SQL左链接【LEFT JOIN】详解及图解
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
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。