4.4、联表查询
JOIN
-- =======联表查询=========
-- 查询参加了考试的同学(学号、姓名、科目编号、分数)
SELECT * FROM student
SELECT * FROM result
/*
思路
1. 分析需求,分析查询哪些字段,这些字段来自哪些表,(两张表以上,联表查询)
2. 确定使用哪种联结查询?共有7种
确定交叉点(这两张表种的哪个数据是相同的)
判断的条件:学生表中的 studentno = 成绩表中的 studentno
*/
-- join on (链接的条件) 链接查询
-- where 等值查询
-- INNER JOIN
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s -- 左表
INNER JOIN `result` AS r -- 右表
ON s.`studentno`=r.`studentno`
-- RIGHT JOIN
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s -- 左表
RIGHT JOIN `result` AS r -- 右表
ON s.`studentno`=r.`studentno`
-- LEFT JOIN
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s -- 左表
LEFT JOIN `result` AS r -- 右表
ON s.`studentno`=r.`studentno`
-- 哪张表在上面,哪张就是左表
操作 | 描述 |
Inner Join | 根据查询的条件返回所需要的数据(有条件的膨胀/扩张返回数据)(实则是并集) |
Left Join | 返回左表中有的全部数据(右表中没有的) (左表是主表,右表是从表) |
Right Join | 返回右表中有的全部数据(左表中没有的) (右表是主表,左表是从表) |
-- ========联表查询 多张表查询=========
-- 查询了参加考试的同学信息:学号,学生姓名,科目名,分数
SELECT s1.`studentno`,`studentname`,`SubjectName`,`studentresult`
FROM student s1
RIGHT JOIN result r
ON s1.studentno=r.studentno
INNER JOIN `subject` s2
ON s2.subjectno=r.subjectno
-- 需要查询的哪些数据 select ....字段
-- 从哪张表中查询 from 表名 as 别名
-- 用哪种查询方式链接其他的表,根据实际需求来用(7种) 查询方式 表名 as 别名
-- 找到交叉点 别名.字段 = 别名.字段
-- 过滤筛选的条件 where ...
-- 如果多张表查询 --> 继续链接其他表来完成实际的需求...
-- 查询学员所属的年级(学号,学生的姓名,年级名称)
SELECT `studentno`,`studentname`,`gradename`
FROM `student` s
INNER JOIN `grade` g
ON s.`gradeid`=g.`gradeid`
-- 查询科目所属的年级(科目编号,科目名称,年级名称)
SELECT `SubjectNo`,`SubjectName`,`gradename`
FROM `subject` s
INNER JOIN `grade` g
WHERE s.`GradeID`=g.`gradeid`
-- 查询了参加 高等数学-2 考试的同学的信息:学号,学生姓名,科目名,分数
SELECT s.`studentno`,`studentname`,`SubjectName`,`studentresult`
FROM `student` s
INNER JOIN `subject` sub
ON s.`gradeid`=sub.`GradeID`
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
WHERE sub.`SubjectName`='高等数学-2'
自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
父类表
categoryid | pid | cateoryName |
2 | 1 | 信息技术 |
3 | 1 | 软件开发 |
5 | 1 | 美术设计 |
子类表
categoryid | pid | categoryName |
4 | 3 | 数据库 |
6 | 3 | web开发 |
7 | 5 | ps技术 |
8 | 2 | 办公信息 |
-- 查询父子信息 把一张表拆分为父类表a和子类表b
-- 子类表中的pid=父类表中的categoryid
SELECT a.`categoryName` AS 父类, b.`categoryName` AS 子类
FROM `category` AS a,`category` AS b
WHERE a.`categoryid`=b.`pid`
查询结果为: