今年鐵人賽的最後一天讓我們好好用幾個基礎的 SQL statements 練習在關聯式資料庫裡查詢特定的資料吧!
選擇 File → 選取 Import: 有兩種建資料庫的方式

Database from SQL file:比如這邊我們從本地引入一個名為 Games 的 CREATE TABLE statement, 是一個 .sql 檔案, 接著選取想要儲存此資料庫的 db 空間, 就可以成功瀏覽到 Games 資料表

Table from CSV file:比如這邊從本地引入了一個已創建好的資料庫進來, 並且設定資料表名稱為 menu

點選 Execute SQL tab,
當你完成想要編寫的 SQL statements 後, 點選 GUI 中的 Execute all/selected SQL, 便可執行。
假如同時上方寫有好幾組不同的 SQL statements, 可以把特定想要執行的 statements 反白, select 起來, 再點選 Execute all/selected SQL即可。
SELECT statement 用於從資料庫返回資料。
它返回結果資料表中的資料, 其中包含給定欄位名的 row 資料。 資料表和欄位名稱有區分大小寫。
學習連結: https://www.w3schools.com/sql/sql_select.asp
語法:
SELECT column(s) FROM table;
Example:
SELECT name, genre
FROM Games;

| name | genre | |
|---|---|---|
| 1 | Pokemon Red/Blue | Role-Playing |
| 2 | Spyro Reignited Trilogy | Platform |
| 3 | Universal Paperclips | World Domination |
| … | … | … |
DISTINCT 可以幫助我們從結果集 (result set) 中去除重複的資料。
學習連結: https://www.w3schools.com/sql/sql_distinct.asp
語法:
SELECT DISTINCT column(s) FROM table;
Example:
// 沒有使用 DISTINCT
SELECT release_year
FROM Games;

// 使用 DISTINCT
SELECT DISTINCT release_year
FROM Games;

可以發現 1996 是重複的 release_year 資料, 所以加上 DISTINCT 後, 重複的資料就會從結果資料表中被去除了。
WHERE 查詢子句根據其欄位的資料值過濾掉 rows。 在大型資料庫中, 使用 WHERE 查詢子句來縮小結果集(result set) 的大小是重要的。
建議: 在嘗試寫 query 時, 首先要考慮 FROM 的部分, 然後是 WHERE 的部分, 最後才是 SELECT 的部分。
學習連結: https://www.w3schools.com/sql/sql_where.asp
語法:
SELECT column(s) FROM table WHERE condition(s);
Example:
SELECT name, platform
FROM Games
WHERE publisher = 'Nintendo';

此外, SELECT statements 的 WHERE 部分可以使用以下屬性:
語法:
WHERE column operator value(s)
Example:
SELECT name, platform, release_year
FROM Games
WHERE release_year < 2000;

不可不知的是, 我們還可以使用 AND 或 OR 組合多個 WHERE 條件
語法:
SELECT name, platform, release_year
FROM Games
WHERE release_year < 2000 AND genre='Racing';

The
LIKEcommand is used in a WHERE clause tosearch for a specified pattern in a column.
學習連結: https://www.w3schools.com/sql/sql_ref_like.asp
前綴開頭 的文本後綴結尾 的文本語法:
WHERE column LIKE pattern
Example:
SELECT name, release_year
FROM Games
WHERE name LIKE 'Pokemon%'

ORDER BY 關鍵字用於對 result set 進行 遞增 (ASC) 或 遞減 (DESC) 的排序, 而未指定的話, 則為遞增排序。
學習連結: https://www.w3schools.com/sql/sql_orderby.asp
語法:
SELECT column(s) FROM table
ORDER BY column(s) ASC|DESC;
Example:
// 預設為遞增排序
SELECT name, release_year
FROM Games
ORDER BY name

// 遞減排序
SELECT name, release_year
FROM Games
ORDER BY name DESC;

LIMIT 可以獲取前 N 個給定類別的 record。它還可以用作 sanity check/test 以確保你的 query 不返回 100000 行。
學習連結: https://www.w3schools.com/sql/sql_top.asp
語法:
LIMIT number
Example:
SELECT name, release_year
FROM Games
WHERE genre='Wii'
ORDER BY release_year
LIMIT 5;

最後讓我們來驗收一下大家的學習成果吧! 這邊有幾個簡單設計的 SQL query 題目, 有興趣的夥伴可以一起練習看看!
Task 1:
寫一個 SQL query, 要返回由 Games 資料表中的前 20 個最早發布的 video games 的遊戲的名稱 (name) 和發布年份 (release_year)
SELECT name, release_year
FROM Games
ORDER BY release_year
LIMIT 20;


Task 2:
寫一個 SQL query, 要返回遊戲標題中包含 “Spyro” 且標題中不包含 “Skylanders” 的所有遊戲的 name、platform 和 release_year。
提示: 適時使用 AND/OR/NOT
SELECT name, platform, release_year
FROM Games
WHERE name LIKE '%Spyro%'
AND NOT (name LIKE '%Skylanders%');

Task 3:
寫一個 SQL query, 要返回 Games 資料表中遊戲的平均 release_year。 使用 ROUND 函數將結果四捨五入為最接近的整數, 並使用別名 “avg_release_year” 重新命名欄位。
SELECT ROUND(AVG(release_year)) AS avg_release_year
FROM Games;

Task 4:
寫一個 SQL query, 要返回 Games 資料表中 “puzzle” 類型遊戲其最早一年發布的 puzzle 遊戲的 name 和 release_year。
必備知識: Subqueries (非常重要!), MIN
SELECT g1.name, g1.release_year
FROM Games g1
WHERE g1.genre = 'puzzle'
AND g1.release_year = (SELECT MIN(g2.release_year)
FROM Games g2
WHERE g2.genre = 'puzzle');
