MySQL 数据库学习笔记(续)
四、DQL 数据查询语言
4.4 联表查询
JOIN 对比
-- =================== 联表查询 JOIN ==================== --
-- join (连接的表) on (判断条件) 连接查询
-- where 等值查询
-- 查询参加了考试的同学(学号 姓名 科目编号 分数)
SELECT FROM student
SELECT FROM result
/*思路
1.分析需求,分析查询的字段来自那些表,(连接查询)
2.确定使用那种连接查询? 7种
-- 确定交叉点(这两个表中那个数据是相同的)、
-- 判断的条件 : 学生表中的 `studentno` 等于 成绩表中的 `studentno`
*/
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
INNER JOIN result AS r
WHERE s.studentno = r.studentno
-- RIGHT JOIN
SELECT s.studentno,studentname,subjectno,studentresult
FROM student s
RIGHT JOIN result r
ON s.studentno = r.studentno
-- LEFT JOIN
SELECT s.studentno,studentname,subjectno,studentresult
FROM student s
LEFT JOIN result r
ON s.studentno = r.studentno
| 操作 |
描述 |
| INNER JOIN |
如果表中至少有一个匹配,就返回行 |
| LEFT JOIN |
会从左表中返回所有的值,即使右表中没有匹配 |
| RIGHT JOIN |
会从右表中返回所有的值,即使左表中没有匹配 |
-- 查询缺考的同学
SELECT s.studentno,studentname,subjectno,studentresult
FROM student s
LEFT JOIN result r
ON s.studentno = r.studentno
WHERE studentresult IS NULL
/*
1. 两张表的结构
student 学生表:存所有学生
result 成绩表:只存参加考试、有成绩的学生
2. 缺考学生的特点
在 student 里 有
在 result 里 没有
3. 不同 JOIN 的区别
① INNER JOIN(普通连接)
只会返回两边都存在的学生
→ 缺考的直接被过滤掉,查不出来
② LEFT JOIN(左连接)
以左边的 student 表为准
不管右边 result 有没有记录,左边学生全部保留
匹配不到成绩的,studentresult 就会变成 NULL
*/
-- 思考题 : 查询了参加考试的同学信息: (学号 学生姓名 科目名 分数)
/*思路
1.分析需求,分析查询的字段来自那些表,student result subject(连接查询)
2.确定使用那种连接查询? 7种
-- 确定交叉点(这两个表中那个数据是相同的)、
-- 判断的条件 : 学生表中的 `studentno` 等于 成绩表中的 `studentno`
*/
SELECT s.studentno 学号,studentname 学生姓名,subjectname 科目名,studentresult 分数
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno
INNER JOIN subject sub
ON r.subjectno = sub.subjectno
-- 我要查询那些数据 SELECT...
-- 从那几个表中查 FROM 表 xxx JOIN 连接的表 ON 交叉条件
-- 假设存在多张表查询,慢慢来先查询两张表然后在慢慢增加
-- from a left join b 以左边的表为准
-- from a right join b 以右边的表为准
联表查询练习
-- =================== 联表查询练习 ==================== --
-- 查询学生所属的年级 (学号 学生的姓名 年级名称)
SELECT studentno 学号,studentname 学生的姓名,gradename 年级名称
FROM student s
INNER JOIN grade g
ON s.gradeid = g.gradeid
-- 查询科目所属的年级 (科目名称 年级名称)
SELECT subjectname 科目名称,gradename 年级名称
FROM `subject` sub
INNER JOIN grade g
ON sub.gradeid = g.gradeid
-- 查询了参加了 高等数学-1 考试的同学信息: (学号 学生姓名 科目名 分数)
SELECT s.studentno 学号,studentname 学生姓名,subjectname 科目名,studentresult 分数
FROM student AS s
INNER JOIN result r
ON s.studentno = r.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname = '高等数学-1'
总结
- 联表查询核心:使用
JOIN 表 ON 匹配条件 实现多表数据查询,替代 where 等值查询
- 三种 JOIN 区别:
INNER JOIN:只返回两表匹配的数据
LEFT JOIN:左表数据全部返回,右表无匹配则为 NULL
RIGHT JOIN:右表数据全部返回,左表无匹配则为 NULL
- 多表联表:可连续使用 JOIN 连接 3 张及以上表,逐步添加连接条件
- 实用场景:可查询学生成绩、学生年级、科目年级、缺考学生等关联数据