資料表 (Tables) 管理 feat. PostgreSQL
主鍵 ( Primary Key, PK)
- 每個資料表都要有一個主
- 主鍵值必須是唯一值,不能重複,設定後不應該再更動
- 主鍵不能為 Null
- 命名通常使用
id
、資料表_id
命名,值為整數或 uuid
外來鍵 (Foreign Key, FK)
- 值來自於外部的資料,當該資料表需要關聯到其他資料表時使用
- 一張資料表可以擁有多個外來鍵
- 外來鍵必須對應到被參考資料表的主鍵
- 外來鍵可以為 Null
- 命名通常使用
參考資料表_id

例如:表中的 user_id
為 users 資料表的主鍵,為 orders 資料表的外來鍵。
建立主鍵
PRIMARY KEY
:設定為主鍵,在新增 Table 時,加在欄位型態後面
-- 格式
CREATE TABLE 資料表名稱 (
欄位名 欄位資料型態 PRIMARY KEY,
);
-- 範例:將 id 設為 Table users 的主鍵
CREATE TABLE users(id INTEGER PRIMARY KEY, name VARCHAR(50));
-- 第一次新增執行會成功
INSERT INTO
users(id, name)
VALUES
(1, 'Jennie');
-- 使用相同的 id 再新增一次,執行會失敗,因為主鍵的值不能重複
-- error message 為 duplicate key value violates unique constraint "users_pkey"
INSERT INTO
users(id, name)
VALUES
(1, 'Jennie2');
SERIAL
:設定自動產生 ID
-- 格式
CREATE TABLE 資料表名稱 (
欄位名 欄位資料型態 SERIAL PRIMARY KEY,
);
-- 範例:將 id 設為 Table users 的主鍵,並透過 SERIAL 設定,讓 id 自動產生
CREATE TABLE users(id SERIAL PRIMARY KEY, name VARCHAR(50));
INSERT INTO
users(name) -- 不需要再傳入 id 欄位值了
VALUES
('Jennie');
關聯外來鍵
- 先設定外來鍵的欄位
FOREIGN KEY
:設定關聯外來鍵,後面用小括號綁定剛新增外來鍵欄位名REFERENCES
:設定欲關聯的資料表(Table)和其底下的主鍵(PK)
-- 格式
CREATE TABLE 資料表名稱 (
欄位名 欄位資料型態 PRIMARY KEY,
外來鍵欄位名 欄位資料型態
FOREIGN KEY (外來鍵欄位名) REFERENCES 資料表名稱 A(A 的主鍵)
);
-- 範例:將 order_id 設定為 Table users 的外來鍵
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- users 的主鍵
name VARCHAR(50),
order_id INTEGER, -- 設定 users 的外來鍵
FOREIGN KEY (order_id) REFERENCES orders(id) -- 關聯外來鍵
);
排序資料 (Order By)
ORDER BY
:選取排序規則ASC
:由小到大DESC
:由大到小LIMIT
:optional,顯示的筆數
-- 格式
SELECT 欄位名
FROM 資料表名稱
ORDER BY 欄位名 排序條件
LIMIT 數量;
-- 範例:價格由低到高排序
SELECT displayName , price
FROM products
ORDER BY price ASC;
PostgreSQL 函數
Null
NOT NULL
:欄位值為 requiredNULL
:欄位為 optional,未提供值時,其值會設為NULL
-- 格式
CREATE TABLE 資料表名稱 (
欄位名 欄位資料型態 NOT NULL,
欄位名 欄位資料型態 NULL,
);
-- 範例:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL, -- 不可為空值
email VARCHAR(100) DEFAULT NULL -- 預設值為空值
);
-- 只新增 name 時會成功,email 欄位會自動設為 null:
INSERT INTO users(name)
VALUES ('Jennie');
-- 只新增 email 時會直接顯示錯誤:
-- null value in column "name" of relation "users" violates not-null constraint
INSERT INTO users(email)
VALUES ('hello@com');
[補充]:
在 SQL 中,並沒有像某些編程語言(如 JavaScript)那樣的
undefined
。
沒有提供值且欄位允許
NULL
,SQL 會將其值設定為NULL
。但這並不等同於
undefined
,因為NULL
是一種特定的 SQL 狀態,表示「無值」或「未知值」。
[補充]:
email VARCHAR(100) NULL
v.semail VARCHAR(100) DEFAULT NULL
寫法區別
實例 email VARCHAR(100) NULL
email VARCHAR(100) DEFAULT NULL
允許空值 是 是 預設值 隱式為 NULL
顯式為 NULL
表結構可讀性 稍微模糊,需依默認行為解釋 明確表明欄位預設值為 NULL
差異重點:
技術上:兩者的行為和結果完全相同,因為未指定
DEFAULT
時,資料庫會將允許NULL
的欄位的預設值設為NULL
。語意上:
DEFAULT NULL
更加明確,有助於避免未來誤解或潛在問題。
count
COUNT()
:計算資料列的數量,括號內可傳入欄位名或表達式(*)
:計算所有資料列數量,忽略NULL
或非NULL
(欄位名)
:計算某欄位中非NULL
的資料列數量(DISTINCT 欄位名)
:計算某欄位中不同且非NULL
的值的數量
-- 格式
SELECT COUNT(欄位名或表達式) FROM 資料表名稱;
-- 計算總共有幾個員工
SELECT COUNT(*) FROM employees;
-- 計算開發部有幾個員工
SELECT COUNT(*) as "RD department"
FROM users
WHERE department_name = 'RD';
AVG、SUM、MAX、MIN 函數
AVG
:平均SUM
:總和MAX
:最高 / 最大MIN
:最低 / 最小
-- 範例
SELECT
MAX(score) AS "最高分數",
MIN(score) AS "最低分數",
AVG(score) AS "平均分數",
SUM(score) AS "總分數"
FROM
students
參考
databasepostgresql
Published on 15 Dec 2024
Updated on 15 Dec 2024