Skip to content

[MySQL] 心得筆記(1) SELECT, FROM, WHERE, GROUP-BY, HAVING, ORDER-BY, LIMIT

Last Updated on 2021-05-13 by Clay

最近在認真研究 SQL 語法,經歷了不少的挫折,總算稍微有點明白這個 SQL 語法該怎麼查找資料了 ...... 今天主要就是紀錄 SQL 當中的『SELECT』、『FROM』、『WHERE』、『GROUP BY』、『HAVING』、『ORDER BY』、『LIMIT』這 7 個基本的指令。

這 7 個指令存在著優先度的順序,以圖示來說即是:

每個指令的意思分別為:

語法功能
SELECT欲查詢的欄位
FROM遇查詢的表格
WHERE查詢條件
GROUP欄位組別
HAVING組別條件
ORDER BY顯示順序
LIMIT顯示限制

這樣一下,可能還是不清楚該怎麼操作,那麼以下就直接以實例來看看吧。


切換資料庫

首先,打開 MySQL Workbench。如果有其他可以練習 SQL 的程式,也可以直接使用,不過要小心不同的資料庫語言可能會有不同。

如果電腦中沒有安裝任何像是 MySQL 之類的程式,也許你可以參考我這篇安裝教學安裝一下: 《MySQL 下載安裝步驟的心得筆記》

show databases;



Output:

information_schema
mysql
performance_schema
sakila
sys
world 

這裡我們先選擇 "world" 這個資料庫。

use world;



這樣我們就切換到這個 "world" 資料庫了。

然後我們顯示一下資料庫裡面有的 table:

show tables;



Output:

city
country
countrylanguage 

如果有以上這些 tables,那代表這個預設的資料庫沒有問題。


SELECT

FROM

這兩個指令需要合在一起使用。SELECT 後面接的是選擇哪個 Column (欄位),FROM 後面接的是我們要從哪個 table 當中查找。

簡單的查找指令:

select * from city;



Output:

IDNameCountryDistrictPopulation
1KabulAFGKabol1780000
2QandaharAFGQandahar237500
3HeratAFGHerat186800
4Mazar-e-SharifAFGBalkh127800
5AmsterdamNLDNoord-Holland731200

以下省略。

基本上,我們使用 "*" 的話會把所有欄位全部列出。當然,你也可以只打欄位名稱,例如剛才的第一個欄位便是 ID:

select ID from city;



Output:

ID
129
1
2
3
4
56

以下省略。這樣一來,我們便只有印出 ID 欄位了。

我們也可以印出多欄位:

select ID, Name from city;



Output:

IDName
1Kabul
2Qandahar
3Herat
4Mazar-e-Sharif
5Amsterdam

這樣就同時把 ID 跟 Name 欄位同時印出了。


WHERE

WHERE 指令就像其他程式語言當中的 if 一樣,是用來進行條件判斷的。

比如說,我們設定印出的程式名稱全都是始於 CountryCode 為 'AFG' 的:

select Name, CountryCode from city where CountryCode = 'AFG';



Output:

NameCountryCode
KabulAFG
QandaharAFG
HeratAFG
Mazar-e-SharifAFG

就像這樣。


GROUP BY

GROUP BY 比較難以解釋,舉個案例來說,我們可以針對返回結果來進行分組。比如說我想要查看每個區域 GNP 最大的國家。

國民生產總值(英語:Gross National Product,縮寫:GNP),台灣亦稱國民生產毛額,在描述地區性生產時稱本地居民生產總值地區居民生產總值,即某一區域公民一年內所生產的最終產品(包括勞務)的市場價值的總和,是國民收入核算中最重要的組成部分。

Wikipedia

我們可以這樣查找:

select
    Continent, Name, max(GNP)
    from country
    group by Continent;



Output:

ContinentNamemax(GNP)
North AmericaAruba8510700.00
AsiaAfghanistan3787042.00
EuropeAlbania2133367.00
South AmericaArgentina776739.00
OceaniaAmerican Samoa351182.00
AfricaAngola116729.00
AntarcticaAntarctica0.00

HAVING

having 便是找尋『符合條件』的情況,比如說我們拿剛才的範例繼續往下做 —— 如果今天我們希望看到結果只有 GNP 超過 500,000 的,我們可以再最後加上 HAVING 指令:

select
    Continent, Name, max(GNP)
    from country
    group by Continent
    having max(GNP) > 500000;



Output:

ContinentNamemax(GNP)
North AmericaAruba8510700.00
AsiaAfghanistan3787042.00
EuropeAlbania2133367.00
South AmericaArgentina776739.00

可以確實看見我們過濾掉 GNP 較小的資料了。


ORDER BY

ORDER BY,顧名思義,便是替資料顯示方式排序。比如說剛才尋找的資料,我們使用 Capital 來進行排序:

select
    Capital, Continent, Name, max(GNP)
    from country
    group by Continent
    order by Capital desc;



Output:

Capital Continent Name max(GNP)
129North AmericaAruba8510700.00
69South AmericaArgentina776739.00
56AfricaAngola116729.00
54OceaniaAmerican Samoa351182.00
34EuropeAlbania2133367.00
1AsiaAfghanistan3787042.00
NULLAntarcticaAntarctica0.00

我們可以看到,現在的排序方法便是將 Capital 從大到小排序了。


LIMIT

LIMIT ,限制顯示資料筆數的指令,使用方法非常單純,只需要加在最後頭:

select
    Capital, Continent, Name, max(GNP)
    from country
    group by Continent
    order by Capital desc
    limit 2;



Output:

CapitialContinentNamemax(GNP)
129North AmericaAruba8510700.00
69South AmericaArgentina776739.00

我們將 LIMIT 限制為 2,我們的結果就只會印出 2 筆資料了!


以上就是簡單、基本的 SQL 指令,希望接下來還能分享更多進階一點的 SQL 指令 —— 希望我能持續學習下去!

Leave a Reply