SQL左链接【LEFT JOIN】详解及图解

JSON 2024-02-26 18:17:04 557

LEFT JOIN 左联接

SQL LEFT JOIN(使用关键字 LEFT JOIN 和 ON 指定)联接两个表,并获取 SQL 表达式为 true 的两个表的所有匹配行,以及第一个表中与第二个表中任何行不匹配的行。

SQL 左连接的图形表示:


左联接:语法

SELECT *
FROM table1
LEFT [ OUTER ] JOIN table2
ON table1.column_name=table2.column_name;

SQL LEFT 联接从 table1 中获取一组完整的记录,并在 table2 中获取匹配的记录(取决于可用性)。当不进行匹配时,结果为右侧为 NULL。

语法图 - LEFT JOIN


SQL 左联接示例

要从公司表中获取公司名称和公司 ID 列,从食物表中获取公司 ID、项目名称、项目单位列,在与这些提到的表进行 OUTER JOIN 之后,可以使用以下 SQL 语句:

样品表:食品

+---------+--------------+-----------+------------+
| ITEM_ID | ITEM_NAME    | ITEM_UNIT | COMPANY_ID |
+---------+--------------+-----------+------------+
| 1       | Chex Mix     | Pcs       | 16         |
| 6       | Cheez-It     | Pcs       | 15         |
| 2       | BN Biscuit   | Pcs       | 15         |
| 3       | Mighty Munch | Pcs       | 17         |
| 4       | Pot Rice     | Pcs       | 15         |
| 5       | Jaffa Cakes  | Pcs       | 18         |
| 7       | Salt n Shake | Pcs       |            |
+---------+--------------+-----------+------------+

 示例表:公司

+------------+---------------+--------------+
| COMPANY_ID | COMPANY_NAME  | COMPANY_CITY |
+------------+---------------+--------------+
| 18         | Order All     | Boston       |
| 15         | Jack Hill Ltd | London       |
| 16         | Akas Foods    | Delhi        |
| 17         | Foodies.      | London       |
| 19         | sip-n-Bite.   | New York     |
+------------+---------------+--------------+

SQL代码:

SELECT company.company_id,company.company_name,
company.company_city,foods.company_id,foods.item_name
FROM   company
LEFT JOIN foods
ON company.company_id = foods.company_id;

 解释:

此 SQL 语句将返回 company 表中的所有行,并且仅返回 foods 表中联接字段相等的行,如果 ON 子句与“foods”表中的任何记录不匹配,则联接仍将返回行,但返回右表每列中的 NULL。

输出:

COMPANY_ID COMPANY_NAME              COMPANY_CITY              COMPANY_ID ITEM_NAME
---------- ------------------------- ------------------------- ---------- --------------
16         Akas Foods                Delhi                     16         Chex Mix
15         Jack Hill Ltd             London                    15         Cheez-It
15         Jack Hill Ltd             London                    15         BN Biscuit
17         Foodies.                  London                    17         Mighty Munch
15         Jack Hill Ltd             London                    15         Pot Rice
18         Order All                 Boston                    18         Jaffa Cakes
19         sip-n-Bite.               New York

上述示例 SQL 左连接的图示:


使用多列的 SQL 左联接示例

要过滤掉账单金额超过500且必须在食品摊位上可用的每张账单的账单编号、项目名称和账单金额,可以使用以下SQL语句:

样品表:食品

+---------+--------------+-----------+------------+
| ITEM_ID | ITEM_NAME    | ITEM_UNIT | COMPANY_ID |
+---------+--------------+-----------+------------+
| 1       | Chex Mix     | Pcs       | 16         |
| 6       | Cheez-It     | Pcs       | 15         |
| 2       | BN Biscuit   | Pcs       | 15         |
| 3       | Mighty Munch | Pcs       | 17         |
| 4       | Pot Rice     | Pcs       | 15         |
| 5       | Jaffa Cakes  | Pcs       | 18         |
| 7       | Salt n Shake | Pcs       |            |
+---------+--------------+-----------+------------+

示例表:counter_sale


BILL_NO ITEM_ID SL_QTY SL_RATE BILL_AMT ---------- ---------- ---------- ---------- ---------- 1003 6 15 20 300 1004 4 18 30 540 1005 7 10 60 600 1006 3 25 25 625 1001 4 20 30 600 1002 1 40 50 2000

SQL代码:

SELECT a.bill_no, b.item_name, a.bill_amt 
FROM counter_sale a 
LEFT JOIN foods b 
ON a.item_id=b.item_id 
WHERE  a.bill_amt>500;

解释:

该 SQL 语句将首先联接 counter_sale 表中的所有行,并且仅联接 foods 表中联接字段相等的行,如果 ON 子句与食物表中没有记录匹配,则联接仍将返回行,但右表每列的 NULL 将删除账单金额小于或等于 500 的行。

输出:

   BILL_NO ITEM_NAME                   BILL_AMT
---------- ------------------------- ----------
      1002 Chex Mix                        2000
      1006 Mighty Munch                     625
      1001 Pot Rice                         600
      1004 Pot Rice                         540
      1005 Salt n Shake                     600

使用多列的 SQL 左连接的图形表示:


使用多个表的 SQL 左连接示例

要筛选出这些账单编号、项目名称、公司名称和城市以及每个账单的账单金额、食品表中可用的项目,以及其制造商必须已登记提供该项目,并且不允许制造商的 NULL 值,可以使用以下 SQL 语句:

样品表:食品

+---------+--------------+-----------+------------+
| ITEM_ID | ITEM_NAME    | ITEM_UNIT | COMPANY_ID |
+---------+--------------+-----------+------------+
| 1       | Chex Mix     | Pcs       | 16         |
| 6       | Cheez-It     | Pcs       | 15         |
| 2       | BN Biscuit   | Pcs       | 15         |
| 3       | Mighty Munch | Pcs       | 17         |
| 4       | Pot Rice     | Pcs       | 15         |
| 5       | Jaffa Cakes  | Pcs       | 18         |
| 7       | Salt n Shake | Pcs       |            |
+---------+--------------+-----------+------------+

示例表:公司

+------------+---------------+--------------+
| COMPANY_ID | COMPANY_NAME  | COMPANY_CITY |
+------------+---------------+--------------+
| 18         | Order All     | Boston       |
| 15         | Jack Hill Ltd | London       |
| 16         | Akas Foods    | Delhi        |
| 17         | Foodies.      | London       |
| 19         | sip-n-Bite.   | New York     |
+------------+---------------+--------------+

示例表:counter_sale

   BILL_NO ITEM_ID        SL_QTY    SL_RATE   BILL_AMT
---------- ---------- ---------- ---------- ----------
      1003 6                  15         20        300
      1004 4                  18         30        540
      1005 7                  10         60        600
      1006 3                  25         25        625
      1001 4                  20         30        600
      1002 1                  40         50       2000

Code: SQL代码:

SELECT a.bill_no, b.item_name,c.company_name, 
c.company_city, a.bill_amt 
FROM counter_sale a 
LEFT JOIN foods b ON a.item_id=b.item_id 
LEFT JOIN company c ON b.company_id=c.company_id
WHERE c.company_name IS NOT NULL
ORDER BY a.bill_no;

解释:

此 SQL 语句将首先联接 counter_sale 表中的所有行,并且仅联接 foods 表中联接字段匹配的行,如果 ON 子句与 foods 表中没有记录匹配,则联接仍将返回行,但返回右表每列中的 NULL。因此,此结果将与公司表联接,结果表中的所有行以及公司表中的匹配行和不匹配行也将出现,但对于公司表的不匹配行,列值将为 NULL。因此,WHERE 子句将删除公司名称列值为 NULL 的行,然后,ORDER BY 子句将根据账单编号按升序排列行。

输出:

   BILL_NO ITEM_NAME                 COMPANY_NAME              COMPANY_CITY                BILL_AMT
---------- ------------------------- ------------------------- ------------------------- ----------
      1001 Pot Rice                  Jack Hill Ltd             London                           600
      1002 Chex Mix                  Akas Foods                Delhi                           2000
      1003 Cheez-It                  Jack Hill Ltd             London                           300
      1004 Pot Rice                  Jack Hill Ltd             London                           540
      1006 Mighty Munch              Foodies.                  London                           625

使用多个表的 SQL 左连接的图形表示:


SQL 中的左连接和左外连接有什么区别?

左连接和左外连接之间实际上没有区别——它们都引用了 SQL 中的类似操作。

示例表:公司

COMPANY_ID COMPANY_NAME              COMPANY_CITY
---------- ------------------------- -------------
18         Order All                 Boston
15         Jack Hill Ltd             London
16         Akas Foods                Delhi
17         Foodies.                  London
19         sip-n-Bite.               New York

样品表:食品

ITEM_ID  ITEM_NAME                 ITEM_UNIT  COMPANY_ID
-------- ------------------------- ---------- ----------
1        Chex Mix                  Pcs        16
6        Cheez-It                  Pcs        15
2        BN Biscuit                Pcs        15
3        Mighty Munch              Pcs        17
4        Pot Rice                  Pcs        15
5        Jaffa Cakes               Pcs        18
7        Salt n Shake              Pcs

需要注意的重要一点是,公司表的最后一行,公司 ID 在食物表中不存在。此外,foods 表中的最后一行公司 ID 的值为 NULL,并且公司表中不存在。这些事实将被证明是左翼加入的重要意义。

这里没有使用“outer”和“left join”的SQL语句。

SQL代码:

SELECT company.company_id,company.company_name,
foods.item_id, foods.item_name, foods.company_id 
FROM company 
LEFT JOIN foods 
ON company.company_id = foods.company_id;

使用“outer”关键字运行 SQL,将得到与运行不带“outer”的 SQL 完全相同的结果。这里是带有“outer”和“left join”的 SQL 语句。

SQL代码:

SELECT company.company_id,company.company_name,
foods.item_id, foods.item_name, foods.company_id 
FROM company 
LEFT OUTER JOIN foods 
ON company.company_id = foods.company_id;

左外联接或左联接将保留左表公司的所有行,而不管右表食物上是否有匹配的行。以下是上述两个语句的输出。

输出:

COMPANY_ID COMPANY_NAME              ITEM_ID  ITEM_NAME                 COMPANY_ID
---------- ------------------------- -------- ------------------------- ----------
16         Akas Foods                1        Chex Mix                  16
15         Jack Hill Ltd             6        Cheez-It                  15
15         Jack Hill Ltd             2        BN Biscuit                15
17         Foodies.                  3        Mighty Munch              17
15         Jack Hill Ltd             4        Pot Rice                  15
18         Order All                 5        Jaffa Cakes               18
19         sip-n-Bite.               NULL     NULL                      NULL

此处所示的上述 SQL 语句的输出是使用 Oracle Database 10g Express Edition 获取的。

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/503.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
SQL右连接【RIGHT JOIN详解图解
SQL右连接【RIGHT JOIN详解图解
SQL内连接详解图解
SQL内连接详解图解
Unicode编码详解
dns-prefetch对网站速度能提升有多少?详解dns-prefetch。
SQL链接剖析
SQL链接剖析
Elasticsearch 教程,Elasticsearch 日期查询详解,Elasticsearch Date 查询Java API
详解JavaScript中splice()方法,有Demo细介绍
最新文章
Linux I/O重定向 1768
Ruby 循环 - while、for、until、break、redo 和 retry 711
Node.js:全局对象 517
如何使用终端检查Linux上的内存使用情况 635
JavaScript对象详细剖析 300
Python print() 函数 409
PHP if/else/elseif 语句 407
HTML5 Canvas弧线教程 387
Java赋值运算符 431
XML内部实体和外部实体 464
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 686836
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 675081
免费天气API,天气JSON API,不限次数获取十五天的天气预报 615809
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 611126
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 555627
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 510028
Elasticsearch教程(四) elasticsearch head 插件安装和使用 481399
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 269208
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 244787
Elasticsearch教程(一),全程直播(小白级别) 227490
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...