搭建环境
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去掉,就是如下结果