MySQL中的Join用法

SQL中的Join用法

#1 环境

MySQL5.7
Mac

#2 创建表及插入数据

新建两个表tableA及tableB

mysql> create table tableA ( id int(10), name varchar(100) );
mysql> create table tableB ( id int(10), name varchar(100) );

插入数据

tableA:

mysql> insert into tableA values(1,'布鲁日');
mysql> insert into tableA values(2,'巴黎');
mysql> insert into tableA values(3,'伦敦');
mysql> insert into tableA values(4,'柏林');
mysql> insert into tableA values(5,'耶路撒冷');

tableB:

mysql> insert into tableB values(1,'多哈');
mysql> insert into tableB values(2,'耶路撒冷');
mysql> insert into tableB values(3,'新德里');
mysql> insert into tableB values(4,'马尼拉');
mysql> insert into tableB values(5,'吉隆坡');

20200112132138-image.png

#3 开始

#3.1 inner join

产生的结果是A和B的交集, inner join也可以简写成join

select * from tableA join tableB ON tableA.name=tableB.name;

输出结果:

+------+--------------+------+--------------+
| id   | name         | id   | name         |
+------+--------------+------+--------------+
|    5 | 耶路撒冷     |    2 | 耶路撒冷     |
+------+--------------+------+--------------+

20200112151317-image.png

#3.2 left join

产生表A的完全集,而B表中匹配的则有值(没有匹配的则以null值取代)。left join返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。

select * from tableA left join tableB ON tableA.name=tableB.name;

输出结果:

+------+--------------+------+--------------+
| id   | name         | id   | name         |
+------+--------------+------+--------------+
|    5 | 耶路撒冷     |    2 | 耶路撒冷     |
|    1 | 布鲁日       | NULL | NULL         |
|    2 | 巴黎         | NULL | NULL         |
|    3 | 伦敦         | NULL | NULL         |
|    4 | 柏林         | NULL | NULL         |
+------+--------------+------+--------------+

20200112151410-image.png

左表独有:

select * from tableA left join tableB ON tableA.name=tableB.name where tableB.name is null;

输出结果:

+------+-----------+------+------+
| id   | name      | id   | name |
+------+-----------+------+------+
|    1 | 布鲁日    | NULL | NULL |
|    2 | 巴黎      | NULL | NULL |
|    3 | 伦敦      | NULL | NULL |
|    4 | 柏林      | NULL | NULL |
+------+-----------+------+------+

20200112152142-image.png

#3.3 right join

与left join相反,产生表B的完全集,而A表中匹配的则有值(没有匹配的则以null值取代)。left join返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。

select * from tableA right join tableB ON tableA.name=tableB.name;

输出结果:

+------+--------------+------+--------------+
| id   | name         | id   | name         |
+------+--------------+------+--------------+
|    5 | 耶路撒冷     |    2 | 耶路撒冷     |
| NULL | NULL         |    1 | 多哈         |
| NULL | NULL         |    3 | 新德里       |
| NULL | NULL         |    4 | 马尼拉       |
| NULL | NULL         |    5 | 吉隆坡       |
+------+--------------+------+--------------+

20200112151501-image.png

右表独有:

select * from tableA right join tableB ON tableA.name=tableB.name where tableA.name is null;

输出结果:

+------+------+------+-----------+
| id   | name | id   | name      |
+------+------+------+-----------+
| NULL | NULL |    1 | 多哈      |
| NULL | NULL |    3 | 新德里    |
| NULL | NULL |    4 | 马尼拉    |
| NULL | NULL |    5 | 吉隆坡    |
+------+------+------+-----------+

20200112152345-image.png

#3.4 full join

A和B的并集,oracle里面有full join,但是在mysql中没有full join 。我们可以使用union来达到目的。

select * from tableA left join tableB ON tableA.name=tableB.name 
union
select * from tableA right join tableB ON tableA.name=tableB.name;

输出结果:

+------+--------------+------+--------------+
| id   | name         | id   | name         |
+------+--------------+------+--------------+
|    5 | 耶路撒冷     |    2 | 耶路撒冷     |
|    1 | 布鲁日       | NULL | NULL         |
|    2 | 巴黎         | NULL | NULL         |
|    3 | 伦敦         | NULL | NULL         |
|    4 | 柏林         | NULL | NULL         |
| NULL | NULL         |    1 | 多哈         |
| NULL | NULL         |    3 | 新德里       |
| NULL | NULL         |    4 | 马尼拉       |
| NULL | NULL         |    5 | 吉隆坡       |
+------+--------------+------+--------------+

20200112151827-image.png

### MySQL LEFT JOIN 的使用方法 #### 定义与基本概念 在 MySQL 中,`LEFT JOIN`(左外连接)用于返回左表中的所有记录以及右表中满足条件的匹配记录。如果右表中不存在匹配,则结果集中对应列将显示为 `NULL`[^2]。 #### 基本语法结构 `LEFT JOIN` 的标准 SQL 语句如下所示: ```sql SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name; ``` 此命令会从 `table1` 和 `table2` 表中选取数据,并通过指定的键来关联两者的行。即使右侧表格 (`table2`) 没有找到对应的条目,在最终的结果集里也会保留左侧表格(`table1`)的数据[^1]。 #### 实际应用案例分析 考虑一个博客平台的例子,其中有两个主要实体:“文章”(articles)和“作者”(users),每篇文章都由一位特定用户撰写。为了获取所有的文章及其相应的作者名,可以执行以下查询: ```sql SELECT articles.aid, articles.title, users.username FROM articles LEFT JOIN users ON articles.author_id = users.uid; ``` 这段代码将会展示所有文章的信息连同它们各自的创作者名字;对于那些尚未分配给任何用户的帖子而言,“username”的位置会出现 NULL 值。 #### 复杂场景下的运用 当涉及到更复杂的业务逻辑时,比如统计某个品牌下不同系列产品的数量,可以通过嵌套子查询的方式实现更加精准的操作: ```sql SELECT a.id, COUNT(b.id) as product_count FROM lib_brand_series a LEFT JOIN ( SELECT * FROM lib_product_index WHERE small_category_id = 252 AND brand_id = 1 ) b ON a.id = b.series_id WHERE a.brand_id=1 AND a.category_id=5 AND a.status=1 GROUP BY a.id; ``` 上述例子展示了如何利用 `LEFT JOIN` 结合其他 SQL 功能如聚合函数、分组依据等完成多维度数据分析任务[^4]。 #### 数据去重技巧 有时可能需要去除重复项以确保结果集唯一性。例如,当我们想要获得赞助商列表的同时排除掉某些冗余信息时,可采用如下方式: ```sql LEFT JOIN ( SELECT DISTINCT sponsor_id, ...other_columns... FROM sponsors_table ) AS unique_sponsors ON main_table.sponsor_id = unique_sponsors.sponsor_id ; ``` 或者直接在子查询内部先做一次汇总处理再进行联接操作[^3]: ```sql LEFT JOIN ( SELECT *, ROW_NUMBER() OVER(PARTITION BY sponsor_id ORDER BY some_column DESC) row_num FROM sponsors_table ) AS ranked_sponsors ON main_table.sponsor_id = ranked_sponsors.sponsor_id AND ranked_sponsors.row_num = 1; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值