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
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、创建⾮聚集索引包含其他显⽰列并把聚集索引列当作条件[聚集索引查]