Skip to content

MySQL 基础语句

MySQL 是一种常用的关系型数据库管理系统。

在 MySQL 中,我们主要使用 SQL 语句完成:

text
数据库操作
表操作
数据增删改查
条件查询
排序
分组
聚合
连接查询

1. 登录 MySQL

终端中常见:

bash
mysql -u root -p

其中:

text
mysql → 启动 MySQL 客户端
-u    → 指定用户名
root  → 用户名
-p    → 使用密码登录

登录后会进入:

text
mysql>

提示符。


数据库操作

2. 查看所有数据库

sql
SHOW DATABASES;

3. 创建数据库

sql
CREATE DATABASE school;

为了避免数据库已经存在时报错,可以写:

sql
CREATE DATABASE IF NOT EXISTS school;

4. 使用数据库

sql
USE school;

执行后,后续表操作默认针对:

text
school

数据库。


5. 查看当前正在使用的数据库

sql
SELECT DATABASE();

6. 删除数据库

sql
DROP DATABASE school;

更加安全的写法:

sql
DROP DATABASE IF EXISTS school;

注意:

DROP DATABASE 会直接删除整个数据库以及其中的数据。


表操作

7. 查看当前数据库中的表

sql
SHOW TABLES;

8. 创建表

例如创建学生表:

sql
CREATE TABLE students (
  id INT,
  name VARCHAR(50),
  age INT
);

9. 创建常见完整表

sql
CREATE TABLE students (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  age INT,
  gender VARCHAR(10),
  score DECIMAL(5, 2)
);

这里包含:

text
id      → 学生编号
name    → 姓名
age     → 年龄
gender  → 性别
score   → 成绩

常见数据类型

10. INT

整数:

sql
age INT

例如:

text
18
20
100

11. VARCHAR

可变长度字符串:

sql
name VARCHAR(50)

表示最多保存:

text
50 个字符

常用于:

text
姓名
用户名
地址
标题

12. CHAR

固定长度字符串:

sql
gender CHAR(1)

适合长度比较固定的数据。

例如:

text
M
F

13. DECIMAL

用于保存精确小数:

sql
price DECIMAL(10, 2)

其中:

text
10 → 总位数
2  → 小数位数

例如:

text
12345.67

金额数据通常更适合使用 DECIMAL


14. DATE

保存日期:

sql
birthday DATE

格式:

text
YYYY-MM-DD

例如:

text
2026-09-01

15. DATETIME

保存日期和时间:

sql
created_at DATETIME

例如:

text
2026-09-01 20:30:00

16. BOOLEAN

MySQL 中可以写:

sql
is_active BOOLEAN

例如:

sql
TRUE
FALSE

在 MySQL 中,BOOLEAN 本质上通常会映射成整数类型。

可以简单理解:

text
TRUE  → 1
FALSE → 0

字段约束

17. PRIMARY KEY

主键:

sql
id INT PRIMARY KEY

主键具有:

text
唯一
不能为空

的特点。

一个表通常会设置一个主键。


18. AUTO_INCREMENT

自动增长:

sql
id INT PRIMARY KEY AUTO_INCREMENT

插入数据时可以不用手动指定 id

例如:

sql
INSERT INTO students (name, age)
VALUES ('Tom', 18);

MySQL 会自动生成:

text
id

19. NOT NULL

不能为空:

sql
name VARCHAR(50) NOT NULL

表示插入数据时:

text
name

必须有值。


20. UNIQUE

唯一约束:

sql
email VARCHAR(100) UNIQUE

表示不同记录中的:

text
email

不能重复。


21. DEFAULT

默认值:

sql
status VARCHAR(20) DEFAULT 'active'

如果插入数据时没有填写 status

sql
INSERT INTO users (name)
VALUES ('Tom');

那么默认:

text
status = active

查看表结构

22. DESC

sql
DESC students;

也可以:

sql
DESCRIBE students;

可以查看:

text
字段名
数据类型
是否允许 NULL
主键
默认值
额外属性

23. 查看建表语句

sql
SHOW CREATE TABLE students;

可以看到 MySQL 实际使用的完整建表 SQL。


修改表结构

24. 添加字段

sql
ALTER TABLE students
ADD email VARCHAR(100);

25. 删除字段

sql
ALTER TABLE students
DROP COLUMN email;

26. 修改字段类型

例如:

sql
ALTER TABLE students
MODIFY age TINYINT;

27. 修改字段名

MySQL 可以使用:

sql
ALTER TABLE students
RENAME COLUMN name TO student_name;

28. 修改表名

sql
RENAME TABLE students TO student;

也可以:

sql
ALTER TABLE students
RENAME TO student;

插入数据

29. INSERT INTO

基本格式:

sql
INSERT INTO 表名 (字段1, 字段2)
VALUES (值1, 值2);

例如:

sql
INSERT INTO students (name, age)
VALUES ('Tom', 18);

30. 插入完整数据

假设表结构:

sql
CREATE TABLE students (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50),
  age INT,
  score DECIMAL(5, 2)
);

插入:

sql
INSERT INTO students (name, age, score)
VALUES ('Tom', 18, 90.5);

31. 一次插入多条数据

sql
INSERT INTO students (name, age, score)
VALUES
  ('Tom', 18, 90.5),
  ('Jack', 20, 85.0),
  ('Alice', 19, 95.5);

查询数据

32. 查询所有数据

sql
SELECT * FROM students;

其中:

text
*

表示所有字段。


33. 查询指定字段

sql
SELECT name, age
FROM students;

34. 给字段设置别名

sql
SELECT name AS student_name,
       score AS student_score
FROM students;

AS 可以省略:

sql
SELECT name student_name
FROM students;

不过初学阶段建议保留 AS,更清楚。


条件查询

35. WHERE

基本格式:

sql
SELECT *
FROM students
WHERE 条件;

例如:

sql
SELECT *
FROM students
WHERE age >= 18;

36. 等于

SQL 中判断相等使用:

sql
=

例如:

sql
SELECT *
FROM students
WHERE name = 'Tom';

注意:

SQL 的相等判断是 =,不是 JavaScript 中的 =====


37. 不等于

MySQL 常用:

sql
<>

或者:

sql
!=

例如:

sql
SELECT *
FROM students
WHERE age != 18;

38. 大于和小于

sql
>
<
>=
<=

例如:

sql
SELECT *
FROM students
WHERE score >= 90;

逻辑条件

39. AND

多个条件同时满足:

sql
SELECT *
FROM students
WHERE age >= 18
  AND score >= 90;

40. OR

满足其中一个条件:

sql
SELECT *
FROM students
WHERE age < 18
   OR score >= 90;

41. NOT

取反:

sql
SELECT *
FROM students
WHERE NOT age = 18;

范围查询

42. BETWEEN

查询一个范围:

sql
SELECT *
FROM students
WHERE score BETWEEN 80 AND 90;

通常包含:

text
80
90

两个边界值。

等价于类似:

sql
WHERE score >= 80
  AND score <= 90

43. IN

判断是否属于多个值中的一个:

sql
SELECT *
FROM students
WHERE age IN (18, 19, 20);

相当于:

sql
WHERE age = 18
   OR age = 19
   OR age = 20

44. NOT IN

sql
SELECT *
FROM students
WHERE age NOT IN (18, 19, 20);

模糊查询

45. LIKE

用于模糊匹配字符串。

例如:

sql
SELECT *
FROM students
WHERE name LIKE 'T%';

表示:

查询以 T 开头的名字。


46. %

% 表示任意数量的字符。

例如:

sql
LIKE 'T%'

表示:

text
T 开头
sql
LIKE '%m'

表示:

text
m 结尾
sql
LIKE '%om%'

表示:

text
包含 om

47. _

下划线:

text
_

表示:

任意一个字符。

例如:

sql
WHERE name LIKE 'T_m';

可以匹配类似:

text
Tom
Tim

NULL

48. 判断 NULL

不能直接写:

sql
WHERE email = NULL;

应该写:

sql
WHERE email IS NULL;

49. 判断不是 NULL

sql
WHERE email IS NOT NULL;

可以记住:

text
NULL 不使用 =
NULL 使用 IS

排序

50. ORDER BY

排序:

sql
SELECT *
FROM students
ORDER BY score;

默认:

text
升序

51. ASC

升序:

sql
SELECT *
FROM students
ORDER BY score ASC;

例如:

text
60
70
80
90

52. DESC

降序:

sql
SELECT *
FROM students
ORDER BY score DESC;

例如:

text
90
80
70
60

注意这里的:

sql
DESC students;

和:

sql
ORDER BY score DESC;

虽然都出现 DESC,但作用不同。

前者:

text
查看表结构

后者:

text
降序排列

53. 多字段排序

sql
SELECT *
FROM students
ORDER BY age ASC, score DESC;

含义:

text
先按年龄升序

年龄相同:
再按成绩降序

限制查询数量

54. LIMIT

只查询前几条:

sql
SELECT *
FROM students
LIMIT 5;

表示:

text
最多返回 5 条

55. LIMIT 偏移量

例如:

sql
SELECT *
FROM students
LIMIT 5, 10;

表示:

text
跳过前 5 条
再查询 10 条

也可以写:

sql
SELECT *
FROM students
LIMIT 10 OFFSET 5;

修改数据

56. UPDATE

基本格式:

sql
UPDATE 表名
SET 字段 =
WHERE 条件;

例如:

sql
UPDATE students
SET score = 100
WHERE id = 1;

57. 一次修改多个字段

sql
UPDATE students
SET age = 19,
    score = 95
WHERE id = 1;

注意:

UPDATE 时一定要特别注意 WHERE 条件。

如果写:

sql
UPDATE students
SET score = 100;

那么:

text
所有学生的 score 都会变成 100

删除数据

58. DELETE

基本格式:

sql
DELETE FROM students
WHERE id = 1;

59. 删除所有数据

sql
DELETE FROM students;

会删除表中的全部记录,但:

text
表结构还在

DELETE、TRUNCATE、DROP

60. DELETE

sql
DELETE FROM students;

作用:

text
删除表中的数据
保留表结构

61. TRUNCATE

sql
TRUNCATE TABLE students;

作用:

text
清空整张表的数据
保留表结构

通常比逐行 DELETE 更适合直接清空整张表。

AUTO_INCREMENT 计数通常也会重新开始。


62. DROP

sql
DROP TABLE students;

作用:

text
数据删除
表结构也删除

可以简单记:

text
DELETE   → 删除数据
TRUNCATE → 清空表
DROP     → 删除整张表

聚合函数

63. COUNT()

统计数量:

sql
SELECT COUNT(*)
FROM students;

64. SUM()

求和:

sql
SELECT SUM(score)
FROM students;

65. AVG()

平均值:

sql
SELECT AVG(score)
FROM students;

66. MAX()

最大值:

sql
SELECT MAX(score)
FROM students;

67. MIN()

最小值:

sql
SELECT MIN(score)
FROM students;

常见聚合函数:

text
COUNT() → 数量
SUM()   → 总和
AVG()   → 平均值
MAX()   → 最大值
MIN()   → 最小值

分组查询

68. GROUP BY

例如统计不同年龄的人数:

sql
SELECT age, COUNT(*)
FROM students
GROUP BY age;

假设数据:

text
Tom     18
Jack    18
Alice   19

结果类似:

text
18 → 2
19 → 1

69. HAVING

HAVING 用于过滤分组后的结果。

例如:

sql
SELECT age, COUNT(*) AS count
FROM students
GROUP BY age
HAVING COUNT(*) >= 2;

70. WHERE 和 HAVING

可以简单区分:

text
WHERE  → 分组之前过滤数据

HAVING → 分组之后过滤结果

例如:

sql
SELECT age, AVG(score)
FROM students
WHERE score >= 60
GROUP BY age
HAVING AVG(score) >= 80;

执行思路:

text
WHERE

GROUP BY

HAVING

去重

71. DISTINCT

去除重复结果:

sql
SELECT DISTINCT age
FROM students;

例如原数据:

text
18
18
19
19
20

查询结果:

text
18
19
20

MySQL 常用函数

72. CONCAT()

拼接字符串:

sql
SELECT CONCAT(name, '-', age)
FROM students;

例如:

text
Tom-18

73. LENGTH()

获取字符串长度:

sql
SELECT LENGTH(name)
FROM students;

需要注意:

MySQL 的 LENGTH() 返回的是字节长度。

如果想按字符数量统计,可以使用:

sql
CHAR_LENGTH(name)

74. NOW()

获取当前日期和时间:

sql
SELECT NOW();

75. CURDATE()

获取当前日期:

sql
SELECT CURDATE();

76. CURTIME()

获取当前时间:

sql
SELECT CURTIME();

多表基础

77. 外键概念

例如有两个表:

text
students
classes

学生表:

sql
CREATE TABLE students (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50),
  class_id INT
);

班级表:

sql
CREATE TABLE classes (
  id INT PRIMARY KEY AUTO_INCREMENT,
  class_name VARCHAR(50)
);

这里:

text
students.class_id

可以用于关联:

text
classes.id

JOIN

78. INNER JOIN

只查询两个表能够匹配的数据:

sql
SELECT students.name,
       classes.class_name
FROM students
INNER JOIN classes
  ON students.class_id = classes.id;

79. LEFT JOIN

保留左表全部数据:

sql
SELECT students.name,
       classes.class_name
FROM students
LEFT JOIN classes
  ON students.class_id = classes.id;

即使某个学生没有对应班级:

text
学生仍然会出现在结果中
班级部分可能为 NULL

执行顺序基础理解

一个比较完整的查询可能是:

sql
SELECT age, AVG(score) AS avg_score
FROM students
WHERE score >= 60
GROUP BY age
HAVING AVG(score) >= 80
ORDER BY avg_score DESC
LIMIT 5;

书写顺序:

text
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT

初学阶段可以先按照这个顺序记忆。


MySQL 注释

80. 单行注释

可以使用:

sql
-- 查询所有学生
SELECT * FROM students;

注意:

text
-- 后面通常需要有一个空格

81. # 注释

MySQL 还支持:

sql
# 查询学生
SELECT * FROM students;

82. 多行注释

sql
/*
  查询
  所有学生
*/
SELECT * FROM students;

一个完整练习

首先创建数据库:

sql
CREATE DATABASE IF NOT EXISTS school;

USE school;

创建表:

sql
CREATE TABLE students (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  age INT,
  score DECIMAL(5, 2)
);

插入数据:

sql
INSERT INTO students (name, age, score)
VALUES
  ('Tom', 18, 85.5),
  ('Jack', 20, 92.0),
  ('Alice', 19, 96.5),
  ('Bob', 18, 70.0);

查询所有数据:

sql
SELECT *
FROM students;

查询成绩大于等于 90:

sql
SELECT name, score
FROM students
WHERE score >= 90;

按成绩降序:

sql
SELECT *
FROM students
ORDER BY score DESC;

查询平均成绩:

sql
SELECT AVG(score)
FROM students;

按照年龄分组:

sql
SELECT age,
       COUNT(*) AS student_count,
       AVG(score) AS avg_score
FROM students
GROUP BY age;

修改数据:

sql
UPDATE students
SET score = 90
WHERE id = 1;

删除数据:

sql
DELETE FROM students
WHERE id = 4;

MySQL 基础语句速查

功能MySQL
查看数据库SHOW DATABASES;
创建数据库CREATE DATABASE db;
使用数据库USE db;
删除数据库DROP DATABASE db;
查看表SHOW TABLES;
查看表结构DESC table_name;
创建表CREATE TABLE
修改表ALTER TABLE
删除表DROP TABLE
插入数据INSERT INTO
查询数据SELECT
条件查询WHERE
修改数据UPDATE
删除数据DELETE
清空表TRUNCATE TABLE
排序ORDER BY
去重DISTINCT
限制数量LIMIT
分组GROUP BY
分组过滤HAVING
统计数量COUNT()
求和SUM()
平均值AVG()
最大值MAX()
最小值MIN()
模糊查询LIKE
范围查询BETWEEN
多值查询IN
内连接INNER JOIN
左连接LEFT JOIN

总结

MySQL 初学阶段最重要的核心其实就是:

text
数据库



记录

字段

然后掌握四个最核心的数据操作:

text



对应:

sql
INSERT
DELETE
UPDATE
SELECT

也就是常说的:

text
CRUD

其中:

text
Create   → INSERT
Read     → SELECT
Update   → UPDATE
Delete   → DELETE

建议优先熟练掌握:

text
CREATE DATABASE
USE

CREATE TABLE
DESC

INSERT INTO

SELECT
WHERE

UPDATE

DELETE

ORDER BY
LIMIT

COUNT
AVG
MAX
MIN

GROUP BY
HAVING

等这些基础语句熟练之后,再继续学习:

text
多表查询
JOIN
子查询
索引
事务
视图
存储过程
用户与权限
数据库设计

这样 MySQL 的基础体系就基本建立起来了。