MySQL 语法速查

00:00
1 min Beginner

常用 MySQL 命令速查表,含使用场景、常见错误,支持搜索和复制

学习指引

前置知识

  • 掌握数据库基本概念(表、字段、记录)
  • 已完成 MySQL 本地安装

推荐学习顺序

  1. 先学习【数据库与表操作】分组,掌握建库建表
  2. 再学习【数据查询】分组,掌握增删改查

数据库与表操作

这是 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 在分组前过滤)。

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式