• SQL中连接(JOIN)子句介绍


    本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法。

    说明:本文的用法示例是面向 MySQL 数据库的。

    1 概述
    SQL 中 JOIN 子句用于把来自两个或多个表的行结合起来。

    在实际的数据库应用中,经常需要从多个数据表中读取数据,这时就可以使用 SQL 语句中的连接(JOIN)子句,在两个或多个数据表中查询数据。

    JOIN 的用法按照功能划分,可分为如下三类:

    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;
    LEFT JOIN(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录;
    RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表中的所有记录,即使左表没有对应匹配的记录。
    2 常见用法
    现提供两个表(表信息如下),本文后面的用法示例,均是对这两个表进行操作的。

    mysql> select * from roles;
    +---------+------------+----------+
    | role_id | occupation | camp     |
    +---------+------------+----------+
    |       1 | warrior    | alliance |
    |       2 | paladin    | alliance |
    |       3 | rogue      | Horde    |
    +---------+------------+----------+
    3 rows in set (0.01 sec)
     
    mysql> 
    mysql> select * from mount_info;
    +----------+------------+---------+
    | mount_id | mount_name | role_id |
    +----------+------------+---------+
    |        1 | horse      |       1 |
    |        2 | sheep      |       1 |
    |        3 | sheep      |       4 |
    +----------+------------+---------+
    3 rows in set (0.01 sec)
     
    mysql> 

    2.1 INNER JOIN
    下面通过一个示例,介绍 INNER JOIN 的用法。

    使用 INNER JOIN(也可以省略 INNER 、直接使用 JOIN)来连接上面两张表,匹配 mount_info 和 role_id 中字段 role_id 相同的内容,相关命令如下:

    mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a INNER JOIN mount_info b ON a.role_id = b.role_id;
    +---------+------------+----------+------------+
    | role_id | occupation | camp     | mount_name |
    +---------+------------+----------+------------+
    |       1 | warrior    | alliance | horse      |
    |       1 | warrior    | alliance | sheep      |
    +---------+------------+----------+------------+
    2 rows in set (0.01 sec)
     
    mysql> 

    上述 SQL 语句与下列语句等价:

    mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a, mount_info b WHERE a.role_id = b.role_id;
    +---------+------------+----------+------------+
    | role_id | occupation | camp     | mount_name |
    +---------+------------+----------+------------+
    |       1 | warrior    | alliance | horse      |
    |       1 | warrior    | alliance | sheep      |
    +---------+------------+----------+------------+
    2 rows in set (0.01 sec)
     
    mysql> 

    INNER JOIN 的表关联模型如下:

    说明:上图中的绿色部分,为两表的内关联结果。

    2.2 LEFT JOIN
    下面通过一个示例,介绍 LEFT JOIN 的用法。

    LEFT JOIN 与 INNER JOIN 有所不同,LEFT JOIN 会读取左侧数据表的全部数据,即使右侧表中无对应数据。

    使用 LEFT JOIN来连接上面两张表,以 roles 为左侧表、mount_info 为右侧表,相关命令如下:

    mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a LEFT JOIN mount_info b ON a.role_id = b.role_id;
    +---------+------------+----------+------------+
    | role_id | occupation | camp     | mount_name |
    +---------+------------+----------+------------+
    |       1 | warrior    | alliance | horse      |
    |       1 | warrior    | alliance | sheep      |
    |       2 | paladin    | alliance | NULL       |
    |       3 | rogue      | Horde    | NULL       |
    +---------+------------+----------+------------+
    4 rows in set (0.01 sec)
     
    mysql> 

    通过上述结果能够看到,上面执行的 SQL 语句读取左边的数据表 roles 的所有的(SELECT)字段数据,即使在右侧表 mount_info 中没有对应的 role_id 字段值。

    LEFT JOIN 的表关联模型如下:

    说明:上图中的绿色部分,为两表的左关联结果。

    2.3 RIGHT JOIN
    下面通过一个示例,介绍 RIGHT JOIN 的用法。

    RIGHT JOIN 会读取右侧数据表的全部数据,即便左侧表无对应数据。

    使用 LEFT JOIN 来连接上面两张表,以 roles 为左侧表、mount_info 为右侧表,相关命令如下:

    mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a RIGHT JOIN mount_info b ON a.role_id = b.role_id;
    +---------+------------+----------+------------+
    | role_id | occupation | camp     | mount_name |
    +---------+------------+----------+------------+
    |       1 | warrior    | alliance | horse      |
    |       1 | warrior    | alliance | sheep      |
    |    NULL | NULL       | NULL     | sheep      |
    +---------+------------+----------+------------+
    3 rows in set (0.01 sec)
     
    mysql> 

    通过上述结果能够看到,上面执行的 SQL 语句读取右侧的数据表 mount_info 的所有的(SELECT)字段数据,即使在左侧表 roles 中没有对应的 role_id 字段值。

    RIGHT JOIN 的表关联模型如下:

     说明:上图中的绿色部分,为两表的右关联结果。

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    C#编程语言详解(第2版) 11.3 类和结构的区别
    .Net程序员如何快速成长之我见
    封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件,c#接收邮件
    POJ1163The Triangle
    hdoj_1231&&hdoj_1003最大连续子序列
    数组名++操作导致的_BLOCK_TYPE_IS_VALID
    《windows程序设计》第二章学习心得
    error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
    Windows环境下Unicode编程总结
    已知顺序表L递增有序,写一算法,将X插入到线性表的适当位置,以保持线性表的有序
  • 原文地址:https://www.cnblogs.com/jijm123/p/15742429.html
Copyright © 2020-2023  润新知