多表查询---连接查询
若一个查询同时涉及两个以上的关系,则称之为连接查询。连接查询是关系数据库中最主要的查询,包括:交叉连接查询 、内连接查询 、外连接查询。
(一)交叉连接查询:又称广义笛卡儿积,是不带连接谓词的查询。
例:求学生表student和课程表course的广义笛卡儿积。
SELECT * FROM student,course;
-- 或
SELECT * FROM student CROSS JOIN course;
(二)内连接查询:内连接查询中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为: <表名1>[INNER] JOIN<表名2>ON<表名1>.<列名1><比较运算符><表名2>.<列名2>
- 其中比较运算符主要有: =、<>、<、>、<=、>=。
- 当连接运算符为“=”时,称为等值连接,使用其他运算符称为非等值连接。
- 连接谓词中的列名称为连接字段。
- 连接条件中的各连接字段类型必须是可比的,但不必是相同的。
a. 等值连接:当比较运算符为“=”时,称为等值连接,其一般格式为:
<表名1>[INNER] JOIN<表名2>ON<表名1>.<列名1>=<表名2>.<列名2>
连接条件也可以放在WHERE子句中,其格式为:
<表名1>.<列名1> =<表名2>.<列名2>
例:求学生以及其选修课程的情况。
-- 格式1: SELECT student.*,score.* FROM student JOIN score ON student.sno=score.sno;
-- 格式2: SELECT student.*,score.* FROM student,score WHERE student.sno=score.sno;
b. 自然连接:当进行连接的两个表中有同名列时,可以使用自然连接来完成,其一般格式为:
<表名1>NATURAL JOIN<表名2>
也可以使用格式: <表名1>JOIN<表名2>USING<字段>
注意:自然连接与其他连接的区别是去掉重复的列。
例:用自然连接完成:求学生以及其选修课程的情况。
-- 格式1: SELECT * FROM student NATURAL JOIN score ;
-- 格式2: SELECT * FROM student JOIN score USING(sno);
c. 自身连接:连接操作不仅可以在两个表之间进行,也可以是一个表与其自身进行连接,称为表的自身连接。当表进行自身连接时,为了区别两个表,必须给他们取不同的别名,表取别名的方式为: 表名 别名
进行自身连接时,由于所有属性名都是同名属性,因此必须使用别名前缀。
其一般格式为:
<表名> aJOIN<表名> bONa. <字段><较比运算符>b. <字段>
例:求年龄大于王燕的所有学生的姓名、专业名和出生日期。
SELECT b.sname,b.dept,b.birthday FROM student a JOIN student b ON a.birthday<b.birthday WHERE a.sname='王燕' ;
(三)外连接查询:
在通常的连接操作中,只有满足连接条件的记录才能作为结果输出,有些用户需要的信息可能在结果中就无法出现,可使用外连接解决这个问题,外连接的格式为:
<表名1> {LEFT|RIGHT|FULL} OUTER JOIN <表名2> ON 连接条件
- LEFT 表示左边的表中所有记录都出现在结果中;
- RIGHT表示右边的表中所有记录都出现在结果中;
- FULL表示左右两边的表中所有记录都出现在结果中;
- 注意:不符合连接条件的连接空记录。
(MySQL暂不支持全外连接)
例:查找未选修任何课程的学生。
SELECT * FROM student a LEFT JOIN score b on a.sno=b.sno WHERE b.sno is null;
