MySQL 日常運維開發中,90% 場景只涉及核心 20% 語法。本文彙總**庫表查看、DDL 結構變更、DML 數據操作、索引維護、權限管理**五大類高頻語法,附帶關鍵參數說明與最佳實踐註釋,作為桌面速查卡。
-- 顯示所有數據庫
SHOW DATABASES;
-- 切換當前數據庫
USE db_name;
-- 顯示當前庫所有表
SHOW TABLES;
-- 顯示表結構(含字段、類型、默認值、索引、引擎、字符集)
SHOW CREATE TABLE tbl_name;
DESC tbl_name; -- 簡略版
SHOW COLUMNS FROM tbl_name;
-- 顯示表索引
SHOW INDEX FROM tbl_name;
-- 顯示表狀態(行數、大小、引擎、自增值、碎片率等)
SHOW TABLE STATUS LIKE 'tbl_name';
ALTER TABLE old_name RENAME TO new_name;
-- 或
RENAME TABLE old_name TO new_name, old2 TO new2; -- 原子多表重命名
-- 末尾新增
ALTER TABLE tbl_name ADD COLUMN col_name INT UNSIGNED NOT NULL DEFAULT 0;
-- 指定位置
ALTER TABLE tbl_name ADD COLUMN col_name VARCHAR(100) AFTER exist_col;
ALTER TABLE tbl_name ADD COLUMN col_name DATE FIRST;
ALTER TABLE tbl_name DROP COLUMN col_name;
-- 等同
ALTER TABLE tbl_name DROP col_name;
-- CHANGE:可改名、改類型、改屬性、移動位置(需完整聲明新定義)
ALTER TABLE tbl_name CHANGE COLUMN old_col new_col BIGINT UNSIGNED NOT NULL DEFAULT 0 AFTER id;
-- MODIFY:僅改類型、屬性、位置(不改名,語法更簡潔)
ALTER TABLE tbl_name MODIFY COLUMN col_name VARCHAR(200) NOT NULL DEFAULT '';
-- 普通索引
ALTER TABLE tbl_name ADD INDEX idx_name (col1, col2);
-- 唯一索引
ALTER TABLE tbl_name ADD UNIQUE INDEX uk_name (col1);
-- 主鍵
ALTER TABLE tbl_name ADD PRIMARY KEY (id);
-- 刪除索引
ALTER TABLE tbl_name DROP INDEX idx_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;
DROP TABLE [IF EXISTS] tbl_name;
DROP TABLE [IF EXISTS] tbl1, tbl2; -- 多表原子刪除
DROP DATABASE [IF EXISTS] db_name;
-- 顯式列名(推薦,防結構變更報錯)
INSERT INTO tbl_name (col1, col2, col3) VALUES ('val1', 100, NOW());
-- 批量插入(單條 SQL,效率最高)
INSERT INTO tbl_name (col1, col2) VALUES
('a', 1), ('b', 2), ('c', 3);
-- 插入查詢結果
INSERT INTO target_tbl (col1, col2) SELECT col1, col2 FROM src_tbl WHERE ...;
-- 忽略重複鍵錯誤(MyISAM/InnoDB 唯一索引衝突時靜默跳過)
INSERT IGNORE INTO tbl_name (col1, col2) VALUES ('a', 1);
-- 衝突更新
INSERT INTO tbl_name (id, col1, col2) VALUES (1, 'a', 10)
ON DUPLICATE KEY UPDATE col1='a', col2=10;
UPDATE tbl_name SET col1='new_val', col2=col2+1 WHERE id = 100;
-- 多表更新
UPDATE t1 JOIN t2 ON t1.id = t2.t1_id SET t1.col = t2.col WHERE t1.status = 1;
DELETE FROM tbl_name WHERE id = 100;
-- 限制刪除行數(防誤刪全表)
DELETE FROM tbl_name WHERE status = 0 LIMIT 1000;
-- 多表刪除
DELETE t1 FROM t1 JOIN t2 ON t1.id = t2.t1_id WHERE t2.type = 'expired';
SELECT col1, col2 FROM tbl_name WHERE col1 = 'val' ORDER BY col2 DESC LIMIT 10;
-- 跨庫查詢
SELECT * FROM db1.tbl1 JOIN db2.tbl2 ON db1.tbl1.id = db2.tbl2.id;
-- 創建用戶
CREATE USER 'app_user'@'10.0.%' IDENTIFIED BY 'strong_password';
-- 授權(按最小權限原則)
GRANT SELECT, INSERT, UPDATE, DELETE ON db_name.* TO 'app_user'@'10.0.%';
GRANT SELECT ON db_name.tbl_name TO 'readonly'@'%';
-- 刷新生效
FLUSH PRIVILEGES;
-- 查看權限
SHOW GRANTS FOR 'app_user'@'10.0.%';
-- 回收權限
REVOKE INSERT, UPDATE, DELETE ON db_name.* FROM 'app_user'@'10.0.%';
-- 刪除用戶
DROP USER 'app_user'@'10.0.%';
| 場景 | 語法/技巧 |
|---|---|
| 查看表大小 | SELECT table_name, ROUND((data_length+index_length)/1024/1024,2) AS size_mb FROM information_schema.tables WHERE table_schema='db_name'; |
| 查看自增值 | SHOW TABLE STATUS LIKE 'tbl_name'; → Auto_increment |
| 重置自增值 | ALTER TABLE tbl_name AUTO_INCREMENT = 1000; |
| 複製表結構 | CREATE TABLE new_tbl LIKE old_tbl; |
| 複製表結構+數據 | CREATE TABLE new_tbl AS SELECT * FROM old_tbl; (無索引/約束) |
| 清空表(極快,不記錄 Binlog 行) | TRUNCATE TABLE tbl_name; |
| 優化表(碎片整理、統計更新) | OPTIMIZE TABLE tbl_name; / ANALYZE TABLE tbl_name; |
| 檢查/修復表(MyISAM) | CHECK TABLE tbl_name; / REPAIR TABLE tbl_name; |
掌握核心 50 條高頻語法,覆蓋 95% 日常操作。**DDL 變更必先測試環境驗證、生產低峰執行、備份可回滾**;**DML 批量操作必加 LIMIT、分批提交、監控主從延遲**;**權限遵循最小授予、定期審計**。將本手冊收藏備查,提升操作確定性與效率。