MySQL连接查询(inner join,left join和right join的区别)
关系数据库由多个相关表组成,这些表使用已知为外键列的常用列链接在一起。 因此,从业务角度来看,每个表中的数据是不完整的。
例如,在示例数据库(yiibaidb)中,使用orderNumber
列链接的orders
和orderdetails
表。
orders
和orderdetails
表的 ER 图如下所示 -
要获取完整的订单数据,需要从订单(orders
)和订单详细(orderdetails
)表中查询数据。
这就是为什么要使用连接表了。
MySQL连接是一种基于表之间的公共列的值来链接来自一个(自连接)或更多表的数据的方法。
MySQL支持以下类型的连接:
要连接表,可以对相应类型的连接使用CROSS JOIN
,INNER JOIN
,LEFT JOIN
或RIGHT JOIN
子句。 在SELECT语句中的FROM
子句之后使用了连接子句。
请注意,MySQL不支持完全外部连接。
为了方便您了解每种类型的连接,我们将使用具有以下结构的两个表:t1
和t2
表:
USE testdb;
CREATE TABLE t1 (
id INT PRIMARY KEY,
pattern VARCHAR(50) NOT NULL
);
CREATE TABLE t2 (
id VARCHAR(50) PRIMARY KEY,
pattern VARCHAR(50) NOT NULL
);
t1
和t2
表中都有pattern
列,此列也是这两个表之间的公共列。执行以下查询语句将数据插入到t1
和t2
表中:
INSERT INTO t1(id, pattern)
VALUES(1,'Divot'),
(2,'Brick'),
(3,'Grid');
INSERT INTO t2(id, pattern)
VALUES('A','Brick'),
('B','Grid'),
('C','Diamond');
现在两个表中的数据如下所示 -
2. MySQL交叉连接(CROSS JOIN)
CROSS JOIN
生成来自多个表的行的笛卡尔乘积。假设您使用CROSS JOIN
来连接t1
和t2
表,结果集将包括t1
表中的行与t2
表中的行的组合。
要执行交叉连接(最后得到迪卡尔乘积),请使用CROSS JOIN
子句,如以下语句所示:
SELECT
t1.id, t2.id
FROM
t1
CROSS JOIN t2;
执行上面语句,得到以下结果 -
mysql> SELECT
t1.id, t2.id
FROM
t1
CROSS JOIN t2;
+----+----+
| id | id |
+----+----+
| 1 | A |
| 2 | A |
| 3 | A |
| 1 | B |
| 2 | B |
| 3 | B |
| 1 | C |
| 2 | C |
| 3 | C |
+----+----+
9 rows in set
如您所见,t1
表中的每一行与t2
表中的行结合形成笛卡尔乘积。
下图显示了t1
和t2
表之间的CROSS JOIN
连接 -
3. MySQL内连接(INNER JOIN)
要形成一个INNER JOIN
连接子句,需要一个称为连接谓词的条件。 INNER JOIN
需要两个连接的表中的行具有匹配的列值。 INNER JOIN
通过组合基于连接谓词的两个连接表的列值来创建结果集。
要连接两个表,INNER JOIN
将第一个表中的每一行与第二个表中的每一行进行比较,以找到满足连接谓词的行对。每当通过匹配非NULL
值来满足连接谓词时,两个表中每个匹配的行对的列值将包含在结果集中(可以简单地理解为两个表的交集)。
以下语句使用INNER JOIN
子句来连接t1
和t2
表:
SELECT
t1.id, t2.id
FROM
t1
INNER JOIN
t2 ON t1.pattern = t2.pattern;
在上面语句中,以下表达式是连接谓词:
t1.pattern = t2.pattern
这意味着t1
和t2
表中的行必须在pattern
列中具有相同的值才能包含在结果中。
以下查询的结果可以说明:
+----+----+
| id | id |
+----+----+
| 2 | A |
| 3 | B |
+----+----+
下图显示了t1
和t2
表之间的INNER JOIN
:
在此图中,两个表中的行必须具有相同pattern
列值,才能包含在结果集中。
4. MySQL左连接(LEFT JOIN)
类似于INNER JOIN
,LEFT JOIN
也需要连接谓词。当使用LEFT JOIN
连接两个表时,介绍了左表和右表的概念。
与INNER JOIN
不同,LEFT JOIN
返回左表中的所有行,包括满足连接谓词的行。 对于不匹配连接谓词的行,右表中的列将使用NULL
值显示在结果集中。
以下语句使用LEFT JOIN
子句来连接t1
和t2
表:
SELECT
t1.id, t2.id
FROM
t1
LEFT JOIN
t2 ON t1.pattern = t2.pattern
ORDER BY t1.id;
执行上面查询,得到以下结果 -
+----+------+
| id | id |
+----+------+
| 1 | NULL |
| 2 | A |
| 3 | B |
+----+------+
3 rows in set
如上所见,t1
表中的所有行都包含在结果集中。 对于t2
表(右表)中没有任何匹配t1
表(左表)中的行,在t2
表中的列使用NULL
显示。
下图显示了在t1
和t2
表上使用LEFT JOIN
子句:
在此图中,以下行具有相同的pattern
:(2
和A
),(3
和B
)。 t1
表中ID
为1
的行在t2
表中没有匹配的行,因此,在结果集中的t2
表的列使用NULL
代替显示。
5. MySQL右连接(RIGHT JOIN)
右连接(RIGHT JOIN
)类似于右连接(LEFT JOIN
),除了表的处理是相反的。使用RIGHT JOIN
,右表格(t2
)中的每一行将显示在结果集中。 对于右表中没有左表(t1
)中的匹配行的行,左表(t1
)中的列会显示NULL
。
以下语句使用RIGHT JOIN
连接t1
和t2
表:
SELECT
t1.id, t2.id
FROM
t1
RIGHT JOIN
t2 on t1.pattern = t2.pattern
ORDER BY t2.id;
执行上面是查询语句,得到下面结果 -
+------+----+
| id | id |
+------+----+
| 2 | A |
| 3 | B |
| NULL | C |
+------+----+
3 rows in set
在此结果中,来自右表(t2
)的所有行都显示在结果集中。对于左表(t1
)中没有匹配右表(t2
)中的行,则左表(t1
)的列将使用NULL
代替显示。
下图显示了t1
和t2
表之间的右连接(RIGHT JOIN
):
在本教程中,您已经学习了各种MySQL连接语句,包括交叉连接,内部连接,左连接和右连接,以从两个或多个表查询数据。
MySQL连接查询(inner join,left join和right join的区别)的更多相关文章
- mysql 连接查询 join
本文用到的表 CREATE TABLE `cls` ( `cls_id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, PRIMARY KEY (`cls ...
- mysql连接查询经典小例题
mysql连接查询: Mysql连接查询支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表 比赛结果表:result 问题: 得出一张表: ...
- MySQL连接查询、联合查询、子查询
参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...
- 掌握MySQL连接查询到底什么是驱动表
准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...
- MySQL连接查询驱动表被驱动表以及性能优化
准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...
- 细说MySQL连接查询:内连、左连和右连
转: 细说MySQL连接查询:内连.左连和右连 简介: MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接.首先,要确定一个主表作为结果集,然后将 ...
- mysql连接查询,封装mysql函数
连接查询 交叉连接语法: select * | 字段列表 from 表1 cross join 表2 内连接: select *|字段列表 from 左表 inner join 右表 on 左表. ...
- Mysql 连接查询 Mysql支持的连接查询有哪些
CREATE TABLE `chx` ( `id` VARCHAR(20) NOT NULL, `name` VARCHAR(50) DEFAULT NULL, `name2` CHAR( ...
- Mysql连接查询、子查询、联合查询 整理
连接查询 连接语法的基本形式 from 表1 [连接方式] join 表2 [on 连接条件]: 交叉连接 语法: from 表1 [cross] join 表2 ; //可 ...
随机推荐
- 洛谷P1331 海战 题解
题目传送门 思路 肯定食用dfs啦... 但关键是两条船接触了怎么判断呢?? 上图: 可以发现一下规律 当两条船接触时,必有一条直线连续穿过两条船 当一条船不与另一条船接触时,没有一条直线连续穿过两条 ...
- 实战MEF(1)一种不错的扩展方式
在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...
- Visual Studio 2017 百度云下载
链接: https://pan.baidu.com/s/1kFjGwyj5HwabvmJKiyLF_g 提取码: 关注公众号[GitHubCN]回复获取 秘钥Enterprise:NJVYC-BM ...
- ASP.NET MVC下判断用户登录和授权状态方法
在我们日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题.登录功能(Authentication),针对于所有用户都开放:而授权(Authorization),则对于某种用户角色才开放. 在a ...
- Sample ASP.NET IHttpHandler
LoggerHandler.cs using System; using System.Collections.Generic; using System.Diagnostics; using Sys ...
- 2017-2018-1 20179202《Linux内核原理与分析》第十一周作业
Metasploit实现木马生成.捆绑.免杀 1.预备知识 (1)Metasploit Metasploit是一款开源的安全漏洞检测工具,全称叫做The Metasploit Framework,简称 ...
- V-by-one
一:v-by-one技术产生背景 LVDS已经在业界盛行多年,近来电视解析度和播放格式的进展已经导致频宽需求大幅增加,具有60Hz和120Hz甚至240Hz更新频率的电视已经在商店内 贩售.2 ...
- Django项目从零开始的大概脉络
Django项目从零开始脉络 创建虚拟环境,隔离项目python环境:mkvirtualenv -p /usr/bin/python3.6 envname 安装Django:pip install d ...
- 一次ygc越来越慢的问题排查过程
问题发现场景 某天突然收到线上应用的gc时间过长的告警,刚开始只有一台机器偶尔报一下,后续其他机器也纷纷告警,具体告警的阈值是应用10分钟内ygc的总时长达到了6.6s. 初步排除过程 按照gc问题常 ...
- 【dijkstra优化/次短路径】POJ3255-Roadblocks
[题目大意] 给出一张无向图,求出从源点到终点的次短边. [思路] 先来谈谈Dijkstra的优化.对于每次寻找到当前为访问过的点中距离最短的那一个,运用优先队列进行优化,避免全部扫描,每更新一个点的 ...