表连接
表连接类型
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 != '胡凯';