MySQL查询语句(六)——全连接与左连接查询

本文深入解析MySQL中的多表查询技巧,涵盖全连接、左连接、右连接及内连接等核心概念。通过实例演示如何高效地从多个表格中提取所需数据,特别关注于解决数据冗余和关联匹配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL查询语句(五)——子查询

全连接

多表查询只需使用,隔开各个表格
查询结果是各表格的行相连得到新的行,总行数=表1行数*表2行数…*表n行数
缺点:数据较大的场景下多表相乘会得到一个很大的临时表格,效率比较低

mysql> select * from result;
+--------+--------+-------+
| name   | subect | score |
+--------+--------+-------+
| 张三   | 数学   |   120 |
| 张三   | 语文   |    12 |
| 张三   | 地理   |    20 |
| 李四   | 数学   |    44 |
| 李四   | 语文   |    33 |
| 王五   | 数学   |     5 |
+--------+--------+-------+
6 rows in set (0.00 sec)

mysql> select * from test;
+----------+------------+----------+
| star     | birthday   | sign     |
+----------+------------+----------+
| Jay zhou | 1979-01-18 | 00:00:00 |
| xiaosan  | 1979-01-01 | 19:43:11 |
| xiaosi   | 1979-00-01 | 19:43:11 |
+----------+------------+----------+
3 rows in set (0.00 sec)

mysql> select * from result,test;
+--------+--------+-------+----------+------------+----------+
| name   | subect | score | star     | birthday   | sign     |
+--------+--------+-------+----------+------------+----------+
| 张三   | 数学   |   120 | Jay zhou | 1979-01-18 | 00:00:00 |
| 张三   | 数学   |   120 | xiaosan  | 1979-01-01 | 19:43:11 |
| 张三   | 数学   |   120 | xiaosi   | 1979-00-01 | 19:43:11 |
| 张三   | 语文   |    12 | Jay zhou | 1979-01-18 | 00:00:00 |
| 张三   | 语文   |    12 | xiaosan  | 1979-01-01 | 19:43:11 |
| 张三   | 语文   |    12 | xiaosi   | 1979-00-01 | 19:43:11 |
| 张三   | 地理   |    20 | Jay zhou | 1979-01-18 | 00:00:00 |
| 张三   | 地理   |    20 | xiaosan  | 1979-01-01 | 19:43:11 |
| 张三   | 地理   |    20 | xiaosi   | 1979-00-01 | 19:43:11 |
| 李四   | 数学   |    44 | Jay zhou | 1979-01-18 | 00:00:00 |
| 李四   | 数学   |    44 | xiaosan  | 1979-01-01 | 19:43:11 |
| 李四   | 数学   |    44 | xiaosi   | 1979-00-01 | 19:43:11 |
| 李四   | 语文   |    33 | Jay zhou | 1979-01-18 | 00:00:00 |
| 李四   | 语文   |    33 | xiaosan  | 1979-01-01 | 19:43:11 |
| 李四   | 语文   |    33 | xiaosi   | 1979-00-01 | 19:43:11 |
| 王五   | 数学   |     5 | Jay zhou | 1979-01-18 | 00:00:00 |
| 王五   | 数学   |     5 | xiaosan  | 1979-01-01 | 19:43:11 |
| 王五   | 数学   |     5 | xiaosi   | 1979-00-01 | 19:43:11 |
+--------+--------+-------+----------+------------+----------+
18 rows in set (0.00 sec)

注意:这种查询当两个表中存在一样名称的列时需要注明所取的是哪个表格的列

mysql> select * from mt;
+--------+--------+
| cat_id | name   |
+--------+--------+
|      1 | 张三   |
+--------+--------+
1 row in set (0.00 sec)

mysql> select * from result;
+--------+--------+-------+
| name   | subect | score |
+--------+--------+-------+
| 张三   | 数学   |   120 |
| 张三   | 语文   |    12 |
| 张三   | 地理   |    20 |
| 李四   | 数学   |    44 |
| 李四   | 语文   |    33 |
| 王五   | 数学   |     5 |
+--------+--------+-------+
6 rows in set (0.00 sec)

mysql> select * from result,mt;
+--------+--------+-------+--------+--------+
| name   | subect | score | cat_id | name   |
+--------+--------+-------+--------+--------+
| 张三   | 数学   |   120 |      1 | 张三   |
| 张三   | 语文   |    12 |      1 | 张三   |
| 张三   | 地理   |    20 |      1 | 张三   |
| 李四   | 数学   |    44 |      1 | 张三   |
| 李四   | 语文   |    33 |      1 | 张三   |
| 王五   | 数学   |     5 |      1 | 张三   |
+--------+--------+-------+--------+--------+
6 rows in set (0.00 sec)

mysql> select name from result,mt;
ERROR 1052 (23000): Column 'name' in field list is ambiguous
mysql> select score from result,mt;
+-------+
| score |
+-------+
|   120 |
|    12 |
|    20 |
|    44 |
|    33 |
|     5 |
+-------+
6 rows in set (0.00 sec)

mysql> select result.name from result,mt;
+--------+
| name   |
+--------+
| 张三   |
| 张三   |
| 张三   |
| 李四   |
| 李四   |
| 王五   |
+--------+
6 rows in set (0.00 sec)

#插入一个身高列
mysql> alter table mt add high_cm smallint(3) not null default 0;
Query OK, 1 row affected (0.04 sec)

mysql> update mt set high_cm=173;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> select * from mt;
+--------+--------+---------+
| cat_id | name   | high_cm |
+--------+--------+---------+
|      1 | 张三   |     173 |
+--------+--------+---------+
1 row in set (0.00 sec)

mysql> select * from result,mt;
+--------+--------+-------+--------+--------+---------+
| name   | subect | score | cat_id | name   | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三   | 数学   |   120 |      1 | 张三   |     173 |
| 张三   | 语文   |    12 |      1 | 张三   |     173 |
| 张三   | 地理   |    20 |      1 | 张三   |     173 |
| 李四   | 数学   |    44 |      1 | 张三   |     173 |
| 李四   | 语文   |    33 |      1 | 张三   |     173 |
| 王五   | 数学   |     5 |      1 | 张三   |     173 |
+--------+--------+-------+--------+--------+---------+
6 rows in set (0.00 sec)
#可以看到上面表格中有很多行其实并不是我们需要的,比如李四后面加张三的身高信息没什么意义,在此我们只查询张三的信息
mysql> select * from result,mt where result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name   | subect | score | cat_id | name   | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三   | 数学   |   120 |      1 | 张三   |     173 |
| 张三   | 语文   |    12 |      1 | 张三   |     173 |
| 张三   | 地理   |    20 |      1 | 张三   |     173 |
+--------+--------+-------+--------+--------+---------+
3 rows in set (0.00 sec)

左连接

定义:假设A表不动,B表在A的右边滑动
A、B表通过一个关系来进行关联行,筛选出满足条件的B表的行
基本语法:A left join B on 条件
结果形成一个结果集,可以看成一张表

mysql> select * from result left join mt on result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name   | subect | score | cat_id | name   | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三   | 数学   |   120 |      1 | 张三   |     173 |
| 张三   | 语文   |    12 |      1 | 张三   |     173 |
| 张三   | 地理   |    20 |      1 | 张三   |     173 |
| 李四   | 数学   |    44 |   NULL | NULL   |    NULL |
| 李四   | 语文   |    33 |   NULL | NULL   |    NULL |
| 王五   | 数学   |     5 |   NULL | NULL   |    NULL |
+--------+--------+-------+--------+--------+---------+
6 rows in set (0.01 sec)

mysql> select * from result left join mt on result.name=mt.name where result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name   | subect | score | cat_id | name   | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三   | 数学   |   120 |      1 | 张三   |     173 |
| 张三   | 语文   |    12 |      1 | 张三   |     173 |
| 张三   | 地理   |    20 |      1 | 张三   |     173 |
+--------+--------+-------+--------+--------+---------+
3 rows in set (0.00 sec)

mysql> select * from result left join mt on result.name=mt.name where result.name="李四";
+--------+--------+-------+--------+------+---------+
| name   | subect | score | cat_id | name | high_cm |
+--------+--------+-------+--------+------+---------+
| 李四   | 数学   |    44 |   NULL | NULL |    NULL |
| 李四   | 语文   |    33 |   NULL | NULL |    NULL |
+--------+--------+-------+--------+------+---------+
2 rows in set (0.00 sec)

左连接和右链接的区别
左连接结果

mysql> insert into mt (name,high_cm) values ('张三',155);
mysql> select * from mt;
+--------+--------+---------+
| cat_id | name   | high_cm |
+--------+--------+---------+
|      1 | 张三   |     173 |
|      2 | 张三   |     155 |
+--------+--------+---------+
2 rows in set (0.00 sec)

mysql> select result.*,mt.* from result left join mt on result.name=mt.name;    +--------+--------+-------+--------+--------+---------+
| name   | subect | score | cat_id | name   | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三   | 数学   |   120 |      1 | 张三   |     173 |
| 张三   | 数学   |   120 |      2 | 张三   |     155 |
| 张三   | 语文   |    12 |      1 | 张三   |     173 |
| 张三   | 语文   |    12 |      2 | 张三   |     155 |
| 张三   | 地理   |    20 |      1 | 张三   |     173 |
| 张三   | 地理   |    20 |      2 | 张三   |     155 |
| 李四   | 数学   |    44 |   NULL | NULL   |    NULL |
| 李四   | 语文   |    33 |   NULL | NULL   |    NULL |
| 王五   | 数学   |     5 |   NULL | NULL   |    NULL |
+--------+--------+-------+--------+--------+---------+
9 rows in set (0.00 sec)

右链接结果

mysql> select result.*,mt.* from mt left join result on result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name   | subect | score | cat_id | name   | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三   | 数学   |   120 |      1 | 张三   |     173 |
| 张三   | 语文   |    12 |      1 | 张三   |     173 |
| 张三   | 地理   |    20 |      1 | 张三   |     173 |
| 张三   | 数学   |   120 |      2 | 张三   |     155 |
| 张三   | 语文   |    12 |      2 | 张三   |     155 |
| 张三   | 地理   |    20 |      2 | 张三   |     155 |
+--------+--------+-------+--------+--------+---------+
6 rows in set (0.01 sec)

mysql> select result.*,mt.* from mt right join result on result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name   | subect | score | cat_id | name   | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三   | 数学   |   120 |      1 | 张三   |     173 |
| 张三   | 数学   |   120 |      2 | 张三   |     155 |
| 张三   | 语文   |    12 |      1 | 张三   |     173 |
| 张三   | 语文   |    12 |      2 | 张三   |     155 |
| 张三   | 地理   |    20 |      1 | 张三   |     173 |
| 张三   | 地理   |    20 |      2 | 张三   |     155 |
| 李四   | 数学   |    44 |   NULL | NULL   |    NULL |
| 李四   | 语文   |    33 |   NULL | NULL   |    NULL |
| 王五   | 数学   |     5 |   NULL | NULL   |    NULL |
+--------+--------+-------+--------+--------+---------+
9 rows in set (0.00 sec)

左右链接是可以互换的,尽量用左链接
A left join B
B right join A

内连接

左右链接的交集

mysql> select result.*,mt.* from result inner join mt on result.name=mt.name;
+--------+--------+-------+--------+--------+---------+
| name   | subect | score | cat_id | name   | high_cm |
+--------+--------+-------+--------+--------+---------+
| 张三   | 数学   |   120 |      1 | 张三   |     173 |
| 张三   | 数学   |   120 |      2 | 张三   |     155 |
| 张三   | 语文   |    12 |      1 | 张三   |     173 |
| 张三   | 语文   |    12 |      2 | 张三   |     155 |
| 张三   | 地理   |    20 |      1 | 张三   |     173 |
| 张三   | 地理   |    20 |      2 | 张三   |     155 |
+--------+--------+-------+--------+--------+---------+
6 rows in set (0.00 sec)

MySQL查询语句(七)——union

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值