mysql的聚合查询_MySql聚合查询

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聚合查询》,跪求各位点评,by 搞代码

查询结果:

f1bd606d83544dc23e3d8aeb5414203d.png

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

查询结果:

0469c38deeaf53ab909d1d90832dad1f.png

例子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 )

查询结果为:

13522be3966d98381873b8a803414dfe.png

或者为:

(使用JOIN ON)

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

ebe7180dda239ddc778a6ad2c3a1f20e.png

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

查询结果为:

10

或者替换语句为:

(使用NOT IN)

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

查询结果为:

10

或者使用替换语句为:

(使用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 )

查询结果为:

10

对集合操作结果的排序

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;

输出结果:

61c3b10359951e8a263e04db92ee5b3b.png

如果写成:

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

输出结果为:

cb5631a5875ad38c1e58ab6ddc187895.png

原创文章,转载请注明: 转载自搞代码

e7ce419cf2d6ad34d01da2ceb8829eed.png

微信 赏一包辣条吧~

023a57327877fb4402bcc76911ec18ea.png

支付宝 赏一听可乐吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值