数据库约束与查询:MySQL 中的 DQL 和约束全解析
大家好!今天我们要深入探讨 MySQL 中非常重要的两个主题——约束(Constraints) 和 数据查询语言(DQL)。

一. 约束(Constraints)
什么是约束?
约束 是在表上强制执行的数据规则,用于确保数据的完整性和一致性。简单来说,它就像一个“守门员”,防止非法或不符合要求的数据进入数据库。
核心内容:
- 主键约束(PRIMARY KEY)
- 自增约束(AUTO_INCREMENT)
- 非空约束(NOT NULL)
- 唯一约束(UNIQUE)
- 默认约束(DEFAULT)
- 零填充约束(ZEROFILL)
- 外键约束(FOREIGN KEY)
1. 主键约束(PRIMARY KEY)
简单解释:
想象一下你有一张员工表,每个员工都有一个唯一的工号。这个工号就是主键,它必须是唯一的且不能为 NULL。
CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL UNIQUE,age INT DEFAULT 0,status TINYINT NOT NULL DEFAULT 1
);特点:
- 每个表只能有一个主键。
- 主键值必须唯一且不能为空。
2. 自增约束(AUTO_INCREMENT)
简单解释:
就像你排队时,每个人都会自动获得一个唯一的编号。自增约束会自动为每条记录生成一个唯一的标识符。
CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50)
);INSERT INTO users(name) VALUES('张三'), ('李四'), ('王五');
-- 查询结果,id会自动递增
SELECT * FROM users;特点:
- 通常与主键一起使用。
- 自增列必须是整数类型。
- 默认从1开始,每次递增1。
3. 非空约束(NOT NULL)
简单解释:
有些字段不允许为空,比如用户的姓名。非空约束确保这些字段必须有值。
CREATE TABLE employees(id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT
);-- 正确插入
INSERT INTO employees VALUES(1, '张三', 25);
-- 错误插入(name为NULL)
INSERT INTO employees VALUES(2, NULL, 30); -- 报错特点:
- 如果尝试插入
NULL值,会报错。
4. 唯一约束(UNIQUE)
简单解释:
有时你需要确保某个字段的值在整个表中都是唯一的,比如邮箱地址。唯一约束可以帮助你做到这一点。
CREATE TABLE customers(id INT PRIMARY KEY,email VARCHAR(100) UNIQUE,phone VARCHAR(20) UNIQUE
);特点:
- 与主键不同,唯一约束允许
NULL值。- 一个表可以有多个唯一约束。
5. 默认约束(DEFAULT)
简单解释:
有时候你想给某些字段设置一个默认值,比如订单的数量默认为1。默认约束可以帮助你实现这一点。
CREATE TABLE orders(id INT PRIMARY KEY,product_name VARCHAR(100),quantity INT DEFAULT 1,order_date DATETIME DEFAULT CURRENT_TIMESTAMP
);-- 插入数据,使用默认值
INSERT INTO orders(id, product_name) VALUES(1, '笔记本电脑');特点:
- 当插入数据时不指定该列的值,将使用默认值。
6. 零填充约束(ZEROFILL)
简单解释:
当你希望数字前面补零时,可以使用零填充约束。不过,MySQL 8.0 后,ZEROFILL 属性已被弃用。
-- 不推荐使用
CREATE TABLE products(id INT ZEROFILL
);7. 外键约束(FOREIGN KEY)
简单解释:
外键约束用于建立表之间的关系。比如,一个学生表和一个课程表之间通过学号和课程号建立关系。
CREATE TABLE scores(student_id INT,course_id INT,score DECIMAL(5,2),PRIMARY KEY(student_id, course_id)
);-- 添加外键约束
ALTER TABLE scores ADD FOREIGN KEY (student_id) REFERENCES students(id);
ALTER TABLE scores ADD FOREIGN KEY (course_id) REFERENCES courses(id);特点:
- 维护数据的一致性和完整性。
- 确保引用的记录存在。
二. 数据查询语言(DQL)
什么是 DQL?
DQL(Data Query Language) 用于从数据库中查询数据,最常用的语句是 SELECT。它帮助我们从表中提取所需的信息。
1. 基础查询
简单查询
-- 查询所有列
SELECT * FROM students;-- 查询指定列
SELECT name, age, score FROM students;-- 列别名
SELECT name AS 姓名, age AS 年龄, score AS 成绩 FROM students;-- 去重
SELECT DISTINCT class_id FROM students;运算符
-- 等于
SELECT * FROM students WHERE age = 20;-- 不等于
SELECT * FROM students WHERE age != 20;-- 大于
SELECT * FROM students WHERE score > 80;2. 常用查询
排序查询
-- 升序排序
SELECT * FROM students ORDER BY age ASC;-- 降序排序
SELECT * FROM students ORDER BY score DESC;-- 多列排序
SELECT * FROM students ORDER BY class_id ASC, score DESC;聚合查询
聚合函数用于统计、求和、平均值等操作。
-- 统计学生总数
SELECT COUNT(*) AS 学生总数 FROM students;-- 统计男生数量
SELECT COUNT(*) AS 男生数量 FROM students WHERE gender = '男';-- 计算平均成绩
SELECT AVG(score) AS 平均成绩 FROM students;分组查询
分组查询可以对数据进行分类统计。
-- 按班级分组,统计每个班级的学生数量
SELECT class_id, COUNT(*) AS 学生数量 FROM students GROUP BY class_id;-- 按班级分组,计算每个班级的平均成绩
SELECT class_id, AVG(score) AS 平均成绩 FROM students GROUP BY class_id;-- 分组后筛选,只显示学生数量大于2的班级
SELECT class_id, COUNT(*) AS 学生数量
FROM students
GROUP BY class_id
HAVING COUNT(*) > 2;分页查询
分页查询用于处理大量数据,一次只显示一部分。
-- 每页显示2条数据,查询第一页
SELECT * FROM students LIMIT 0, 2;-- 每页显示2条数据,查询第二页
SELECT * FROM students LIMIT 2, 2;三. 总结与最佳实践
| 约束类型 | 特点 |
|---|---|
| 主键约束 | 唯一标识每一行数据,不能为空 |
| 自增约束 | 自动生成唯一的标识符 |
| 非空约束 | 确保列不能存储 NULL 值 |
| 唯一约束 | 确保列中的值唯一,允许 NULL |
| 默认约束 | 为列指定默认值 |
| 零填充约束 | 已被弃用 |
| 外键约束 | 建立表之间的关系 |
最佳实践
- 合理使用约束:确保数据的完整性和一致性。
- 灵活运用 DQL:根据需求选择合适的查询方式。
- 优化查询性能:避免不必要的复杂查询,适当使用索引。
一句话总结:
约束是数据库的“守门员”,确保数据的合法性和一致性;而 DQL 则是你的“数据探索工具”,帮助你轻松获取所需信息。
结语
这篇博客,我们详细讲解了 MySQL 中约束和 DQL 的核心概念和使用方法。

