数据库类型
OLTP(Online Transaction Processing)- 联机事务处理
OLAP(Online Analytical Processing)- 联机分析处理
结构化查询语言(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 |
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
属性 | Redo Log(重做日志) | Undo Log(回滚日志) |
---|---|---|
主要作用 | 崩溃恢复、持久化保障 | 事务回滚、MVCC支持 |
写入时机 | 修改后、提交前 | 修改前 |
是否落盘 | 会立即落盘 | 通常保存在内存或表空间中 |
影响性能 | 大量写操作需优化 | 回滚/快照读需频繁访问 |
示例操作 | crash-recovery | rollback, consistent read |
类比 | 黑匣子:记录“我做了什么”,飞行器崩溃后可以“重做” | 撤销按钮:随时能“撤销上一步操作”,方便回滚 |
主要是为了减少数据冗余,减少空间占用
保持原子性,比如某表中有一个地址字段,如果经常需要访问地址字段中的城市属性,则需要将该字段拆分为多个字段,省份、城市、详细地址等
允许一定的数据冗余,增加查询效率
均衡选择:性能和高效之间选择(空间 vs 时间、冗余 vs 高效、写入复杂 vs 查询简单)
--创建数据库
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;
INSERT INTO `table_name`(`field1`, `field2`, ..., `fieldn`) VALUES (value1,value2, ..., valuen);
--一次性插入多行就是values多写几行就行
DELETE FROM users
WHERE id = 1;
--修改指定行数据
UPDATE users
SET email = '[email protected]', age = 26
WHERE name = 'Alice';
--批量更新某列
UPDATE users
SET age = age + 1
WHERE age < 30;
SELECT * FROM users;--全部查询
SELECT name, email FROM users;--查询部分字段
SELECT distinct `class_id` FROM student;-- 把查询出来的结果的重复记录去掉
SELECT * FROM users
WHERE age > 18 AND name = 'Alice';
SELECT * FROM users
WHERE age BETWEEN 18 AND 30;
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` = ''; --判断为空字符串
SELECT * FROM users
WHERE name LIKE '_A%'; -- 使用 like关键字,"%"代表任意数量的字符,”_”代表占位符
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
--asc:升序, desc:降序
SELECT * FROM users
ORDER BY age DESC; -- 按年龄降序
SELECT * FROM users
ORDER BY name ASC, age DESC;
聚合函数 | 描述 |
---|---|
sum() | 计算某列的总和 |
avg() | 计算某列的平均值 |
max() | 计算某列的最大值 |
min() | 计算某列的最小值 |
count() | 计算某列的行数 |
SELECT COUNT(*) FROM users;
SELECT AVG(age) FROM users;
SELECT MAX(age) FROM users;
--GROUP BY + HAVING
SELECT age, COUNT(*) AS count
FROM users
GROUP BY age
HAVING count > 1;
--内连接:两边都要有
SELECT
cid
FROM
`course`
INNER JOIN `teacher` ON course.teacher_id = teacher.tid;
--左连接:保留左边全部
SELECT users.name, roles.role_name
FROM users
LEFT JOIN roles
ON users.role_id = roles.id;
--右连接:保留右边全部
SELECT users.name, roles.role_name
FROM users
RIGHT JOIN roles
ON users.role_id = roles.id;
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders
WHERE total > 100
);
--子查询常用于 动态过滤 和 嵌套聚合
--可以在 SELECT、FROM、WHERE、HAVING 等位置使用
--尽量避免子查询嵌套太深,效率可能较低
SELECT name FROM users
UNION --UNION:去重合并结果
SELECT name FROM admins;
SELECT name FROM users
UNION ALL--不去重,效率更高
SELECT name FROM admins;
预处理语句 = SQL模板 + 参数绑定
它将 SQL 拆为两个阶段:
Prepare:只编译一次 SQL 模板
Execute:每次执行时只传递参数,提高性能 & 防注入
优点:
CREATE VIEW adult_users AS
SELECT name, age
FROM users
WHERE age >= 18;
--使用视图
SELECT * FROM adult_users;
优势 | 描述 |
---|---|
简化查询 | 可封装复杂的多表 SQL |
提高安全性 | 限制用户只能访问视图而不是底层表 |
增强可维护性 | 改 SQL 结构但保持视图接口不变 |
触发器是在对表执行 INSERT、UPDATE、DELETE 操作时自动触发的事件
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
BEGIN
-- 触发时执行的 SQL
END;
用途 | 描述 |
---|---|
自动记录日志 | 比如用户插入、更新、删除操作 |
数据同步 | 多表之间的数据同步 |
自动校验 | 在插入/更新前进行校验和格式化处理 |