MySQL的JOIN用法

数据库中的JOIN称为连接,连接的主要作用是根据两个或多个表中的列之间的关系,获取存在于不同表中的数据。连接分为三类:内连接、外连接、全连接。另外还有CROSS JOIN(笛卡尔积),个人认为如果要理解MySQL中JOIN的各种连接,只需要理解笛卡尔积就足够了。

1 笛卡尔积

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。

下面一张图很好解释了笛卡尔积:

笛卡尔积

2 数据准备

  • 创建两张表:t1t2
CREATE TABLE t1 (
    id INT PRIMARY KEY,
    person VARCHAR(50) NOT NULL
);
 
CREATE TABLE t2 (
    id VARCHAR(50) PRIMARY KEY,
    person VARCHAR(50) NOT NULL
);
  • 插入数据
INSERT INTO t1(id, person)
VALUES(1,'小明'),
      (2,'小红'),
      (3,'小强');
 
INSERT INTO t2(id, person)
VALUES('A','小明'),
      ('B','小红'),
      ('C','小刚');

t1t2中的数据如下:

数据

3 CROSS JOIN

笛卡尔积就是将表1的每条记录与表2中的每一条记录拼成数据对,CROSS JOIN的SQL执行语句如下:

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

执行结果如下:

执行结果

下图解释了表t1t2之间的笛卡尔积操作:

笛卡尔积

4 INNER JOIN

内连接就是求两个表的交集,从笛卡尔积的角度讲就是从笛卡尔积中选出满足某条件的记录,下面是一个内连接的例子:

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

执行结果如下:

下图解释了表t1t2之间的内连接操作:

内连接

5 LEFT JOIN

左连接(LEFT JOIN)的含义就是求两个表的交集外加左表剩下的数据。从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录:

SELECT 
    t1.id, t2.id
FROM
    t1
        LEFT JOIN
    t2 ON t1.person = t2.person

执行结果

下图解释了表t1t2之间的左连接操作:

左连接

6 RIGHT JOIN

右连接RIGHT JOIN就是求两个表的交集外加右表剩下的数据。再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录:

SELECT 
    t1.id, t2.id
FROM
    t1
        RIGHT JOIN
    t2 on t1.person = t2.person

执行结果

下图解释了表t1t2之间的右连接操作:

右连接

相关教程

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GopherCoder

2016.05.27

1584
来自专栏C/C++基础

MySQL对CREATE TABLE IF NOT EXISTS SELECT的处理

MySQL支持创建持数据表时判断是否存在,存在则不创建,不存在则创建,相应语句如下:

1393
来自专栏Python爬虫实战

MySQL 从零开始:06 数据检索

在第四节《表的增删改查》中已经介绍了 select 查询记录的几种使用方法:查询所有行的所有列、查询指定行的所有列、查询所有行的指定列和查询指定行的指定列。本文...

1213
来自专栏java一日一条

SQL Server优化之SQL语句优化

2. ON: 对vt1表应用ON筛选器只有满足 join_condition 为真的行才被插入vt2

2332
来自专栏CodingToDie

MySQL查询优化

1. 查询优化 1. 查询优化 1.2.1. 使用关联查询优化 1.2.2. 使用范围查询 1.1. 最大值和最小值的优化 1.2. 优化 Limit 分页 ...

3726
来自专栏一枝花算不算浪漫

[数据库]SQL中Group By 的常见使用方法.

39613
来自专栏性能与架构

简化 SQL 递归查询

自引用类型的表结构处理起来比较麻烦,比如“分类”表,通常包括自己的ID和父分类ID,当我们要做父分类路径、子分类路径之类的查询时很不方便,例如我们会使用嵌套查询...

1714
来自专栏一个会写诗的程序员的博客

mysql 查看索引、添加索引、删除索引命令添加索引删除索引

· Table 表的名称。 · Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。 · Key_name 索引的名称。 · S...

951
来自专栏数据之美

一些sql用法例子【Updating】

1、利用instr连接表做字段查询,group_concat做值的合并: create table ab(product_id int,product_name...

2836
来自专栏个人随笔

sql sever分组查询和连接查询

分组查询 select 查询信息 from 表名 where 条件 group by 按照列分组(可多个 ,隔开) order by 排序方式 (查询信息如果列...

3705

扫码关注云+社区

领取腾讯云代金券