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 是关系数据库系统的标准语言

类型 全称 作用 示例关键字
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 TB
    A[客户端] --> B[连接池组件]
    B --> C[SQL接口组件]
    C --> D[查询分析器组件]
    D --> E[优化器组件]
    E --> F[缓冲组件(缓存/Buffer Pool)]
    F --> G[插件式存储引擎(innoDB等)]
    G --> H[物理文件(表数据、日志、索引)]
    
    subgraph 管理层
        I[管理服务]
        J[工具组件]
    end

    B --> I
    B --> J

  1. 连接池组件:管理数据库连接。
  2. SQL接口组件:解析 SQL 语句。
  3. 查询分析器组件:将 SQL 拆解为执行计划。
  4. 优化器组件:对执行计划进行优化。
  5. 缓冲组件:缓存数据页,加快查询速度。
  6. 插件式存储引擎:如 InnoDB、MyISAM 等,负责实际数据操作。
  7. 物理文件:存储表数据、日志文件、索引等。
  8. 管理服务和工具组件:运维层面用于监控、配置、管理。
属性 Redo Log(重做日志) Undo Log(回滚日志)
主要作用 崩溃恢复、持久化保障 事务回滚、MVCC支持
写入时机 修改后、提交前 修改前
是否落盘 会立即落盘 通常保存在内存或表空间中
影响性能 大量写操作需优化 回滚/快照读需频繁访问
示例操作 crash-recovery rollback, 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 = '[email protected]', 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 orders
  WHERE 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;

用途 描述
自动记录日志 比如用户插入、更新、删除操作
数据同步 多表之间的数据同步
自动校验 在插入/更新前进行校验和格式化处理

你可能感兴趣的:(mysql,数据库,c++,linux,后端)