MySql集合查询

php中文网
发布: 2016-06-07 15:02:10
原创
4492人浏览过

select语句的查询结果是元组的集合,所以多个select语句的结果可进行集合操作。 集合操作主要包括并操作UNION、交操作INTERSECT、差操作EXCEPT。 注意, 参加集合操作的各查询结果的列数必须相同;对应的数据类型也必须相同。 本示例中的数据表有student,sc

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
登录后复制
查询结果:

MySql集合查询

本查询实际上是求计算机系的所有学生与年龄不大于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
登录后复制

查询结果:

MySql集合查询

例子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
)
登录后复制
查询结果为:

MySql集合查询

或者为:

SKU组合查询算法
SKU组合查询算法

SKU组合查询算法

SKU组合查询算法 39
查看详情 SKU组合查询算法

(使用JOIN ON)

SELECT *
FROM SC SCX
JOIN SC SCY ON ( SCX.Cno = '1'
AND SCY.Cno = '2'
AND SCX.Sno = SCY.Sno )
登录后复制

MySql集合查询

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
登录后复制

查询结果为:

MySql集合查询

或者替换语句为:

(使用NOT IN)

SELECT *
FROM Student
WHERE Sdept = 'CS'
AND Sno NOT
IN (
SELECT Sno
FROM Student
WHERE Sage <=19
)
登录后复制
查询结果为:

MySql集合查询

或者使用替换语句为:

(使用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
)
登录后复制
查询结果为:

MySql集合查询

对集合操作结果的排序

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;
登录后复制
输出结果:

MySql集合查询

如果写成:

SELECT * FROM Student
WHERE Sdept='CS'
UNION
SELECT * FROM Student
WHERE Sage<=19
ORDER BY 1;
登录后复制
输出结果为:

MySql集合查询


相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号