承接前三篇安裝、點命令、建表,本文深入 CRUD 語法、比較/邏輯運算子、排序分組去重、日期時間處理、聚合函數、字串函數、索引視圖、備份還原,所有指令均在 sqlite3 CLI 實測可用。
| 類別 | 說明 |
|---|---|
| NULL | 空值 |
| INTEGER | 帶號整數,1~8 bytes 依值動態儲存 |
| REAL | IEEE 754 雙精度浮點數,8 bytes |
| TEXT | UTF-8/16BE/16LE 字串 |
| BLOB | 二進位資料,完全依輸入儲存 |
型別親和性:欄位宣告型別僅為建議,SQLite 允許任意類別寫入任意欄位 (除 INTEGER PRIMARY KEY 強制整數)。
CREATE TABLE company (
id INTEGER PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
age INT NOT NULL,
address CHAR(50),
salary REAL
);
-- 插入 (指定欄位)
INSERT INTO company (id, name, age, address, salary) VALUES (1, 'Paul', 32, 'California', 20000);
-- 插入 (全欄位,id 自動遞增)
INSERT INTO company VALUES (7, 'James', 24, 'Houston', 10000);
-- 批次插入
INSERT INTO company VALUES (2,'Allen',25,'Texas',15000),(3,'Teddy',23,'Norway',20000);
-- 查詢
SELECT * FROM company;
SELECT * FROM company WHERE age < 30;
-- 更新
UPDATE company SET address = 'NanJing' WHERE name = 'wirelessqa';
-- 刪除
DELETE FROM company WHERE address = 'NanJing';
| 運算子 | 說明 | 範例 |
|---|---|---|
| = / == | 相等 | age = 32 |
| != / <> | 不等 | age != 32 |
| > / < / >= / <= | 大小比較 | age >= 25 |
| AND / OR | 邏輯與/或 | age < 25 AND salary > 15000 |
| BETWEEN ... AND ... | 區間 (含邊界) | age BETWEEN 25 AND 32 |
| IN (val1, val2...) | 離散值集合 | age IN (25,27) |
| NOT IN | 排除集合 | age NOT IN (25,27) |
| LIKE / GLOB | 模糊匹配 (GLOB 區分大小寫) | name LIKE 'Ki%' / name GLOB 'Ki*' |
| IS NULL / IS NOT NULL | 空值判斷 | age IS NOT NULL |
| EXISTS (subquery) | 子查詢存在性 | EXISTS (SELECT 1 FROM company WHERE salary > 65000) |
-- 排序
SELECT * FROM company ORDER BY salary ASC;
SELECT * FROM company ORDER BY age, salary DESC;
-- 分組聚合
SELECT name, SUM(salary) FROM company GROUP BY name;
SELECT name, SUM(salary) FROM company GROUP BY name ORDER BY name DESC;
-- HAVING 分組過濾
SELECT name, COUNT(*) FROM company GROUP BY name HAVING COUNT(*) > 1;
-- 去重
SELECT DISTINCT age FROM company;
-- 限制筆數
SELECT * FROM company LIMIT 4;
-- 當前日期/時間
SELECT date('now'); -- 2024-05-18
SELECT time('now'); -- 14:30:00
SELECT datetime('now'); -- 2024-05-18 14:30:00
-- Unix 時間戳轉換
SELECT datetime(1092941466, 'unixepoch'); -- 2004-08-19 18:51:06
-- 日期運算
SELECT date('now', '+7 days');
SELECT date('now', 'start of month');
SELECT date('now', '-1 month', '+3 days');
| 函數 | 範例 | 結果 |
|---|---|---|
| COUNT(*) | SELECT COUNT(*) FROM company | 7 |
| MAX/MIN | MAX(salary) | 85000 |
| AVG/SUM | AVG(salary) | 37142.85 |
| UPPER/LOWER | UPPER(name) | PAUL |
| LENGTH | LENGTH(name) | 4 |
| SUBSTR | SUBSTR(name,1,2) | Pa |
| TRIM | TRIM(' hi ') | hi |
| REPLACE | REPLACE('a-b-c','-','_') | a_b_c |
| COALESCE | COALESCE(NULL,0) | 0 |
-- 索引
CREATE INDEX idx_salary ON company(salary);
-- 視圖
CREATE VIEW high_salary AS SELECT * FROM company WHERE salary > 50000;
-- 備份 (SQL 文本)
sqlite3 company.db .dump > backup.sql
# 或二進位熱備份 (需 3.27+)
sqlite3 company.db ".backup backup.db"
-- 還原
sqlite3 company.db < backup.sql
# 或
sqlite3 company.db ".restore backup.db"
-- 刪除表
DROP TABLE company;
-- 刪除資料庫檔案
rm company.db
-- 匯出 CSV
.mode csv
.headers on
.output data.csv
SELECT * FROM company;
.output stdout
-- 匯入 CSV
CREATE TABLE new_tbl (id INTEGER PRIMARY KEY, name TEXT);
.mode csv
.import data.csv new_tbl
SQLite 雖輕量,但標準 SQL 功能極完整:型別親和性、日期時間運算、視窗函數 (3.25+)、JSON1 擴充、FTS5 全文搜尋、R-Tree 空間索引。掌握本文 CRUD、運算子、分組、日期、備份匯出全流程,即可在任何嵌入式/桌面/行動專案中自信驅動 SQLite。