MySQL 语法速查
00:00
常用 MySQL 命令速查表,含使用场景、常见错误,支持搜索和复制
学习指引
前置知识
- 掌握数据库基本概念(表、字段、记录)
- 已完成 MySQL 本地安装
推荐学习顺序
- 先学习【数据库与表操作】分组,掌握建库建表
- 再学习【数据查询】分组,掌握增删改查
数据库与表操作
这是 SQL 的第一步。本组命令用于管理数据库和表结构。创建数据库
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;输出: Query OK, 1 row affected (0.01 sec)
场景: 需要新建一个数据库来存储业务数据时使用。建议始终指定字符集为 utf8mb4 以支持中文和表情符号。
常见错误
- 错误:
CREATE DATABASE mydb;-- 解决: 始终显式指定 CHARACTER SET utf8mb4,不要依赖服务器默认字符集 - 错误:
CREATE DATABASE mydb;-- 解决: 使用 CREATE DATABASE IF NOT EXISTS mydb ... 避免重复创建报错
进阶: 生产环境中建议同时指定 COLLATE 排序规则。utf8mb4_general_ci 不区分大小写,utf8mb4_bin 区分大小写。
查看数据库列表
SHOW DATABASES;输出: +--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
场景: 需要确认数据库是否创建成功,或查看当前 MySQL 服务器上有哪些数据库时使用。
常见错误
- 错误:
SHOW DATABASE;-- 解决: 关键字是 DATABASES(复数形式),不是 DATABASE
删除数据库
DROP DATABASE IF EXISTS mydb;输出: Query OK, 0 rows affected (0.02 sec)
场景: 需要彻底删除一个数据库及其所有数据时使用。此操作不可逆,务必谨慎。
常见错误
- 错误:
DROP DATABASE mydb;-- 解决: 使用 DROP DATABASE IF EXISTS mydb 避免数据库不存在时报错 - 错误:
DROP DATABASE production_db;-- 解决: 执行删除前务必确认数据库名称,生产环境建议先备份再删除
进阶: 删除前可用 mysqldump -u root -p mydb > backup.sql 备份整个数据库。
创建表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
age INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;输出: Query OK, 0 rows affected (0.03 sec)
场景: 在数据库中创建新表来存储结构化数据时使用。需要先通过 USE 命令选择数据库。
常见错误
- 错误:
CREATE TABLE users (id INT, name VARCHAR);-- 解决: VARCHAR 必须指定长度,如 VARCHAR(50) - 错误:
CREATE TABLE users (...);-- 解决: 先执行 USE mydb; 选择数据库,再创建表
进阶: ENGINE=InnoDB 支持事务和外键,是 MySQL 5.5 以后的默认存储引擎。每个表都应定义主键。
查看表结构
DESC users;输出: +------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+-------------------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | | NULL | |
| email | varchar(100) | NO | UNI | NULL | |
| age | int | YES | | 0 | |
| created_at | timestamp | YES | | CURRENT_TIMESTAMP | |
+------------+--------------+------+-----+-------------------+----------------+
5 rows in set (0.00 sec)
场景: 需要查看表的字段名、数据类型、是否允许为空、主键、默认值等信息时使用。
常见错误
- 错误:
DESCRIBE nonexistent_table;-- 解决: 先用 SHOW TABLES; 确认表名是否正确
进阶: DESC 是 DESCRIBE 的简写,两者等价。也可使用 SHOW CREATE TABLE users; 查看完整的建表语句。
数据查询
查询是 SQL 最核心的能力。本组命令用于从表中检索数据,是日常开发中使用频率最高的操作。基本查询
SELECT id, username, email FROM users;输出: +----+----------+--------------------+
| id | username | email |
+----+----------+--------------------+
| 1 | zhangsan | zhangsan@mail.com |
| 2 | lisi | lisi@mail.com |
+----+----------+--------------------+
2 rows in set (0.00 sec)
场景: 需要查看表中指定列的数据时使用。避免使用 SELECT *,只查询需要的列可提升性能。
常见错误
- 错误:
SELECT * FORM users;-- 解决: 关键字是 FROM,不是 FORM,注意拼写 - 错误:
SELECT username FROM Users;-- 解决: Linux 系统下 MySQL 表名区分大小写,需与建表时一致;Windows 下不区分
进阶: SELECT * FROM users; 可查询所有列,但在生产环境中不建议使用,因为会增加网络传输和内存消耗。
条件查询
SELECT id, username, email FROM users WHERE age >= 18 AND username LIKE '张%';输出: +----+----------+--------------------+
| id | username | email |
+----+----------+--------------------+
| 1 | 张三 | zhangsan@mail.com |
+----+----------+--------------------+
1 row in set (0.00 sec)
场景: 需要根据条件筛选数据时使用。WHERE 子句支持 =, !=, <, >, <=, >=, LIKE, IN, BETWEEN 等运算符。
常见错误
- 错误:
SELECT * FROM users WHERE age = 18 OR 20;-- 解决: 正确写法为 age = 18 OR age = 20,或使用 IN: age IN (18, 20) - 错误:
SELECT * FROM users WHERE username = '%张%';-- 解决: 模糊匹配必须使用 LIKE:username LIKE '%张%'
进阶: LIKE 中 % 匹配任意多个字符,_ 匹配单个字符。BETWEEN 10 AND 20 包含两端值。
排序查询
SELECT id, username, age FROM users ORDER BY age DESC, id ASC;输出: +----+----------+-----+
| id | username | age |
+----+----------+-----+
| 3 | wangwu | 30 |
| 1 | zhangsan | 25 |
| 2 | lisi | 20 |
+----+----------+-----+
3 rows in set (0.00 sec)
场景: 需要按指定字段对查询结果排序时使用。ASC 为升序(默认),DESC 为降序。支持多字段排序,优先级从左到右。
常见错误
- 错误:
SELECT * FROM users ORDER age DESC;-- 解决: 关键字是 ORDER BY,不是 ORDER,必须带上 BY - 错误:
SELECT * FROM users WHERE age > 18 ORDER BY name;-- 解决: 确保 ORDER BY 后的列名在表中存在,或使用列的别名
进阶: 对大量数据排序时,在排序字段上建立索引可显著提升性能。NULL 值在升序中排在最前,降序中排在最后。
限制结果数量
SELECT id, username FROM users ORDER BY id DESC LIMIT 10 OFFSET 20;输出: +----+----------+
| id | username |
+----+----------+
| 80 | user80 |
| 79 | user79 |
| 78 | user78 |
+----+----------+
10 rows in set (0.00 sec)
场景: 分页查询时使用。LIMIT 指定返回的行数,OFFSET 指定跳过的行数。常与 ORDER BY 配合使用。
常见错误
- 错误:
SELECT * FROM users LIMIT 10, 20;-- 解决: LIMIT offset, count 中 offset 是跳过的行数,count 是返回的行数。建议使用 LIMIT count OFFSET offset 写法更清晰 - 错误:
SELECT * FROM users LIMIT 10;-- 解决: 分页查询必须配合 ORDER BY 确保结果顺序稳定
进阶: 大数据量分页时,OFFSET 值过大会导致性能问题。可用 WHERE id > last_id LIMIT 10 的方式优化深分页。
聚合函数
SELECT COUNT(*) AS total, AVG(age) AS avg_age, MAX(age) AS max_age, MIN(age) AS min_age FROM users;输出: +-------+---------+---------+---------+
| total | avg_age | max_age | min_age |
+-------+---------+---------+---------+
| 100 | 25.30 | 60 | 18 |
+-------+---------+---------+---------+
1 row in set (0.00 sec)
场景: 需要对数据进行统计计算时使用。常用聚合函数:COUNT(计数)、SUM(求和)、AVG(平均值)、MAX(最大值)、MIN(最小值)。
常见错误
- 错误:
SELECT username, COUNT(*) FROM users;-- 解决: 非聚合列必须出现在 GROUP BY 中:SELECT username, COUNT(*) FROM users GROUP BY username; - 错误:
SELECT COUNT(username) FROM users;-- 解决: 统计总行数使用 COUNT(*),统计某列非空值数量使用 COUNT(列名)
进阶: 聚合函数可与 GROUP BY 配合进行分组统计,HAVING 用于过滤分组后的结果(WHERE 在分组前过滤)。