内容正文:
4.2联接查询
联接查询
如果一个查询同时涉及两个以上的表,则称之为联接查询
内联接
外联接
交叉联接
学习要点
联接查询
内联接(Inner Join)
在 SQL-92 标准中,内联接可在 FROM 或 WHERE 子句中指定 (建议使用后者)
等值联接
非等值联接
自身联接
联接查询
内联接
等值联接
【例4-24】查询每个学生的S_no(学号)、S_name(姓名)、S_class(班级)及其所选修课程的成绩情况
分析:
内联接
Information表
Score表
S_no
S_name
S_class
c_no
grade
semester
值相等
SELECT Information.S_no, Information.S_name,
S_class, c_no, semester, grade
FROM Information
JOIN Score
ON Information.S_no=Score.S_no
返回结果
连接score表
“=”即为等值连接
等值联接
内联接
非等值联接
使用>、<、>=、<=等运算符作为联接条件的联接称为非等值联接。
但在实际应用中很少使用不等联接 (< >),并且通常不等联接只有与自联接同时使用才有意义,如【例4-25】所示
内联接
内联接
自身联接
一个表与其自己进行联接,这种联接称为表的自身联接
自身联接一般很少仅用于查询数据,主要用于INSERT,UPDATE语句中对一个表中满足特定条件的行进行操作操作的情况下
【例4-25】
内联接
内联接
【例4-25】
查询比“王玉梅”年龄大或同龄的学生的学号、姓名和出生年份,结果按出生年月升序排列
返回结果如下:
SELECT X2.S_no 学号, X2.S_name 姓名, year(X2.S_birth) 出生年份
FROM Information X1
JOIN Information X2
ON X1.S_name='王玉梅' AND X2.S_birth<=X1.S_birth
ORDER By X2.S_birth
自身联接
联接查询
外联接(Outer Join)
如果以Information表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其基本情况信息,其选课信息为空值即可,这时就需要使用外联接(Outer Join)
左外联接
右外联接
完全外部联接
联接查询
外联接
左外联接(匹配左表的所有行)
【例4-26】将Information表和Score表之间的左向外联接包括所有学生的信息,包括没有进行选课的学生
返回结果
外联接
SELECT Information.S_no,S_name,S_sex,S_class,
C_no,Grade
FROM Information
LEFT OUTER JOIN Score on Information.S_no=Score.S_no
Join之左侧表:information
左外联接
外联接
右外联接(匹配右表的所有行)
【例4-27】在Information和Score表之间的右向外联接将包括所有学生的成绩
返回结果
外联接
SELECT Information.S_no,S_name,S_sex,S_class,C_no,Grade
FROM Information
RIGHT OUTER JOIN Score on Information.S_no=Score.S_no
Join之右侧表:score
右外联接
外联接
完全外部联接(显示所有行,不管匹配)
【例4-28】在Information和Score表之间的建立完整外部联接
返回结果
外联接
SELECT Information.S_no,S_name,S_sex,S_class,C_no,Grade
FROM Information
FULL OUTER JOIN Score on Information.S_no=Score.S_no
完全外部联接
联接查询
交叉联接(卡氏积联接 )
卡氏积是不带联接谓词的联接。
两个表的卡氏积即是两表中记录的交叉乘积
也即其中一表中的每一记录都要与另一表中的每一记录作拼接,因此结果表往往很大。
【例4-29】
联接查询
交叉联接
【例4-29】
对学生信息表和成绩表进行交叉联接
交叉联接
SELECT * FROM Information
CROSS JOIN Score
SELECT Information.* ,Score.*
FROM Information,Score
感谢聆听
$$