MySQL基础~使用SQL99实现7种JOIN操作(取并操作)

union 与 union all关键字

UNION的作用是合并查询的结果 ,去除重复的记录
在这里插入图片描述
UNION ALL的作用是合并查询结果,不去掉重复的记录
在这里插入图片描述
语法格式

select 某列... from1
union /union all
select 某列....from2



优先使用:
union 返回两个表的内容(并集),去重

union all 
返回 两个表的内容(并集) 不去重

在优先级选择上,优先选择使用union all,因为 union 有一个去重操作,会导致运行效率比较慢 ,但这是在明确结果里没有重复数据的情况下,如果有重复的数据,还是使用union


使用union、union all的要求:
两个结果并的时候 列数要相同 列的数据类型也要相同

7种JOIN操作的实现

7中JOIN操作就是查询两张表后返回结果的几种可能,可能是内连接(A∩B),左外、右外、A-A∩B、B-A∩B、A∪B-A∩B、全部返回(A∪B)共7种结果,如下图:
在这里插入图片描述

A∩B内连接

最中间的图,即返回两张表之间的交集,就是内连接

举例:返回员工表中的员工id和部门表中对应的部分 ,连接条件是部门id相等
mysql> SELECT employee_id,department_name
    ->  FROM employees e JOIN departments d
    ->  ON e.`department_id`=d.`department_id`;
+-------------+------------------+
| employee_id | department_name  |
+-------------+------------------+
|         200 | Administration   |
|         201 | Marketing        |
|         202 | Marketing        |
|         114 | Purchasing       |
|         115 | Purchasing       |
|         116 | Purchasing       |
|         117 | Purchasing       |
|         118 | Purchasing       |
|         119 | Purchasing       |
|         203 | Human Resources  |
|         120 | Shipping         |
|         121 | Shipping         |
|         122 | Shipping         |
|         123 | Shipping         |
|         124 | Shipping         |
|         125 | Shipping         |
|         126 | Shipping         |
|         127 | Shipping         |
|         128 | Shipping         |
|         129 | Shipping         |
|         130 | Shipping         |
|         131 | Shipping         |
|         132 | Shipping         |
|         133 | Shipping         |
|         134 | Shipping         |
|         135 | Shipping         |
|         136 | Shipping         |
|         137 | Shipping         |
|         138 | Shipping         |
|         139 | Shipping         |
|         140 | Shipping         |
|         141 | Shipping         |
|         142 | Shipping         |
|         143 | Shipping         |
|         144 | Shipping         |
|         180 | Shipping         |
|         181 | Shipping         |
|         182 | Shipping         |
|         183 | Shipping         |
|         184 | Shipping         |
|         185 | Shipping         |
|         186 | Shipping         |
|         187 | Shipping         |
|         188 | Shipping         |
|         189 | Shipping         |
|         190 | Shipping         |
|         191 | Shipping         |
|         192 | Shipping         |
|         193 | Shipping         |
|         194 | Shipping         |
|         195 | Shipping         |
|         196 | Shipping         |
|         197 | Shipping         |
|         198 | Shipping         |
|         199 | Shipping         |
|         103 | IT               |
|         104 | IT               |
|         105 | IT               |
|         106 | IT               |
|         107 | IT               |
|         204 | Public Relations |
|         145 | Sales            |
|         146 | Sales            |
|         147 | Sales            |
|         148 | Sales            |
|         149 | Sales            |
|         150 | Sales            |
|         151 | Sales            |
|         152 | Sales            |
|         153 | Sales            |
|         154 | Sales            |
|         155 | Sales            |
|         156 | Sales            |
|         157 | Sales            |
|         158 | Sales            |
|         159 | Sales            |
|         160 | Sales            |
|         161 | Sales            |
|         162 | Sales            |
|         163 | Sales            |
|         164 | Sales            |
|         165 | Sales            |
|         166 | Sales            |
|         167 | Sales            |
|         168 | Sales            |
|         169 | Sales            |
|         170 | Sales            |
|         171 | Sales            |
|         172 | Sales            |
|         173 | Sales            |
|         174 | Sales            |
|         175 | Sales            |
|         176 | Sales            |
|         177 | Sales            |
|         179 | Sales            |
|         100 | Executive        |
|         101 | Executive        |
|         102 | Executive        |
|         108 | Finance          |
|         109 | Finance          |
|         110 | Finance          |
|         111 | Finance          |
|         112 | Finance          |
|         113 | Finance          |
|         205 | Accounting       |
|         206 | Accounting       |
+-------------+------------------+
106 rows in set (0.00 sec)
左外连接&右外连接

左上角的图对应典型的左外连接,右上角的图对应典型的右外连接,就是在返回两个表并集的基础上,分别加上了左表剩余部分或者右表剩余部分

举例:
可能有些员工没有部门 或者有些部门没有员工 将这两种情况一起查询出来

left join
# 左外连接: 
 SELECT employee_id,department_name
 FROM employees e LEFT JOIN departments d
 ON e.`department_id`=d.`department_id`;
 
right join
# 右外连接:
 SELECT employee_id department_name
 FROM employees e RIGHT JOIN departments d
 ON e.`department_id`=d.`department_id`;

查询的结果集比较长,这里不再展示
A - A∩B

左中图对应的情况是A - A∩B,就是返回A表中除去A、B交集的部分,可以在左外连接的基础上,加上筛选条件,去掉重复部分

举例:查询出员工没有部门的情况
mysql> SELECT employee_id,department_name
    -> FROM employees e LEFT JOIN departments d
    -> ON e.`department_id`=d.`department_id`
    -> WHERE d.`department_id` IS NULL;
+-------------+-----------------+
| employee_id | department_name |
+-------------+-----------------+
|         178 | NULL            |
+-------------+-----------------+
1 row in set (0.00 sec)
B-A∩B

右中图对应的情况是B-A∩B,与上面的情况相反,返回B表中剩余部分,即除去与A表相关联的部分

举例:查询出有些部门没有员工的情况
mysql> SELECT employee_id,department_name
    -> FROM employees e RIGHT JOIN departments d
    -> ON e.`department_id`=d.`department_id`
    -> WHERE e.`department_id` IS NULL;
+-------------+----------------------+
| employee_id | department_name      |
+-------------+----------------------+
|        NULL | Treasury             |
|        NULL | Corporate Tax        |
|        NULL | Control And Credit   |
|        NULL | Shareholder Services |
|        NULL | Benefits             |
|        NULL | Manufacturing        |
|        NULL | Construction         |
|        NULL | Contracting          |
|        NULL | Operations           |
|        NULL | IT Support           |
|        NULL | NOC                  |
|        NULL | IT Helpdesk          |
|        NULL | Government Sales     |
|        NULL | Retail Sales         |
|        NULL | Recruiting           |
|        NULL | Payroll              |
+-------------+----------------------+
16 rows in set (0.00 sec)
满外连接(A∪B)

对应左下图,可以看成是左上图+UNION ALL+右中图
我们明确知道左上图和右中图这两种返回结果没有重复的数据,所以可以直接使用union all,来返回查询结果

举例:返回员工有部门,员工无部门,部门无员工三种情况的所有结果

会在107行数据的基础上增加16条部门无员工的数据

mysql> SELECT employee_id,department_name
    -> FROM employees e LEFT JOIN departments d
    -> ON e.`department_id` = d.`department_id`
    -> UNION ALL
    -> SELECT employee_id,department_name
    -> FROM employees e RIGHT JOIN departments d
    -> ON e.`department_id` = d.`department_id`
    -> WHERE e.`department_id` IS NULL;
+-------------+----------------------+
| employee_id | department_name      |
+-------------+----------------------+
|         178 | NULL                 |
|         200 | Administration       |
|         201 | Marketing            |
|         202 | Marketing            |
|         114 | Purchasing           |
|         115 | Purchasing           |
|         116 | Purchasing           |
|         117 | Purchasing           |
|         118 | Purchasing           |
|         119 | Purchasing           |
|         203 | Human Resources      |
|         120 | Shipping             |
|         121 | Shipping             |
|         122 | Shipping             |
|         123 | Shipping             |
|         124 | Shipping             |
|         125 | Shipping             |
|         126 | Shipping             |
|         127 | Shipping             |
|         128 | Shipping             |
|         129 | Shipping             |
|         130 | Shipping             |
|         131 | Shipping             |
|         132 | Shipping             |
|         133 | Shipping             |
|         134 | Shipping             |
|         135 | Shipping             |
|         136 | Shipping             |
|         137 | Shipping             |
|         138 | Shipping             |
|         139 | Shipping             |
|         140 | Shipping             |
|         141 | Shipping             |
|         142 | Shipping             |
|         143 | Shipping             |
|         144 | Shipping             |
|         180 | Shipping             |
|         181 | Shipping             |
|         182 | Shipping             |
|         183 | Shipping             |
|         184 | Shipping             |
|         185 | Shipping             |
|         186 | Shipping             |
|         187 | Shipping             |
|         188 | Shipping             |
|         189 | Shipping             |
|         190 | Shipping             |
|         191 | Shipping             |
|         192 | Shipping             |
|         193 | Shipping             |
|         194 | Shipping             |
|         195 | Shipping             |
|         196 | Shipping             |
|         197 | Shipping             |
|         198 | Shipping             |
|         199 | Shipping             |
|         103 | IT                   |
|         104 | IT                   |
|         105 | IT                   |
|         106 | IT                   |
|         107 | IT                   |
|         204 | Public Relations     |
|         145 | Sales                |
|         146 | Sales                |
|         147 | Sales                |
|         148 | Sales                |
|         149 | Sales                |
|         150 | Sales                |
|         151 | Sales                |
|         152 | Sales                |
|         153 | Sales                |
|         154 | Sales                |
|         155 | Sales                |
|         156 | Sales                |
|         157 | Sales                |
|         158 | Sales                |
|         159 | Sales                |
|         160 | Sales                |
|         161 | Sales                |
|         162 | Sales                |
|         163 | Sales                |
|         164 | Sales                |
|         165 | Sales                |
|         166 | Sales                |
|         167 | Sales                |
|         168 | Sales                |
|         169 | Sales                |
|         170 | Sales                |
|         171 | Sales                |
|         172 | Sales                |
|         173 | Sales                |
|         174 | Sales                |
|         175 | Sales                |
|         176 | Sales                |
|         177 | Sales                |
|         179 | Sales                |
|         100 | Executive            |
|         101 | Executive            |
|         102 | Executive            |
|         108 | Finance              |
|         109 | Finance              |
|         110 | Finance              |
|         111 | Finance              |
|         112 | Finance              |
|         113 | Finance              |
|         205 | Accounting           |
|         206 | Accounting           |
|        NULL | Treasury             |
|        NULL | Corporate Tax        |
|        NULL | Control And Credit   |
|        NULL | Shareholder Services |
|        NULL | Benefits             |
|        NULL | Manufacturing        |
|        NULL | Construction         |
|        NULL | Contracting          |
|        NULL | Operations           |
|        NULL | IT Support           |
|        NULL | NOC                  |
|        NULL | IT Helpdesk          |
|        NULL | Government Sales     |
|        NULL | Retail Sales         |
|        NULL | Recruiting           |
|        NULL | Payroll              |
+-------------+----------------------+
123 rows in set (0.01 sec) 

也可以左中图 union all 右上图
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
A∪B-A∩B

最后一个图的情况对应右下图,右下图是返回两张表互不关联的部分,即去除交集后剩下的部分。可以看成是左中图+UNION ALL+ 右中图

举例:返回员工无部门,部门无员工的情况
mysql> SELECT employee_id,department_name
    -> FROM employees e LEFT JOIN departments d
    -> ON e.`department_id` = d.`department_id`
    -> WHERE d.`department_id` IS NULL
    -> UNION ALL
    -> SELECT employee_id,department_name
    -> FROM employees e RIGHT JOIN departments d
    -> ON e.`department_id` = d.`department_id`
    -> WHERE e.`department_id` IS NULL;
+-------------+----------------------+
| employee_id | department_name      |
+-------------+----------------------+
|         178 | NULL                 |
|        NULL | Treasury             |
|        NULL | Corporate Tax        |
|        NULL | Control And Credit   |
|        NULL | Shareholder Services |
|        NULL | Benefits             |
|        NULL | Manufacturing        |
|        NULL | Construction         |
|        NULL | Contracting          |
|        NULL | Operations           |
|        NULL | IT Support           |
|        NULL | NOC                  |
|        NULL | IT Helpdesk          |
|        NULL | Government Sales     |
|        NULL | Retail Sales         |
|        NULL | Recruiting           |
|        NULL | Payroll              |
+-------------+----------------------+
17 rows in set (0.00 sec)

总结

左中图:
#实现A - A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

右中图:
#实现B - A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

左下图:
#实现查询结果是A∪B
#用左外的A,union 右外的B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句
union 
select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;


右下图:
#实现A∪B - A∩B 或   (A - A∩B) ∪ (B - A∩B)
#使用左外的 (A - A∩B) union 右外的(B - A∩B)
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值