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、创建非聚集索引包含其他显示列 并把聚集索引列当作条件[聚集索引查找]
SQL表与表连接关系的更多相关文章
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- 章节2:SQL之多表连接
原文:章节2:SQL之多表连接 Sql的多表连接关系有:内连接.外连接和交叉连接. 先建立两个用于演示的表: TB_Characters: Id Character 1 内向 2 外向 3 中性性格 ...
- Day055--MySQL--外键的变种,表与表的关系,单表查询,多表查询, 内连接,左右连接,全外连接
表和表的关系 ---- 外键的变种 * 一对多或多对一 多对多 一对一 参考 https://www.cnblogs.com/majj/p/9169416.html 如何找出两张表之间的关系 分析步骤 ...
- SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)
SQL Fundamentals || Oracle SQL语言 一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查 ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- SQL的多表连接查询
SQL的多表连接查询 多表连接查询具有两种规范,SQL92和SQL99规范. SQL92规范支持下列多表连接查询: (1)等值连接: (2)非等值连接: (3)外连接: (4)广义笛卡尔积: SQL9 ...
- Oracle 表三种连接方式(sql优化)
在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式: 嵌套循环(Nested Loops (NL)) (散列)哈希 ...
- SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数
---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ ...
- SQL语法 之 表连接
一.连接条件 连接查询中用来连接连个表的条件称为连接条件或连接谓词.其形式为: [<表1>].<列名1> <连接运算符> [<表2>].<列2&g ...
随机推荐
- 谈谈TensorFlow with CPU support or TensorFlow with GPU support(图文详解)
不多说,直接上干货! You must choose one of the following types of TensorFlow to install: TensorFlow with CPU ...
- js调试记录,将客户的调试信息保存到服务器端的一个小方法。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- VMware一些使用心得
这段时间VMware workstation用得较多,装了好几个虚拟机,有win2003,win2008,win7,还分32位,64位.装了这么多,要么是用于安装一些软件,比如oracle12c,因为 ...
- Dom4J XML转bean
package com.baiwang.bop.utils; import com.baiwang.bop.client.BopException; import org.dom4j.Element; ...
- div内鼠标坐标位置及绝对和相对坐标获取
JQuery 获得div绝对,相对位置的坐标方法 1 2 3 4 5 6 获取页面某一元素的绝对X,Y坐标 var X = $('#DivID').offset().top; var Y = $( ...
- 关于warning: Clock skew detected. Your build may be incomplete. 的解决方法【转】
本文转载自:http://blog.csdn.net/jeesenzhang/article/details/40300127 今天发现电脑的系统时间不正确,因此将时钟进行了修改,回头编译Linux ...
- qemu-kvm磁盘读写的缓冲(cache)的五种模式
qemu-kvm磁盘读写的缓冲(cache)模式一共有五种,分别是writethrough, wirteback, none, unsafe, directsync当你对VM读写磁盘的性能有不同的要求 ...
- I.MX6 Battery issues
/******************************************************************** * I.MX6 Battery issues * 说明: * ...
- 并不对劲的bzoj4560:p3269:[JLOI2016]字符串覆盖
题目大意 \(T\)(\(T\leq10\))组询问 每组询问给出一个字符串\(A\)(\(|A|\leq10^4\)),\(n\)(\(n\leq4\))个\(A\)的子串\(B_1,B_2,B_3 ...
- BZOJ_2819_Nim_树状数组维护出栈入栈序
BZOJ_2819_Nim_树状数组维护出栈入栈序 Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任 ...