sql的集合操作
原文转自: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语句:
- 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;
输出结果为:
最新文章
- shell-参数做下标
- OD使用教程10
- Java编程思想学习(六) 多态
- 详解linux运维工程师入门级必备技能
- JAVA 单选按钮、复选按钮
- Tomcat遇到的问题The Tomcat server configuration at ServersTomcat v5.5 Server at localhost-config is missing. Check..
- Java笔记(二)
- HibernateTemplate实现查询distinct构造对象
- Codeforces 803F Coprime Subsequences (容斥)
- phpMyAdmin 安装教程全攻略
- 求助Ubuntu16.10如何设置默认启动为字符界面
- 理解metrics.classification_report
- 36. CentOS-6.3安装Mysql集群
- C# 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
- Mysql存储之原生语句操作(pymysql)
- NOIP2013 D1 T2火柴排队
- UVA11468 Substring --- AC自动机 + 概率DP
- 一步一步部署WPF浏览器应用程序
- mul 指令
- 03.if 和 switch结合练习
热门文章
- iOS 键盘框架IQKeyboardManager使用
- WCF之初体验
- hdu 4104
- [RxJS] AsyncSubject
- VC 部署
- Android屏幕分辨率详解(VGA、HVGA、QVGA、WVGA、WQVGA)
- S2-020 Struts ClassLoader Manipulation安全限制绕过(CVE-2014-0094)
- AAPT: libpng error: Not a PNG file 问题解决
- aggregation 详解4(pipeline aggregations)
- JSON对象和string的相互转换