数据库中的数据查询——集合查询与空值处理

数据查询-集合查询

集合操作用于查询结果的再运算.
参加集合操作的各查询结果的列数必须相同; 对应项的数据类型也必须相同.

集合操作的种类

  • 并操作 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降序) .
——最后一条为一组,用于对结果排序——

目标列表达式格式

  1. *
  2. <表名>.*
  3. COUNT ( [DISTINCT | ALL]* )
  4. [<表名>.]<属性列名表达式>[,[<表名>.]<属性列名表达式>]...
    其中<属性列名表达式>可以是由属性列, 聚集函数 和 常量的算术运算(+, -, *, /)组成的运算公式

聚集函数的一般格式

  • COUNT ( [DISTINCT | ALL] <列名> )
  • SUM ( [DISTINCT | ALL] <列名> )
  • AVG ( [DISTINCT | ALL] <列名> )
  • MAX ( [DISTINCT | ALL] <列名> )
  • MIN ( [DISTINCT | ALL] <列名> )

WHERE子句的条件表达式可选格式

  1. <属性列名> "关系运算符" <属性列名> / <常量> / [ ANY | ALL ] ( SELECT语句 )
  2. <属性列名> [NOT] BETWEEN ... AND ... (...即<属性列名> / <常量> / ( SELECT语句 ))
  3. <属性列名> [NOT] IN (<值1>, <值2>...) / (SELECT语句)
  4. <属性列名> [NOT] LIKE <匹配串>
  5. <属性列名> IS [NOT] NULL
  6. [NOT] EXISTS (SELECT语句)
  7. <条件表达式> 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);