原文转自:http://blog.csdn.net/qsyzb/article/details/12560917

SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。

集合操作主要包括并操作UNION、交操作INTERSECT、差操作EXCEPT。

注意,参加集合操作的各查询结果的列数必须相同;对应的数据类型也必须相同。

本示例中的数据表有student,sc,course三个,数据表的具体内容请看:Mysql数据库中的EXISTS和NOT EXISTS

UNION示例:

例子1.1

题目:查询计算机科学系的学生及年龄不大于19岁的学生。

SQL语句:

  1. SELECT * FROM Student WHERE Sdept='CS' UNION
  2. SELECT * FROM Student WHERE Sage<=19

查询结果:

本查询实际上是求计算机系的所有学生与年龄不大于19岁的学生的并集。

与它等效的SQL语句是:

  1. SELECT * FROM Student WHERE Sdept='CS' OR Sage<=19

注意:虽然这个两个SQL语句是等效的,但是本质上是不一样的,第一个SQL语句是分别进行两次SELECT然后将结果取并集;第二个SQL语句是直接进行了一次SELECT语句查询。

INTERSECT示例:

MySql语句并不支持INTERSECT,所以只能使用其替代语句

例子2.1

题目:查询计算机科学系中年龄不大于19岁的学生。

对应的SQL语句应该是:

  1. SELECT * FROM Student
  2. WHERE Sdept='CS'
  3. INTERSECT
  4. SELECT * FROM Student
  5. WHERE Sage<=19;

替代的SQL语句:

  1. SELECT *
  2. FROM student
  3. WHERE Sdept = 'CS'
  4. AND Sage <=19

查询结果:

例子2.2

题目:查询即选修了课程1又选修了课程2的学生。(就是查询选修课程1的学生集合与选修课程2的学生集合的交集)

对应的SQL语句应该是:

  1. SELECT Sno FROM SC
  2. WHERE  Cno='1'
  3. INTERSECT
  4. SELECT Sno FROM SC
  5. WHERE Cno='2';

替代的SQL语句为:

(使用IN)

  1. SELECT Sno
  2. FROM SC
  3. WHERE Cno = '1'
  4. AND Sno
  5. IN (
  6. SELECT Sno
  7. FROM SC
  8. WHERE Cno = '2'
  9. )

或者为:

(使用EXISTS)

  1. SELECT Sno
  2. FROM SC SCX
  3. WHERE Cno = '1'
  4. AND EXISTS (
  5. SELECT Sno
  6. FROM SC SCY
  7. WHERE Cno = '2'
  8. AND SCX.Sno = SCY.Sno
  9. )

查询结果为:

或者为:

(使用JOIN ON)

  1. SELECT *
  2. FROM SC SCX
  3. JOIN SC SCY ON ( SCX.Cno = '1'
  4. AND SCY.Cno = '2'
  5. AND SCX.Sno = SCY.Sno )

EXCEPT操作:

很不幸,MySql也不支持EXCEPT操作,只能使用替代的语句。

例子3.1

查询计算机科学系的学生与年龄不大于19岁的学生的差集。

对应的SQL语句为:

  1. SELECT * FROM Student WHERE Sdept='CS'
  2. EXCEPT
  3. SELECT * FROM Student WHERE Sage<=19;

也就是查询计算机科学系中年龄大于19岁的学生。

替换语句为:

(直接使用WHERE,不得不说这么做很简单,但是意思上不是很好理解)

  1. SELECT *
  2. FROM Student
  3. WHERE Sdept = 'CS'
  4. AND Sage >19

查询结果为:

或者替换语句为:

(使用NOT IN)

  1. SELECT *
  2. FROM Student
  3. WHERE Sdept = 'CS'
  4. AND Sno NOT
  5. IN (
  6. SELECT Sno
  7. FROM Student
  8. WHERE Sage <=19
  9. )

查询结果为:

或者使用替换语句为:

(使用NOT EXISTS)

  1. SELECT *
  2. FROM Student SX
  3. WHERE Sdept = 'CS'
  4. AND NOT
  5. EXISTS (
  6. SELECT *
  7. FROM Student SY
  8. WHERE SY.Sage <=19
  9. AND SX.Sno = SY.Sno
  10. )

查询结果为:

对集合操作结果的排序

ORDER BY子句只能用于对最终查询结果排序,不能对中间结果排序。

任何情况下,ORDER BY子句只能出现在最后;对集合操作结果排序时,ORDER BY子句中用数字指定排序属性。

下面是一种错误的写法:

  1. SELECT * FROM Student
  2. WHERE Sdept='CS'
  3. ORDER BY Sno
  4. UNION
  5. SELECT * FROM Student
  6. WHERE Sage<=19
  7. ORDER BY Sno;

正确的应该是:

  1. SELECT * FROM Student
  2. WHERE Sdept='CS'
  3. UNION
  4. SELECT * FROM Student
  5. WHERE Sage<=19
  6. ORDER BY 2;

输出结果:

如果写成:

  1. SELECT * FROM Student
  2. WHERE Sdept='CS'
  3. UNION
  4. SELECT * FROM Student
  5. WHERE Sage<=19
  6. ORDER BY 1;

输出结果为:

sql的集合操作的更多相关文章

  1. 用python(2.7)自定义实现SQL的集合操作

    有的时候需要在不同的数据库实例之间做集合操作,这就无法直接使用SQL语句的join,left join了.相同类型的数据库之间虽然也有类似于DBLINK和FEDERATED之类的东西,但一来这些东西不 ...

  2. Oracle视图,序列及同义词、集合操作

    一.视图(重点) 视同的功能:一个视图其实就是封装了一个复杂的查询语句.1.创建视图的语法:CREATE VIEW 视图名称 AS 子查询 范例:创建一个包含了20部门的视图CREATE VIEW e ...

  3. MySQL集合操作类型

    SQL语言包含3个集合操作符(union.intersect.expect)以执行各种集合操作. 此外,每个集合操作符可以有两种修饰符:一个表是包含重复项,另一个表是去除重复项(但不一定时所有的重复项 ...

  4. 彻底理解Oracle中的集合操作与复合查询

    --Oracle中的复合查询 复合查询:包含集合运算(操作)的查询 常见的集合操作有: union: 两个查询的并集(无重复行.按第一个查询的第一列升序排序) union all:两个查询的并集(有重 ...

  5. Oarcle之集合操作

    计算字段(列):不在于表中,通过x.÷操作和列进行计算得到的列: 获取员工的年薪 select (ename || '的年薪为:' || sal*12) info from emp; *info 为表 ...

  6. orcale 之 集合操作

    集合操作就是将两个或者多个 sql 查询的结果合并成复合查询.常见的集合操作有UNION(并运算).UNION ALL.INTERSECT(交运算)和MINUS(差运算). UNION UNION 运 ...

  7. Oracle 学习笔记 14 -- 集合操作和高级子查询

    Oracel提供了三种类型的集合操作:各自是并(UNION) .交(INTERSECT). 差(MINUS) UNION :将多个操作的结果合并到一个查询结果中,返回查询结果的并集,自己主动去掉反复的 ...

  8. MongoDB(三):数据库操作、集合操作

    1. 数据库操作 看完前面的文章,大家应该把环境搭建好了,下面我们就开始学习MongoDB的一些基本操作了. 首先我们要了解的一些要点: MongoDB将数据存储为一个文档,数据结构由键值对(key= ...

  9. SQL进阶系列之7用SQL进行集合运算

    写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL ...

随机推荐

  1. iOS调用系统通讯录获取姓名电话号码(转)

    原文地址:http://blog.csdn.net/idoshi201109/article/details/46007125 OS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可 ...

  2. PHP str_replace() 函数

    定义和用法 str_replace() 函数使用一个字符串替换字符串中的另一些字符. 语法 str_replace(find,replace,string,count) 参数 描述 find 必需.规 ...

  3. C#WinForm应用程序实现自动填充网页上的用户名和密码并点击登录按钮【转载】

    使用WebBrowser控件,在documentComplete事件处理器里写 HtmlElement name = webBrowser1.Document.GetElementById(" ...

  4. hdu 5497 Inversion 树状数组 逆序对,单点修改

    Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...

  5. 配置Ubuntu开发环境

    前言 新买了一台ThinkPad E431,主要看中了硬盘500G和7200转/分钟的速度,因此准备从x220上把工作环境迁移到新买的笔记本上. 为什么不要公司的电脑,是由于160G的ssd硬盘实在是 ...

  6. 【每日一摩斯】-【序列】-续-RAC and Sequences (853652.1)

    一个简单的sequence有什么可以说的呢?如果再这样认为就大错特错了... 也许以下几点高人们都很清楚,但至少对于我来说,之前是陌生的,或者说是忽略的. 1.CREATE SEQUENCE seq; ...

  7. Android在MediaMuxer和MediaCodec用例 - audio+video

    在Android多媒体类,MediaMuxer和MediaCodec这是一个相对年轻,他们是JB 4.1和JB 4.3据介绍. 前者被用来产生一个混合的音频和视频的多媒体文件.的缺点是,现在可以只支持 ...

  8. 【源码分享】iOS-OC版五子棋

    五子棋是程序猿比较熟悉的一款小游戏,相信很多人大学时期就用多种语言写过五子棋小游戏,笔者工作闲暇之余,试着用OC实现了一下,在这里给大家分享一下.有不足之处,欢迎大家提供建议和指点! GitHub源码 ...

  9. iOS开发——UI篇OC篇&UICollectionView详解+实例

    UICollectionView详解+实例 实现步骤: 一.新建两个类 1.继承自UIScrollView的子类,比如HMWaterflowView * 瀑布流显示控件,用来显示所有的瀑布流数据 2. ...

  10. Android4.4 + WebAPI 实现拍照上传

    网上有很多关于拍照上传的实现方法,如果用新版本android去运行有可能会发现根本实现不了.主要原因是android从4.4版本开始通过intent.ACTION_GET_CONTENT打开选择器后, ...