Mysql基礎知識整理筆記(二)

PS:文章整理的知識內容及資料均來自極客時間《SQL必知必會》專欄編程

SQL函數以及使用帶來的問題

clipboard.png

日期函數 EXTRACT: EXTRACT(YEAR FROM '2019-09-04') = YEAR('2019-09-4');
補充:在WHERE子句中使用SQL函數會使索引失效安全

彙集函數的使用

clipboard.png

注意:ORDER BY是對記錄進行排序。若是在前面用到了GROUP BY,其實是一種分組的聚合方式,已經把一組的數據聚合成爲了一條記錄,因此再進行排序的時候,也至關因而對分的組進行排序模塊化

子查詢的使用

clipboard.png

player球員表爲例:函數

clipboard.png

  • 非關聯子查詢:子查詢從數據表中查詢了數據結果,且這個數據結果只執行一次,而後以這個數據結果做爲主查詢的條件進行過濾;
例子: 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)
  • ANY(SOME)的使用:查詢player表中的球員身高比team_id=1002的任一球員身高高的球員數據
例子:
SELECT player_id, player_name, height FROM player 
WHERE height > ANY (SELECT height FROM player WHERE team_id = 1002)
  • ALL的使用:查詢比team_id=1002的全部球員身高都高的球員數據
例子:
SELECT player_id, player_name, height FROM player 
WHERE height > ALL (SELECT height FROM player WHERE team_id = 1002)
  • EXIST和IN的查詢效率比較
當查詢字段字段進行了索引時,主表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

鏈接的使用

  • 交叉鏈接(笛卡爾積):CROSS JOIN
例子: SELECT * FROM player CROSS JOIN team
  • 天然鏈接:NATURAL JOIN
例子:SELECT player_id, team_id, player_name, height, team_name FROM player NATURAL JOIN team
  • 左外鏈接:LEFT JOIN
例子:SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id
  • 右外鏈接:RIGHT JOIN
例子:SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id
  • 自鏈接:JOIN
例子: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 中都對自鏈接處理進行了優化。排序

視圖

clipboard.png

咱們須要瞭解到視圖是虛擬表,自己不存儲數據,若是想要經過視圖對底層數據表的數據進行修改也會受到不少限制,一般咱們是把視圖用於查詢,也就是對 SQL 查詢的一種封裝。
  1. 安全性:虛擬表是基於底層數據表的,咱們在使用視圖時,通常不會輕易經過視圖對底層數據進行修改,即便是使用單表的視圖,也會受到限制,好比計算字段,類型轉換等是沒法經過視圖來對底層數據進行修改的,這也在必定程度上保證了數據表的數據安全性。同時,咱們還能夠針對不一樣用戶開放不一樣的數據查詢權限,好比人員薪酬是個敏感的字段,那麼只給某個級別以上的人員開放,其餘人的查詢視圖中則不提供這個字段。
  2. 簡單清晰:視圖是對 SQL 查詢的封裝,它能夠將本來複雜的 SQL 查詢簡化,在編寫好查詢以後,咱們就能夠直接重用它而沒必要要知道基本的查詢細節。同時咱們還能夠在視圖之上再嵌套視圖。這樣就比如咱們在進行模塊化編程同樣,不只結構清晰,還提高了代碼的複用率。

存儲過程

clipboard.png

遊標

clipboard.png

相關文章
相關標籤/搜索