深入淺出MySQL(二) 查詢技巧

今天這篇文章主要是來講解一些mysql高級查詢技巧方面的內容:時間寶貴,現在我們直接進入主題:

技巧1:union和union all聯表查詢

Mysql的聯合查詢命令UNION和UNION ALL,總結了使用語法和注意事項,以及學習例子和項目例子,需要的朋友可以參考下
一、UNION和UNION ALL的作用和語法
UNION 用於合併兩個或多個 SELECT 語句的結果集,並消去表中任何重複行。UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同.
SQL UNION 語法:
sql腳本代碼如下:

SELECT column_name FROM table1
UNION
SELECT column_name FROM table2

註釋:默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重複行。
SQL UNION ALL 語法
sql腳本代碼如下:

SELECT column_name FROM table1
UNION ALL
SELECT column_name FROM table2

舉個例子來說明
這裏寫圖片描述

如果要用union來進行相應的查詢的話:

SELECT country,'female', sum(population) from country GROUP 
BY country
UNION
SELECT country,'male',sum(population) from country GROUP 
BY country

乍眼一看,沒什麼意義,這個案例只是用於進行講解

這裏寫圖片描述

嗯嗯,確實查詢出來也沒什麼意義,但是如果我們把性別字段統一之後看會有什麼效果:

SELECT country,'sex', sum(population) from country GROUP 
BY country
UNION
SELECT country,'sex',sum(population) from country GROUP 
BY country

這裏寫圖片描述

果然字段信息裏面重複的內容會有消失,這就是union鏈表查詢的特點,去重

如果我們將關鍵字換成了union all的話,就會變成了以下內容:

SELECT country,'sex', sum(population) from country GROUP
 BY country
UNION ALL
SELECT country,'sex',sum(population) from country GROUP 
BY country

這裏寫圖片描述

這個案例告訴了我們聯合查詢裏面的union和union all的區別了。
那麼這種用法又有什麼應用場景呢?
不急,現在就來一個案例:
還是之前country這張表:
如果想要按照國家和性別進行分組,得出結果如下 :
國家 男 女
中國 340 260
美國 45 55
加拿大 51 49
英國 40 60
那麼sql該怎麼寫?
這個時候可以借鑑上述的union關鍵字來進行聯表查詢了!!

SELECT country,'男', sum(population) from country WHERE 
sex=1 GROUP BY country 
UNION 
SELECT country,'女',sum(population) from country  WHERE 
sex=2 GROUP BY country

這裏寫圖片描述

技巧2:case語句

按照上述的那個案例來說:
還是之前country這張表:
如果想要按照國家和性別進行分組,得出結果如下 :
國家 男 女
中國 340 260
美國 45 55
加拿大 51 49
英國 40 60
那麼sql該怎麼寫?
原先的寫法是:

SELECT country,'男', sum(population) from country WHERE 
sex=1 GROUP BY country 
UNION 
SELECT country,'女',sum(population) from country  WHERE 
sex=2 GROUP BY country

嗯嗯,這樣寫是沒有錯,但是你是否有考慮過性能優化方面的問題呢?
假射現在我往這個數據表裏面插入了100萬條數據之後了?sql查詢兩次,是否會造成性能方面的耽誤?爲何不試試用case語句來進行優化呢?
以下是相關解決方案:

SELECT country, 
       SUM( CASE WHEN sex = 1 THEN 
                      population ELSE 0 END) as 'male',   
       SUM( CASE WHEN sex = 2 THEN 
                      population ELSE 0 END)  as 'female'
FROM  country 
GROUP BY country; 

這樣一來,sql的查詢次數就只需要一遍了
這裏寫圖片描述

查詢結果如上圖所示,有沒有感覺清晰了很多,哈哈哈。這是一種sql優化的技巧。

技巧3:case語句技巧深入

Case具有兩種格式。簡單Case函數和Case搜索函數。
–簡單Case函數
CASE sex
WHEN ‘1’ THEN ‘男’
WHEN ‘2’ THEN ‘女’
ELSE ‘其他’ END
–Case搜索函數
CASE WHEN sex = ‘1’ THEN ‘男’
WHEN sex = ‘2’ THEN ‘女’
ELSE ‘其他’ END


簡單case函數的案例:
有如下數據:(爲了看得更清楚,我並沒有使用國家代碼,而是直接用國家名作爲Primary Key)
國家(country) 人口(population)
中國 600
美國 100
加拿大 100
英國 200
法國 300
日本 250
德國 200
墨西哥 50
印度 250

根據這個國家人口數據,統計亞洲和北美洲的人口數量。應該得到下面這個結果。
洲 人口
亞洲 1100
北美洲 250
其他 700

想要解決這個問題,你會怎麼做?生成一個帶有洲Code的View,是一個解決方法,但是這樣很難動態的改變統計的方式。
如果使用Case函數,SQL代碼如下:

SELECT  SUM(population), 
        CASE country 
                WHEN '中國'     THEN '亞洲' 
                WHEN '印度'     THEN '亞洲' 
                WHEN '日本'     THEN '亞洲' 
                WHEN '美國'     THEN '北美洲' 
                WHEN '加拿大'  THEN '北美洲' 
                WHEN '墨西哥'  THEN '北美洲' 
                  WHEN '德國'  THEN '歐洲'
             WHEN '法國'  THEN '歐洲'
             WHEN '英國'  THEN '歐洲'
        ELSE '其他' END 
FROM  country 
GROUP BY CASE country 
                WHEN '中國'     THEN '亞洲' 
                WHEN '印度'     THEN '亞洲' 
                WHEN '日本'     THEN '亞洲' 
                WHEN '美國'     THEN '北美洲' 
                WHEN '加拿大'  THEN '北美洲' 
                WHEN '墨西哥'  THEN '北美洲' 
                  WHEN '德國'  THEN '歐洲'
                WHEN '法國'  THEN '歐洲'
                WHEN '英國'  THEN '歐洲' 
        ELSE '其他' END; 

同樣的,我們也可以用這個方法來判斷工資的等級,由於之前的emp表裏面的數據已經過了一百萬,操作起來比較慢,因此先copy其中的部分數據到emp2表裏面進行操作:
INSERT INTO emp2
SELECT * from emp limit 10
ok,這下新的表格創建好了。
現在需要對數據庫表裏面的數據進行分類管理:

SELECT  FIRST_NAME,SALARY,
 CASE 
  WHEN emp2.SALARY <=1000 THEN '窮苦'
  WHEN emp2.SALARY >1000 AND SALARY<=5000  THEN '普通'
  WHEN emp2.SALARY >5000 THEN '富裕'
END
FROM emp2

經過查詢最後得出相應的結果圖如下:

這裏寫圖片描述

技巧4:update函數裏面使用case

還是剛纔的那個emp2表格裏面:
例,有如下更新條件
工資5000以上的職員,工資減少10%
工資在2000到4600之間的職員,工資增加15%
很容易考慮的是選擇執行兩次UPDATE語句,如下所示
–條件1

UPDATE emp2
SET salary = salary * 0.9 
WHERE salary >= 5000; 

–條件2

UPDATE emp2
SET salary = salary * 1.15 
WHERE salary >= 2000 AND salary < 4600; 

但是事情沒有想象得那麼簡單,假設有個人工資5000塊。首先,按照條件1,工資減少10%,變成工資4500。接下來運行第二個SQL時候,因爲這個人的工資是4500在2000到4600的範圍之內, 需增加15%,最後這個人的工資結果是5175,不但沒有減少,反而增加了。如果要是反過來執行,那麼工資4600的人相反會變成減少工資。暫且不管這個規章是多麼荒誕,如果想要一個SQL 語句實現這個功能的話,我們需要用到Case函數。代碼如下:

UPDATE emp2 SET emp2.SALARY=
CASE
 WHEN salary>5000 THEN emp2.SALARY*1.15
 WHEN salary>2000 AND salary<4000 THEN SALARY*0.4
ELSE salary END;

嗯嗯,更新成功了
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章