• SQL表与表连接关系


    一、SQL连接方式

    left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。

    right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。

    inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。

    full join:外连接,返回两个表中的行:left join + right join。

    cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

    二、关键字ON与WHERE执行顺序(LEFT JOIN 与 INNER JOIN 区别)

    如:Department表

    Employee表

    LEFT JOIN两条SQL语句:

    执行结果如下:

    发现数据有很大差别 返回的结果集不一样

    INNER JOIN两条SQL

     

    相信大家已经清楚两者的数据差异了吧,接下来和大家分析一下产生此问题的原因:

    1、数据库中表与表关联都会组合成一张临时表,并将临时表的结果集返回给用户(Worktable)。

    2、LEFT JOIN 与 REGIN JOIN 下的On条件是在生成临时表时使用的条件,无论条件是否为真都会筛选左(右)表中全部数据,然而FULL JOIN 具备LEFT JOIN 与 RIGHT JOIN的全部特性并集,INNER JOIN 没有这个特性放在ON 后面与WHERE 一样

    eg:Left JOIN 下ShowPlan_text 文本, 去除了ON后面针对Department表过滤条件 返回Department 全部数据

    3、ON是生成临时表时使用的条件 ,WHERE 对中间表数据过滤(多表关联时ON会在WHERE之前执行 生成中间表 在进行条件过滤

    SQL执行执行计划如下:

    4、 SQL Server有几种方式查找数据记录

    [Table Scan] 表扫描(最慢),对表记录逐行进行检查

    [Clustered Index Scan] 聚集索引扫描(较慢),按聚集索引对记录逐行进行检查

    [Index Scan] 索引扫描(普通),根据索引滤出部分数据在进行逐行检查

    [Index Seek] 索引查找(较快),根据索引定位记录所在位置再取出记录

    [Clustered Index Seek] 聚集索引查找(最快),直接根据聚集索引获取记录

    5、没有主键的表查询就会进行表扫描

    6、有主键的表查询就会进行聚集索引扫描

    7、创建非聚集索引的表查询[索引扫描+书签查找]

    书签查找:通过非聚集索引找到所求的行,但这个索引并不包含显示的列,因此还要额外去基本表中找到这些列,所以要进行键查找,如果基本表在堆中则Key Lookup会变成RID查找,这两个查找统称为书签查找。

    即: CREATE INDEX XXXX ON TABLE(CREATEDATE)

    8、创建非聚集索引包含其他显示列[索引查找]

    即: CREATE INDEX XXXX ON TABLE(CREATEDATE) INCLUDE (A,B,C)

    9、创建非聚集索引包含其他显示列 并把聚集索引列当作条件[聚集索引查找]

  • 相关阅读:
    Prometheus服务发现
    持久化查询
    PromQL进阶
    PromQL基础
    Prometheus概述
    监控系统概念
    zabbix5x解决中文字体问题
    allure 插件新手 demo
    关于时间复杂度~
    IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库
  • 原文地址:https://www.cnblogs.com/tx720/p/7801355.html
Copyright © 2020-2023  润新知