14连接的使用
Posted stephanie-boke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14连接的使用相关的知识,希望对你有一定的参考价值。
连接的使用:inner join(join) 、left jion 、right join
从多个数据表中读取数据
JOIN 按照功能大致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
两个表:
mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鸟教程 | 10 |
| RUNOOB.COM | 20 |
| Google | 22 |
+---------------+--------------+
3 rows in set (0.01 sec)
mysql> SELECT * from runoob_tbl;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1 | 学习 php | 菜鸟教程 | 2017-04-12 |
| 2 | 学习 MySQL | 菜鸟教程 | 2017-04-12 |
| 3 | 学习 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 学习 Python | RUNOOB.COM | 2016-03-06 |
| 5 | 学习 C | FK | 2017-04-05 |
+-----------+---------------+---------------+-----------------+
5 rows in set (0.01 sec)
1、 inner join(join)
select a.runoob_id, a.runoob_author, b.runoob_count
from runoob_tbl a join tcount_tbl b
on a.runoob_author = b.runoob_author;
等价于:
SELECT a.runoob_id, a.runoob_author, b.runoob_count
FROM runoob_tbl a, tcount_tbl b
WHERE a.runoob_author = b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
+-----------+---------------+--------------+
4 rows in set
注意:
on a.runoob_author = b.runoob_author 中名字不一致时也可查询,只要记录中字段相等即可
如:
mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| author | runoob_count |
+---------------+--------------+
| 菜鸟教程 | 10 |
| RUNOOB.COM | 20 |
| Google | 22 |
+---------------+--------------+
3 rows in set (0.01 sec)
select a.runoob_id, a.runoob_author, b.runoob_count
from runoob_tbl a join tcount_tbl b
on a.runoob_author = b.author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
+-----------+---------------+--------------+
4 rows in set
2、left join
SELECT a.runoob_id, a.runoob_author, b.runoob_count
FROM runoob_tbl a LEFT JOIN tcount_tbl b
ON a.runoob_author = b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| 5 | FK | NULL |
+-----------+---------------+--------------+
5 rows in set
3、right join
select a.runoob_id, a.runoob_author, b.runoob_count
from runoob_tbl a right join tcount_tbl b
on a.runoob_author = b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| NULL | NULL | 22 |
+-----------+---------------+--------------+
5 rows in set
为什么在最后一行 runoob_author 中显示为 NULL,因为我们在开始选择表的内容时候选择的是a.runoob_author,在runoob_author中不存在Google,那么意味者只能用null字段来代替。
4、知识拓展
4.1、where 与 on 的区别
- where 会将两个表进行全连接(也即是全相乘得到了临时表)之后再查找,没有利用索引来查找,效率低,数据量大。
- on 会在根据索引一边查找一边取出数据,效率高
4.2、 on之后可以再用where进行查询
select a.runoob_id, a.runoob_author, b.runoob_count
from runoob_tbl a right join tcount_tbl b
on a.runoob_author = b.runoob_author
where a.runoob_id=1;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | 菜鸟教程 | 10 |
+-----------+---------------+--------------+
1 row in set
以上是关于14连接的使用的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段
14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段