MySQL-4 连接查询


定义: 将多张表(可以大于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。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章