• hi mate, lets recall the bloody “JOIN“


    补补数据库基础

    上图中,表A的记录是123,表B的记录是ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用null填充。

    注意:多表连接查询会比直接使用自带的API查询表中的一个属性,再根据属性查询另一个表,一个一个查询来得快。所以,我们要善用多表连接查询。

    举个例子:

    学生表:


    s_id:学生学号
    s_name:学生名称
    s_class:学生班级

    老师表:


    t_id:老师id
    t_class:老师管理的班级
    t_name:老师名称

    内连接(INNER JOIN)

    内连接:,,JOIN,INNER JOIN
    如果输入JOIN,那么默认就是INNER JOIN内连接

    1. /* 内连接 */
    2. SELECT * FROM student INNER JOIN teacher ON s_class=t_class
    3. /* 我比较喜欢这种,但是上面那种效率会更高,因为 JOIN 的优先级高于 逗号,,所以如果可以的话,尽量使用上面的 */
    4. SELECT * FROM student,teacher WHERE s_class=t_class

    补充:
    在使用 join 时,on 和 where 条件的区别如下:
    1、on 条件是在生成临时表时使用的条件,它不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。
    2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边或者右边表的记录)了,条件不为真的就全部过滤掉。

    而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

     外连接(OUTERJOIN)

            左外连接(LEFT JOIN)

    左外连接:LEFT JOINLEFT OUTER JOIN
    
    1. /* 左连接 */
    2. SELECT * FROM student LEFT JOIN teacher ON s_class=t_class

             右外连接(RIGHT JOIN)

    右外连接:RIGHT JOINRIGHT OUTER JOIN
    
    1. /* 右连接 */
    2. SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class

     全外连接(FULL JOIN) 

    全外连接:FULL JOINFULL OUTER JOIN

    注意:Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+union+右外连接实现。 

    1. /* 全连接(不适用于MYSQL) */
    2. SELECT * FROM student FULL JOIN teacher ON s_class=t_class
    3. /* 全连接 */
    4. SELECT * FROM student LEFT JOIN teacher ON s_class=t_class
    5. UNION
    6. SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class

     交叉连接(笛卡尔积)(CROSS JOIN)

    笛卡尔积:对所有元素一一映射,排列组合

    1. /* 交叉连接 */
    2. SELECT * FROM student CROSS JOIN teacher

    自链接 

     

    自连接作为一种特例,可以将一个表与它自身进行连接,称为自连接。
    若要在一个表中查找具有相同列值的行,则可以使用自连接
    使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。

    1. SELECT a.学号, a.课程号, b.课程号, a.成绩
    2. FROM student a JOIN student b
    3. ON a.成绩=b.成绩 AND a.学号=b.学号 AND a.课程号!=b.课程号

     

    REFERENCE:

    【SQL】JOIN 连接:内连接、外连接、交叉连接、自连接、等值连接、自然连接 - Nemo& - 博客园

  • 相关阅读:
    在 Solidity 中 ++i 为什么比 i++ 更省 Gas?
    【C++】实现D3D9 的 Inline hook
    人工智能 | ShowMeAI资讯日报 #2022.06.24
    【优化算法】基于matlab量子粒子群算法求解单目标优化问题【含Matlab源码 2203期】
    Euro-NCAP-HWA测试流程中文版V1.1(2023发布)
    【编程题 动态规划】把数字翻译成字符串(详细注释 易懂)
    Flutter 问题集
    为什么亚马逊卖家一定要有独立站?新手低成本快速搭建跨境电商独立站完整图文教程
    Ubuntu中不能使用ifconfig命令
    【LeetCode】Day131-子集 I&II & 组合
  • 原文地址:https://blog.csdn.net/dongnihao/article/details/127981960