目录
前言
在实际开发中,经常需要同时从两个表或多个表中检索数据,并且每一个表中的数据往往作为一个单独的列出现在结果集中。在表连接技术中,可分为内连接、外连接 和交叉连接等。
一、内连接
内连接是把两个表中的数据连接生成第三个表,第三个表中仅仅包含两张表共同拥有的部分的数据。在内连接中,使用 INNER JOIN 连接运算符,并且使用 ON关键字指定连接条件。
在表连接中,如果 JOIN 前面没有明确指定连接类型,那么默认为内连接。
-- 内连接语法格式
SELECT select_list FROM 表1
INNER JOIN 表2
ON 连接条件
或
SELECT select_list
FROM 表1, 表2
WHERE 连接条件
-- 连接条件格式
表1.列1 = 表2.列2
-- 示例:查询每个学生的姓名、课程号 和成绩。
select sname, cno, score
from student
inner join sc
on student.sno = sc.sno
或
select sname, cno, score
from student , sc
where student.sno = sc.sno
当从多个表中查询的列名相同时,列名前必须添加表名;列名不同是可以忽略不加,但加上可以增加可读性。
在 FROM 子句中,可以为表定义一个临时别名,在查询中引用,以缩写表名减少代码繁杂。
二、自连接
连接操作不仅可以在不同表上进行,在同一张表中也可以进行自身连接,即同一个表的不同行连接起来。自连接可以看作是一张表的两个副本之间的连接,且必须给表指定两个别名,使其在逻辑上成为两张表。
-- 示例:查看 student表中,同名学生的信息。
select *
from student as li
inner join student as rl
on li.sname = rl.sname and li.sno <> rl.sno
在评论信息的存储中,通常把所有评论信息保存到一种表中,这时就需要使用表的自连接把不同评论之间关联起来。
三、外连接
1、左外连接
左外连接,是以左边表的数据为基准,去匹配右边表的数据,如果匹配到则显示,匹配不到就显示 NULL。
-- 语法结构
SELECT select_list
FROM 表1
LEFT JOIN 表2
ON 表1.列1 = 表2.列2
-- 示例:查看所有学生及其选修课程的成绩情况(含未选课程的学生信息)。
select student.*, sc.cno, sc.score
from student
left join sc
on student.sno = sc.sno
2、右外连接
右外连接,是以右边表的数据为基准,去匹配左边表的数据,如果匹配到则显示,匹配不到就显示 NULL。
-- 语法结构
SELECT select_list
FROM 表1
RIGHT JOIN 表2
ON 表1.列1 = 表2.列2
-- 示例:查看成绩在75分以上的学生学号、姓名、选修的课程号、课程名和成绩。
select student.sno, student.sname, sc.cno, course.cname, sc.score
from student
left join sc
on student.sno = sc.sno
left join course
on sc.cno = course.cno
where score >=75
3、全外连接
全外连接,顾名思义,就是将两张表中的数据都显示出来,没有对应的值就显示 NULL。
-- 语法结构
SELECT select_list
FROM 表1
FULL [ OUTER ] JOIN 表2
ON 表1.列1 = 表2.列2
-- 示例:查看每个学生及其选修课程情况(含未选课程的学生信息及未被选修的课程信息)。
select student.*, sc.cno, course.cname
from student
full join sc
on student.sno = sc.sno
full join course
on sc.cno = course.cno
四、交叉连接
交叉连接,也称笛卡儿积,返回两个表的乘积。在检索结果中,包含所连接的两个表中所有行的全部组合。交叉连接使用 CROSS JOIN 关键字来创建。
列如,如果对 A表和 B表进行笛卡儿积,A表中有 5行数据,B表中有 12行数据,那么结果集中可以有60条数据。
-- 语法结构
SELECT 列
FROM 表1
CROSS JOIN 表2
-- 示例:查看所有学生所有可能的选课情况。
select student.*, sc.cno, sc.score
from student
cross join sc