关系数据库由多个相关表组成,这些表使用已知为外键列的常用列链接在一起。 因此,从业务角度来看,每个表中的数据是不完整的。

例如,在示例数据库(yiibaidb)中,使用orderNumber列链接的ordersorderdetails表。

ordersorderdetails表的 ER 图如下所示 -

要获取完整的订单数据,需要从订单(orders)和订单详细(orderdetails)表中查询数据。

这就是为什么要使用连接表了。

MySQL连接是一种基于表之间的公共列的值来链接来自一个(自连接)或更多表的数据的方法。

MySQL支持以下类型的连接:

要连接表,可以对相应类型的连接使用CROSS JOININNER JOINLEFT JOINRIGHT JOIN子句。 在SELECT语句中的FROM子句之后使用了连接子句。

请注意,MySQL不支持完全外部连接。

为了方便您了解每种类型的连接,我们将使用具有以下结构的两个表:t1t2表:

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
);
SQL

t1t2表中都有pattern列,此列也是这两个表之间的公共列。执行以下查询语句将数据插入到t1t2表中:

INSERT INTO t1(id, pattern)
VALUES(1,'Divot'),
(2,'Brick'),
(3,'Grid'); INSERT INTO t2(id, pattern)
VALUES('A','Brick'),
('B','Grid'),
('C','Diamond');
SQL

现在两个表中的数据如下所示 -

2. MySQL交叉连接(CROSS JOIN)

CROSS JOIN生成来自多个表的行的笛卡尔乘积。假设您使用CROSS JOIN来连接t1t2表,结果集将包括t1表中的行与t2表中的行的组合。

要执行交叉连接(最后得到迪卡尔乘积),请使用CROSS JOIN子句,如以下语句所示:

SELECT
t1.id, t2.id
FROM
t1
CROSS JOIN t2;
SQL

执行上面语句,得到以下结果 -

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
SQL

如您所见,t1表中的每一行与t2表中的行结合形成笛卡尔乘积。

下图显示了t1t2表之间的CROSS JOIN连接 -

3. MySQL内连接(INNER JOIN)

要形成一个INNER JOIN连接子句,需要一个称为连接谓词的条件。 INNER JOIN需要两个连接的表中的行具有匹配的列值。 INNER JOIN通过组合基于连接谓词的两个连接表的列值来创建结果集。

要连接两个表,INNER JOIN将第一个表中的每一行与第二个表中的每一行进行比较,以找到满足连接谓词的行对。每当通过匹配非NULL值来满足连接谓词时,两个表中每个匹配的行对的列值将包含在结果集中(可以简单地理解为两个表的交集)。

以下语句使用INNER JOIN子句来连接t1t2表:

SELECT
t1.id, t2.id
FROM
t1
INNER JOIN
t2 ON t1.pattern = t2.pattern;
SQL

在上面语句中,以下表达式是连接谓词:

t1.pattern = t2.pattern
SQL

这意味着t1t2表中的行必须在pattern列中具有相同的值才能包含在结果中。

以下查询的结果可以说明:

+----+----+
| id | id |
+----+----+
| 2 | A |
| 3 | B |
+----+----+
SQL

下图显示了t1t2表之间的INNER JOIN

在此图中,两个表中的行必须具有相同pattern列值,才能包含在结果集中。

4. MySQL左连接(LEFT JOIN)

类似于INNER JOINLEFT JOIN也需要连接谓词。当使用LEFT JOIN连接两个表时,介绍了左表和右表的概念。

INNER JOIN不同,LEFT JOIN返回左表中的所有行,包括满足连接谓词的行。 对于不匹配连接谓词的行,右表中的列将使用NULL值显示在结果集中。

以下语句使用LEFT JOIN子句来连接t1t2表:

SELECT
t1.id, t2.id
FROM
t1
LEFT JOIN
t2 ON t1.pattern = t2.pattern
ORDER BY t1.id;
SQL

执行上面查询,得到以下结果 -

+----+------+
| id | id |
+----+------+
| 1 | NULL |
| 2 | A |
| 3 | B |
+----+------+
3 rows in set
SQL

如上所见,t1表中的所有行都包含在结果集中。 对于t2表(右表)中没有任何匹配t1表(左表)中的行,在t2表中的列使用NULL显示。

下图显示了在t1t2表上使用LEFT JOIN子句:

在此图中,以下行具有相同的pattern:(2A),(3B)。 t1表中ID1的行在t2表中没有匹配的行,因此,在结果集中的t2表的列使用NULL代替显示。

5. MySQL右连接(RIGHT JOIN)

右连接(RIGHT JOIN)类似于右连接(LEFT JOIN),除了表的处理是相反的。使用RIGHT JOIN,右表格(t2)中的每一行将显示在结果集中。 对于右表中没有左表(t1)中的匹配行的行,左表(t1)中的列会显示NULL

以下语句使用RIGHT JOIN连接t1t2表:

SELECT
t1.id, t2.id
FROM
t1
RIGHT JOIN
t2 on t1.pattern = t2.pattern
ORDER BY t2.id;
SQL

执行上面是查询语句,得到下面结果 -

+------+----+
| id | id |
+------+----+
| 2 | A |
| 3 | B |
| NULL | C |
+------+----+
3 rows in set
Shell

在此结果中,来自右表(t2)的所有行都显示在结果集中。对于左表(t1)中没有匹配右表(t2)中的行,则左表(t1)的列将使用NULL代替显示。

下图显示了t1t2表之间的右连接(RIGHT JOIN):

在本教程中,您已经学习了各种MySQL连接语句,包括交叉连接,内部连接,左连接和右连接,以从两个或多个表查询数据。

MySQL连接查询(inner join,left join和right join的区别)的更多相关文章

  1. mysql 连接查询 join

    本文用到的表 CREATE TABLE `cls` ( `cls_id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, PRIMARY KEY (`cls ...

  2. mysql连接查询经典小例题

    mysql连接查询: Mysql连接查询支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表 比赛结果表:result 问题: 得出一张表: ...

  3. MySQL连接查询、联合查询、子查询

    参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...

  4. 掌握MySQL连接查询到底什么是驱动表

    准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...

  5. MySQL连接查询驱动表被驱动表以及性能优化

    准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...

  6. 细说MySQL连接查询:内连、左连和右连

    转: 细说MySQL连接查询:内连.左连和右连 简介: MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接.首先,要确定一个主表作为结果集,然后将 ...

  7. mysql连接查询,封装mysql函数

    连接查询 交叉连接语法: select  * | 字段列表 from 表1  cross join 表2 内连接: select *|字段列表 from 左表 inner join 右表 on 左表. ...

  8. Mysql 连接查询 Mysql支持的连接查询有哪些

    CREATE TABLE `chx` (   `id` VARCHAR(20) NOT NULL,   `name` VARCHAR(50) DEFAULT NULL,   `name2` CHAR( ...

  9. Mysql连接查询、子查询、联合查询 整理

    连接查询 连接语法的基本形式 from 表1  [连接方式]  join 表2  [on 连接条件]: 交叉连接 语法: from  表1  [cross]  join  表2  ;      //可 ...

随机推荐

  1. Elasticsearch: 权威指南---基础入门

    1.查看方式:GETURL:http://10.10.6.225:9200/?pretty pretty 在任意的查询字符串中增加pretty参数.会让Elasticsearch美化输出JSON结果以 ...

  2. CentOS7.5安装MongoDB4.0与CRUD基本操作

    一 MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数 ...

  3. 使用spring-boot-maven-plugin插件打包spring boot项目

    在spring-boot项目中使用spring-boot-maven-plugin插件进行打包,输出可执行JAR包.项目包含多个模块,当打完包后在本地的maven仓库中发现输出的可执行JAR非常小,并 ...

  4. LoadRunner中文乱码问题解决方法

    LoadRunner中文乱码问题解决方法 前段时间在录制,增强,整合LoadRunner脚本,期间两次遇到了中文乱码问题.在此记录一下中文乱码问题的解决办法. 一.录制回放中文乱码 我录制登陆的脚本, ...

  5. 【Java网络编程】基于 UDP 的聊天通信

    使用 udp 协议,写一个基于命令行的聊天软件:客户端跟服务端分别在命令行启动之后,客户端和服务器端可以互相发送数据. 代码实现如下: 一.创建线程 sendThread 和 receiveThrea ...

  6. PHP学习日记 函数

    可变函数 PHP支持可变函数的概念.所以如果一个变量后面有圆括号“()”,PHP将寻找与变量值同名的函数,并尝试执行此函数,可变函数可以用来实现回调函数.函数列表等.可变函数不能用于echo.prin ...

  7. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 D.寻找-树上LCA(树上a到b的路径上离c最近的点)

    链接:https://ac.nowcoder.com/acm/contest/558/D来源:牛客网 寻找 小猫在研究树. 小猫在研究树上的距离. 给定一棵N个点的树,每条边边权为1. Q次询问,每次 ...

  8. Python之路【第十一篇】: 进程与线程理论篇

    阅读目录 一 背景知识二 进程2.1 什么是进程2.2 进程与程序的区别2.3 并发与并行2.4 同步与异步2.5 进程的创建2.6 进程的终止2.7 进程的层次结构2.8 进程的状态2.9 进程并发 ...

  9. Reading lists for new LISA students(转)

    Research in General How to write a great research paper Basics of machine learning http://www.iro.um ...

  10. django信号调度的用法

    Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的signal Model_signal ...