连接查询
(多表)连接查询
SELECT [ ALL|DISTINCT ]<目标列表达式1>[,<目标列表达式2>,... ]
FROM <表名或视图名1> [,<表名或视图名2> ,... ]
[ WHERE <元组选择条件表达式> ]
连接条件与元组选择条件进行AND(与)操作
缺少连接条件,在多表的广义笛卡尔积进行查询
案例:查询选修课程号为”C01”的学生学号和成绩
SELECT SNO,GRADE
FROM SC
WHERE CNO='C01';
案例:查询选修课程号为”C01”的学生姓名和成绩
SELECT SN,GRADE
FROM SC,S
WHERE CNO='C01' AND SC.SNO=S.SNO;
查询语句是在SC表和S表的广义笛卡尔积的结果进行的选择,并不是两个表自然连接的结果。因此在笛卡尔积的基础上筛选出两个表的学号sno值相同,同时课程号CNO = ‘C01’的元组
案例:查询选修“数据结构”课程的学生的学号、姓名和成绩
SELECT S.SNO,SN,GRADE
FROM S,SC,C
WHERE S.SNO=SC.SNO AND
C.CNO=SC.CNO AND
CN='数据结构';
注意:select子句中学号属性名sno前加上表名可以是S或SC,否则,无法识别SNO来自于哪张基本表,在语句执行时会报错
外连接查询
在SQL语句中,外连接在FROM子句中指定,其语法规则如下:
FROM <左关系> LEFT | RIGHT | FULL [OUTER] JOIN<右关系>
ON<连接条件>
说明:
• 左外连接: LEFT [OUTER] JOIN
• 右外连接: RIGHT [OUTER] JOIN
• 全外连接: FULL [OUTER] JOIN
• 连接条件可包括对参与连接的关系进行元组选择的条件
案例:查询所有学生姓名及选修课程号为“C01”的成绩,没有选修该课程的学生,成绩显示为空
SELECT SN,GRADE
FROM S LEFT OUTER JOIN SC
ON SC.SNO=S.SNOANDCNO='C01'
•常规连接查询也称为内连接查询, 在FROM子句中指定,其语法规则如下:
FROM <左关系> [ INNER] JOIN <右关系> ON <连接条件>
案例:查询选修“数据结构”课程的学生的学号、姓名和成绩
SELECT S.SNO, SN, GRADE
FROM (S INNER JOIN SC ON S.SNO=SC.SNO )
INNER JOIN C ON C.CNO=SC.CNO
WHERE CN='数据结构';
自身连接查询
案例:查询每门课程的间接先修课程号(即先修课程的先修课程号)
SELECT FIRST.CNO, SECOND.PC
FROM C FIRST, C SECOND
WHERE FIRST.PC=SECOND.CNO;
连接查询
SQL连接查询的典型格式:
SELECT A1,A2,… ,Am
FROM R1, R2, … ,Rn
WHERE F