zoukankan      html  css  js  c++  java
  • SQL中 LEFT JOIN ,RIGHTJOIN,INNER JOIN 的使用及优先级浅析

    首先了解JOIN的基本概念:

    join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

    INNER JOIN:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

    RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

    FULL JOIN 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

    通俗的解释是INNER JOIN就类似于查询多个表并且在WHERE之后加上联接这些表的唯一限定条件,以下两句SQL语句,返回相同的结果:

    select * from tb_Course as c,tb_CourseType as ct where c.ctpID=ct.ID
    
    select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID

    以此类推,LEFT JOIN 返回左表的所有行,也就是即使右表中无法找到对应左表记录的数据,也会返回数据。RIGHT JOIN 类似。而FULL JOIN就是LEFT 和 RIGHT 的并集,只要存在匹配就返回行。

    而本文需要解决或者验证的问题是在进行多表查询的时候,LEFT JOIN ,RIGHT JOIN 会不会有优先级。

    为了方便,就拿最简单的三表查询进行检验。在三表查询中,可能出现的情况也就是9种(暂时不考虑FULL JOIN)。

    首先运行下面语句:

    select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID

    得到的结果如图:

    当在上面语句之后再JOIN一张表的时候:

    select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID
                                            inner join tb_Teacher as t on t.CID=c.ID

    得到的结果如图:

    由此得到猜想,第二条语句首先进行了第一个JOIN,然后将此结果进行第二次JOIN,也就是是按照从左到右的顺序进行JOIN。而为了验证此猜想,就要进行其他的检验。方法很简单,依次按照先LEFT JOIN 后LEFT JOIN或者先RIGHT JOIN后LEFT JOIN的顺序进行检验,当检查完每个结果集时,是否遵循先前的猜想。

  • 相关阅读:
    C++ 解析CSV文件
    MFC/WTL 设置背景图和控件透明的方法
    VS2008安装x64版本所遇问题
    VS2012 安装番茄插件
    16年面试提问
    git 使用笔记
    03_运算符、键盘录入、流程控制
    02_java关键字、表识符、注释、进制转换、补码反码、数据类型转换
    01_计算机和java基础
    10 js一维数组、一维数组细节
  • 原文地址:https://www.cnblogs.com/adzhouyang/p/3147499.html
Copyright © 2011-2022 走看看