首页 > 其他分享 >【学习笔记】联表查询和自连接

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

时间:2022-09-30 16:55:05浏览次数:54  
标签:JOIN 笔记 查询 studentno studentresult subjectno 联表 join 科目

联表查询和自连接

 

七种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

 

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

标签:JOIN,笔记,查询,studentno,studentresult,subjectno,联表,join,科目
From: https://www.cnblogs.com/wztblogs/p/16745442.html

相关文章

  • 阅读笔记2
    以下为《代码大全2》的阅读收获第一处是关于如何改善软件质量。一种强有力的方法就是根据软件的各种外在特性和内在特性明确定义出软件质量的目标。这个步骤经常被忽......
  • PADS应用笔记:Layout隐藏线段方框和叉号
    问题用layout看图纸时方框和叉号太影响观感了,如何隐藏方法方框叉号......
  • adb笔记
    1、查找文件adbshellbusyboxfind.-name<文件名>模糊查询:adbshellbusyboxfind.-name<*关键字*>2、安装应用adbinstall<apk>3、卸载应......
  • PADS应用笔记:Layout怎么检测错误
    问题一边layout结束后要检查是否有问题,那如何启动设计验证呢方法选项栏选择验证设计然后根据需求对相关特性进行验证......
  • PADS应用笔记:Layout时怎么加泪滴焊盘
    问题画好的板子要给过孔和焊盘加泪滴,具体要怎么做呢方法现在设置中选择显示泪滴和生产泪滴然后随意选择一个线,右键选择泪滴属性先点添加(已经添加过的可以选择修改......
  • Python 字典学习笔记
    字典(Dictionary)字典(Dictionary)是一个无序、可变和有索引的集合。在Python中,字典用花括号{}编写,拥有键和值。'''单级实例操作classroom={'Jack':12,'Amy':11,'J......
  • MYSQL 列值为JSON串匹配条件查询
    这里需定位到你要查询的字段再json中的位置。比如我需要我的列值JSON格式如下:我需要匹配Tin(123456,223432)可以像下面这样写SELECTREPLACE(JSON_EXTRACT(wms_r......
  • 9月份读书笔记1
    importjava.util.Scanner;importjava.util.Random;importjava.math.BigInteger;publicclasssizeyunsuan{ //出题参数 Randomr=newRandom(); Strings[]=newStr......
  • 9月份读书笔记2
    importjava.util.Scanner;importjava.util.Random;importjava.math.BigInteger;publicclasssizeyunsuan{ //出题参数 Randomr=newRandom(); Strings[]=newStr......
  • 学习笔记——Django项目的删除数据、查询数据(filter、get、exclude)
    2022-09-30删除数据:方式一:打开pycharm,进入虚拟环境,进入shell环境(pythonmanage.pyshell)。删除数据,接上面的笔记——“学习笔记——Django项目的新增数据、修改数据”......