核心概念

基本组成

数据库 (Database) - 数据集合,如一个电商平台的所有数据

表 (Table) - 存储数据的基本单位,类似Excel表格

字段/列 (Column) - 表的属性

记录/行 (Row) - 一条具体数据

示例:

1
2
3
4
5
6
7
学生表 (students)
+----+--------+-----+--------+
| id | name | age | gender |
+----+--------+-----+--------+
| 1 | 张三 | 20 | 男 |
| 2 | 李四 | 22 | 女 |
+----+--------+-----+--------+

主键 (Primary Key)

唯一标识每条记录的字段,特点:

  • 唯一性:不能重复
  • 非空性:不能为空
  • 稳定性:不要轻易改变
1
2
3
4
5
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);

外键 (Foreign Key)

外键用于关联表与表的关系。

重点:

  • 外键字段名可以随意命名(常用 表名_id,但非强制)
  • 真正定义关系的是 FOREIGN KEY 约束,不是字段名
1
2
3
4
5
6
7
8
9
10
11
12
13
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);

-- 订单表
CREATE TABLE orders (
id INT PRIMARY KEY,
buyer INT, -- 字段名自定义
total DECIMAL(10, 2),
FOREIGN KEY (buyer) REFERENCES users(id) -- 这里定义关系
);

可视化:

1
2
3
4
5
6
7
users                    orders
+----+------+ +----+-------+-------+
| id | name | | id | buyer | total |
+----+------+ +----+-------+-------+
| 1 | 张三 | <-------- | 1 | 1 | 100 |
| 2 | 李四 | | 2 | 1 | 200 |
+----+------+ +----+-------+-------+

添加外键约束的方式:

1
2
3
4
5
6
7
-- 创建表时
FOREIGN KEY (buyer) REFERENCES users(id)

-- 创建后添加
ALTER TABLE orders
ADD CONSTRAINT fk_user
FOREIGN KEY (buyer) REFERENCES users(id);

外键作用:

  • 维护数据完整性
  • 防止插入不存在的关联数据
  • 可设置级联删除/更新
1
2
FOREIGN KEY (buyer) REFERENCES users(id) 
ON DELETE CASCADE; -- 删除用户时自动删除其订单

表关系类型

一对多(最常见)

1
2
一个用户 → 多个订单
实现:在"多"的一方添加外键

一对一

1
2
一个用户 → 一份详细资料
实现:外键添加 UNIQUE 约束

多对多

1
2
3
4
5
6
7
8
9
10
多个学生 ↔ 多门课程
实现:需要中间表,包含两个外键

CREATE TABLE enrollments (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);

SQL基础操作

查询 (SELECT)

1
2
3
SELECT * FROM students;
SELECT name, age FROM students WHERE age > 20;
SELECT * FROM students ORDER BY age DESC LIMIT 10;

插入 (INSERT)

1
2
INSERT INTO students (name, age) VALUES ('王五', 21);
INSERT INTO students (name, age) VALUES ('赵六', 19), ('孙七', 22);

更新 (UPDATE)

1
2
UPDATE students SET age = 23 WHERE id = 1;
UPDATE students SET age = age + 1 WHERE gender = '男';

删除 (DELETE)

1
2
DELETE FROM students WHERE id = 1;
DELETE FROM students WHERE age < 18;

表连接 (JOIN)

1
2
3
4
5
6
7
8
9
10
-- 查询用户及其订单
SELECT users.name, orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id;

-- 查询用户订单统计(包括无订单用户)
SELECT users.name, COUNT(orders.id) as order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id;

数据类型

数值类型

类型 说明 示例
int 整数 123
bigint 大整数 9999999999
float 单精度浮点 3.14
double 双精度浮点 3.14159265
decimal(m,n) 精确小数 decimal(10,2)12345.67

字符串类型

类型 说明 示例
varchar(n) 可变长字符串(最大n字符) varchar(50)'张三'
char(n) 固定长字符串 char(10)
text 长文本(最大65KB) 主诉、诊断等

日期时间类型

类型 格式 示例
date YYYY-MM-DD 2024-05-15
time HH:MM:SS 14:37:21
datetime YYYY-MM-DD HH:MM:SS 2024-05-15 14:37:21
timestamp 同datetime,自动更新 记录创建/修改时间

其他

类型 说明
boolean 布尔值(0/1)
blob 二进制数据

索引与优化

索引作用

加速查询,类似书的目录。

1
2
3
4
5
6
-- 创建索引
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_author_status ON posts(author_id, status);

-- 唯一索引
CREATE UNIQUE INDEX idx_username ON users(username);

索引设计原则

应该建索引的字段 ✅

  • 主键字段(必须):如 id
  • 经常用于WHERE条件的字段:如住院号、医疗卡号、卡号(用于查询患者)、门诊流水号(用于关联查询)
  • 经常用于排序的字段:如就诊时间、date(用于时间排序)
  • 经常用于JOIN的字段:如门诊流水号(用于表关联)
  • 高选择性字段(值的种类多):如患者ID(每个患者不同)、门诊流水号(每次就诊不同)

不应该建索引的字段 ❌

  • 很少查询的字段:如备注、处理(很少用于WHERE条件)
  • 低选择性字段(值的种类少):如性别(只有”男”、”女”两个值)、转归状态(只有几个固定值),原因是索引效果不明显,还占用空间
  • 大文本字段:如主诉、诊断(TEXT类型),原因是索引会非常大,且全文搜索应该用专门的全文索引
  • 经常更新的字段:原因是每次更新都要更新索引,影响性能

优化技巧

1
2
3
4
5
6
7
8
9
10
-- ❌ 避免
SELECT * FROM users WHERE id = 1;
SELECT * FROM users WHERE YEAR(created_at) = 2024;

-- ✅ 推荐
SELECT name, email FROM users WHERE id = 1;
SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';

-- 分析查询
EXPLAIN SELECT * FROM posts WHERE author_id = 1;

事务 (Transaction)

  • 事务 (Transaction) 是指一组逻辑上不可分割的数据库操作序列,这些操作要么全部成功执行,要么全部不执行,以保证数据库从一个一致性状态转换到另一个一致性状态。
  • 若没有事务机制,数据库在并发、故障等情况下极易产生脏读、不可重复读、幻读等问题。
  • 简单说:事务就是“一荣俱荣,一损俱损”的操作打包机制,是保障数据库可靠性的基石。

ACID特性

  • Atomicity(原子性):全部成功或全部失败
  • Consistency(一致性):数据保持一致
  • Isolation(隔离性):并发事务互不干扰
  • Durability(持久性):提交后永久保存

使用方法

1
2
3
4
5
6
7
8
9
10
START TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

-- 成功则提交
COMMIT;

-- 失败则回滚
ROLLBACK;

数据库文件与备份

文件位置

MySQL:

1
2
3
4
/var/lib/mysql/mydb/
├── users.ibd
├── posts.ibd
└── orders.ibd

PostgreSQL:

1
2
/var/lib/postgresql/data/
(复杂结构,不建议直接操作)

SQLite:

1
mydata.db(单文件)

备份方法

方法一:逻辑备份(推荐)

1
2
3
4
5
6
7
8
9
10
11
# MySQL备份
mysqldump -u user -p database_name > backup.sql
mysqldump -u user -p --all-databases > all_backup.sql
mysqldump -u user -p db_name | gzip > backup.sql.gz

# 恢复
mysql -u user -p database_name < backup.sql

# PostgreSQL
pg_dump -U user db_name > backup.sql
psql -U user db_name < backup.sql

方法二:物理备份

1
2
3
4
5
6
7
# 停止服务
sudo systemctl stop mysql
sudo cp -r /var/lib/mysql /backup/
sudo systemctl start mysql

# 不停机备份(使用工具)
xtrabackup --backup --target-dir=/backup/

方法三:远程备份

1
2
3
4
5
# 从远程导出
mysqldump -h 172.21.8.164 -u user -p db_name > backup.sql

# 服务器间直接传输
mysqldump -h source_host -u user -p db | mysql -h dest_host -u user -p db

可视化工具

VSCode + SQLTools

安装:

  1. 安装”SQLTools”扩展
  2. 安装对应驱动(如”SQLTools MySQL/MariaDB”)

功能:

  • Tables:实际存储数据的表
  • Views:虚拟表,基于查询的动态结果
  • 右键表名 → “Show Table Records” 查看数据
  • 执行SQL查询
  • 导出结果(CSV/JSON)

其他工具

  • MySQL Workbench - MySQL官方
  • DBeaver - 支持多种数据库,免费
  • DataGrip - JetBrains出品,功能强大
  • Navicat - 商业软件,界面友好

总结

核心要点:

  1. 主键唯一标识记录,外键建立表关系
  2. 外键约束靠 FOREIGN KEY 定义,字段名可自定义
  3. 三种表关系:一对多、一对一、多对多
  4. 使用索引优化查询,但不要过度索引
  5. 事务保证数据完整性
  6. 定期备份数据,推荐用 mysqldump
  7. 使用可视化工具提高效率

学习路径:

  1. 掌握基本SQL操作(增删改查)
  2. 理解表关系和外键
  3. 学习索引和查询优化
  4. 了解事务和数据完整性
  5. 实践备份恢复
  6. 深入学习特定数据库系统

参考资源: