本文系統梳理 MySQL 最核心、最高頻的實戰操作,涵蓋庫表管理、用戶權限、遠程連接、數據增刪改查、進階查詢、索引優化等生產環境必備技能。
SHOW DATABASES; -- 默認系統庫: -- mysql:用戶權限元數據 -- test:測試用庫 -- information_schema:MySQL 內部架構信息
-- UTF-8 編碼(推薦) CREATE DATABASE db_name DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- GBK 編碼 CREATE DATABASE db_name DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
USE db_name; -- 分號可省略
-- 創建用戶(% 表示任意 IP)
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
-- 刪除用戶
DROP USER 'username'@'%';
-- 重命名用戶
RENAME USER 'old_user'@'%' TO 'new_user'@'%';
-- 修改密碼
SET PASSWORD FOR 'username'@'%' = PASSWORD('new_password');
-- 查看當前登錄用戶
SELECT USER();
-- 列出所有用戶(去重顯示)
SELECT DISTINCT CONCAT('User: ''', user, '''@''', host, ''';') AS query FROM mysql.user;
-- 查看指定用戶權限
SHOW GRANTS FOR 'nick'@'%';
-- 授權語法 GRANT 權限 ON 數據庫.表 TO '用戶'@'IP'; -- 回收權限 REVOKE 權限 ON 數據庫.表 FROM '用戶'@'IP';
常用權限對照表:
| 權限 | 說明 |
|---|---|
| ALL PRIVILEGES | 除 GRANT 外所有權限 |
| SELECT | 僅查詢權限 |
| SELECT, INSERT | 查詢與插入 |
| USAGE | 無實質訪問權限(僅能登錄) |
對象範圍:
db.*:庫下所有表db.table:指定表db.proc:指定存儲過程*.*:所有庫所有表主機匹配:
user@'192.168.1.100':僅該 IPuser@'192.168.1.%':IP 段通配user@'%':任意 IP(默認)-- 創建表(含主鍵、自增、非空、默認值、外鍵)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT DEFAULT 0,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 修改表結構
ALTER TABLE users MODIFY username VARCHAR(60); -- 修改類型
ALTER TABLE users CHANGE username user_name VARCHAR(60); -- 修改名+類型
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email; -- 增加列
ALTER TABLE users MODIFY phone VARCHAR(20) AFTER username; -- 調整列順序
ALTER TABLE users DROP PRIMARY KEY, ADD PRIMARY KEY (user_name); -- 重定義主鍵
-- 清空表(保留結構,重置自增 ID)
TRUNCATE TABLE users;
-- 插入單條
INSERT INTO users (username, email, age) VALUES ('張三', 'zhang@example.com', 25);
-- 批量插入/從查詢結果插入
INSERT INTO users_backup SELECT * FROM users WHERE age > 20;
-- 更新
UPDATE users SET age = 26 WHERE username = '張三';
-- 刪除
DELETE FROM users WHERE age < 18;
-- 條件查詢
SELECT * FROM users WHERE age BETWEEN 20 AND 30 AND username LIKE '張%';
-- 分頁、排序
SELECT * FROM users ORDER BY age DESC LIMIT 10 OFFSET 20;
-- 多表連接
SELECT u.username, d.dept_name
FROM users u
LEFT JOIN departments d ON u.dept_id = d.id;
-- 結果集合併
SELECT username FROM users WHERE age > 25
UNION
SELECT username FROM users WHERE dept_id = 1;
-- 查看建表語句 SHOW CREATE TABLE users; -- 查看表結構 DESC users; -- 或 SHOW COLUMNS FROM users; -- 查看執行計劃(是否走索引) EXPLAIN SELECT * FROM users WHERE username = '張三';
| 類型 | 適用場景 | 存儲/備註 |
|---|---|---|
| TINYINT/SMALLINT/INT/BIGINT | 整數 | 1/2/4/8 字節 |
| DECIMAL(p,s) | 精確小數(金額) | 定點數,避免浮點誤差 |
| VARCHAR(n) | 變長字符串 | 實際長度+1-2字節 |
| TEXT/BLOB | 大文本/二進制 | 離頁存儲,慎用 |
| DATETIME/TIMESTAMP | 日期時間 | TIMESTAMP 有时區自動轉換 |
| ENUM/SET | 枚舉/集合 | 內部存數字,極省空間 |
FULLTEXT,MySQL 5.6+ InnoDB 支持INDEX(a,b,c),查詢 a=1 AND b=2 AND c>3 用到 a,b;c>3 是範圍查詢,d 無法用到索引COUNT(DISTINCT col)/COUNT(*) > 0.1 適合建索引,性別/狀態等低區分度列不宜FROM_UNIXTIME(create_time) = '2024-01-01' ❌ → create_time = UNIX_TIMESTAMP('2024-01-01') ✅INDEX(a),需 (a,b) 時直接 ALTER TABLE ... DROP INDEX a, ADD INDEX(a,b)LIKE 'prefix%'=/<=> 精確匹配,不支持範圍ANALYZE TABLE 更新統計信息