1. 多关系查询结构
- 表的连接方法有以下两种
(1)表之间满足一定条件的行进行连接时,FROM子句指明进行连接的表名,WHERE子句指明连接的列名及其连接条件。
SELECT [ALL|DISTINCT][TOP N [PERCENT][WITH TIES]]〈字段名〉[AS 别名1] [{,〈字段名〉[ AS 别名2]}]
FROM〈表名1〉[[AS] 表1别名] [{,〈表名2〉[[AS] 表2别名,…]}]
[WHERE〈检索条件〉]
[GROUP BY <列名1>[HAVING <条件表达式>]]
[ORDER BY <列名2>[ASC|DESC]]
(2)利用关键字JOIN进行连接。
INNER JOIN(内连接)
显示符合条件的记录,此为默认值。LEFT(OUTER)JOIN称为左(外)连接
,用于显示符合条件的数据行以及左边表中不符合条件的数据行。此时右边数据行会以NULL来显示RIGHT(OUTER)JOIN称为右(外)连接
,用于显示符合条件的数据行以及右边表中不符合条件的数据行。此时左边数据行会以NULL来显示FULL(OUTER)JOIN
显示符合条件的数据行以及左边表和右边表中不符合条件的数据行。此时缺乏数据的数据行会以NULL来显示CROSS JOIN
将一个表的每一个记录和另一表的每个记录匹配成新的数据行。
当将JOIN关键词放于FROM子句中时,应有关键词ON与之对应,以表明连接的条件。
SELECT [ALL|DISTINCT][TOP N [PERCENT][WITH TIES]] 字段名1 [AS 别名1] [, 字段名2 [ AS 别名2]…]
FROM 表名 1[[AS] 表1别名] [INNER|RIGHT|FULL|OUTER|CROSS] JOIN表名2 [[AS] 表2别名]
ON 条件
2. 内连接查询
- 上述语句中的学号“sno“需要加上表名前缀,这是因为学生表s和选课表sc中都有学号“sno”,必须用表名前缀来确切说明该字段属于哪个表,以避免二义性,此外,上述语句中的学号“sno”的表前缀也可以写为选课表sc
上述语句的执行过程是将学生表s中的学号“sno“和选课表sc中的学号“sno”进行等值连接,同时选取学号为“s5”的行,然后对学号“sno”、学生姓名“sn”和课程号“cno”进行投影操作,即可得到查询结果
3. 外连接查询
在内连接查询中,不满足连接条件的元组不能作为查询结果输出
- 在外部连接中,参与连接的表有主从之分,以主表的每行数据去匹配从表的数据列,符合连接条件的数据将直接返回到结果集中;对那些不符合连接条件的列,将被填上NULL值后,再返回到结果集中
- 外部连接分为左外部连接和右外部连接两种
- 主表在左边,则称为左外部连接
- 主表在右边,则称为右外部连接
可以看出查询结果包括所有的教师,没有授课的张刚老师的授课名称显示为空
4. 交叉连接查询(笛卡尔积结果)
交叉连接查询(CROSS JOIN)对连接查询的表没有特殊的要求,任何表都可以进行交叉连接查询操作
上述语句是将教师表t中的每一个元组和课程表c的每一个元组匹配生成新的数据行,查询结果的行数是两个表行数的乘积,列数是两个表列数的和
5. 自连接查询
当一个表与其自身进行连接查询操作时,称为表的自连接查询
6.子查询
1、普通子查询
- 普通子查询的执行顺序是:首先执行子查询,然后把子查询的结果作为父查询的查询条件的值。
普通子查询只执行一次,而父查询所涉及的所有记录行都与其查询结果进行比较以确定查询结果集合。
(一)返回一个值的普通子查询
(二)返回一组值的普通子查询(比较运算符的子查询)
元素与集合元素之间还存在更为复杂的关系,如比较关系,常用到谓词ANY(或SOME)和ALL。
ANY表示子查询结果中的某个值
- ALL表示子查询结果中的所有值
注意:
- 如果子查询中的结果关系仅包含一个元组,则可将ALL和ANY去掉,直接使用比较运算符;
- ANY也可以用SOME替代 。
(三)使用IN的子查询
(四)用于数据操纵的普通查询
2. 相关子查询
- 普通子查询,子查询中的查询条件不涉及父查询中的基本表的属性;
- 有些查询任务中,子查询的查询条件需要引用父查询表中的属性值,这类查询称为相关子查询;
- 相关子查询的执行顺序是:
- 首先,选取父查询表中的第一行记录,子查询利用此行中相关的属性值在子查询设计的基本表中进行查询;
- 然后,父查询根据子查询返回的结果判断父查询表中的此行是否满足查询条件。如果满足条件,则把该行放入父查询的查询结果集合中;
- 重复执行这一过程,直到处理完父查询表中的每一行数据。
- 由此可以看出,相关子查询的执行次数是由父查询表的行数决定的。
- EXISTS是表示存在的量词,带有EXISTS的子查询不返回任何实际数据,它只得到逻辑值“真”或“假”;
- 当子查询的查询结果集合为非空时,外层的WHERE子句返回真值,否则返回假值。NOT EXISTS与此相反。
(一)使用存在量词EXISTS的子查询
- 量词有两种:
- 一是存在量词;
- 二是全称量词在离散数学中,全称量词可用存在量词替代;
- SQL仅提供存在量词的运算,使用谓词EXISTS表示;
- 全称量词转化通过NOT EXISTS谓词来实现。
- WHERE子句中的谓词EXISTS用来判断其后的子查询的结果集合中是否存在元素;
- 谓词EXISTS大量用于相关子查询中;
※※ 双重NOT EXISTS
3.复杂子查询
4.集合运算查询
- 集合运算查询是使用UNION关键字将来自不同查询的数据组合起来,形成一个具有综合信息的查询结果;
- UNION操作会自动将重复的数据行剔除;
- 参加合并查询的各子查询的使用的表结构应该相同,即各子查询中的数据属性的数目和对应的数据类型都必须相同。