前面的查询是针对一个表进行的。若是一个查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询、和复合条件连接查询等。
1. 等值与非等值连接查询
等值连接:连接运算符为等号;
非等值连接:使用其他运算符;
连接查询的where子句中用来连接两个表的条件称之为连接条件或者连接谓词,其一般格式为:
[ <表名1>.] <列名1> <比较运算符> [ <表名2>.] <列名2>
其中比较云算符主要有=、>、<、>=、<=、!=(或<>)等。
例1、 查询每个学生及学生及其选修课程的情况:
select student.*,sc.*
from student,sc
where student.sno = sc.sno //这里studnet和sc表中都有sno列
若在等值连接中把目标列中重复的属性去掉则为自然连接
例2、 如上例1.1
select student.sno,sname,ssex,sage,sdept,cno,grade
from student,sc
where student.sno = sc.sno
例3、 查询选修课程号为2号的学生姓名
select sname from student,sc
where student.sno = sc.sno and sc.cno = '2'
1.1使用表的别名
该查询在表中出现同名字段学号Sno和课程号Cno,为了区分字段,加上了表名,整个查询命令显得十分冗长。为了简洁起见,用户可以采用为表指定别名的方法 。
例3、 查询学号为’200215121’的学生的姓名、院系、课程号及成绩;
select a.sname,a.sdept,b.cno,b.grade
from student a,sc b
where a.sno = '200215121' and a.sno = b.sno
2. 自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接;
由于所有属性名都是同名属性,因此必须使用别名前缀。需要给表起别名以示区别。
select first.cno,second.cpno
from course first,course second
where first.cpno = second.cno
3. 使用JOIN关键字实现表的连接
在SELECT语句的FROM子句中,通过指定不同类型的JOIN关键字可以实现不同的表的连接方式,而在ON关键字后指定连接条件。
基本连接语法如下:
select column_list from join_table
join_type join_table
on (join_condition)
说明:
join_table:指出参与连接操作的表名;
join_type为连接类型,可分为3种:内部连接、外部连接和交叉连接
3.1内连接
内部连接是使用比较运算符比较要连接列中的值的连接。
例4、 从student和sc表中查询每个学生的各门选修课成绩信息,要求返回的结果中包含学生的学号、姓名、性别、选修课程序号及成绩。
select a.sno,sname,ssex,cno,grade
from student a inner join sc b
on a.sno = b.sno
3.2 外连接
在通常的连接操作中,只有满足连接条件的行才能作为结果输出,但有些情况下,也需要输出其他相关选项,这就用到了外连接。
外连接可分为:左连接(left)、右连接(right)、全连接(full)三种:
- 左外连接(left outer join):结果表中除了包括满足连接条件的行外,还包括左表的所有行,没有值补为null;
select <目标列表达式>[,<目标列表达式>]......
from <表名1>left [outer] join <表名2>
on <连接条件>
- 右外连接 (right outer join):结果表中除了包括满足连接条件的行外,还包括右表的所有行,没有值补为null;
select <目标列表达式> [,<目标列表达式>]......
from <表名1> right [outer] join <表名2>
on <连接条件>
- 完全外连接 (full outer join):结果表中除了包括满足连接条件的行外,还包括两个表的所有行,没有值补为null;
select <目标列表达式>[,<目标列表达式>]......
from <表名1> full [outer] join <表名2>
on <连接条件>
例5、 查询所有学生基本情况及他们选修课程的成绩(包括没有选修任何课的学生)
select student.*,grade
from student left outer join sc
on (student.sno = sc.sno)
4. 多表连接
多表连接:就是将两个以上的表进行连接。
例6、 查询每个学生的学号、姓名、选修的 课程名及成绩
select student.sno,sname,cname,grade
from student,sc,course
where student.sno = sc.sno and sc.cno = course.cno