4.2.1 MYSQL语句,索引,视图,存储过程,触发器
文章目录
- 4.2.1 MYSQL语句,索引,视图,存储过程,触发器
- 1. SQL基础
- 1. 数据库
- 2. SQL
- 3. 数据库术语:
- 2. MYSQL体系结构
- 1. 体系
- 3. 数据库设计三范式和反范式
- 1. 列不可分
- 2. 在1基础上,完全依赖主键,而非部分依赖(联合索引)
- 3. 在2基础上,主键直接相关,而非间接相关,减少数据冗余
- 4. 反范式
- 4. crud
- 1. 5大约束
- 2. 数据库,数据表基本操作
- 3. 增
- 4. 删
- 5. 改
- 5. 高级查询
- 1. 基础查询
- 2. 条件查询
- 3. 范围查询
- 4. 判空查询
- 5. 模糊查询
- 6. 分页查询
- 7. 查询后排序
- 8. 聚合查询
- 9. 分组查询
- 10. 联表查询
- 1. INNER JOIN
- 2. LEFT JOIN
- 3. RIGHT JOIN
- 11. 子查询
- 12. 合并查询
- 6. 预处理语句
- 7. 视图
- 8. 触发器
4.2.1 MYSQL语句,索引,视图,存储过程,触发器
1. SQL基础
1. 数据库
数据库类型
-
OLTP(Online Transaction Processing)- 联机事务处理
- 面向大量短小事务(如增删改查)
- 注重响应速度和并发性能
- 常用于银行、电商系统
-
OLAP(Online Analytical Processing)- 联机分析处理
- 面向复杂查询、数据分析
- 关注报表、统计、多维分析
- 常用于数据仓库、BI 系统
2. SQL
结构化查询语言(Structured Query Language) 简称 SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL 是关系数据库系统的标准语言
类型 | 全称 | 作用 | 示例关键字 |
---|---|---|---|
DQL | Data Query Language | 数据查询 | SELECT |
DML | Data Manipulation Language | 数据操作 | INSERT, UPDATE, DELETE |
DDL | Data Definition Language | 定义数据库结构 | CREATE, DROP, ALTER |
DCL | Data Control Language | 权限控制 | GRANT, REVOKE |
TCL | Transaction Control Language | 事务管理 | COMMIT, ROLLBACK, SAVEPOINT |
3. 数据库术语:
- 数据库(Database): 用于存储有结构的数据集合,是信息的有序管理系统。
- 数据表(Table): 数据库存储数据的基本单位,类似于 Excel 表格。
- 列(Column): 表中的字段,定义数据的属性。
- 行(Row): 表中的记录,每一行代表一条数据。
- 主键(Primary Key): 唯一标识表中每一行的字段,不允许重复或为 NULL。
- 外键(Foreign Key): 用于建立与其他表的关联,引用其他表的主键。
- 复合键(Composite Key): 由两个或以上的列组成的主键,用于联合唯一标识。
- 索引(Index): 加快查询速度的数据结构,但会增加写入和存储成本。
2. MYSQL体系结构
1. 体系
graph TBA[客户端] --> B[连接池组件]B --> C[SQL接口组件]C --> D[查询分析器组件]D --> E[优化器组件]E --> F[缓冲组件(缓存/Buffer Pool)]F --> G[插件式存储引擎(innoDB等)]G --> H[物理文件(表数据、日志、索引)]subgraph 管理层I[管理服务]J[工具组件]endB --> IB --> J
- 连接池组件:管理数据库连接。
- SQL接口组件:解析 SQL 语句。
- 查询分析器组件:将 SQL 拆解为执行计划。
- 优化器组件:对执行计划进行优化。
- 缓冲组件:缓存数据页,加快查询速度。
- 插件式存储引擎:如 InnoDB、MyISAM 等,负责实际数据操作。
- 物理文件:存储表数据、日志文件、索引等。
- 管理服务和工具组件:运维层面用于监控、配置、管理。
属性 | Redo Log(重做日志) | Undo Log(回滚日志) |
---|---|---|
主要作用 | 崩溃恢复、持久化保障 | 事务回滚、MVCC支持 |
写入时机 | 修改后、提交前 | 修改前 |
是否落盘 | 会立即落盘 | 通常保存在内存或表空间中 |
影响性能 | 大量写操作需优化 | 回滚/快照读需频繁访问 |
示例操作 | crash-recovery | rollback, consistent read |
类比 | 黑匣子:记录“我做了什么”,飞行器崩溃后可以“重做” | 撤销按钮:随时能“撤销上一步操作”,方便回滚 |
3. 数据库设计三范式和反范式
主要是为了减少数据冗余,减少空间占用
1. 列不可分
保持原子性,比如某表中有一个地址字段,如果经常需要访问地址字段中的城市属性,则需要将该字段拆分为多个字段,省份、城市、详细地址等
2. 在1基础上,完全依赖主键,而非部分依赖(联合索引)
3. 在2基础上,主键直接相关,而非间接相关,减少数据冗余
4. 反范式
允许一定的数据冗余,增加查询效率
均衡选择:性能和高效之间选择(空间 vs 时间、冗余 vs 高效、写入复杂 vs 查询简单)
4. crud
1. 5大约束
- 非空约束:限制字段不能为空
- 自增约束:数字列值自动递增,常用于主键(一张表只能有一个 AUTO_INCREMENT 字段)
- 唯一约束: 限制列值唯一,不允许重复
- 主键约束(PRIMARY KEY):唯一标识每一行,隐含 NOT NULL 和 UNIQUE
- 外键约束: 实现表与表之间的关联(引用其他表的主键),但是要保证引用数据存在
2. 数据库,数据表基本操作
--创建数据库
CREATE DATABASE `数据库名` DEFAULT CHARACTER SET utf8; # 字符集设置为 utf8--删除数据库
DROP DATABASE `数据库名`;--选择数据库
USE `数据库名`;--创建表
CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY AUTO_INCREMENT, -- 主键 + 自增name VARCHAR(50) NOT NULL, -- 非空email VARCHAR(100) UNIQUE, -- 唯一约束age INT DEFAULT 18, -- 默认值role_id INT, -- 外键FOREIGN KEY (role_id) REFERENCES roles(id) -- 外键约束
);--删除表
DROP TABLE IF EXISTS users;--清空数据表
TRUNCATE TABLE `table_name`; -- 截断表 以页为单位(至少有两行数据),有自增索引的话,从初始
值开始累加
DELETE TABLE `table_name`; -- 逐行删除,有自增索引的话,从之前值继续累加
--TRUNCATE 比 DELETE FROM users; 更快,且不能回滚--查看所有数据库
SHOW DATABASES;--查看当前数据库中所有表
SHOW TABLES;--查看表结构
DESC users;
-- 或
SHOW COLUMNS FROM users;
3. 增
INSERT INTO `table_name`(`field1`, `field2`, ..., `fieldn`) VALUES (value1,value2, ..., valuen);
--一次性插入多行就是values多写几行就行
4. 删
DELETE FROM users
WHERE id = 1;
5. 改
--修改指定行数据
UPDATE users
SET email = 'newemail@example.com', age = 26
WHERE name = 'Alice';--批量更新某列
UPDATE users
SET age = age + 1
WHERE age < 30;
5. 高级查询
1. 基础查询
SELECT * FROM users;--全部查询
SELECT name, email FROM users;--查询部分字段
SELECT distinct `class_id` FROM student;-- 把查询出来的结果的重复记录去掉
2. 条件查询
SELECT * FROM users
WHERE age > 18 AND name = 'Alice';
3. 范围查询
SELECT * FROM users
WHERE age BETWEEN 18 AND 30;
4. 判空查询
SELECT * FROM `student` WHERE `class_id` IS NOT NULL; --判断不为空
SELECT * FROM `student` WHERE `class_id` IS NULL; --判断为空
SELECT * FROM `student` WHERE `gender` <> ''; --判断不为空字符串,不要用!=,用标准sql语句
SELECT * FROM `student` WHERE `gender` = ''; --判断为空字符串
5. 模糊查询
SELECT * FROM users
WHERE name LIKE '_A%'; -- 使用 like关键字,"%"代表任意数量的字符,”_”代表占位符
6. 分页查询
SELECT * FROM users
LIMIT 10 OFFSET 0; -- 第1页,10条SELECT * FROM users
LIMIT 10 OFFSET 10; -- 第2页,跳过前10条开始查询
--OFFSET 10:跳过前10条记录,组合效果:返回第11-20条记录
--LIMIT offset, count 的写法也可以用 LIMIT count OFFSET offset
7. 查询后排序
--asc:升序, desc:降序
SELECT * FROM users
ORDER BY age DESC; -- 按年龄降序SELECT * FROM users
ORDER BY name ASC, age DESC;
8. 聚合查询
聚合函数 | 描述 |
---|---|
sum() | 计算某列的总和 |
avg() | 计算某列的平均值 |
max() | 计算某列的最大值 |
min() | 计算某列的最小值 |
count() | 计算某列的行数 |
SELECT COUNT(*) FROM users;
SELECT AVG(age) FROM users;
SELECT MAX(age) FROM users;
9. 分组查询
--GROUP BY + HAVING
SELECT age, COUNT(*) AS count
FROM users
GROUP BY age
HAVING count > 1;
10. 联表查询
1. INNER JOIN
--内连接:两边都要有
SELECT
cid
FROM
`course`
INNER JOIN `teacher` ON course.teacher_id = teacher.tid;
2. LEFT JOIN
--左连接:保留左边全部
SELECT users.name, roles.role_name
FROM users
LEFT JOIN roles
ON users.role_id = roles.id;
3. RIGHT JOIN
--右连接:保留右边全部
SELECT users.name, roles.role_name
FROM users
RIGHT JOIN roles
ON users.role_id = roles.id;
11. 子查询
SELECT * FROM users
WHERE id IN (SELECT user_id FROM ordersWHERE total > 100
);
--子查询常用于 动态过滤 和 嵌套聚合
--可以在 SELECT、FROM、WHERE、HAVING 等位置使用
--尽量避免子查询嵌套太深,效率可能较低
12. 合并查询
SELECT name FROM users
UNION --UNION:去重合并结果
SELECT name FROM admins;SELECT name FROM users
UNION ALL--不去重,效率更高
SELECT name FROM admins;
6. 预处理语句
预处理语句 = SQL模板 + 参数绑定
它将 SQL 拆为两个阶段:
Prepare:只编译一次 SQL 模板
Execute:每次执行时只传递参数,提高性能 & 防注入
优点:
- 减少重复解析和编译
- 防止sql注入,避免拼接字符串导致sql注入
7. 视图
- 视图是一个 虚拟表,本质是保存了一条 SELECT 查询语句的别名,并不会真正存储数据,类似函数
- 视图是虚拟的,不占用实际存储
- 不能直接修改复杂视图中的数据(比如带有聚合、JOIN 等
CREATE VIEW adult_users AS
SELECT name, age
FROM users
WHERE age >= 18;--使用视图
SELECT * FROM adult_users;
优势 | 描述 |
---|---|
简化查询 | 可封装复杂的多表 SQL |
提高安全性 | 限制用户只能访问视图而不是底层表 |
增强可维护性 | 改 SQL 结构但保持视图接口不变 |
8. 触发器
触发器是在对表执行 INSERT、UPDATE、DELETE 操作时自动触发的事件
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
BEGIN-- 触发时执行的 SQL
END;
用途 | 描述 |
---|---|
自动记录日志 | 比如用户插入、更新、删除操作 |
数据同步 | 多表之间的数据同步 |
自动校验 | 在插入/更新前进行校验和格式化处理 |