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

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. 数据库

数据库类型

  1. OLTP(Online Transaction Processing)- 联机事务处理

    • 面向大量短小事务(如增删改查)
    • 注重响应速度和并发性能
    • 常用于银行、电商系统
  2. OLAP(Online Analytical Processing)- 联机分析处理

    • 面向复杂查询、数据分析
    • 关注报表、统计、多维分析
    • 常用于数据仓库、BI 系统

2. SQL

结构化查询语言(Structured Query Language) 简称 SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL 是关系数据库系统的标准语言

类型全称作用示例关键字
DQLData Query Language数据查询SELECT
DMLData Manipulation Language数据操作INSERT, UPDATE, DELETE
DDLData Definition Language定义数据库结构CREATE, DROP, ALTER
DCLData Control Language权限控制GRANT, REVOKE
TCLTransaction 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
  1. 连接池组件:管理数据库连接。
  2. SQL接口组件:解析 SQL 语句。
  3. 查询分析器组件:将 SQL 拆解为执行计划。
  4. 优化器组件:对执行计划进行优化。
  5. 缓冲组件:缓存数据页,加快查询速度。
  6. 插件式存储引擎:如 InnoDB、MyISAM 等,负责实际数据操作。
  7. 物理文件:存储表数据、日志文件、索引等。
  8. 管理服务和工具组件:运维层面用于监控、配置、管理。
属性Redo Log(重做日志)Undo Log(回滚日志)
主要作用崩溃恢复、持久化保障事务回滚、MVCC支持
写入时机修改后、提交前修改前
是否落盘会立即落盘通常保存在内存或表空间中
影响性能大量写操作需优化回滚/快照读需频繁访问
示例操作crash-recoveryrollback, consistent read
类比黑匣子:记录“我做了什么”,飞行器崩溃后可以“重做”撤销按钮:随时能“撤销上一步操作”,方便回滚

3. 数据库设计三范式和反范式

主要是为了减少数据冗余,减少空间占用

1. 列不可分

保持原子性,比如某表中有一个地址字段,如果经常需要访问地址字段中的城市属性,则需要将该字段拆分为多个字段,省份、城市、详细地址等

2. 在1基础上,完全依赖主键,而非部分依赖(联合索引)

3. 在2基础上,主键直接相关,而非间接相关,减少数据冗余

4. 反范式

允许一定的数据冗余,增加查询效率
均衡选择:性能和高效之间选择(空间 vs 时间、冗余 vs 高效、写入复杂 vs 查询简单)

4. crud

1. 5大约束

  1. 非空约束:限制字段不能为空
  2. 自增约束:数字列值自动递增,常用于主键(一张表只能有一个 AUTO_INCREMENT 字段)
  3. 唯一约束: 限制列值唯一,不允许重复
  4. 主键约束(PRIMARY KEY):唯一标识每一行,隐含 NOT NULL 和 UNIQUE
  5. 外键约束: 实现表与表之间的关联(引用其他表的主键),但是要保证引用数据存在

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:每次执行时只传递参数,提高性能 & 防注入

优点:

  1. 减少重复解析和编译
  2. 防止sql注入,避免拼接字符串导致sql注入

7. 视图

  1. 视图是一个 虚拟表,本质是保存了一条 SELECT 查询语句的别名,并不会真正存储数据,类似函数
  2. 视图是虚拟的,不占用实际存储
  3. 不能直接修改复杂视图中的数据(比如带有聚合、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;
用途描述
自动记录日志比如用户插入、更新、删除操作
数据同步多表之间的数据同步
自动校验在插入/更新前进行校验和格式化处理

相关文章:

  • 第十三步:vue
  • 【PVR】《Adaptive Palm Vein Recognition Method》
  • React Testing Library
  • Java学习手册:开发 Web 网站要知道的知识
  • T检验、F检验及样本容量计算学习总结
  • 2025第16届蓝桥杯省赛之研究生组D题最大数字求解
  • 学习spark总结
  • 常见锁策略
  • 关系型数据库PostgreSQL vs MySQL 深度对比:专业术语+白话解析+实战案例
  • Customizing Materials Management with SAP ERP Operations
  • AI日报 - 2025年04月28日
  • (26)VTK C++开发示例 ---将点坐标写入PLY文件
  • Java多线程实现顺序执行
  • 界面打印和重定向同时实现
  • CodeGeeX 免费的国产AI编程助手
  • HikariCP 6.3.0 完整配置与 Keepalive 优化指南
  • SAP-pp 怎么通过底表的手段查找BOM的全部ECN变更历史
  • 【实战篇】数字化打印——打印格式设计器的功能说明
  • (25)VTK C++开发示例 --- 将点坐标写入.xyz文件
  • 复盘笔记1
  • 最近这75年,谁建造了上海?
  • 当AI开始深度思考,人类如何守住自己的慢思考能力?
  • 纪录电影《中国有戏:天幕计划》启动,有望太空播放
  • 辽宁省信访局副局长于江调任辽宁省监狱管理局局长
  • 特朗普承认“24小时结束俄乌冲突”是玩笑:大家都知道
  • 苏迪曼杯即将在厦门打响,国羽向创纪录的14冠进军