数据查询-集合查询
集合操作用于查询结果的再运算.
参加集合操作的各查询结果的列数必须相同; 对应项的数据类型也必须相同.
集合操作的种类
- 并操作 UNION
- 交操作 INTERSECT
- 差操作 EXCEPT
并操作 UNION / UNION ALL
- UNION: 将多个查询结果合并起来, 去掉重复的元组
- UNION ALL: 将多个查询结果合并起来, 保留重复的元组
例子1
1 2 3 4 5 6 7 8 9
| #查询计算机系的学生 和 年龄不大于19岁的学生 SELECT * FROM Student WHERE Sdept = 'CS' UNION SELECT * FROM Student WHERE Sage <= 19; #查询选修了课程1 或 选修了课程2的学生 SELECT * FROM SC WHERE Cno = '1' UNION ALL SELECT * FROM SC WHERE Cno = '2'; #可见, 善用UNION / UNION ALL可以让原本一个较为复杂的语句拆分成较为简单的几个语句
|
交操作 INTERSECT
- INTERSECT: 将多个查询结果相交, 保留在所有结果集中都存在的元组
例子2
1 2 3 4 5 6 7 8 9
| #查询计算机系的年龄不大于19的学生 SELECT * FROM Student WHERE Sdept = 'CS' INTERSECT SELECT * FROM Student WHERE Sage <= 19; #查询同时选修了课程1和课程2的学生 SELECT * FROM SC WHERE Cno = '1' INTERSECT SELECT * FROM SC WHERE Cno = '2'; #第二个例子可见, 原本需要嵌套查询的功能,用INTERSECT可以不用嵌套实现
|
差操作 EXCEPT
- EXCEPT: 将左结果集中 在 右结果集中出现的元组去掉
例子3:
1 2 3 4
| #查询计算机系学生中 年龄大于 19岁的学生 SELECT * FROM Student WHERE Sdept = 'CS' EXCEPT SELECT * FROM Student WHERE Sage < 19;
|
查询语句小结
语句格式
SELECT [ALL | DEISTINCT] <目标列表达式>[, <目标列表达式>]...
FROM <表名或视图名>[, <表名或视图名>]...|(SELECT 语句) [AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC | DESC]];
SELECT: 要查询的内容 (选定列) (ALL不去重(缺省) / DEISTINCT去重) ;
FROM: 从哪个表查询 (选定表) ;
WHERE: 查询的约束条件 (选定行) (条件表达式里面不能使用聚集函数) ;
——前三者为一组,用于查询出结果集——
GROUP BY: 结果集的分组方式 (按照某列值分组,相同值为一组统计数量) ;
HAVING: 只输出满足条件的结果 ;
——中间二者为一组,用于对结果集的输出限制,通常伴随使用聚集函数——
ORDER BY: 结果集的排序方式 (ASC升序(缺省) / DESC降序) .
——最后一条为一组,用于对结果排序——
目标列表达式格式
*
<表名>.*
COUNT ( [DISTINCT | ALL]* )
[<表名>.]<属性列名表达式>[,[<表名>.]<属性列名表达式>]...
其中<属性列名表达式>可以是由属性列, 聚集函数 和 常量的算术运算(+, -, *, /)组成的运算公式
聚集函数的一般格式
COUNT ( [DISTINCT | ALL] <列名> )
SUM ( [DISTINCT | ALL] <列名> )
AVG ( [DISTINCT | ALL] <列名> )
MAX ( [DISTINCT | ALL] <列名> )
MIN ( [DISTINCT | ALL] <列名> )
WHERE子句的条件表达式可选格式
<属性列名> "关系运算符" <属性列名> / <常量> / [ ANY | ALL ] ( SELECT语句 )
<属性列名> [NOT] BETWEEN ... AND ... (...即<属性列名> / <常量> / ( SELECT语句 ))
<属性列名> [NOT] IN (<值1>, <值2>...) / (SELECT语句)
<属性列名> [NOT] LIKE <匹配串>
<属性列名> IS [NOT] NULL
[NOT] EXISTS (SELECT语句)
<条件表达式> AND/OR <条件表达式>...
空值处理
即NULL
谓词IS NULL / IS NOT NULL用于判断空值
判断空值 IS NULL / IS NOT NULL
1 2
| #找出漏填了性别或者年龄信息的记录 SELECT * FROM Student WHERE Ssex IS NULL OR Sage IS NULL;
|
属性定义(或者域定义)中
- 由NOT NULL约束条件的不能取空值
- 加了UNIQUE限制的属性不能取空值
- 键不能取空值
空值的算术运算, 比较运算, 逻辑运算
- NULL与另一个值的 算术运算 结果为 NULL
- NULL与另一个值的 比较运算 结果为 UNKNOWN
- 有UNKNOWN后, 传统二值(TRUE, FALSE)的逻辑就扩展为三值逻辑
逻辑运算符真值表
x y |
x AND y |
x OR y |
NOT x |
T T |
T |
T |
F |
T U |
U |
T |
F |
T F |
F |
T |
F |
U T |
U |
T |
U |
U U |
U |
U |
U |
U F |
F |
U |
U |
F T |
F |
T |
T |
F U |
F |
U |
T |
F F |
F |
F |
T |
例子1
1 2 3 4 5
| #找出选修1号课程的不及格的学生 SELECT Sno FROM SC WHERE Grade < 60 AND Cno = '1'; #查询结果不包括缺考学生, 因为它们的Grade值是NULL #找出选修1号课程的不及格的学生 以及 缺考的学生 SELECT Sno FROM SC WHERE Cno = '1' AND (Grade < 60 OR Grade IS NULL);
|