SQL教學
SQL RDBMS概念
SQL簡介
SQL NOT NULL約束
SQL DEFAULT約束
SQL唯一約束
SQL主鍵
SQL外鍵
SQL CHECK約束
SQL示例數據庫
SQL索引約束
SQL NULL值
數據庫 - 第一範式(1NF)
數據庫 - 第二範式(2NF)
數據庫 - 第三範式(3NF)
SQL RDBMS數據庫
SQL語法
SQL數據類型
SQL操運算符
SQL算術運算符
SQL比較運算符
SQL邏輯運算符
SQL表達式
SQL創建數據庫(CREATE DATABASE)
SQL丟棄或刪除數據庫(DROP DATABASE)
SQL選擇數據庫(SELECT Database, USE語句)
SQL創建表(CREATE Table)
SQL從現有表創建表
SQL刪除表(DROP或DELETE Table)
SQL INSERT INTO插入查詢
SQL SELECT查詢語句
SQL WHERE子句
SQL AND和OR運算符
SQL UPDATE更新查詢
SQL DELETE刪除查詢
SQL LIKE子句
SQL TOP,LIMIT,ROWNUM子句
SQL ORDER BY排序子句
SQL GROUP BY(分組)
SQL Distinct關鍵字
SQL排序結果
SQL約束
SQL Join聯接
SQL INNER JOIN(內部連接)
SQL LEFT JOIN(左連接)
SQL RIGHT JOIN(右連接)
SQL FULL JOIN(全連接)
SQL自連接
SQL笛卡爾或交叉連接
SQL UNION子句/操作符
SQL INTERSECT子句
SQL EXCEPT子句
SQL別名語法
SQL索引
SQL ALTER TABLE(修改表)
SQL TRUNCATE TABLE(截斷表)
SQL View(視圖)
SQL Having子句
SQL事務
SQL通配符運算符
SQL日期函數
SQL ADDDATE()函數
SQL ADDTIME()函數
SQL CONVERT_TZ()函數
SQL CURDATE()函數
SQL CURRENT_DATE()函數
SQL CURTIME()函數
SQL CURRENT_TIME()函數
SQL CURRENT_TIMESTAMP()方法
SQL DATE(expr)函數
SQL DATEDIFF()方法
SQL DATE_ADD()和DATE_SUB()方法
SQL DATE_FORMAT()函數
SQL DATE_SUB()方法
SQL DAY()函數
SQL DAYNAME()函數
SQL DAYOFMONTH()函數
SQL DAYOFWEEK()函數
SQL DAYOFYEAR()函數
SQL EXTRACT()函數
SQL FROM_DAYS()函數
SQL FROM_UNIXTIME()函數
SQL HOUR()方法
SQL LAST_DAY()函數
SQL LOCALTIME和LOCALTIME()函數
SQL LOCALTIMESTAMP和LOCALTIMESTAMP()函數
SQL MAKEDATE()函數
SQL MAKETIME()函數
SQL MICROSECOND()函數
SQL MINUTE()函數
SQL MONTH()函數
SQL MONTHNAME()函數
SQL NOW()函數
SQL PERIOD_ADD()函數
SQL PERIOD_DIFF()函數
SQL QUARTER()函數
SQL SECOND()函數
SQL SEC_TO_TIME()函數
SQL STR_TO_DATE()函數
SQL SUBDATE()函數
SQL SUBTIME()函數
SQL SYSDATE()函數
SQL TIME()函數
SQL TIMEDIFF()函數
SQL TIMESTAMP()函數
SQL TIMESTAMPADD()函數
SQL TIMESTAMPDIFF()函數
SQL TIME_FORMAT()函數
SQL TIME_TO_SEC()函數
SQL TO_DAYS()函數
SQL UNIX_TIMESTAMP()函數
SQL UTC_DATE()函數
SQL UTC_TIME()函數
SQL UTC_TIMESTAMP()函數
SQL WEEK()函數
SQL WEEKDAY()函數
SQL WEEKOFYEAR()函數
SQL YEAR()函數
SQL YEARWEEK()函數
SQL臨時表
SQL克隆表
SQL子查詢
SQL使用序列(自動遞增)
SQL DISTINCT重複處理
SQL注入
SQL實用函數
SQL MAX()函數
SQL MIN()函數
SQL AVG()函數
SQL SUM()函數
SQL SQRT()函數
SQL RAND()函數
SQL CONCAT()函數
SQL數值函數
SQL ABS()函數
SQL ACOS()函數
SQL ASIN(X)函數
SQL ATAN(X)函數
SQL ATAN2()函數
SQL BIT_AND()函數
SQL BIT_COUNT()函數
SQL BIT_OR()函數
SQL CEIL()函數
SQL CONV()函數
SQL COS()函數
SQL COT()函數
SQL DEGREES()函數
SQL EXP(X)函數
SQL FLOOR(X)函數
SQL FORMAT(X,D)函數
SQL GREATEST()函數
SQL INTERVAL()函數
SQL LEAST()函數
SQL LOG()函數
SQL LOG10(X)函數
SQL MOD()函數
SQL OCT(N)函數
SQL PI()函數
SQL POW()函數
SQL RADIANS()函數
SQL ROUND()函數
SQL SIGN(X)函數
SQL SIN(X)函數
SQL SQRT(X)函數
SQL STD()函數
SQL TAN(X)函數
SQL TRUNCATE()函數
SQL字符串函數
SQL ASCII(str)函數
SQL BIN(N)函數
SQL BIT_LENGTH()函數
SQL CHAR()函數
SQL CHAR_LENGTH()函數
SQL CHARACTER_LENGTH()函數
SQL字符串CONCAT()函數
SQL CONCAT_WS()函數
SQL CONV(N,from_base,to_base)函數
SQL ELT()函數
SQL EXPORT_SET()函數
SQL FIELD()函數
SQL FIND_IN_SET()函數
SQL FORMAT()函數
SQL HEX()函數
SQL INSERT()函數
SQL INSTR()函數
SQL LCASE()函數
SQL LEFT()函數
SQL LENGTH()函數
SQL LOAD_FILE()函數
SQL LOCATE()函數
SQL LOWER()函數
SQL LPAD()函數
SQL LTRIM()函數
SQL MAKE_SET()函數
SQL MID()函數
SQL OCT()函數
SQL OCTET_LENGTH()函數
SQL ORD()函數
SQL POSITION()函數
SQL QUOTE()函數
SQL REGEXP模式
SQL REPEAT()函數
SQL REPLACE()函數
SQL REVERSE()函數
SQL RIGHT()函數
SQL RPAD()函數
SQL SOUNDEX()函數
SQL SPACE()函數
SQL STRCMP()函數
SQL SUBSTRING()函數
SQL SUBSTRING_INDEX()函數
SQL TRIM()函數
SQL UCASE()函數
SQL UNHEX()函數
SQL UPPER()函數

SQL Left Join子句

在本教程中,我們將介紹另一種稱爲SQL LEFT JOIN的連接,它用於從多個表中檢索數據。

1. SQL LEFT JOIN子句簡介

在上一個教程中我們知道,如果兩個表中至少有一行與連接條件匹配,則返回行記錄的內聯接。 內連接子句消除了與另一個表的行不匹配的行。

但是,左連接將返回左表中的所有行,而不管右表中是否存在匹配的行。

假設有兩個表AB。表A有四行:1,2,34。表B還有四行:3,4,5,6

當將表A與表B連接時,表A中的所有行(左表)都包含在結果集中,而不管無論表B中是否存在匹配的行。

SQL

在SQL中,使用以下語法將表A與表B連接起來。

SELECT
    A.n
FROM
    A
LEFT JOIN B ON B.n = A.n;

LEFT JOIN子句出現在FROM子句之後。 ON關鍵字後面的條件稱爲連接條件B.n = A.n

2. SQL LEFT JOIN示例

2.1. SQL LEFT JOIN兩個表的例子

我們來看看以下兩個表:countrieslocations表的結構和關係。
SQL

每個地點屬於一個且僅一個國家/地區,而每個國家/地區可以具有零個或多個地點。countrieslocations表之間的關係是一對多的。

locations表中的country_id列是鏈接到countries表中country_id列的外鍵。

要查詢美國,英國和中國的國家/地區名稱,請使用以下語句。

···

SELECT
    country_id,
    country_name
FROM
    countries
WHERE
    country_id IN ('US', 'UK', 'CN');

執行上面查詢語句,得到以下結果 -

+------------+--------------+
| country_id | country_name |
+------------+--------------+
| CN         | 中國         |
| UK         | 英國         |
| US         | 美國         |
+------------+--------------+
3 rows in set

以下查詢檢索位於美國,英國和中國的地點:

SELECT
    country_id,
    street_address,
    city
FROM
    locations
WHERE
    country_id IN ('US', 'UK', 'CN');

執行上面查詢語句,得到以下結果 -

+------------+------------------------------------------+---------------------+
| country_id | street_address                           | city                |
+------------+------------------------------------------+---------------------+
| US         | 2014 Jabberwocky Rd                      | Southlake           |
| US         | 2011 Interiors Blvd                      | South San Francisco |
| US         | 2004 Charade Rd                          | Seattle             |
| UK         | 8204 Arthur St                           | London              |
| UK         | Magdalen Centre, The Oxford Science Park | Oxford              |
+------------+------------------------------------------+---------------------+
5 rows in set

現在,使用LEFT JOIN子句將countries表與locations表連接爲以下查詢:

SELECT
    c.country_name, c.country_id, l.country_id, l.street_address, l.city
FROM
    countries c
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
    c.country_id IN ('US', 'UK', 'CN')

執行上面查詢語句,得到以下結果 -

SQL

應用WHERE子句中的條件,指示僅檢索來自:USUKChina行的數據。

因爲使用LEFT JOIN子句,所以滿足countries表的WHERE子句中的條件的所有行都包含在結果集中。

對於countries表中的每一行,LEFT JOIN子句在locations表中查找匹配的行。如果找到至少一個匹配行,則數據庫引擎將兩個表中匹配行的列中的數據組合在一起。

如果沒有找到匹配的行,例如,使用country_id的值是:CN,則countries表中的行包含在結果集中,而locations表中的行用NULL值填充。

由於右表中的非匹配行使用NULL值填充,因此可以將LEFT JOIN子句應用於表之間的未匹配行。

例如,要查找locations表中沒有任何地點的國家/地區,請使用以下查詢:

SELECT
    country_name
FROM
    countries c
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
    l.location_id IS NULL
ORDER BY
    country_name;

執行以下查詢語句,得到以下結果 -

+--------------+
| country_name |
+--------------+
| 中國         |
| 丹麥         |
| 以色列       |
| 印度         |
| 埃及         |
| 墨西哥       |
| 尼日利亞     |
.....
| 荷蘭         |
| 贊比亞       |
| 阿根廷       |
| 香港         |
+--------------+
21 rows in set

2.2. SQL LEFT JOIN 3個表的示例

請參閱下表:regions, countrieslocations的結構和關係。

SQL

一個地區可能有零個或多個國家,而每個國家都位於一個地區。 countriesregions表之間的關係是一對多的。 countries表中的region_id列是國家和地區表之間的鏈接。

以下語句演示瞭如何連接3個表:regions, countrieslocations

SQL

通過上面的學習,現在您應該很好地理解SQL LEFT JOIN子句的工作原理,並知道如何應用LEFT JOIN子句來查詢來自多個表的數據。