MySQL的DQL数据查询语言--联表查询和自连接(超详细小白详解)

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`

查询结果为:

在这里插入图片描述

Guess you like

Origin blog.csdn.net/l1341886243/article/details/118577619