SQL中连接(JOIN)子句介绍

摘要:
1概述SQL中的JOIN子句用于组合两个或多个表中的行。在实际的数据库应用程序中,通常需要从多个数据表中读取数据。此时,可以使用SQL语句中的join子句来查询两个或多个数据表中的数据。LEFTJOIN的表关联模型如下:注意:上图中的绿色部分是两个表的左侧关联结果。RIGHTJOIN将读取右侧数据表中的所有数据,即使左侧表中没有相应的数据。

本文主要介绍 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 的表关联模型如下:

SQL中连接(JOIN)子句介绍第1张

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

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 的表关联模型如下:

SQL中连接(JOIN)子句介绍第2张

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

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 的表关联模型如下:

SQL中连接(JOIN)子句介绍第3张

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

免责声明:文章转载自《SQL中连接(JOIN)子句介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python+unittest+requests实现接口自动化的方法radio 获取选中值下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mount命令(用来挂载硬盘或镜像等)

用法:mount [-t vfstype] [-o options] device dir1.-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:DOS fat16文件系统:msdosWindows 9x fat32文件系统:vfatWindows NT ntfs文件系统:ntfsWindows网络文件共...

mysql 怎么通过sql语句批量去掉某一个表中某一个字段的多余字符

采用替换,把”<img src="http://t.zoukankan.com/“替换为空格," />也替换为空格,曾经在网上看到过这样的SQL,替换字段中字符串中的某些字符update 表名 set 要修改的字段名= replace(要修改的字段名,‘<img src="http://t.zoukankan.com/’,'')updat...

MYSQL 数据库导入导出命令

在不同操作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生。所以一般推荐用SQL脚本形式导入。下面分别介绍两种方法。 MySQL命令行导出数据库 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:Program FilesMySQLMySQL Server 4.1in (或...

mysql 中unionall 使用

SELECTpay_id,invoice_num,task_name,pay_priority,core_enterprise_name,financial_institutions_name,suppliers_name,item_company_name,account_receivable,task_user_uuid,biz_uuid,task_u...

mysql 创建函数

<pre name="code" class="html">root 用户创建函数; delimiter $$ CREATE FUNCTION `loadTreeByParent`(begin_sn INT) RETURNS varchar(600) CHARSET utf8 BEGIN DECLARE rest VARCHAR(60...

ansible 的用法

ansible 常用模块 1 command 模块 默认模块,不指定 -m 参数时,使用的就是 command 模块; 但 "<", ">", "|", and "&" 操作都不可以,当然,也不支持管道; 缺点:不支持管道,没法批量执行命令; 示例: ansible 192.168.2.20 -m command -a 'ifconfi...