本地的唐山網(wǎng)站建設(shè)零基礎(chǔ)seo入門教學(xué)
SQL零基礎(chǔ)入門學(xué)習(xí)(七)
SQL 連接(JOIN)
SQL join 用于把來自兩個(gè)或多個(gè)表的行結(jié)合起來。
下圖展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相關(guān)的 7 種用法。
SQL JOIN
SQL JOIN 子句用于把來自兩個(gè)或多個(gè)表的行結(jié)合起來,基于這些表之間的共同字段。
最常見的 JOIN 類型:SQL INNER JOIN(簡(jiǎn)單的 JOIN)。 SQL INNER JOIN 從多個(gè)表中返回滿足 JOIN 條件的所有行。
語(yǔ)法:
SELECT column1, column2, ...
FROM table1
JOIN table2 ON condition;
參數(shù)說明:
column1, column2, …:要選擇的字段名稱,可以為多個(gè)字段。如果不指定字段名稱,則會(huì)選擇所有字段。
table1:要連接的第一個(gè)表。
table2:要連接的第二個(gè)表。
condition:連接條件,用于指定連接方式。
演示數(shù)據(jù)庫(kù)
在本教程中,我們將使用 RUNOOB 樣本數(shù)據(jù)庫(kù)。
下面是選自 “Websites” 表的數(shù)據(jù):
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘寶 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鳥教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND |
+----+---------------+---------------------------+-------+---------+
下面是 “access_log” 網(wǎng)站訪問記錄表的數(shù)據(jù):
mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date |
+-----+---------+-------+------------+
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)
請(qǐng)注意,“Websites” 表中的 “id” 列指向 “access_log” 表中的字段 “site_id”。上面這兩個(gè)表是通過 “site_id” 列聯(lián)系起來的。
然后,如果我們運(yùn)行下面的 SQL 語(yǔ)句(包含 INNER JOIN):
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;
執(zhí)行以上 SQL 輸出結(jié)果如下:
不同的 SQL JOIN
在我們繼續(xù)講解實(shí)例之前,我們先列出您可以使用的不同的 SQL JOIN 類型:
INNER JOIN:如果表中有至少一個(gè)匹配,則返回行
LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN:只要其中一個(gè)表中存在匹配,則返回行
SQL INNER JOIN 關(guān)鍵字
INNER JOIN 關(guān)鍵字在表中存在至少一個(gè)匹配時(shí)返回行。
SQL INNER JOIN 語(yǔ)法
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
參數(shù)說明:
columns:要顯示的列名。
table1:表1的名稱。
table2:表2的名稱。
column_name:表中用于連接的列名。
注釋:INNER JOIN 與 JOIN 是相同的。
演示數(shù)據(jù)庫(kù)
在本教程中,我們將使用 RUNOOB 樣本數(shù)據(jù)庫(kù)。
下面是選自 “Websites” 表的數(shù)據(jù):
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘寶 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鳥教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND |
+----+---------------+---------------------------+-------+---------+
下面是 “access_log” 網(wǎng)站訪問記錄表的數(shù)據(jù):
mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date |
+-----+---------+-------+------------+
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)
SQL INNER JOIN 實(shí)例
下面的 SQL 語(yǔ)句將返回所有網(wǎng)站的訪問記錄:
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count;
執(zhí)行以上 SQL 輸出結(jié)果如下:
注釋:INNER JOIN 關(guān)鍵字在表中存在至少一個(gè)匹配時(shí)返回行。如果 “Websites” 表中的行在 “access_log” 中沒有匹配,則不會(huì)列出這些行。
SQL LEFT JOIN 關(guān)鍵字
LEFT JOIN 關(guān)鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結(jié)果為 NULL。
SQL LEFT JOIN 語(yǔ)法
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
注釋:在某些數(shù)據(jù)庫(kù)中,LEFT JOIN 稱為 LEFT OUTER JOIN。
演示數(shù)據(jù)庫(kù)
在本教程中,我們將使用 RUNOOB 樣本數(shù)據(jù)庫(kù)。
下面是選自 “Websites” 表的數(shù)據(jù):
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘寶 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鳥教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND |
+----+---------------+---------------------------+-------+---------+
下面是 “access_log” 網(wǎng)站訪問記錄表的數(shù)據(jù):
mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date |
+-----+---------+-------+------------+
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)
SQL LEFT JOIN 實(shí)例
下面的 SQL 語(yǔ)句將返回所有網(wǎng)站及他們的訪問量(如果有的話)。
以下實(shí)例中我們把 Websites 作為左表,access_log 作為右表:
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;
執(zhí)行以上 SQL 輸出結(jié)果如下:
注釋:LEFT JOIN 關(guān)鍵字從左表(Websites)返回所有的行,即使右表(access_log)中沒有匹配。
SQL RIGHT JOIN 關(guān)鍵字
RIGHT JOIN 關(guān)鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結(jié)果為 NULL。
SQL RIGHT JOIN 語(yǔ)法
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
注釋:在某些數(shù)據(jù)庫(kù)中,RIGHT JOIN 稱為 RIGHT OUTER JOIN。
演示數(shù)據(jù)庫(kù)
在本教程中,我們將使用 RUNOOB 樣本數(shù)據(jù)庫(kù)。
操作前先在 access_log 表添加一條數(shù)據(jù),該數(shù)據(jù)在 Websites 表沒有對(duì)應(yīng)的數(shù)據(jù):
INSERT INTO `access_log` (`aid`, `site_id`, `count`, `date`) VALUES ('10', '6', '111', '2016-03-09');
下面是選自 “Websites” 表的數(shù)據(jù):
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘寶 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鳥教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND |
+----+---------------+---------------------------+-------+---------+
下面是 “access_log” 網(wǎng)站訪問記錄表的數(shù)據(jù):
mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date |
+-----+---------+-------+------------+
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
| 10 | 6 | 111 | 2016-03-19 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)
SQL RIGHT JOIN 實(shí)例
下面的 SQL 語(yǔ)句將返回網(wǎng)站的訪問記錄。
以下實(shí)例中我們把 Websites 作為左表,access_log 作為右表:
SELECT websites.name, access_log.count, access_log.date
FROM websites
RIGHT JOIN access_log
ON access_log.site_id=websites.id
ORDER BY access_log.count DESC;
執(zhí)行以上 SQL 輸出結(jié)果如下:
注釋:RIGHT JOIN 關(guān)鍵字從右表(access_log)返回所有的行,即使左表(Websites)中沒有匹配。
SQL FULL OUTER JOIN 關(guān)鍵字
FULL OUTER JOIN 關(guān)鍵字只要左表(table1)和右表(table2)其中一個(gè)表中存在匹配,則返回行.
FULL OUTER JOIN 關(guān)鍵字結(jié)合了 LEFT JOIN 和 RIGHT JOIN 的結(jié)果。
SQL FULL OUTER JOIN 語(yǔ)法
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
演示數(shù)據(jù)庫(kù)
在本教程中,我們將使用 RUNOOB 樣本數(shù)據(jù)庫(kù)。
下面是選自 “Websites” 表的數(shù)據(jù):
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘寶 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鳥教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND |
+----+---------------+---------------------------+-------+---------+
下面是 “access_log” 網(wǎng)站訪問記錄表的數(shù)據(jù):
+-----+---------+-------+------------+
| aid | site_id | count | date |
+-----+---------+-------+------------+
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)
SQL FULL OUTER JOIN 實(shí)例
下面的 SQL 語(yǔ)句選取所有網(wǎng)站訪問記錄。
MySQL中不支持 FULL OUTER JOIN,你可以在 SQL Server 測(cè)試以下實(shí)例。
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
FULL OUTER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;
注釋:FULL OUTER JOIN 關(guān)鍵字返回左表(Websites)和右表(access_log)中所有的行。如果 “Websites” 表中的行在 “access_log” 中沒有匹配或者 “access_log” 表中的行在 “Websites” 表中沒有匹配,也會(huì)列出這些行。