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

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

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

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

UNION示例:

例子1.1

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

SQL语句:

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

查询结果:

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

与它等效的SQL语句是:

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

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

INTERSECT示例:

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

例子2.1

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

对应的SQL语句应该是:

SELECT * FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT * FROM Student
WHERE Sage<=19;

替代的SQL语句:

SELECT *
FROM student
WHERE Sdept = 'CS'
AND Sage <=19

查询结果:

例子2.2

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

对应的SQL语句应该是:

SELECT Sno FROM SC
WHERE Cno='1'
INTERSECT
SELECT Sno FROM SC
WHERE Cno='2';

替代的SQL语句为:

(使用IN)

SELECT Sno
FROM SC
WHERE Cno = '1'
AND Sno
IN (
SELECT Sno
FROM SC
WHERE Cno = '2'
)

或者为:

(使用EXISTS)

SELECT Sno
FROM SC SCX
WHERE Cno = '1'
AND EXISTS (
SELECT Sno
FROM SC SCY
WHERE Cno = '2'
AND SCX.Sno = SCY.Sno
)

查询结果为:

或者为:

(使用JOIN ON)

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

EXCEPT操作:

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

例子3.1

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

对应的SQL语句为:

SELECT * FROM Student WHERE Sdept='CS'
EXCEPT
SELECT * FROM Student WHERE Sage<=19;

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

替换语句为:

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

SELECT *
FROM Student
WHERE Sdept = 'CS'
AND Sage >19

查询结果为:

或者替换语句为:

(使用NOT IN)

SELECT *
FROM Student
WHERE Sdept = 'CS'
AND Sno NOT
IN (
SELECT Sno
FROM Student
WHERE Sage <=19
)

查询结果为:

或者使用替换语句为:

(使用NOT EXISTS)

SELECT *
FROM Student SX
WHERE Sdept = 'CS'
AND NOT
EXISTS (
SELECT *
FROM Student SY
WHERE SY.Sage <=19
AND SX.Sno = SY.Sno
)

查询结果为:

对集合操作结果的排序

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

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

下面是一种错误的写法:

SELECT * FROM Student
WHERE Sdept='CS'
ORDER BY Sno
UNION
SELECT * FROM Student
WHERE Sage<=19
ORDER BY Sno;

正确的应该是:

SELECT * FROM Student
WHERE Sdept='CS'
UNION
SELECT * FROM Student
WHERE Sage<=19
ORDER BY 2;

输出结果:

如果写成:

SELECT * FROM Student
WHERE Sdept='CS'
UNION
SELECT * FROM Student
WHERE Sage<=19
ORDER BY 1;

输出结果为:

MySql集合查询的更多相关文章

  1. MySQL<表单&集合查询>

    表单查询 简单查询 SELECT语句 查询所有字段 指定所有字段:select 字段名1,字段名2,...from 表名; select * from 表名; 查询指定字段 select 字段名1,字 ...

  2. MySQL模糊查询:LIKE模式和REGEXP模式

    MySQL模糊查询提供了两种模式:LIKE模式和REGEXP模式. LIKE模式 LIKE模式是使用的LIKE 或 NOT LIKE 比较运算符进行模糊查询. SELECT 字段 FROM 表 WHE ...

  3. Mysql数据库连接查询

                                    Mysql数据库连接查询 连接是关系数据库模型的主要特点.连接查询是关系数据库中最主要的查询,主要包括内连接.外连接等.通过连接运算可以 ...

  4. Oracle和MySQL分组查询GROUP BY

    Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...

  5. MySQL数据查询之单表查询

    单表查询 简单查询 - 创建表 DROP TABLE IF EXISTS `person`; CREATE TABLE `person` ( `id` ) NOT NULL AUTO_INCREMEN ...

  6. mysql的查询

    1.单表查询 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 ...

  7. mysql基础查询语法

    一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count( ...

  8. Day3 MySql高级查询

    DQL高级查询 多表查询(关联查询.连接查询) 1.笛卡尔积 emp表15条记录,dept表4条记录. 连接查询的笛卡尔积为60条记录. 2.内连接 不区分主从表,与连接顺序无关.两张表均满足条件则出 ...

  9. MySql学习—— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

随机推荐

  1. 【LeetCode】:二叉树的Max,Min深度

    一.最大深度问题 描述: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes a ...

  2. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  3. css3图片过滤效果

    在线演示 本地下载

  4. CSS3垂直图标菜单

    在线演示 本地下载

  5. 随意谈谈tcp

    tcp作为四层中可靠到传输协议,为上层协议提供了字节流的可靠到传输,之所以能做到可靠主要因为以下几点: 1.流与分段:流即字节流,计算机处理程序时一般以字节为单位,如果上层协议接收到到是字节流并且跟发 ...

  6. C# Stopwatch与TimeSpan详解

    http://www.cnblogs.com/newstart/archive/2012/09/21/2696884.html

  7. MVC中URL传多个参数

    1.mvc中url传递多个参数不能直接使用&,会报错(从客户端(&)中检测到有潜在危险的 Request.Path 值) 方法①:使用?---/Home/Index/?id=xxx&a ...

  8. json与jsonp详解

     前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域 ...

  9. hibernate的update、merge和saveOrUpdate的区别(转)

    1.首先 saveOrUpdate返回void 也就是什么都不返回 而merge会返回一个对象 2.其次 saveOrUpdate的做法是:自动判断该对象是否曾经持久化过,如果曾持久化过则使用upda ...

  10. ATL实现COM组件

    参考文献:https://blog.csdn.net/Marcus2006/article/details/41978799 ATL实现COM组件比较简单,关键是在程序中如何调用该组件. vs2010 ...