定义: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接)。
结果: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)
意义: 在用户查看数据的时候,需要显示的数据来自多张表.
连接查询: join,
使用方式: 左表 join 右表
SQL中将连接查询分成四类: 内连接,外连接,自然连接和交叉连接
举例:
表tb_a: 表tb_b:
1. 交叉连接
交叉连接: cross join, 从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积.
基本语法:
左表 cross join 右表;
(或者 from 左表,右表;)
笛卡尔积没有意义: 应该尽量避免(交叉连接没用)
交叉连接存在的价值: 保证连接这种结构的完整性
使用:
select * from tb_a cross join tb_b;
select * from tb_a , tb_b;
-- 结果共5*6=30条记录--
部分结果:
2. 内连接
内连接: [inner] join, 从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.
基本语法
左表 [inner] join 右表 on 左表.字段 = 右表.字段;
-- 基于条件的内连接:只保留笛卡尔积中符合条件的数据--
在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分, 而表名太长, 通常可以使用别名.内连接还可以使用where代替on关键字(where没有on效率高)
使用:
简单内连接:等价于交叉连接
select * from tb_a a inner join tb_b b;
-- 结果共5*6=30条记录,不使用条件则和交叉连接结果一样--
基于条件的内连接:只保留笛卡尔积中符合条件的数据
select * from tb_a a inner join tb_b b on a.name = b.name;
3. 外连接
外连接: outer join, 以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能比配,正确保留; 不能匹配,其他表的字段都置空NULL.
外连接分为两种:
- Left join: 左外连接(左连接), 以左表为主表
- Right join: 右外连接(右连接), 以右表为主表
基本语法:
左表 left/right join 右表 on 左表.字段 = 右表.字段;
-- 左外连接:左表不变,增加右表符合条件的数据 --
-- 右外连接:右表不变,增加左表符合条件的数据 --
虽然左连接和右连接有主表差异, 但是显示的结果: 左表的数据在左边,右表数据在右边.
左连接和右连接可以互转.
-- 左外连接:左表不变,增加右表符合条件的数据 --
select * from tb_a a left join tb_b b on a.name = b.name;
-- 右外连接:右表不变,增加左表符合条件的数据 --
select * from tb_a a right join tb_b b on a.name = b.name;
4. 自然连接
自然连接: natural join, 自然连接, 就是自动匹配连接条件: 系统以字段名字作为匹配模式(同名字段就作为条件, 多个同名字段都作为条件).
自然连接: 可以分为自然内连接和自然外连接.
- 自然内连接:
左表 natural join 右表
; - 自然外连接:
左表 natural left/right join 右表
;
其实, 内连接和外连接都可以模拟自然连接: 使用同名字段,合并字段
左表 left/right/inner join 右表 using(字段名)
; – 使用同名字段作为连接条件: 自动合并条件
多表连接: A表 inner join B表 on 条件 left join C表 on条件 ...
执行顺序: A表内连接B表,得到一个二维表, 左连接C表形成二维表…
使用:
-- 自然连接 保留相同属性的值都相同的列,其他列补充--
select * from tb_a natural join tb_b;
stu1,2,3,4的name,number,age对应的值都相同,那么保留两个表的这四条记录,再合并相同内容。
-- 左自然连接 左表为基准,留右表与左表相同属性的值都相同的记录,相同的覆盖--
select * from tb_a natural left join tb_b;
以左表为基准,右表的stu1,2,3,4记录与左表的name,number,age对应的值都相同。合并并保留。
-- 右自然连接 右表为基准,留左表与右表相同属性的值都相同的记录,相同的覆盖--
select * from tb_a natural right join tb_b;
以右表为基准,左表的stu1,2,3,4记录与右表的name,number,age对应的值都相同。合并并保留,但是左表不存在sex属性,那么这个值为NULL。