MySql集合查询
2013-10-10 15:28
183 查看
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。
集合操作主要包括并操作UNION、交操作INTERSECT、差操作EXCEPT。
注意,参加集合操作的各查询结果的列数必须相同;对应的数据类型也必须相同。
本示例中的数据表有student,sc,course三个,数据表的具体内容请看:Mysql数据库中的EXISTS和NOT
EXISTS
题目:查询计算机科学系的学生及年龄不大于19岁的学生。
SQL语句:
查询结果:
本查询实际上是求计算机系的所有学生与年龄不大于19岁的学生的并集。
与它等效的SQL语句是:
注意:虽然这个两个SQL语句是等效的,但是本质上是不一样的,第一个SQL语句是分别进行两次SELECT然后将结果取并集;第二个SQL语句是直接进行了一次SELECT语句查询。
例子2.1
题目:查询计算机科学系中年龄不大于19岁的学生。
对应的SQL语句应该是:
替代的SQL语句:
查询结果:
例子2.2
题目:查询即选修了课程1又选修了课程2的学生。(就是查询选修课程1的学生集合与选修课程2的学生集合的交集)
对应的SQL语句应该是:
替代的SQL语句为:
(使用IN)
或者为:
(使用EXISTS)
查询结果为:
或者为:
(使用JOIN ON)
例子3.1
查询计算机科学系的学生与年龄不大于19岁的学生的差集。
对应的SQL语句为:
也就是查询计算机科学系中年龄大于19岁的学生。
替换语句为:
(直接使用WHERE,不得不说这么做很简单,但是意思上不是很好理解)
查询结果为:
或者替换语句为:
(使用NOT IN)
查询结果为:
或者使用替换语句为:
(使用NOT EXISTS)
查询结果为:
任何情况下,ORDER BY子句只能出现在最后;对集合操作结果排序时,ORDER BY子句中用数字指定排序属性。
下面是一种错误的写法:
正确的应该是:
输出结果:
如果写成:
输出结果为:
集合操作主要包括并操作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查询in操作 查询结果按in集合顺序显示
- MySQL查询in操作 查询结果按in集合顺序显示
- mysql查询死锁,执行语句,服务器状态等语句集合
- mysql 面向集合查询
- mysql 集合函数,分组查询
- MySql集合查询
- 在Eclipse中测试MySQL-JDBC(5)查询1-4之间的所有员工,并且封装为一个个的employee对象,并且存储到一个集合中
- MySQL高级查询之与Group By集合使用介绍
- mysql 查询问题集合
- MySQL查询in操作 查询结果按in集合顺序显示
- MySQL笔记-子查询与集合运算
- 常用查询集合oracle、mysql、sqlserver
- MySQL查询结果按in集合顺序排序
- MySQL使用集合函数进行查询操作实例详解
- MySQL查询in操作 查询结果按in集合顺序显示
- MySQL 查询结果按in集合顺序显示
- MySQL查询in操作 查询结果按in集合顺序显示
- MySQL高级查询之与Group By集合使用介绍
- MySQL查询语句集合
- 利用集合的交集并集等图示展现Mysql的多表的查询结果