| 術語 | 定義 | 比喻 |
|---|---|---|
| DBMS(數據庫管理系統) | 管理數據的軟件系統,如 MySQL、Oracle、SQL Server | 圖書館管理系統 |
| Database(數據庫) | 邏輯容器,存放相關表 | 某個書架 |
| Table(表) | 二維結構,行=記錄,列=字段 | 書架上的一本書 |
| Column(字段/列) | 屬性定義,含類型、約束 | 書的屬性:書名、作者、ISBN |
| Row(行/記錄) | 一條具體數據 | 某一本具體的書 |
| SQL | 結構化查詢語言,國際標準 | 與圖書館溝通的統一語言 |
# 登錄(-h 主機 -u 用戶 -p 密碼)
mysql -h127.0.0.1 -uroot -p
# 進入後首條指令:防止中文亂碼
SET NAMES utf8mb4;
最佳實踐:生產環境統一使用 utf8mb4(支援 Emoji),而非舊版 utf8(僅 3 字節)。
-- 創建(指定字符集與排序規則)
CREATE DATABASE shop_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 查看
SHOW DATABASES;
-- 切換
USE shop_db;
-- 刪除(謹慎!)
DROP DATABASE shop_db;
| 分類 | 類型 | 存儲/範圍 | 適用場景 |
|---|---|---|---|
| 整數 | TINYINT | 1 字節 / -128~127 | 狀態碼、布爾 |
| INT | 4 字節 / ±21 億 | 主鍵 ID、數量 | |
| BIGINT | 8 字節 / ±9×10¹⁸ | 訂單號、毫秒時間戳 | |
| 小數 | DECIMAL(p,s) | 精確定點數 | 金額、價格(必須用此) |
| FLOAT/DOUBLE | 近似浮點數 | 科學計算、經緯度 | |
| 字串 | VARCHAR(n) | 變長,1~2 字節長度前綴 | 名稱、標題、郵箱 |
| TEXT | 64 KB | 文章內容、日誌 | |
| MEDIUMTEXT | 16 MB | 長文檔 | |
| LONGTEXT | 4 GB | 極大文本 | |
| 時間 | DATE | 3 字節 / 1000-01-01 ~ 9999-12-31 | 生日、入職日期 |
| TIME | 3 字節 / -838:59:59 ~ 838:59:59 | 每日打卡時間 | |
| DATETIME | 8 字節 / 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 創建時間、訂單時間(不帶時區) | |
| TIMESTAMP | 4 字節 / 1970-01-01 ~ 2038-01-19(UTC) | 自動更新欄位、帶時區業務 |
CREATE TABLE user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵',
username VARCHAR(32) NOT NULL COMMENT '用戶名',
email VARCHAR(128) NOT NULL COMMENT '郵箱',
password_hash CHAR(60) NOT NULL COMMENT 'bcrypt 雜湊',
status TINYINT NOT NULL DEFAULT 1 COMMENT '1正常 0禁用',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_username (username),
UNIQUE KEY uk_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';
約束關鍵字:
PRIMARY KEY:唯一 + 非空 + 聚簇索引。UNIQUE:業務唯一性(如用戶名、郵箱)。NOT NULL:拒絕 NULL,優化器更易優化。DEFAULT:隱式賦值,減少應用層判斷。AUTO_INCREMENT:自增主鍵,配合 BIGINT 防溢出。COMMENT:文檔化,SHOW CREATE TABLE 可見。-- 查看結構
DESC user;
SHOW CREATE TABLE user;
-- 修改:增刪改列
ALTER TABLE user ADD COLUMN phone VARCHAR(20) AFTER email;
ALTER TABLE user MODIFY COLUMN phone VARCHAR(30); -- 擴長
ALTER TABLE user CHANGE COLUMN phone mobile VARCHAR(20); -- 重命名+改類型
ALTER TABLE user DROP COLUMN mobile;
-- 刪表
DROP TABLE user;
-- 增
INSERT INTO user (username, email, password_hash) VALUES ('alice', 'alice@ex.com', '$2y$10$...');
INSERT INTO user (username, email, password_hash) VALUES
('bob','bob@ex.com','$2y$10$...'),('cindy','cindy@ex.com','$2y$10$...'); -- 批次
-- 刪(帶 WHERE,防誤刪全表)
DELETE FROM user WHERE id = 100;
-- 清空表並重置自增
TRUNCATE TABLE user;
-- 改
UPDATE user SET status = 0 WHERE id = 100;
-- 查
SELECT id, username, email, created_at FROM user WHERE status = 1 ORDER BY created_at DESC LIMIT 20;
utf8` vs `utf8mb4`:舊版 utf8` 只支援 BMP 字符,Emoji 會截斷報錯。WHERE varchar_col = 123` 導致全表掃描,字串加引號。BIGINT` 或雪花算法。