MySQL的连接查询与聚合查询

搭建环境

CREATE TABLE `salary` (
  `id` int(4) DEFAULT NULL,
  `money` double(6,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

INSERT INTO `mysqlstudy`.`salary` (`id`, `money`) VALUES ('1', '1000.02');  
INSERT INTO `mysqlstudy`.`salary` (`id`, `money`) VALUES ('2', '4000.50'); 
INSERT INTO `mysqlstudy`.`salary` (`id`, `money`) VALUES ('3', '5000.05'); 
INSERT INTO `mysqlstudy`.`salary` (`id`, `money`) VALUES ('5', '7000.00'); 

在这里插入图片描述

CREATE TABLE `employee` (
  `id` int(4) DEFAULT NULL,
  `name` varchar(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

INSERT INTO `mysqlstudy`.`employee` (`id`, `name`) VALUES ('1', '张三丰');
INSERT INTO `mysqlstudy`.`employee` (`id`, `name`) VALUES ('2', '谢敏');
INSERT INTO `mysqlstudy`.`employee` (`id`, `name`) VALUES ('3', '周芷若');
INSERT INTO `mysqlstudy`.`employee` (`id`, `name`) VALUES ('4', '小马');

在这里插入图片描述

1、内连接(也称自然连接)(笛卡尔积结果集)

select *
from employee e
inner join salary s

在这里插入图片描述
在上面语句添加一个条件ON e.id=s.id
在这里插入图片描述

SELECT *
FROM employee e
INNER JOIN salary s
ON e.`id`=s.`id`

最终结果,与上面分析丝毫不差。
在这里插入图片描述
完全等价于

SELECT *
FROM employee e,salary s
WHERE e.`id`=s.`id`

==========================================================================================

2、外连接

在这里插入图片描述

2.1、左外连接

SELECT *
FROM employee e
LEFT OUTER JOIN salary s

结果:You have an error in your SQL syntax;
说明:左外连接非笛卡尔积结果集

SELECT *
FROM employee e
LEFT OUTER JOIN salary s
ON e.`id`=s.`id`

在这里插入图片描述
解释:左外连接是对连接条件中左边的表不加限制,对右表加以限制。
自我理解步骤:
① 左边的表查出全部记录 ===> 结果集映射1
② 右边的表根据连接条件查询出所有记录 ===> 结果集映射2
③ 结果集左右拼接。 ====>你可能会想左右记录条数不对等怎么办?
④ 将缺少的条数以null填充

2.2、右外连接

SELECT *
FROM employee e
RIGHT OUTER JOIN salary s

结果:You have an error in your SQL syntax;
说明:右外连接非笛卡尔积结果集

SELECT *
FROM employee e
RIGHT OUTER JOIN salary s
ON e.`id`=s.`id`

在这里插入图片描述
解释:右外连接是对连接条件中右边的表不加限制,对左表加以限制。
自我理解步骤:
① 右边的表查出全部记录 ===> 结果集映射1
② 左边的表根据连接条件查询出所有记录 ===> 结果集映射2
③ 结果集左右拼接。 ====>你可能会想左右记录条数不对等怎么办?
④ 将缺少的条数以null填充

2.3、全外连接

MySQL没有全外连接,如果需要就使用左外连接+右外连接+聚合查询

3、聚合查询

(1)UNION ALL:不去除重复记录
(2)UNION :去除重复记录

在这里插入图片描述
(1)UNION ALL

SELECT *
FROM employee e
LEFT OUTER JOIN salary s
ON e.`id`=s.`id`
UNION ALL
SELECT *
FROM employee e
RIGHT OUTER JOIN salary s
ON e.`id`=s.`id`

在这里插入图片描述
(2)UNION
将上面的All去掉,就是如下结果
在这里插入图片描述

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值