SQL 資料取得、篩選
在 MySQL 中,主要使用 `SELECT` 指令取得資料,搭配 `WHERE` 篩選符合條件的資料。
## 1. 取得資料
### 取得所有欄位
```sql
SELECT *
FROM users;
```
### 取得指定欄位
```sql
SELECT id, name, email
FROM users;
```
建議只查詢需要的欄位,不要在正式程式中一律使用 `SELECT *`。
### 使用別名
```sql
SELECT
name AS 使用者名稱,
email AS 電子郵件
FROM users;
```
---
## 2. 使用 `WHERE` 篩選資料
### 等於
```sql
SELECT *
FROM users
WHERE status = 'active';
```
### 數值比較
```sql
SELECT *
FROM products
WHERE price > 1000;
```
常見比較運算子:
| 運算子 | 意義 |
|---|---|
| `=` | 等於 |
| `<>` 或 `!=` | 不等於 |
| `>` | 大於 |
| `<` | 小於 |
| `>=` | 大於或等於 |
| `<=` | 小於或等於 |
---
## 3. 多個條件
### `AND`:同時符合
```sql
SELECT *
FROM products
WHERE price >= 100
AND stock > 0;
```
### `OR`:符合其中一個
```sql
SELECT *
FROM users
WHERE city = '台北'
OR city = '新北';
```
### 使用括號控制邏輯
```sql
SELECT *
FROM users
WHERE (city = '台北' OR city = '新北')
AND status = 'active';
```
---
## 4. 使用 `IN`
當同一欄位有多個可能值時,可以使用 `IN`:
```sql
SELECT *
FROM users
WHERE city IN ('台北', '新北', '桃園');
```
等同於:
```sql
WHERE city = '台北'
OR city = '新北'
OR city = '桃園'
```
---
## 5. 使用 `BETWEEN`
查詢某個範圍:
```sql
SELECT *
FROM products
WHERE price BETWEEN 100 AND 500;
```
日期範圍範例:
```sql
SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';
```
注意:`BETWEEN` 包含起點與終點。
---
## 6. 使用 `LIKE` 模糊搜尋
### 找出名稱以「王」開頭的資料
```sql
SELECT *
FROM users
WHERE name LIKE '王%';
```
### 找出名稱包含「明」的資料
```sql
SELECT *
FROM users
WHERE name LIKE '%明%';
```
### 常用萬用字元
| 符號 | 意義 |
|---|---|
| `%` | 任意長度的字串 |
| `_` | 任意一個字元 |
例如:
```sql
SELECT *
FROM users
WHERE name LIKE '_明';
```
代表兩個字元,且第二個字元是「明」。
---
## 7. 判斷 `NULL`
不能使用:
```sql
WHERE email = NULL
```
應使用 `IS NULL` 或 `IS NOT NULL`:
```sql
SELECT *
FROM users
WHERE phone IS NULL;
```
```sql
SELECT *
FROM users
WHERE phone IS NOT NULL;
```
---
## 8. 排序資料:`ORDER BY`
### 由小到大或由舊到新
```sql
SELECT *
FROM products
ORDER BY price ASC;
```
### 由大到小或由新到舊
```sql
SELECT *
FROM products
ORDER BY price DESC;
```
也可以依多個欄位排序:
```sql
SELECT *
FROM products
ORDER BY category ASC, price DESC;
```
---
## 9. 限制筆數:`LIMIT`
取得前 10 筆:
```sql
SELECT *
FROM users
LIMIT 10;
```
分頁查詢:
```sql
SELECT *
FROM users
ORDER BY id
LIMIT 20 OFFSET 40;
```
表示跳過 40 筆後,取得 20 筆資料。
也可以寫成:
```sql
LIMIT 40, 20;
```
---
## 10. 去除重複資料:`DISTINCT`
```sql
SELECT DISTINCT city
FROM users;
```
只會列出不重複的城市。
---
## 11. 統計資料
### 計算筆數
```sql
SELECT COUNT(*) AS total
FROM users;
```
### 計算平均值、最大值、最小值
```sql
SELECT
AVG(price) AS average_price,
MAX(price) AS highest_price,
MIN(price) AS lowest_price
FROM products;
```
### 分組統計:`GROUP BY`
```sql
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city;
```
### 篩選分組結果:`HAVING`
```sql
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
HAVING COUNT(*) >= 10;
```
`WHERE` 是分組前篩選,`HAVING` 是分組後篩選。
---
## 12. 連接多個資料表:`JOIN`
假設:
- `orders.user_id` 對應 `users.id`
```sql
SELECT
orders.id AS order_id,
users.name,
orders.amount
FROM orders
JOIN users
ON orders.user_id = users.id;
```
常見的 `JOIN`:
```sql
-- 只取得兩邊都有對應資料的紀錄
INNER JOIN
-- 即使右表沒有對應資料,也保留左表資料
LEFT JOIN
-- 即使左表沒有對應資料,也保留右表資料
RIGHT JOIN
```
例如查詢所有使用者,即使他們沒有訂單:
```sql
SELECT
users.id,
users.name,
orders.id AS order_id
FROM users
LEFT JOIN orders
ON orders.user_id = users.id;
```
---
## 13. 綜合範例
查詢目前啟用、位於台北、名稱包含「陳」的使用者,依註冊日期新到舊排列,最多顯示 20 筆:
```sql
SELECT id, name, email, created_at
FROM users
WHERE status = 'active'
AND city = '台北'
AND name LIKE '%陳%'
ORDER BY created_at DESC
LIMIT 20;
```
一般的查詢結構順序如下:
```sql
SELECT 欄位
FROM 資料表
JOIN 其他資料表 ON 連接條件
WHERE 篩選條件
GROUP BY 分組欄位
HAVING 分組篩選條件
ORDER BY 排序欄位
LIMIT 筆數;
```
在應用程式中,使用者輸入的條件應透過「參數化查詢」傳入,不要直接串接 SQL 字串,以避免 SQL Injection。
相關學習地圖、教學課程
Python 後端工程、資料庫