SQL 介紹和基本語法(CRUD)
什麼是資料庫?
資料庫是一種用於儲存、管理和檢索資料的系統,其核心運作通常由資料庫管理系統(Database Management System, DBMS)支援,負責實現資料的建立、讀取、更新和刪除(CRUD)等功能。
什麼是 SQL ?
關聯式資料庫廣泛使用結構化查詢語言(Structured Query Language, SQL)來操作和管理資料。使用者(Client)透過 SQL 與資料庫進行溝通互動,執行資料的查詢和操作需求。
資料庫結構
資料表 (Table)
整體資料,包含所有相關的資料
欄位 (Columns)
定義資料的屬性和類型 (Data Type)
資料列 (Rows)
橫向資料的集合,代表一筆完整資料
資料的型態
資料型態 | 描述 | 使用情境 | 範例欄位 | 範例 |
---|---|---|---|---|
INTEGER | 整數 | ID、數量 | count INTERGER |
1, 2, 100 |
VARCHAR(n) | 字串 (n=字串長度) | 名稱、描述 | ‘Jennie’ | name VARCHAR(50) |
TIMESTAMP | 日期時間 | 建立/刪除時間 | ‘2025-01-01 00:00:01’ | created_at TIMESTAMP |
DECIMAL(p,s) | 精確小數(p=精度,數字的總位數;s=小數位數) | 金額 | 10.99 | price DECIMAL(10,2) |
BOOLEAN | 布林值 | 狀態 | true, false | is_Adult false |
JSON | JSON 資料 | 彈性的資料結構 | ‘{ “age”: “18”}’ | profile JSON |
[補充] :
字串會嚴謹設定字元數,原因之一是考量資訊安全,防止有心人不當使用資料庫,進而導致資料庫當機。網頁出現錯誤訊息時,攻擊者可能從中得知一些敏感資訊,如 IP 位置,進而增加資料被入侵的風險。
SQL 基本語法
通用規則
-
SQL 關鍵字:通常採用大寫(例如:
CREATE TABLE
、VALUES
),這是約定俗成的風格,用於方便區分 SQL 提供的關鍵字與自定義的內容。 -
建立順序:Table → Columns → Rows
-
;
: 分號代表整個 SQL 指令結束,需加在最末尾 -
,
: 多筆資料使用逗號隔開 -
--
:單行註解 -
/*
+*/
:多行註解 -
'
:單引號用於字串值 -
"
:雙引號用於標識符,包括資料表名、欄位名或別名-- 錯誤寫法: -- 'RD department' 被解釋為字串常數,但 AS 別名要求的是標識符,因此導致語法錯誤 SELECT COUNT(*) as 'RD department' -- 正確寫法: -- "RD department" 是一個合法的標識符,定義了查詢結果中該欄位的名稱 SELECT COUNT(*) AS "RD department"
線上練習 SQL 指令網址 : pg-sql
建立資料表
CREATE TABLE
:建立 Table 指令
-- 格式
CREATE TABLE 資料表名稱 (
欄位名 欄位資料型態,
);
-- 範例
CREATE TABLE users (
name VARCHAR(50),
email VARCHAR(100),
age INTEGER
);
新增資料
INSERT INTO
:插入欄位至 TableVALUES
:插入欄位對應的值
-- 單筆格式
INSERT INTO 資料表名稱 (欄位名 A, 欄位名 B, 欄位名 C)
VALUES (欄位值 A, 欄位值 B, 欄位值 C);
-- 多筆格式
INSERT INTO
users (name, email, age)
VALUES
(欄位值 A1, 欄位值 B1, 欄位值 C1),
(欄位值 A2, 欄位值 B2, 欄位值 C2),
(欄位值 A3, 欄位值 B3, 欄位值 C3);
-- 單筆範例:
INSERT INTO users (name, email, age)
VALUES ('Jennie', 'hello@world.com', 18);
-- 多筆範例:
INSERT INTO
users (name, email, age)
VALUES
('Jennie', 'hello@world.com', 18),
('Joy', 'hello2@world.com', 20),
('Jack', 'hello3@world.com', 22);
查詢資料
SELECT
+FROM
:從 Table 中,選擇查詢的欄位名*
:不指定欄位,表示全部
AS
:可將欄位名變成指定的別名
[補充]:
實務上避免用
*
查詢,會有效能影響。
-- 格式
SELECT 欄位名 FROM 資料表名稱;
-- 範例:
-- 不指定欄位
SELECT * FROM users;
-- 單個特定欄位
SELECT email FROM users;
-- 多個特定欄位
SELECT name,age FROM users;
-- 別名 (除了幫原欄位改別名,也可以多顯示虛擬欄位,不會影響原資料表)
SELECT
name,
age AS real_age,
age + 1 AS korean_age
FROM
users;
尋找資料(Where)
WHERE
:查詢的條件範圍- 執行順序:找資料表(
FROM
) → 篩選範圍(WHERE
) → 取得對應欄位(SELECT
) - 英文字會區分大小寫(case sensitivity)
-- 格式
SELECT 欄位名 FROM 資料表名稱
WHERE 條件範圍
-- 範例:查詢商品分類為 3C 的商品名
-- 執行順序是 2 -> 3 -> 1 (範圍大到小)
SELECT -- 1
name
FROM -- 2
products
WHERE -- 3
category = '3C'
- 比較運算子
運算子 | 描述 |
---|---|
= | 等於 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
-- 範例:查詢價格大於 100 的商品名稱
SELECT
name
FROM
products
WHERE
price > 100;
- 邏輯運算子
運算子 | 描述 |
---|---|
AND | 且,兩個條件需同時成立 |
OR | 或,其中一個條件成立 |
-- 範例:查詢價格大於 100 且庫存大於 0 的商品名稱
SELECT
name
FROM
products
WHERE
price > 100 AND stock > 0;
-- 範例:查詢下架或庫存等於 0 的商品名稱
SELECT
name
FROM
products
WHERE
status = 'inactive' OR stock = 0;
更新資料
UPDATE
:更新目標的資料表(Table)SET
:更新欄位值- 執行順序:更新資料表(
UPDATE
) → 篩選範圍(WHERE
) → 更新對應欄位值(SET
)
-- 格式
UPDATE 資料表名稱
SET 欄位名 = 欄位值
WHERE 條件範圍
-- 範例:更新 iPhone 庫存為 1
-- 執行順序是 1 -> 3 -> 2
UPDATE
products -- 1
SET
stock = 1 -- 2
WHERE
name = 'iPhone'; -- 3
-- 範例(多筆更新):更新 iPhone 庫存為 3、價錢為 55,000
UPDATE
products
SET
stock = 3, price = 55000
WHERE
name = 'iPhone';
刪除資料
DELETE FROM
:刪除目標的資料表
-- 格式
DELETE FROM 資料表名稱
WHERE 條件範圍
-- 範例:刪除庫存等於 0 的商品
DELETE FROM products
WHERE stock = 0;
[補充]
實務上通常不會直接刪除資料庫的資料,而是使用
軟刪除
方式,即為透過另外一個欄位(例如:deleteAt
)實作刪除標記,避免意外導致資料救不回來。
databasepostgresql
Published on 15 Dec 2024
Updated on 15 Dec 2024