(1)SQL语言集合运算,并UNION,交INTERSECT,差EXCEPT
基本语法: 子查询1{Union [ALL]|Intersect [ALL]|Except [ALL] 子查询2}
通常下,删除重复元组不带ALL,若要保留重复元素就要带ALL
子查询1的一个元组出现m次,子查询2的一个元组出现n次在,在结果中:
1)子查询1 Union ALL 子查询2 出现m+n次
2)子查询1 Intersect ALL 子查询2 出现min(m,n)次
3)子查询1 Except 子查询2 结果出现了max(0,m-n)次
例:查询既学过002号课程同学又学过003号课程的同学的学号
select S# From SC where C#='002'
Union
select S# From SC where C#='003';
上卖弄查询等价于:
select S# From SC where C#='002' or C#='003';
例:求既学过002号课程,又学过003号课程的同学学号
select S# From SC where C#='002'
Intersect
select S# From SC where C#='003';
上面等价于:
select S# From SC where C#='002'
where S# in (
select S# From SC where C#='003');
例:假设所有同学都有选课,求没学过002号课程的同学的学号
select S# From SC
Except
select S# From SC where C#='002';
(2)SQL语言对空值的处理
空值检测: is [not] null
例:找出年龄值为空的同学的姓名
select Sname From student
where Sage is null;
DBMS对空值的处理:
1)除了 is [not] null 外,空值不满足任何查找条件
2) 如果null 参与了聚集函数的运算。除了count(*)之外,其他的聚集函数将会忽略 null.
(3)SQL语言的连接操作
语法: select 列名[...]
From 表1 [NATURAL]
[INNER]|{LEFT|RIGHT|FULL}[outer] JOIN {ON 连接条件|Using (clo1,clo2,...) }
4种连接类型:
inner join 内连接
Left outer jion 左外连接
Right outer jion 右外连接
FULL outer join 外连接
3中连接条件:
natual 自然连接
on 连接条件
using <clo1,clo2,..>
1) inner join :关系代数中的Theta连接运算
2)表1 Left outer join 表2 :则表1的任何元组t都会出现在结果中。如果表2有满足连接条件的元组s,则t与s连接,否则t与空值连接
3)表1 Rightouter join 表2 :则表2的任何元组t都会出现在结果中。如果表1有满足连接条件的元组s,则t与s连接,否则t与空值连接
4)表1 Full outer join 表2 :表示左外右外连接的并
natual连接条件:出现在结果关系的两个连接关系的元组在公共的属性上值相等,且公共属性在结果中只出现一次。
on 连接:出现在结果关系的两个连接关系的元组取值满足连接条件,且公共属性在结果中出现2次
using 连接:两个表的元组在属性<clo1,clo2,..>上取值相等,这些公共属性在结果中只出现一次。
例:找出所有教师的教师号以及授课情况,并按照教师号从小到大排序
select Teacher.T#,Cname
From Teacher inner join Course
on Teacher.T#=Course.T#
order by Teacher.T# ASC;