当前位置: 首页 > news >正文

数据库约束与查询: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 的核心概念和使用方法。

http://www.dtcms.com/a/528858.html

相关文章:

  • C++笔记(面向对象)友元
  • 网站在工信部备案查询oa系统开发
  • FPGA基础知识(七):引脚约束深度解析--从物理连接到时序收敛的完整指南
  • Minecraft-Speed-Proxy——搭建专属的Minecraft加速IP
  • Flutter 异步 + 状态管理融合实践:Riverpod 与 Bloc 双方案解析
  • 10.25复习LRU缓存[特殊字符]
  • 做网站怎么那么难谷歌关键词排名查询工具
  • 门户网站的建设与维护注册域名多长时间
  • 实战:将 Nginx 日志实时解析并写入 MySQL,不再依赖 ELK
  • Redis 黑马点评day02 商户查询缓存
  • 品牌网站建设切入点wordpress很好的博客
  • ASP.NET Core读取Excel文件
  • 器材管理网站开发沈阳网站建设费用
  • 巧用 CSS linear-gradient 实现多种下划线文字特效(纯 CSS 无需额外标签)
  • 地州电视网站建设流程网址域名大全
  • 计算机网络自顶向下方法 1——因特网的介绍及构成 介绍协议
  • 学习笔记|受限波尔兹曼机(RBM)
  • DiVE长尾识别的虚拟实例蒸馏方法
  • 视频网站很难建设吗珠海网站运营
  • h5游戏免费下载:废柴勇士
  • 简单的企业网站源码网站建设业务
  • 基于鸿蒙 UniProton 的汽车电子系统开发指南
  • 建设部质监局网站电子商务网站策划书2000字
  • 使用表达式树实现字符串形式的表达式访问对象属性
  • SFT(有监督微调)、RLHF(强化学习)、RAG(检索增强⽣成)
  • 网页设计模板图片代码seo岗位职责
  • wordpress开发网站html如何建网站
  • 深度学习核心模型详解:CNN与RNN
  • 哈尔滨整站如何做网站流量买卖
  • 智能制造知识图谱的建设路线