SQL:MySQL7种JOIN用法总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: SQL:MySQL7种JOIN用法总结

d6.1.jpeg

数据准备

1、建2张表

# 姓名表
create table table_name(
  id int(11) primary key auto_increment,
  user_id int(11) default 0,
  name varchar(5) default ''
);
# 年龄表
create table table_age(
  id int(11) primary key auto_increment,
  user_id int(11) default 0,
  age int(11) default 0
);

2、原始数据

# user_id, name, age
(1, "小赵", 21), 
(2, "小钱", 22), 
(3, "小孙", 23), 

将6条数据分为两部分插入到数据库中

# 名字表少一条 user_id = 3
insert into table_name(user_id, name)
values(1, "小赵"), (2, "小钱");
# 年龄表少一条 user_id = 2
insert into table_age(user_id, age)
values(1, 21), (3, 23);

3、查看数据

mysql> select * from table_name;
+----+---------+--------+
| id | user_id | name   |
+----+---------+--------+
|  1 |       1 | 小赵   |
|  2 |       2 | 小钱   |
+----+---------+--------+
mysql> select * from table_age;
+----+---------+------+
| id | user_id | age  |
+----+---------+------+
|  1 |       1 | 21   |
|  3 |       3 | 23   |
+----+---------+------+

d6.2.png


mysql> select a.user_id, name, age  
    -> from table_name as a inner join table_age as b  
    -> on a.user_id=b.user_id;
+---------+--------+------+
| user_id | name   | age  |
+---------+--------+------+
|       1 | 小赵   |   21 |
+---------+--------+------+

2、LEFT JOIN (左连接)

d6.3.png


mysql> select a.user_id, name, age
from table_name as a left join table_age as b
on a.user_id=b.user_id;
+---------+--------+------+
| user_id | name   | age  |
+---------+--------+------+
|       1 | 小赵   |   21 |
|       2 | 小钱   | NULL |
+---------+--------+------+

3、RIGHT JOIN(右连接)

d6.4.png

mysql> select b.user_id, name, age
from table_name as a right join table_age as b
on a.user_id=b.user_id;
+---------+--------+------+
| user_id | name   | age  |
+---------+--------+------+
|       1 | 小赵   |   21 |
|       3 | NULL   |   23 |
+---------+--------+------+

4、UNION(全连接)

d6.5.png


mysql> select a.user_id, name, age 
from table_name as a left join table_age as b
on a.user_id =b.user_id
union
select b.user_id, name, age 
from table_name as a right join table_age as b
on a.user_id =b.user_id;
+---------+--------+------+
| user_id | name   | age  |
+---------+--------+------+
|       1 | 小赵   |   21 |
|       2 | 小钱   | NULL |
|       3 | NULL   |   23 |
+---------+--------+------+

5、LEFT JOIN EXCLUDING INNER JOIN(左连接-内连接)

d6.6.png


mysql> select a.user_id, name, age
    -> from table_name as a left join table_age as b
    -> on a.user_id=b.user_id
    -> where b.user_id is null;
+---------+--------+------+
| user_id | name   | age  |
+---------+--------+------+
|       2 | 小钱   | NULL |
+---------+--------+------+

6.RIGHT JOIN EXCLUDING INNER JOIN(右连接-内连接)

d6.7.png


mysql> select b.user_id, name, age
    -> from table_name as a right join table_age as b
    -> on a.user_id=b.user_id
    -> where a.user_id is null;
+---------+------+------+
| user_id | name | age  |
+---------+------+------+
|       3 | NULL |   23 |
+---------+------+------+

7、OUTER JOIN EXCLUDING INNER JOIN(外连接-内连接)

d6.8.png


mysql> select a.user_id, name, age
    -> from table_name as a left join table_age as b
    -> on a.user_id =b.user_id
    -> where b.user_id is null
    -> union
    -> select b.user_id, name, age
    -> from table_name as a right join table_age as b
    -> on a.user_id =b.user_id
    -> where a.user_id is null;
+---------+--------+------+
| user_id | name   | age  |
+---------+--------+------+
|       2 | 小钱   | NULL |
|       3 | NULL   |   23 |
+---------+--------+------+

8、笛卡尔积

mysql> select * from table_name join table_age;
+----+---------+--------+----+---------+------+
| id | user_id | name   | id | user_id | age  |
+----+---------+--------+----+---------+------+
|  1 |       1 | 小赵   |  1 |       1 |   21 |
|  2 |       2 | 小钱   |  1 |       1 |   21 |
|  1 |       1 | 小赵   |  2 |       3 |   23 |
|  2 |       2 | 小钱   |  2 |       3 |   23 |
+----+---------+--------+----+---------+------+

总结

操作

关键字

解释

图示

内连接

INNER JOIN

A ∩ B A \cap BA∩B

 

左连接

LEFT JOIN

a ∈ A a \in Aa∈A

 

右连接

RIGHT JOIN

a ∈ B a \in Ba∈B

 

全连接

UNION

A ∪ B A \cup BA∪B

 

左表独有

LEFT JOIN WHERE

A − A ∩ B A - A \cap BA−A∩B

 

右表独有

RIGHT JOIN WHERE

B − A ∩ B B - A \cap BB−A∩B

 

并集去交集

UNION WHERE

A ∪ B − A ∩ B A \cup B - A \cap BA∪B−A∩B


参考

1、一张图看懂 SQL 的各种 join 用法

2、mysql中的几种join 及 full join问题

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
JSON 关系型数据库 MySQL
Mysql(5)—函数
MySQL提供了许多内置的函数以帮助用户进行数据操作和分析。这些函数可以分为几类,包括聚合函数、字符串函数、数值函数、日期和时间函数、控制流函数等。
234 1
Mysql(5)—函数
|
SQL 关系型数据库 MySQL
mysql:1153 Got a packet bigger than ‘max_allowed_packet’ bytes的解决方法
mysql:1153 Got a packet bigger than ‘max_allowed_packet’ bytes的解决方法
455 0
|
10月前
|
NoSQL 关系型数据库 分布式数据库
【赵渝强老师】HBase的表结构
本文介绍了Google的BigTable思想及其对HBase的影响。BigTable将所有数据存入一张表中以提高查询性能,而HBase作为其具体实现,采用列式存储,适合数据分析和处理。文章通过示例说明了HBase的表结构和数据插入方法,并提供了相关代码和图示。
348 0
|
数据采集 中间件 数据处理
scrapy的入门和使用
scrapy的入门和使用
|
Go
Golang语言高级数据类型之指针篇
这篇文章详细讲解了Golang语言中的指针概念、指针地址和类型、定义指针变量、指针的细节操作、指针传值,以及内置函数new和make的用法和它们之间的区别。
159 0
|
机器学习/深度学习 人工智能 算法
TipDM是一种人工智能计算平台
TipDM是一种人工智能计算平台
233 6
|
存储 SQL cobar
大厂原来都这么对MySQL分库分表!(上)
大厂原来都这么对MySQL分库分表!(上)
2152 0
大厂原来都这么对MySQL分库分表!(上)
|
API Go 网络架构
GEE Colab——如何从本地/Google云盘/Google Cloud Storage (GCS)上传和下载
GEE Colab——如何从本地/Google云盘/Google Cloud Storage (GCS)上传和下载
694 4
|
人工智能 JavaScript 中间件
【利用AI让知识体系化】入门Egg框架(含实战)(一)
【利用AI让知识体系化】入门Egg框架(含实战)
|
设计模式 Java 关系型数据库
JAVA设计模式第十讲:SPI - 业务差异解决方案
JAVA设计模式第十讲:SPI - 业务差异解决方案
461 0
JAVA设计模式第十讲:SPI - 业务差异解决方案