连接查询

了解交叉连接、内连接和外连接的概念和写法

概述

“连接”是将多个数据源融合到一起的一种方法(另一种融合方法是集合运算)。

演示数据

你可以先跳过这一节,演示数据仅用于理解各种连接方式的差异。

学生表数据:

学号

姓名

001

张三

002

李四

003

王五

选课表数据:

学号

课程号

001

0000001

001

0000002

002

0000001

004

0000001

交叉连接

概念

若将数据源 A 和 B 进行交叉连接,即执行了笛卡尔积运算,最终会得到 NANBN_{A}N_{B} 行数据。

按“学号”把演示数据两表进行交叉连接,会得到如下结果:

学生表.学号

姓名

课程表.学号

课程号

001

张三

001

0000001

001

张三

001

0000002

001

张三

002

0000001

001

张三

004

0000001

002

李四

001

0000001

002

李四

001

0000002

002

李四

002

0000001

002

李四

004

0000001

003

王五

001

0000001

003

王五

001

0000002

003

王五

002

0000001

003

王五

004

0000001

写法

FROM 子句中指定多个数据源。示例如下:

SELECT student.学号, 姓名, 成绩
FROM student, course, sc;

内连接

概念

内连接需要指定关联字段,用来表示两数据源之间的关联。只有两数据源的关联字段的共有部分才会被连接,非共有部分的数据都将被丢弃(类似于一个交集)。

按“学号”把演示数据两表进行内连接,将得到如下结果:

学号

姓名

课程号

001

张三

0000001

001

张三

0000002

002

李四

0000001

学号是关联字段,但学号“003”和“004”不是两数据源共有的,因此不会出现在内连接中。

写法一

基于交叉连接改进,在 WHERE 子句中添加关联条件,示例如下:

SELECT s.学号, 姓名, 成绩
FROM student s, course c, sc
WHERE s.学号=sc.学号 AND c.课程号=sc.课程号;

写法二

使用 INNER JOIN ... ON ... 语法,示例如下:

-- ON 的后面是关联条件
SELECT s.学号, 姓名, 成绩
FROM student s INNER JOIN sc ON s.学号=sc.学号
  JOIN course c ON c.课程号=sc.课程号;

写法三

使用 INNER JOIN ... USING (...) 语法,当两数据源的关联字段名一致时,可以使用此写法简化关联条件。关联字段名因为必须是一致的,所以可以不用指定数据源,前提是不与其它数据源发生冲突。示例如下:

-- student、sc 和 course 表的关联字段名都是“学号”
-- 查询字段“学号”不用指定数据源
SELECT 学号, 姓名, 成绩
FROM student s INNER JOIN sc USING(学号)
  JOIN course c USING(课程号);

在 MySQL 中,连接默认使用内连接,也就是说 JOININNER JOIN 表示的意思是一致的。

左外连接

概念

写法

右外连接

概念

写法

最后更新于

这有帮助吗?