【学习笔记】联表查询和自连接

联表查询和自连接

 

七种join理论

img

 

想要在多个表中查询数据的思路:

  1. 分析需求,即想要查询哪些字段,以及这些字段来自哪些表

  2. 确定使用哪种连接,即七种join中的哪一种

    • 确定交叉点

    • 判断条件:即两个表中相同的字段

我们首先以查询所有学生的学号、姓名、科目、考试成绩,为例

student表是做表,result表是右表

  • inner join

    SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
    FROM `student` s
    INNER JOIN `result` r
    ON s.studentno = r.studentno

    结果是查询到了参加了考试的学生的信息,没有参加考试的学生没有被查出来,以及没有对应student表的考试信息也没有被查出来,也就是左表和右表在对方那边是null的信息,没有被查出来。

  • left join

    SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
    FROM `student` s
    LEFT JOIN `result` r
    ON s.studentno = r.studentno

    image-20220930153156562

    从结果我们可以看出,subjectno和studentresult为空的学生也被查询了出来

 

  • right join

    SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
    FROM `student` s
    RIGHT JOIN `result` r
    ON s.studentno = r.studentno

    image-20220930153551690

    与left join 相同,right join 把右表中没有对应左表数据的信息,也查出来了

 

总结:

操作 描述
INNER JOIN 会返回两个表中都有的数据
LEFT JOIN 会从左表中返回所有的值,不管右表有没有匹配
RIGHT JOIN 会从右表中返回所有的值,不管左表有没有匹配

 

如果有其他判断条件,可用where来控制

如查询缺考的同学,即studentresult is null

SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` s
LEFT JOIN `result` r
ON s.studentno = r.studentno
WHERE studentresult IS NULL

image-20220930154224825

 

例子:查询参加考试的同学的信息:学号、姓名、科目名、分数

涉及到了三个表

SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN result r
ON s.studentno = r.studentno 
INNER JOIN `subject` su
ON r.subjectno = su.subjectno

先连接两个表,然后用结果去连接另外一个表

 

sql92

以上都是sql99语法,除此之外还有sql92语法

sql92语法: 在from中选择多个表,用where控制相同的条件

SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` s,result r
WHERE s.studentno = r.studentno 

这样起到的效果和 inner join 相同

 

自连接

image-20220930162349821

现在我们有这样一张表,categoryid是科目的id,pid是父科目的id,pid为1的说明没有父科目,categoryname是科目名

我们列几张表来说明它们的关系

父科目

categoryid categoryname
2 信息技术
3 软件开发
5 美术设计

子科目

pid categoryid categoryname
2 8 办公信息
3 4 数据库
3 6 web开发
5 7 ps技术

父科目对应子科目

父科目 子科目
信息技术 办公信息
软件开发 数据库
软件开发 web开发
美术设计 ps技术

用sql去实现

SELECT a.categoryname AS '父科目',b.categoryname AS '子科目'
FROM category a,category b
WHERE a.categoryid = b.pid

image-20220930163806009

 

核心就是:把一张表拆成两张表

posted @ 2022-09-30 16:49  GrowthRoad  阅读(35)  评论(0编辑  收藏  举报