SQL join(連接): 用於把來自兩個或多個表的行結合起來。
下圖展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相關的 7 種用法。
- INNER JOIN:內連接,又叫等值連接,只返回兩個表中連接字段相等的行。
- LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行,右邊爲空字段補null
- RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行,左邊爲空字段補null
- FULL JOIN:外連接,返回兩個表中的行:left join + right join。
- CROSS JOIN : 結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。
FULL OUTER JOIN 用法:
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
得到的結果數
inner join <= min(left join, right join)
full join >= max(left join, right join)
當 inner join < min(left join, right join) 時, full join > max(left join, right join)
表連接的邏輯
首先,連接的結果可以在邏輯上看作是由SELECT語句指定的列組成的新表。
左連接與右連接的左右指的是以兩張表中的哪一張爲基準,它們都是外連接。
外連接就好像是爲非基準表添加了一行全爲空值的萬能行,用來與基準表中找不到匹配的行進行匹配。假設兩個沒有空值的表進行左連接,左表是基準表,左表的所有行都出現在結果中,右表則可能因爲無法與基準表匹配而出現是空值的字段。
在使用 left join 時,on 和 where 條件的區別如下:
數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。
- on 條件是在生成臨時表時使用的條件,它不管 on 中的條件是否爲真,都會返回左邊表中的記錄。
- where 條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有 left join 的含義(必須返回左邊表的記錄)了,條件不爲真的就全部過濾掉。
舉例說明:
A表(a1,b1,c1)
B表(a2,b2)
左連接
SELECT A.\*,B.\* FROM A left outer join on (A.a1 = B.a2);
結果:
右連接
SELECT A.\*,B.\* FROM A right outer join B on (A.a1 = B.a2);**
結果:
內連接
從多個表中返回滿足 JOIN 條件的所有行。
SELECT A.\*,B.\* FROM A inner join B ON (A.a1 = B.a2);
自然連接
SELECT * FROM A,B WHERE A.a1 = B.a2;
結果:
union & union all
合併兩個或多個SQL語句的結果集(重複或不重複)
請注意,UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每個 SELECT 語句中的列的順序必須相同。
SQL union用法:
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。
SQL union all用法:
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。
使用UNION命令時需要注意,只能在最後使用一個ORDER BY命令,是將兩個查詢結果合在一起之後,再進行排序!絕對不能寫兩個ORDER BY命令。
另外,在使用ORDER BY排序時,注意兩個結果的別名保持一致,使用別名排序很方便。當然也可以使用列數。
ORDER BY 除了可以對指定的字段進行排序,還可以使用函數進行排序:
order by abs(a);
ORDER BY 只能當前 SQL 查詢結果進行排序,如要對 union all 出來的結果進行排序,需要先做集合。
select aa.* from
(select country,name from websites where country = 'CN'
union all select country,app_name from apps where country='CN' ) aa
order by aa.name;
EXPLAIN
可以模擬優化器執行SQL查詢語句,從而指導MySQL是如何處理你的SQL語句的。可用來分析查詢語句或表結構的性能瓶頸。可以查看:
- 表的讀取順序
- 數據讀取操作的操作類型
- 哪些索引可以使用
- 哪些索引被實際使用
- 表之間的引用
- 每張表有多少行被優化器查詢
EXPLAIN用法
EXPLAIN SQL語句
例:EXPLAIN SELECT * FROM ‘Table’ LIMIT 3,5
- type:查詢使用類型 system > const > eq_ref > ref > range > index > all
- possible_keys:查詢涉及到的字段上若存在索引就會列出,但不一定會被用到
- key:實際查詢中用到的索引
- rows:查詢數據時掃描的行數,越少越好