本文的内容结构:表的联结
一、为什么要用联结?
二、联结的两种写法
三、联结的类型(逻辑联结)cross join →equi join=inner join →outer join(left outer join、right outer join、full outer join)这是满足业务逻辑需求的部分。
四、多表联结的写法(联结两个表、联结三个或以上的表)
五、底层物理联结方式(Nested Loop Join, Merge Join, Hash Join)这是SQL性能优化的部分。
Inner join, Outer join为逻辑连接,即SQL语句中From子句的表的连接方式,我们看到的都是联结后的展示的结果,而其中底层的物理联结过程我们并不清楚。
数据库会根据分析结果采取合适的底层物理连接方式Nested Loop Join, Merge Join, Hash Join。
注意:
①子查询只是返回单列结果,不要当成联结
②join、cross join、inner join重点要看后面的语句有没有等值过滤的语句
③等值联结并不是默认是自然联结
④联结经常用到表别名,因为自连接必用,并且也是为了少写表名缩短语句
⑤联结写法逻辑的总结
查询SQL逻辑:
select 单列,多列,聚集函数、窗口函数
from ... join ... on ...(本文内容)
where 过滤条件
group by
order by
limit
一、为什么要用联结?
因为关系表的设计把不同的信息分解成多个表,通过一些共同的值来关联,
我们要用联结来关联查询多个表的数据,才能得到我们要的数据结果。
我们从表中查询数据,实际业务中很少只查单表,
单表是最简单的情况,基本都是要多表查询的。
二、联结的两种写法:DBMS支持两种格式的写法,简单格式A,B和标准格式join
举例等值联结
简单格式:select ... from A,B where A.a=B.b
标准格式:select ... from A join B on A.a=B.b
where子句和on子句的作用是一样的。
不过开发习惯上on子句上只写等值联结的条件,毕竟on子句就是为了联结条件而存在的。其他的过滤条件则在下面的where子句来写。
where子句本该拿来作为过滤的,但是简单格式只有where子句,所以联结条件只能写在where子句了。
首选的是标准格式join语法,简单格式A,B是被SQL纯正论者所“鄙视”的。