关系代数与SQL语句
(关系代数可递归调用,结果的查询是基于操作符的顺序,关系数据库正是使用代数表达式来表示查询执行的计划。)
1)选择λ
从表中选出符合条件的行, 用于选择条件的比较操作符有:>,>=,<,<=,=,!=。逻辑运算符有AND,OR,NOT,对应WHERE。
instance:
SELECT * FROM student WHERE stuClass = '计0001' AND stuName = '张三'
表students
查询结果
2)投影π
从表中抽出所需的一列和多列,重复元组会保留,对应SELECT.
instance:
SELECT stuName FROM student WHERE stuClass = '计0004'
查询结果
3)集合操作
1> UNION(并):元组出现在A中或者出现在B中
使用要求 :两个表的结构要完全一致,重复的元组只保留一组。
instance:
SELECT * FROM student
UNION
SELECT * FROM student1
表student1
表student
查询结果
2> INTERSECTION(交):元组即出现在A中又出现在B中
MySQL不支持INTERSECTION关键字,但是可以用INNER JOIN或IN实现同样的效果。
instance:
SELECT * FROM student1
WHERE student1.stuNumber IN (SELECT student.stuNumber FROM student)
表student1
表student
查询结果
3> DIFFERENCE(差):A-B 元组只出现在A中不出现在B中
MySQL不支持EXCEPT关键字,可以用NOT IN 来实现同样的效果
instance:
SELECT * FROM student1
WHERE student1.stuNumber NOT IN (SELECT student.stuNumber FROM student)
不支持:
SELECT * FROM student
EXCEPT
SELECT * FROM student1
查询结果
4> CROSS PRODUCT(笛卡尔积) 对应FROM.
把A(m),B(n)两张表中的column全部提取出来构成一个查询集合,类似于矩阵相乘,A中的每一个元组都要和B中的元组连接一遍,结果是A*B(m*n)。
instance:
SELECT * FROM student1,class
表student1
表class
查询结果
4)联结操作
联结操作可以定义为A*B之后再做选择操作,但是查询结果比笛卡尔积小,所以使用广泛。
1>条件连接
即A,B两表做笛卡尔积后在根据连接条件缩小数据范围。
instance:
SELECT * FROM student1,class
WHERE claName = '计算机01班'
或
SELECT * FROM student1 CROSS JOIN class
WHERE claName = '计算机01班'
查询结果(根据上一节CROSS PRODUCT(笛卡尔积)的查询结果在加上班级名的限制条件)
2>等连接(也叫做 inner join)
是条件连接的特例,只是条件表达式中只能有“=”,不能包含<,<=,>,>=,或!=这些比较符。
instance:
SELECT stuNumber, stuName, claName FROM student,class (SQL-92的写法)
WHERE claNumber = stuClass
或者
(使用 inner join 的写法时连接条件要通过ON引出)
SELECT stuNumber, stuName, claName (T-SQL的写法)
FROM student INNER JOIN class ON stuClass = claNumber
查询结果
3>自然连接
是等连接的特例,条件表达式所涉及的字段也必须相同,查询从表的时候同时查主表对应的元组。使用natural join 关键字可以不显示的写明连接条件,会自动隐含两表相同字段的相等条件。
instance:
SELECT * FROM student NATURAL JOIN student1 等同 SELECT * FROM student,student1
WHERE student.stuName = student1.stuName
AND student.stuClass = student1.stuClass
AND student.stuNumber = student1.stuNumber
查询结果
4>外连接
与外联接对应,前面三种都属于内连接(inner join),外连接又分左外连接(left join)(也可以写作left outer join),右外连接(right join/right outer join)和全外连接(full join/full outer join),连接条件要通过ON引出。
左外连接(left join/left outer join):A left join B,以左边的 A表为准,在右边的B表中寻找与A中的行对应的行,如果没有则设置为NULL。也可以表示为返回除自然连接外左边A表中不符合条件的元组。
右外连接(right join/right outer join):A right join B,以右边的 B表为准,在右边的A表中寻找与B中的行对应的行,如果没有则设置为NULL。也可以表示为返回除自然连接外右边B表中不符合条件的元组。
全外连接(full join/full outer join):除自然连接外还返回左右两边不符合条件的所有元组,结果是左连接和右连接的并集去掉从复元组。
instance:
SELECT student.stuNumber,stuName,class.claName
FROM student RIGHT JOIN class
ON student.stuClass = class.claNumber
表class
表student1
查询结果