本文會介紹SQL 基本語法, 進階查詢, 計算函式, 彙總函式 和表格連接的語法。
1. 基本語法
1.1 創建資料表
CREATE TABLE
CREATE TABLE table_name ( column_1 data_type, column_2 data_type, column_3 data_type );
CREATE TABLE celebs ( id INTEGER, name TEXT, age INTEGER );
CREATE TABLE celebs ( id INTEGER PRIMARY KEY, name TEXT UNIQUE, date_of_birth TEXT NOT NULL, date_of_death TEXT DEFAULT 'Not Applicable', );
- PRIMARY KEY:可用於資料的唯一識別,不能重複,一個資料只能有一個欄位是 PRIMARY KEY。
- UNIQUE:與 PRIMARY KEY 很像,不過它可以設置在一個資料的多個欄位
- NOT NULL:強制該欄位一定要給定值
- DEFAULT:如果欄位沒有值,會自動定預設值
1.2 刪除資料表
DROP DATABASE
DROP DATABASE table_name;
1.3 新增資料
INSERT INTO
INSERT INTO table_name (id, name, age) VALUES (1, 'Justin Bieber', 21); SELECT * FROM table_name;
1.4資料表查詢
SELECT
SELECT column_name FROM table_name;
SELECT * FROM table_name;
1.5 更新資料
UPDATE
UPDATE celebs SET age = 22 WHERE id = 1;
1.6 改變資料表欄位
ALTER TABLE
- 新增欄位
ALTER TABLE celebs ADD COLUMN twitter_handle TEXT;
- 刪除欄位
ALTER TABLE celebs DROP COLUMN twitter_handle;
- 修改欄位
- SQL Server / MS Access
ALTER TABLE celebs ALTER COLUMN twitter_handle INTEGER;
- My SQL / Oracle (prior version 10G)
ALTER TABLE celebs MODIFY COLUMN twitter_handle INTEGER;
- Oracle 10G and later
ALTER TABLE celebs MODIFY twitter_handle INTEGER;
- SQL Server / MS Access
1.7 刪除資料
DELETE FROM
DELETE FROM celebs WHERE twitter_handle IS NULL;
2. 進階查詢語法
2.1 SELECT
查詢結果顯示 name, genre, year
SELECT name, genre, year FROM movies;
2.2 AS
可以改變查詢結果的欄位名稱,但不會改掉資料表裡的欄位
SELECT imdb_rating AS 'IMDb' FROM movies;
2.3 SELECT DISTINCT
去掉的重複的查詢結果
- 去掉 year 重複的結果
SELECT DISTINCT year FROM movies;
- 去掉 year 和 name 都重複的結果
SELECT DISTINCT year, name FROM movies;
2.4 WHERE
篩選資料用的
SELECT * FROM movies WHERE year > 2014;
:::danger
「等於」要特別注意,只有一個等號
2.5 LIKE
可以在 WHERE 子句中使用 LIKE 運算子來進行模糊搜尋
SELECT * FROM movies WHERE name LIKE 'Se_en';
:::info
_ 代表任意字元
:::
SELECT * FROM movies WHERE name LIKE 'A%';
- A% 代表由 A 開頭
- %A 代表由 A 結尾
- %man% 代表所有含有 man 的字串
2.6 NULL
NULL 不能拿來用運算子進行比較,因此出現 IS NULL、IS NOT NULL 來判斷是否是 NULL。
- 顯示具有 imdb_rating 的資料
SELECT name FROM movies WHERE imdb_rating IS NOT NULL;
2.7 BETWEEN
可以在 WHERE 子句中使用 BETWEEN 運算子來篩選出特定範圍區間得值
篩選出 name 開頭為 ‘A’、‘B’、‘C’ 的結果
SELECT * FROM movies WHERE name BETWEEN 'A' AND 'D';
篩選出 year 在 1990 ~ 1999 區間的結果
SELECT * FROM movies WHERE year BETWEEN 1990 AND 1999;
:::warning
BETWEEN 兩個字串,會不包含結尾
BETWEEN 兩個數字,會包含結尾的數字
:::
2.8 AND
SELECT * FROM movies WHERE year BETWEEN 1990 AND 1999 AND genre = 'romance';
2.9 OR
SELECT * FROM movies WHERE genre = 'romance' OR genre = 'comedy';
2.10 ORDER BY
用來排序結果
:::warning
如果 WHERE 存在,ORDER BY 永遠跟在 WHERE 後面
:::
- DESC:從大到小排序
- ASC:從小到大排序(預設)
2.11 LIMIT
用來限制查詢結果數量
SELECT * FROM movies ORDER BY imdb_rating DESC LIMIT 3;
:::warning
永遠放在查詢語法最後面
:::
:::info
不是所有 RDBMS(關聯式資料庫管理系統) 都有
:::
2.12 CASE
SQL 中的判斷式,可以用在顯示結果加上新欄位
:::info
CASE 通常在 SELECT 語句中
:::
- WHEN 後面接著條件式,如果條件式為真,會返回 THEN 後面的字串
- ELSE 會在前面條件式都不符合的時候,返回一個字串
- CASE 結尾一定要有一個 END
- 可以在 END 後面接 AS 來簡稱該條件的欄位名稱
SELECT name, CASE WHEN genre = 'romance' THEN 'Chill' WHEN genre = 'comedy' THEN 'Chill' ELSE 'Intense' END AS 'Mood' FROM movies;
3. 計算函式
3.1 Count
計算指定欄位非空資料的總數
SELECT COUNT(*) FROM fake_apps WHERE price = 0;
3.2 SUM
加總指定欄位的值
SELECT SUM(downloads) FROM fake_apps;
3.3 MAX / MIN
求指定欄位的最大或最小值
SELECT MIN(downloads) FROM fake_apps;
3.4 AVERAGE
求指定欄位的平均值
SELECT AVG(price) FROM fake_apps;
3.5 ROUND
將指定資料四捨五入
SELECT ROUND(AVG(price), 2) FROM fake_apps;
4. 彙總函式
4.1 GROUP BY
用來搭配 SELECT 語句,將指定欄位中,相同資料的放在一組,以便計算函式以組為單位進行計算
:::info
GROUP BY 會出現在 WHERE 之後,ORDER BY 和 LIMIT 之前
:::
SELECT category, SUM(downloads) FROM fake_apps GROUP BY category;
GROUP BY 後面的參數可以接數字,從 1 開始,分別代表 SELECT 後面的第幾個值
SELECT category, price, AVG(downloads) FROM fake_apps GROUP BY 1, 2;
以上面的例子來說,GROUP BY 後面的 1、2 分別指向 category 和 price
4.2 HAVING
與 WHERE 類似,不過他是針對 Group
:::info
HAVING 會出現在 GROUP BY 之後,ORDER BY 和 LIMIT 之前
:::
SELECT price, ROUND(AVG(downloads)), COUNT(*) FROM fake_apps GROUP BY price HAVING COUNT(*) > 10;
5. 表格連接
5.1 JOIN
使用方法:JOIN 表格名稱 ON 連接欄位規則
連接後會自動補 NULL
SELECT * FROM orders JOIN customers ON orders.customer_id = customers.customer_id;
5.2 INNER JOIN
使用方法:INNER JOIN 表格名稱 ON 連接欄位規則
會自動將不符合連接欄位規則的部分捨棄,如下圖
SELECT COUNT(*) FROM newspaper JOIN online ON newspaper.id = online.id;
文章出處:BlackMaple’s Blog