開始學習 SQL 之後,常會遇到這些疑問:
SQL 的語法很多,但其實不需要一開始全部背起來。
這次要介紹的是,SQL 初學者在參與專案前應該先掌握的 10 個基本語法。
我們會邊看實際的 SQL,邊一個一個確認。
SQL(Structured Query Language)是用來操作資料庫的語言。
例如,假設使用者資料儲存在資料庫中。
idnameage1田中252佐藤303鈴木18透過 SQL,可以進行以下操作:
什麼是 SELECT?
SELECT 是用來取得資料的語法。
如果要學 SQL,這是首先一定要記住的基本中的基本。
SELECT name
FROM users;
這段 SQL 的意思是:
從 users 資料表取得 name
取得所有欄位
SELECT *
FROM users;
使用 * 可以取得所有欄位。
取得多個欄位
SELECT name, age
FROM users;
只會取得 name 和 age。
重點
SELECT → 要取得什麼?
FROM → 從哪個資料表?
先把這兩個搭配起來記住。
什麼是 WHERE?
WHERE 是用來指定要取得資料條件的語法。
例如,
只想取得 20 歲以上的使用者
可以這樣寫:
SELECT *
FROM users
WHERE age >= 20;
常用比較運算子
運算子意義=等於<>不等於>大於<小於>=大於等於<=小於等於例如,要取得 30 歲的使用者:
SELECT *
FROM users
WHERE age = 30;
就會得到這樣的結果。
指定多個條件
可以使用 AND 來指定多個條件。
SELECT *
FROM users
WHERE age >= 20
AND age <= 30;
這代表:
20 歲以上且 30 歲以下
什麼是 ORDER BY?
ORDER BY 是用來排序取得資料的語法。
例如,若要依年齡由大到小排列:
SELECT *
FROM users
ORDER BY age DESC;
升冪與降冪
指定意義ASC升冪DESC降冪```
-- 年齡由小到大
SELECT *
FROM users
ORDER BY age ASC;
-- 年齡由大到小
SELECT *
FROM users
ORDER BY age DESC;
`ASC` 有時也可以省略。
SELECT *
FROM users
ORDER BY age;
這種情況下,通常預設為升冪。
---
### [](#4-insert)4. INSERT
**什麼是 INSERT?**
`INSERT` 是**用來新增資料的語法**。
例如,在 users 資料表中新增一位新使用者:
INSERT INTO users (name, age)
VALUES ('山田', 25);
這樣就會新增以下資料:
name:山田
age :25
**基本語法**
INSERT INTO 資料表名稱 (欄位名稱)
VALUES (要新增的值);
**注意事項**
指定字串時,基本上要用單引號包住。
'山田'
數字則可以直接指定,例如:
25
---
### [](#5-update)5. UPDATE
**什麼是 UPDATE?**
`UPDATE` 是**用來更新已經登錄的資料的語法**。
例如,要把山田先生的年齡改成 26 歲:
UPDATE users
SET age = 26
WHERE name = '山田';
**基本語法**
UPDATE 資料表名稱
SET 欄位名稱 = 要更新的值
WHERE 條件;
**注意不要忘了 WHERE**
例如:
UPDATE users
SET age = 26;
這樣做的話,**users 資料表中的所有使用者年齡都可能變成 26。**
因此,使用 UPDATE 時一定要確認:
> 「要更新哪筆資料?」
---
### [](#6-delete)6. DELETE
**什麼是 DELETE?**
`DELETE` 是**用來刪除資料的語法**。
例如,要刪除 id 為 3 的使用者:
DELETE FROM users
WHERE id = 3;
**基本語法**
DELETE FROM 資料表名稱
WHERE 條件;
**DELETE 也要注意 WHERE**
DELETE FROM users;
這樣可能會把資料表中的所有資料全部刪除。
在實務上尤其要特別小心這個語法。
---
### [](#7-group-by)7. GROUP BY
**什麼是 GROUP BY?**
`GROUP BY` 是**用來把相同值分組的語法**。
例如,假設有一個管理購買紀錄的 orders 資料表。
iduser\_idprice111000212000321500423000如果想按使用者彙總購買金額:
SELECT user_id, SUM(price)
FROM orders
GROUP BY user_id;
這樣就可以得到:
user_id 1 → 3000 日圓
user_id 2 → 4500 日圓
像這樣,依使用者分組整理。
**GROUP BY 的概念**
零散的資料
↓
依相同值分組
↓
按群組進行彙總
`GROUP BY` 常常會和後面要介紹的 `COUNT`、`SUM` 等彙總函數一起使用。
---
### [](#8-having)8. HAVING
**什麼是 HAVING?**
`HAVING` 是**用來對 GROUP BY 分組後的資料指定條件的語法**。
例如,
> 想要彙總每位使用者的購買金額,只取得總金額 3000 日圓以上的使用者
可以寫成:
SELECT user_id, SUM(price)
FROM orders
GROUP BY user_id
HAVING SUM(price) >= 3000;
**和 WHERE 的差異**
這是初學者很容易混淆的地方。
WHERE
→ 對分組前的資料指定條件
HAVING
→ 對 GROUP BY 分組後的資料指定條件
先記成:
> **WHERE 是資料,HAVING 是群組**
會比較容易理解。
---
### [](#9-join)9. JOIN
**什麼是 JOIN?**
`JOIN` 是**用來結合多個資料表的語法**。
在實際資料庫中,不一定會把所有資訊都存放在同一個資料表裡。
例如:
**users 資料表**
idname1山田2佐藤**orders 資料表**
iduser\_idprice111000222000如果想同時取得:
> 使用者名稱和購買金額
就要使用 JOIN。
SELECT users.name, orders.price
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
**INNER JOIN**
`INNER JOIN` 是**取得兩個資料表中都能對應上的資料**。
SELECT users.name, orders.price
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
**LEFT JOIN**
`LEFT JOIN` 是**在結合資料時,基本上保留左邊資料表的資料**。
SELECT users.name, orders.price
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;
**JOIN 在實務上很重要**
在 SQL 專案中,常常需要從多個資料表取得資料,因此:
- `INNER JOIN`
- `LEFT JOIN`
- `ON`
這些都是參與專案前應該先理解的重點。
---
### [](#10-countsumavg)10. COUNT・SUM・AVG
**什麼是 COUNT・SUM・AVG?**
這些是**在彙總資料時會使用的函數**。
**COUNT**
計算資料筆數。
SELECT COUNT(*)
FROM users;
可以取得 users 資料表中有幾筆資料。
**SUM**
加總數值。
SELECT SUM(price)
FROM orders;
可以取得購買金額總和等資料。
**AVG**
求平均值。
SELECT AVG(age)
FROM users;
可以取得使用者的平均年齡等資料。
**常用的彙總函數**
函數意義`COUNT`筆數`SUM`總和`AVG`平均`MAX`最大值`MIN`最小值先記住 `COUNT`、`SUM`、`AVG` 會比較好。
[](#%E5%AE%9F%E5%8B%99%E3%81%A7%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86sql%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B)實務上常用的 SQL 組合
---------------------------------------------------------------------------------------------------------------------------------------------
SQL 通常不是只單獨使用一種語法,而是會將多種語法組合起來使用。
例如,
> 取得 20 歲以上的使用者,並依年齡由大到小排序
可以寫成:
SELECT name, age
FROM users
WHERE age >= 20
ORDER BY age DESC;
再加上 JOIN 的話:
SELECT users.name, orders.price
FROM users
INNER JOIN orders
ON users.id = orders.user_id
WHERE orders.price >= 1000
ORDER BY orders.price DESC;
就會變成像這樣的 SQL。
一開始可能會覺得很難,但如果從各個語法的角色來理解,會比較容易掌握:
SELECT → 要取得什麼?
FROM → 從哪裡?
JOIN → 要和其他資料表結合嗎?
WHERE → 什麼條件?
ORDER BY → 要怎麼排序?
---
### [](#%E5%8F%82%E7%94%BB%E5%89%8D%E3%81%AB%E7%89%B9%E3%81%AB%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E6%A7%8B%E6%96%87)參與專案前特別想先記住的語法
如果 10 個語法無法全部完美記住,可以先優先學下面這些。
**優先度 ★★★**
SELECT
WHERE
ORDER BY
JOIN
GROUP BY
這些在 SQL 搜尋、取得資料時很常出現。
特別是 `SELECT` 和 `WHERE` 是 SQL 的基礎,務必要優先記住。
**優先度 ★★**
INSERT
UPDATE
DELETE
HAVING
COUNT / SUM / AVG
這些在實務上也會用到,因此至少先理解基本用法會比較安心。
[](#sql%E3%82%92%E8%A6%9A%E3%81%88%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)學習 SQL 時的重點
-------------------------------------------------------------------------------------------------------------------------
SQL 只靠死背語法,很難真正學會。
例如看到:
SELECT name
FROM users
WHERE age >= 20;
時,能夠用中文說出:
> 「從 users 資料表取得 20 歲以上的人名」
這點很重要。
**看到 SQL 時,試著轉成中文理解**
SELECT
↓
「要取得什麼?」
FROM
↓
「從哪個資料表?」
WHERE
↓
「什麼條件?」
養成這樣思考的習慣,會更容易理解 SQL。
[](#%E3%81%BE%E3%81%A8%E3%82%81)總結
-----------------------------------
這次介紹了 SQL 初學者在參與專案前應該先記住的 10 個語法。
\#語法作用1`SELECT`取得資料2`WHERE`指定條件3`ORDER BY`排序4`INSERT`新增資料5`UPDATE`更新資料6`DELETE`刪除資料7`GROUP BY`將資料分組8`HAVING`對群組指定條件9`JOIN`結合資料表10`COUNT`・`SUM`・`AVG`彙總資料SQL 的語法雖然很多,但不需要一開始全部都記起來。
先以
**SELECT → WHERE → ORDER BY → JOIN → GROUP BY**
為中心學習,慢慢增加能夠使用的語法吧。
實際寫寫看 SQL,確認資料會如何被取得,才是學會 SQL 的捷徑。
感謝你讀到最後!
---
原文出處:https://qiita.com/nt_matsuda56/items/156d782818f30a3b563e