• DQL查询语句之联表查询JoinON


    联表查询

    JOIN

    七种Jion:

    连接查询

            如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
    内连接 inner join
            查询两个表中的结果集中的交集
    外连接 outer join
            左外连接 left join(以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
            右外连接 right join(以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
            等值连接和非等值连接

    操作描述
    inner join如果表中至少有一个匹配,就返回行
    left join会从左边中返回所有的值,即使右表中没有匹配
    right join会从右边中返回所有的值,即使左表中没有匹配

    例:

    result:

    student:

    1. -- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
    2. SELECT * FROM student;
    3. SELECT * FROM result;
    4. /*思路:
    5. (1):分析需求,确定查询的列来源于两个类,student result,连接查询
    6. (2):确定使用哪种连接查询?(内连接)
    7. */
    8. SELECT s.studentno,studentname,subjectno,StudentResult
    9. FROM student s
    10. INNER JOIN result r
    11. ON r.studentno = s.studentno
    12. -- 右连接(也可实现)
    13. SELECT s.studentno,studentname,subjectno,StudentResult
    14. FROM student s
    15. RIGHT JOIN result r
    16. ON r.studentno = s.studentno
    17. -- 等值连接
    18. SELECT s.studentno,studentname,subjectno,StudentResult
    19. FROM student AS s , result AS r
    20. WHERE r.studentno = s.studentno
    21. -- 左连接 (查询了所有同学,不考试的也会查出来)
    22. SELECT s.studentno,studentname,subjectno,StudentResult
    23. FROM student s
    24. LEFT JOIN result r
    25. ON r.studentno = s.studentno
    26. -- 查一下缺考的同学(左连接应用场景)
    27. SELECT s.studentno,studentname,subjectno,StudentResult
    28. FROM student s
    29. LEFT JOIN result r
    30. ON r.studentno = s.studentno
    31. WHERE StudentResult IS NULL
    32. -- 内连接:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
    33. SELECT s.studentno,studentname,subjectname,StudentResult
    34. FROM student AS s
    35. INNER JOIN result AS r
    36. ON r.studentno = s.studentno
    37. INNER JOIN `subject` sub
    38. ON sub.subjectno = r.subjectno

    小结:

            1.我要查询哪些数据 select....

            2.从那几个表中查 FROM (表 XXX) join (连接表) ON (交叉条件)

            3.假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加

            4.FROM a left join b 这个就是把a表全部包括,再去找b中的东西,没有就是null(左连接)

            5.FROM a right join b 这个就是把b表全部包括,再去找a中的东西,没有就是null(右连接)


    自联接

            自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

    例:

    1. CREATE TABLE `category`(
    2. `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
    3. `pid` INT(10) NOT NULL COMMENT '父id',
    4. `categoryname` VARCHAR(50) NOT NULL COMMENT '主题名字',
    5. PRIMARY KEY (`categoryid`)
    6. ) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
    7. INSERT INTO `category` (`categoryid`, `pid`, `categoryname`)
    8. VALUES ('2','1','信息技术'),
    9. ('3','1','软件开发'),
    10. ('5','1','美术设计'),
    11. ('4','3','数据库'),
    12. ('8','2','办公信息'),
    13. ('6','3','web开发'),
    14. ('7','5','ps技术');

        父类

             先看pid,去找相同的pid(pid = 1),然后去列出对应的categoryid

    categoryidcategoryName
    2信息安全
    3软件开发
    5美术设计

        子类

    pidcategoryidcategoryName
    34数据库
    28办公信息
    36web开发
    57ps技术

        操作:查询父类对应的子类关系

    父类子类
    软件开发数据库
    信息安全办公系统
    软件开发web开发
    美术设计ps技术
    1. -- 查询父子信息:把一张表看成为两个一摸一样的表
    2. SELECT a.`categoryname` AS '父栏目',b.`categoryname` AS '子栏目'
    3. FROM `category` AS a,`category` AS b
    4. WHERE a.`categoryid` = b.`pid`

        运行结果:

  • 相关阅读:
    swift 侧滑返回
    Linux下安装两个版本python
    Dockerfile的概述和构建
    C语言指针操作(七)*指针数组和多重指针
    云e办(后端)——导入导出员工数据(EasyPoi注解使用)
    黔院长 | 邀您一同共筑养生健康项目!
    【矩阵论】3. 矩阵运算与函数——张量积
    学习vue一些小记
    神经网络建模的适用范围,神经网络建模流程详解
    腾讯季报图解:营收1340亿降3% 马化腾称主动退出非核心业务
  • 原文地址:https://blog.csdn.net/weixin_48426115/article/details/126214057