Skip to content
On this page

表连接

表连接类型

  • INNER JOIN:内连接

  • LEFT JOIN:左外连接

  • RIGHT JOIN:右外连接

连接条件

使用ON关键字来设定连接条件,也可以使用WHERE

内连接INNER JOIN

  • 筛选同时符合左表和右表的查询条件(指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件)
SQL
# 使用ON关键字
SELECT * FROM student A INNER JOIN score B ON A.id = B.student_id;
# 还可以使用WHERE,和上面的查询是一样的
SELECT * FROM student A, score B WHERE A.id = B.student_id;

左外连接LEFT JOIN

  • 筛选左表的全部和右表符合条件的数据(左边表数据行全部保留,右边表保留符合连接条件的行)
SQL
SELECT * FROM student A LEFT JOIN score B ON A.id = B.student_id;

右外连接RIGHT JOIN

  • 筛选右表的全部和左表符合条件的数据(右边表数据行全部保留,左边表保留符合连接条件的行)
SQL
SELECT * FROM student A RIGHT JOIN score B ON A.id = B.student_id;

多表连接

使用多表连接时,要先考虑清楚一共需要查询几张表,是否需要中间过渡表来连接另外的表的数据,理清楚逻辑之后,SQL写起来就顺畅了

如下:共有3张表

学生表中存储学生基本信息

课程表中存储有哪些课程

分数表中存储学生的课程的分数

分数表中存了两个外键

其中student_id是学生表的主键idcourse_id是分数表的主键id

需求:查询学生名字为宗主的学生的各科成绩

分析:学生名称要从学生表中取得,学生课程要从课程表中取得,学生分数要从分数表中取得,所以要查询3张表

最终的SQL如下

SQL
SELECT s2.name, c1.name, s1.grade FROM score s1
INNER JOIN student s2
ON s1.student_id = s2.id
INNER JOIN course c1
ON s1.course_id = c1.id
WHERE s2.name = '宗主';

# 查询结果如下
s2.name,c1.name,grade
宗主,语文,80
宗主,数学,98
宗主,英语,118
宗主,物理,90
宗主,生物,86
宗主,化学,99
宗主,体育,100

自连接

自连接就是自身进行关联。虽然自连接的两张表都是同一张表,但是我们可以把它按两张表对待,这样理解就会容易些

例如:有一个学生表,要找出学生表中,年龄大于等于胡凯年龄的人

实现该需求可以是用子查询自连接两种方式:

  • 使用子查询实现,首先先查询胡凯的年龄,然后再查询年龄大于等于他的
SQL
SELECT * FROM student WHERE age >= (SELECT age FROM student WHERE name = '胡凯') AND name != '胡凯';
  • 使用自连接实现
SQL
SELECT s2.* FROM student s1
INNER JOIN student s2
ON s1.age <= s2.age
WHERE s1.name = '胡凯'
AND s2.name != '胡凯';