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:
ID | Name | Country | District | Population |
1 | Kabul | AFG | Kabol | 1780000 |
2 | Qandahar | AFG | Qandahar | 237500 |
3 | Herat | AFG | Herat | 186800 |
4 | Mazar-e-Sharif | AFG | Balkh | 127800 |
5 | Amsterdam | NLD | Noord-Holland | 731200 |
以下省略。
基本上,我們使用 "*" 的話會把所有欄位全部列出。當然,你也可以只打欄位名稱,例如剛才的第一個欄位便是 ID:
select ID from city;
Output:
ID |
129 |
1 |
2 |
3 |
4 |
56 |
以下省略。這樣一來,我們便只有印出 ID 欄位了。
我們也可以印出多欄位:
select ID, Name from city;
Output:
ID | Name |
1 | Kabul |
2 | Qandahar |
3 | Herat |
4 | Mazar-e-Sharif |
5 | Amsterdam |
這樣就同時把 ID 跟 Name 欄位同時印出了。
WHERE
WHERE 指令就像其他程式語言當中的 if 一樣,是用來進行條件判斷的。
比如說,我們設定印出的程式名稱全都是始於 CountryCode 為 'AFG' 的:
select Name, CountryCode from city where CountryCode = 'AFG';
Output:
Name | CountryCode |
Kabul | AFG |
Qandahar | AFG |
Herat | AFG |
Mazar-e-Sharif | AFG |
就像這樣。
GROUP BY
GROUP BY 比較難以解釋,舉個案例來說,我們可以針對返回結果來進行分組。比如說我想要查看每個區域 GNP 最大的國家。
國民生產總值(英語:Gross National Product,縮寫:GNP),台灣亦稱國民生產毛額,在描述地區性生產時稱本地居民生產總值或地區居民生產總值,即某一區域公民一年內所生產的最終產品(包括勞務)的市場價值的總和,是國民收入核算中最重要的組成部分。
Wikipedia
我們可以這樣查找:
select Continent, Name, max(GNP) from country group by Continent;
Output:
Continent | Name | max(GNP) |
North America | Aruba | 8510700.00 |
Asia | Afghanistan | 3787042.00 |
Europe | Albania | 2133367.00 |
South America | Argentina | 776739.00 |
Oceania | American Samoa | 351182.00 |
Africa | Angola | 116729.00 |
Antarctica | Antarctica | 0.00 |
HAVING
having 便是找尋『符合條件』的情況,比如說我們拿剛才的範例繼續往下做 —— 如果今天我們希望看到結果只有 GNP 超過 500,000 的,我們可以再最後加上 HAVING 指令:
select Continent, Name, max(GNP) from country group by Continent having max(GNP) > 500000;
Output:
Continent | Name | max(GNP) |
North America | Aruba | 8510700.00 |
Asia | Afghanistan | 3787042.00 |
Europe | Albania | 2133367.00 |
South America | Argentina | 776739.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) |
129 | North America | Aruba | 8510700.00 |
69 | South America | Argentina | 776739.00 |
56 | Africa | Angola | 116729.00 |
54 | Oceania | American Samoa | 351182.00 |
34 | Europe | Albania | 2133367.00 |
1 | Asia | Afghanistan | 3787042.00 |
NULL | Antarctica | Antarctica | 0.00 |
我們可以看到,現在的排序方法便是將 Capital 從大到小排序了。
LIMIT
LIMIT ,限制顯示資料筆數的指令,使用方法非常單純,只需要加在最後頭:
select Capital, Continent, Name, max(GNP) from country group by Continent order by Capital desc limit 2;
Output:
Capitial | Continent | Name | max(GNP) |
129 | North America | Aruba | 8510700.00 |
69 | South America | Argentina | 776739.00 |
我們將 LIMIT 限制為 2,我們的結果就只會印出 2 筆資料了!
以上就是簡單、基本的 SQL 指令,希望接下來還能分享更多進階一點的 SQL 指令 —— 希望我能持續學習下去!