多表联合查询
SELECT 字段列表 FROM 表1 [别名1] , 表2 [别名2] WHERE 连接条件表达式 [AND 查询条件表达式 ];
① 要进行联合查询的表都要放在FROM子句中,表名之间用逗号分开,比如FROM s , sc。
② 为了书写方便,可以为表起别名,别名一经定义,在整个查询语句中就只能使用表的别名而不能再使用表名。
③ 连接的条件放在WHERE子句中,格式为:表1.字段=表2.字段。
连接查询—内连接查询
SELECT 字段列表 FROM 表1 [别名1] [INNER] JOIN 表2 [别名2] [ON 表1.字段=表2.字段] [ WHERE 条件表达式 ];
当连接条件由两张表相同名称且类型系统的字段相连接时,可以使用USING(字段名)来连接。
########## 查询每个学生的学号、姓名、选修课程号、课程名及成绩 ##########
select s.sno,sname,sc.cno,cname,score from s join sc on s.sno = sc.sno
join c on sc.cno = c.cno;
左外连接查询
SELECT 字段列表 FROM 表1 [别名1] LEFT [OUTER] JOIN 表2 [别名2] [ON 表1.字段=表2.字段] [ WHERE 查询条件表达式 ];
在内连接的基础上,结果集中还包括左表(表1)中不满足条件的记录行。当左表中不满足条件的记录与右表(表2)记录进行组合时,右表相应列值为NULL。
右外连接查询
SELECT 字段列表 FROM 表1 [别名1] RIGHT [OUTER] JOIN 表2 [别名2] [ON 表1.字段=表2.字段] [ WHERE 查询条件表达式 ];
在内连接的基础上,结果集中还包括右表(表2)中不满足条件的记录行。当右表中不满足条件的记录与左表(表1)记录进行组合时,左表相应列值为NULL。
########## 查询所有课程的被选情况(包括从未被选修的课程),要求显示选课的学生学号、课程编号、课程名和成绩 ##########
SELECT s.sno, c.cno, cname, score
FROM s
RIGHT JOIN (c LEFT JOIN sc ON c.cno = sc.cno
) ON s.sno = sc.sno;
交叉连接查询
SELECT 字段列表 FROM 表1 [别名1] CROSS JOIN 表2 [别名2]
交叉连接无任何连接条件,也不能带WHERE子句。
########## 查询所有学生的可能选课组合,结果集包括学号、姓名、课程号及课程名 ##########
select s.sno,sname,c.cno,cname from s cross join c;
子查询
########## 查询学号为's003'学生的选修课程号和课程名 ##########
select c.cno,cname
from (select sc.cno from s join sc on s.sno = sc.sno where s.sno = 's003') as sub
join c on sub.cno = c.cno;
UNION 联合查询(删除重复行)
SELECT语句1 UNION[ALL] SELECT语句2 [UNION [ALL]< SELECT语句3>][...n]
########## 查询来自'北京'或'上海'的学生学号、姓名、所在院系和家庭地址 ##########
select s.sno,sname,dept,addr from s where addr = '北京' union select s.sno ,sname ,dept,addr from s where addr = '上海';