1. 程式人生 > >Mysql多表查詢詳解(初學者適用)

Mysql多表查詢詳解(初學者適用)

-- ----------------
-- ######多表查詢##
-- join用於把來自兩個或多個表的行結合起來。
-- INNER JOIN:如果表中有至少一個匹配,則返回行
-- LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
-- RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
-- FULL JOIN:只要其中一個表中存在匹配,則返回行,MYSQL不支援該語法

-- ----------------

SELECT * FROM websites;
SELECT * FROM access_log;
-- INNER JOIN  從多個表中返回滿足 JOIN 條件的所有行
-- "Websites" 表中的 "id" 列指向 "access_log" 表中的欄位 "site_id"。
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;

-- LEFT JOIN 從左表(access_log)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。
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;
-- RIGHT JOIN 從右表(Websites)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。
SELECT Websites.name, access_log.count, access_log.date
FROM access_log
RIGHT JOIN Websites
ON access_log.site_id=Websites.id
ORDER BY access_log.count DESC;
-- MySQL中不支援 FULL OUTER JOIN
-- FULL OUTER JOIN 關鍵字返回左表(Websites)和右表(access_log)中所有的行。
-- 如果 "Websites" 表中的行在 "access_log" 中沒有匹配或者 "access_log" 表中的行在 "Websites" 表中沒有匹配,也會列出這些行。
-- FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行.
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;

-- UNION 操作符合並兩個或多個 SELECT 語句的結果。(上下連結串列)
-- UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每個 SELECT 語句中的列的順序必須相同。

-- 自動去重  (當兩張表裡的資料,有重複的才會自動去重)
SELECT country FROM Websites UNION
SELECT country FROM apps
ORDER BY country;
-- 從 "Websites" 和 "apps" 表中選取所有的country(也有重複的值)
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY country;
--  從 "Websites" 和 "apps" 表中選取所有的中國(CN)的資料(也有重複的值):
SELECT country, `name` FROM Websites WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps WHERE country='CN'
ORDER BY country;