PS:文章整理的知識內容及資料均來自極客時間《SQL必知必會》專欄編程
日期函數 EXTRACT: EXTRACT(YEAR FROM '2019-09-04') = YEAR('2019-09-4');
補充:在WHERE子句中使用SQL函數會使索引失效安全
注意:ORDER BY是對記錄進行排序。若是在前面用到了GROUP BY,其實是一種分組的聚合方式,已經把一組的數據聚合成爲了一條記錄,因此再進行排序的時候,也至關因而對分的組進行排序模塊化
player球員表爲例:函數
例子: SELECT player_name, height FROM player WHERE height = (SELECT max(height) FROM player)
例子: SELECT player_name, height, team_id FROM player AS a WHERE height > (SELECT avg(height) FROM player AS b WHERE a.team_id = b.team_id)
例子: SELECT player_id, player_name, height FROM player WHERE height > ANY (SELECT height FROM player WHERE team_id = 1002)
例子: SELECT player_id, player_name, height FROM player WHERE height > ALL (SELECT height FROM player WHERE team_id = 1002)
當查詢字段字段進行了索引時,主表A數據大於從表B數據,使用IN子查詢效率較高,相反則使用EXIST效率較高,由於IN表是外邊和內表進行hash鏈接,是先執行子查詢。EXISTS是對外表進行循環,而後在內表進行查詢。所以若是外表數據量大,則用IN,若是外表數據量小,則用EXISTS。IN有一個缺陷是不能判斷NULL,所以若是字段存在NULL值,則會出現返回,所以最好使用NOT EXISTS。
例如如:性能
SELECT * FROM A WHERE cc IN (SELECT cc FROM B) SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)
當A小於B時,用EXIST。由於EXIST的實現,至關於外表循環,實現的邏輯相似於:優化
for i in A for j in B if j.cc == i.cc then ...
當B小於A時,用IN,由於實現的邏輯相似於:spa
for i in B for j in A if j.cc == i.cc then ...
因此哪一個表小就用哪一個表來驅動,A表小 就用EXIST,B表小 就用IN;code
例子: SELECT * FROM player CROSS JOIN team
例子:SELECT player_id, team_id, player_name, height, team_name FROM player NATURAL JOIN team
例子:SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id
例子:SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id
例子:SELECT b.player_name, b.height FROM player AS a JOIN player AS b ON a.player_name = '布雷克-格里芬' AND a.height < b.height
一、控制鏈接表的數量
多表鏈接就至關於嵌套 for 循環同樣,很是消耗資源,會讓 SQL 查詢性能降低得很嚴重,所以不要鏈接沒必要要的表。在許多 DBMS 中,也都會有最大鏈接表的限制。二、鏈接時使用WHERE語句過濾
多表鏈接的時候不要忘記了 WHERE語句,這樣能夠過濾掉沒必要要的數據行返回。blog三、使用自鏈接代替子查詢
在自鏈接例子中,其實也可使用子查詢。通常狀況建議使用自鏈接,由於在許多 DBMS 的處理過程當中,對於自鏈接的處理速度要比子查詢快得多。由於子查詢其實是經過未知表進行查詢後的條件判斷,而自鏈接是經過已知的自身數據表進行條件判斷,所以在大部分 DBMS 中都對自鏈接處理進行了優化。排序
咱們須要瞭解到視圖是虛擬表,自己不存儲數據,若是想要經過視圖對底層數據表的數據進行修改也會受到不少限制,一般咱們是把視圖用於查詢,也就是對 SQL 查詢的一種封裝。