
前言
知识无底,学海无涯,到今天进入 MySQL 的学习第 4 天了。知识点虽然看起来简单,但数量不少,容易遗忘。于是写一篇博客,把 MySQL 中关于数据约束和**数据操作(DML)**的基础内容整理出来,既方便自己日后复习,也希望能够帮助到同样正在入门的同学。
一、SQL 简述
1. SQL 的概述
Structured Query Language(结构化查询语言)简称 SQL,被 ANSI 定为关系型数据库的标准语言,后被 ISO 采纳为国际标准。通过 SQL,我们可以定义和操作数据、维护数据完整性与安全性。
2. SQL 的优点
- 简单易学,操作性强
- 主流数据库(MySQL、Oracle、SQL Server 等)均支持
- 高度非过程化:大部分工作由 DBMS 自动完成
3. SQL 的分类
| 分类 | 说明 | 常见关键字 |
|---|---|---|
| DDL | 数据定义语言 | CREATE、ALTER、DROP |
| DML | 数据操作语言 | INSERT、UPDATE、DELETE |
| DCL | 数据控制语言 | GRANT、DENY |
| DQL | 数据查询语言 | SELECT |
二、数据库的三大范式
- 第一范式(1NF):字段不可再分,具有原子性
- 第二范式(2NF) :在 1NF 基础上,非主键字段必须完全依赖主键
- 第三范式(3NF) :在 2NF 基础上,非主键字段之间不能相互依赖
三、数据表的约束
约束的本质:对插入的数据进行限制,保证数据的正确性。
1. 主键约束(PRIMARY KEY)
作用 :唯一标识一行记录
特点:
- 值唯一
- 不能为 NULL
- 一张表只能有一个主键(但可以是联合主键)
sql
-- 方式一
CREATE TABLE teachers(
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 方式二:联合主键
CREATE TABLE stus(
first_name VARCHAR(50),
second_name VARCHAR(50),
CONSTRAINT pk_name PRIMARY KEY(first_name, second_name)
);
2. 自增约束(AUTO_INCREMENT)
特点:
- 必须配合主键使用
- 插入
0、NULL时会自动递增 - 一张表只能有一个自增字段
sql
CREATE TABLE students1(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
3. 非空约束(NOT NULL)
作用:该字段插入时必须有值
sql
CREATE TABLE students2(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL
);
4. 唯一约束(UNIQUE)
作用:字段值在列中唯一(允许多个 NULL)
sql
CREATE TABLE students3(
id INT UNIQUE,
name VARCHAR(50)
);
5. 默认值约束(DEFAULT)
作用:未赋值时使用默认值
sql
CREATE TABLE students5(
id INT DEFAULT 1,
name VARCHAR(50)
);
6. 外键约束(FOREIGN KEY)
用于维护多表之间的数据一致性(此处略作简化)。
四、数据表插入数据(INSERT)
1. 全字段插入
sql
CREATE TABLE students6(
id INT,
name VARCHAR(50),
age INT,
height DOUBLE,
sex CHAR(1)
);
INSERT INTO students6 VALUES(1, '张伟', 18, 175.5, '男');
2. 指定字段插入
sql
INSERT INTO students6(id, name) VALUES(2, '李娜');
3. 一次插入多条记录
sql
INSERT INTO students6(id, name)
VALUES
(3, '王磊'),
(4, '刘洋');
五、删除数据(DELETE & TRUNCATE)
1. DELETE 基本语法
sql
DELETE FROM students6 WHERE id = 1;
2. 删除全部数据
sql
DELETE FROM students6;
3. TRUNCATE 清空表
sql
TRUNCATE TABLE students6;
4. DELETE vs TRUNCATE vs DROP
| 对比项 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 类型 | DML | DDL | DDL |
| 是否可回滚 | ✅ | ❌ | ❌ |
| 自增影响 | 继续增长 | 重置为 1 | 表不存在 |
| 删除粒度 | 行级 | 表级 | 表级 |
六、更新数据(UPDATE)
sql
-- 修改指定记录
UPDATE students5 SET id = 2 WHERE name = '李娜';
-- 修改多个字段
UPDATE students5 SET id = 1, name = '陈静' WHERE id = 2;
-- 不加 WHERE 会更新整张表(慎用)
UPDATE students5 SET name = '赵敏';
七、简单查询(DQL)
sql
-- 查询所有字段
SELECT * FROM students6;
-- 查询指定字段
SELECT id, name FROM students6;
-- 去重
SELECT DISTINCT sex FROM students6;
-- 算术运算
SELECT name, age + 10 AS future_age FROM students6;
八、条件查询
sql
-- 关系运算符
SELECT * FROM students6 WHERE age >= 18;
-- IN
SELECT * FROM students6 WHERE id IN (1, 3);
-- BETWEEN
SELECT * FROM students6 WHERE age BETWEEN 18 AND 22;
-- NULL 判断
SELECT * FROM students6 WHERE age IS NOT NULL;
-- LIKE
SELECT * FROM students6 WHERE name LIKE '张%';
-- LIMIT
SELECT * FROM students6 ORDER BY age ASC LIMIT 3;
九、分组查询与排序
sql
-- 分组统计
SELECT sex, COUNT(*) FROM students6 GROUP BY sex;
-- HAVING 筛选
SELECT sex, COUNT(*) FROM students6
GROUP BY sex
HAVING COUNT(*) >= 2;
-- 排序
SELECT * FROM students6 ORDER BY age DESC;
十、别名设置
sql
-- 表别名
SELECT s.name FROM students6 AS s;
-- 字段别名
SELECT name AS 姓名, age AS 年龄 FROM students6;
十一、多表连接查询(示例)
sql
-- 内连接
SELECT s.name, c.class_name
FROM students s
JOIN classes c ON s.class_id = c.id;
-- 左连接
SELECT c.class_name, s.name
FROM classes c
LEFT JOIN students s ON c.id = s.class_id;
十二、子查询
sql
-- 比较子查询
SELECT * FROM classes
WHERE id = (SELECT class_id FROM students WHERE name = '张伟');
-- EXISTS
SELECT * FROM classes
WHERE EXISTS (SELECT 1 FROM students WHERE name = '王磊');
总结
SQL 书写顺序
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
SQL 执行顺序
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
学习 MySQL 最重要的是:多写 SQL、多验证结果 。
基于复习,乐于分享,希望这篇笔记对你有帮助!