前言
即便在資料科學和資料庫技術不斷變化的時代,用來操作關聯式資料庫的 SQL 語法仍然是探討資料庫世界非常重要且適合入門的基礎語法,不管你是在 Web 應用程式的開發或是資料分析(Data Analytics)都有可能用得上。本文將透過分類方式列出常用的 SQL(Structured Query Language)基礎語法方便讀者入門,若能跟著動手操作比起死記語法會更容易記憶。
環境設定
市面上有許多關聯式資料庫(Relational database)可以使用,包括常見的有:
- SQLite
- MySQL
- PostgreSQL
- MariaDB
- SQL Server
- Oracle Database
- DB2
本文會主要為了方便,使用 MySQL 當做說明環境(使用 XAMPP,讀者也可以自行使用 Docker 啟動 MySQL Server)在 MacOS 進行,注意一些語法可能會針對不同資料庫而有所不同。
關聯式資料庫概要
在我們生活中事實上無處沒有資料庫的蹤影(比起單純文字檔案或是 Excel,資料庫在資料量較大時維護和多人使用上相對方便),不管是你去購物中心購買或是旅遊訂房的住宿紀錄等都會使用到資料庫進行客戶分析或是資料的儲存。以下我們就以住宿會員資料名單資料庫作為範例。
在關聯式資料庫(RDB)中,資料庫下面可以許多張資料表(table),你可以想成就是類似 excel 的工作表,每一欄代表一個屬性,每一列代表一筆資料。在 phpmyadmin(一個管理資料庫的視覺化操作工具)上呈現的資料表:
SQL 基本概要和分類
SQL 主要是以 keyword 關鍵字和資料表(table)名稱和欄位(column)名稱當作一段完整的語句。SQL 語法使用分號 ;
當作結尾,英文字母不區分大小寫,單字間使用空白分隔。單行註解寫法 --
,多行註解使用 /**/
包裹。
DDL(Data Definition Language)
DDL 又稱為資料定義語言,能建立或刪除資料庫和資料表等用來儲存的單位。- CREATE
- DROP
- ALTER
DML(Data Manipulation Language)
DML 能查詢或修改資料表的紀錄。- INSERT
- SELECT
- UPDATE
- DELETE
DCL(Data Control Language)
DCL 為可用來取消操作和設定操作權限的指令。- COMMIT
- ROLLBACK
- GRANT
- REVOKE
DDL(Data Definition Language)
CREATE 建立資料庫/資料表
創建資料庫使用 CREATE
,COLLATE collation_name 指定資料庫的預設定序,這邊使用 utf8mb4_unicode_ci
處理中文字排序。
在這邊我們創建一個練習用的資料庫 demo_shop
這樣,我們就可以盡情操作玩耍,若是玩壞了就再重新就建立即可。
CREATE DATABASE demo_shop
COLLATE utf8mb4_unicode_ci;
範例:
CREATE DATABASE 資料庫名稱
COLLATE 編碼;
創建資料表(這邊建立三個欄位 username
、age
和 gender
,其後面為該欄位的屬性設定,例如資料型別、長度、是否允許 NULL 值、default 值等),一個資料庫中可以有多張資料表。
CREATE TABLE 資料表名稱 (
欄位名稱 欄位屬性
);
範例:
CREATE TABLE users (
username VARCHAR(12) NOT NULL,
age INTEGER,
gender VARCHAR(6)
);
VARCHAR 為可變長度字串型別,遇上值小於最大長度時不會自動補上半型空白
DROP 刪除資料庫/資料表
若創建錯誤的資料庫或是表單可以使用 DROP 指令進行刪除,但要小心操作。
DROP DATABASE/TABLE 資料庫/資料表名稱;
刪除資料庫:
DROP DATABASE demo_shop;
刪除資料表:
DROP TABLE users;
ALTER 修改資料表結構
當我們已經建立好資料表後若是要新增或是刪除欄位可以使用 ALTER 進行。
ALTER TABLE 資料表名稱 ADD/DROP 欄位名稱;
新增欄位:
ALTER TABLE users ADD profile TEXT;
刪除欄位:
ALTER TABLE users DROP age;
DML(Data Manipulation Language)
INSERT 插入資料
當我們已經建立好資料庫和資料表後,我們就可以使用將資料插入到資料表中:
INSERT INTO users VALUES (
'Jack', 20, 'Male'
);
SELECT 查詢資料
資料庫中很重要的功能就是長期儲存資料以便後續和未來可以查詢使用,我們可以針對我們想要查詢的欄位進行設定。
SELECT 欄位名稱 FROM 資料表名稱;
星號 *
代表所有的意思,所以是所有欄位:
SELECT * FROM users;
針對特定屬性選取:
SELECT age
FROM users;
條件
若是我們需要設定查詢條件可以使用 WHERE
來限定條件,例如年齡大於 20 歲:
SELECT age
FROM users
WHERE age > 20;
年齡大於 20 歲且為女性:
SELECT age
FROM users
WHERE age > 20 AND gender == 'Female';
排序
若是我們希望排序我們查詢的資料可以加上 ORDER BY
,可以設定由大到小 DESC
或由小到大 ASC
:
SELECT * FROM users
ORDER BY age DESC;
函式
當我們需要彙總資料時,我們就會可以使用(Aggregate Function),常見的有數量 COUNT
、加總 SUM
、平均值 AVG
、最大值 MAX
和最小值 MIN
。
COUNT
計算 NULL 以外的資料筆數:
SELECT COUNT(*)
FROM users;
資料分群
若是需要將資料先分群彙整可以使用 GROUP BY
。例如想要將資料透過性別分組,然後統計男女數量:
SELECT gender, COUNT(*)
FROM users;
GROUP BY gender;
UPDATE 更新資料
當我們需要更新資料可以使用 UPDATE
:
UPDATE users
SET age = 20
WHERE username = 'Tony';
DELETE 刪除資料
當我們需要刪除資料可以使用 DELETE FROM
:
DELETE FROM users
WHERE username = 'Tony';
DCL(Data Control Language)
COMMIT 將操作更新到資料庫
當我們進行資料庫操作時,最後會 commit 到資料庫才算完成。若要同時進行多個資料庫操作時我們可以使用 TRANSACTION
來包裹,視為同一個操作,若所有操作都要完成才提交到資料庫。
START TRANSACTION;
UPDATE users
SET age = 20
WHERE username = 'Tony';
UPDATE users
SET age = 30
WHERE username = 'Amy';
COMMIT;
ROLLBACK 取消對資料庫的操作
若希望操作完成後,不要儲存操作結果到資料則使用 ROLLBACK
:
START TRANSACTION;
UPDATE users
SET age = 20
WHERE username = 'Tony';
UPDATE users
SET age = 30
WHERE username = 'Amy';
ROLLBACK;
GRANT 授權使用者
當我們希望給新的使用者可以操作資料庫的權限,可以使用 GRANT
。例如以下範例使用者 my_user 將擁有 demo_shop 資料庫下的 SELECT
和 INSERT
權限。
GRANT SELECT, INSERT ON demo_shop.*
TO 'my_user'@'localhost';
REVOKE 取消使用者權限
若要取消權限則可以使用 REVOKE
來取消使用者權限,ALL PRIVILEGES
為所有權限:
REVOKE ALL PRIVILEGES ON demo_shop.*
FROM 'my_user'@'localhost';
總結
即便在大數據時代(Big Data),關聯式資料庫(Relational database)和 SQL(Structured Query Language)仍佔有非常重要的地位。以上列出常用的 SQL 語法介紹,方便讀者入門了解 SQL 使用情境,若能跟著動手操作比起死記語法會更容易記憶。由於是基礎語法所以簡化了一些進階語法的介紹,然而 SQL 還有許多進階使用方式和好用工具,未來有機會再持續介紹給讀者參考。
參考文件
(image via kf_immemdbs_040419)