表连接
表连接类型
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
是学生表的主键id
,course_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 != '胡凯';