数据库基础
在开始学习 SQL 之前,需要理解数据库的基本概念。本章将介绍数据库的核心概念、关系模型和基本术语,为后续学习打下坚实基础。
什么是数据库?
定义
数据库是一个有组织的数据集合,通常存储在计算机系统中。它允许用户高效地存储、检索和管理数据。
数据库管理系统(DBMS)
数据库管理系统(Database Management System)是用于创建、管理和操作数据库的软件。常见的 DBMS 包括:
- MySQL
- PostgreSQL
- SQL Server
- Oracle
- SQLite
关系
数据库 ← 存储数据的地方
DBMS ← 管理数据库的软件
SQL ← 与 DBMS 交互的语言
关系数据库
核心概念
关系数据库是基于关系模型(Relational Model)的数据库系统,数据以表格(表)的形式存储。
表格示例
| id | name | age | city |
|---|---|---|---|
| 1 | 张三 | 25 | 北京 |
| 2 | 李四 | 30 | 上海 |
| 3 | 王五 | 28 | 广州 |
这是一个典型的数据库表,包含行和列。
数据库基本术语
1. 表(Table)
表是数据库中存储数据的基本单位,类似于 Excel 表格。
示例:用户表
sql
-- SQL 创建表
CREATE TABLE users (
id INT,
name VARCHAR(50),
age INT,
city VARCHAR(50)
);2. 列(Column)
列定义了表中数据的类型和属性,也称为字段(Field)。
列的特性
- 数据类型:定义列中数据的类型(整数、文本、日期等)
- 约束:限制列中数据的规则(不能为空、必须唯一等)
- 默认值:如果没有提供值时使用的默认值
示例:列定义
sql
CREATE TABLE products (
id INT, -- 整数列
name VARCHAR(100), -- 文本列
price DECIMAL(10,2), -- 小数列
stock INT DEFAULT 0, -- 带默认值的列
created_at DATE -- 日期列
);3. 行(Row)
行也称为记录(Record),是表中的一条完整数据。
示例:行数据
sql
-- 插入行数据
INSERT INTO users (id, name, age, city)
VALUES (1, '张三', 25, '北京');4. 主键(Primary Key)
主键是表中唯一标识每一行的列,主键的值不能重复且不能为空。
主键的特点
- 唯一性:每行的主键值必须唯一
- 非空性:主键值不能为 NULL
- 不变性:主键值通常不改变
示例:定义主键
sql
CREATE TABLE users (
id INT PRIMARY KEY, -- id 列是主键
name VARCHAR(50),
age INT
);5. 外键(Foreign Key)
外键是一个表中的列,它引用另一个表的主键,用于建立表之间的关系。
外键的作用
- 确保数据的一致性
- 建立表之间的关联
- 防止无效数据的插入
示例:外键关系
sql
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 订单表(引用用户表)
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
);6. 索引(Index)
索引是提高查询性能的数据结构,类似于书的目录。
索引的作用
- 加快数据检索速度
- 优化查询性能
- 但会占用额外存储空间
示例:创建索引
sql
-- 为 name 列创建索引
CREATE INDEX idx_name ON users(name);数据库结构
数据库 → 表 → 行列
数据库(Database)
├── 用户表(Table: users)
│ ├── 列:id, name, age, city
│ └── 行:(1, '张三', 25, '北京')
└── 订单表(Table: orders)
├── 列:id, user_id, amount
└── 行:(1, 1, 99.99)层次结构
- 数据库服务器:运行 DBMS 的计算机
- 数据库:存储相关表的集合
- 表:存储相关数据的结构
- 行/列:实际的数据单元
关系模型
一对一关系(1:1)
一个表中的一条记录对应另一个表中的一条记录。
示例:用户和用户详情
users 表 user_details 表
id (PK) → user_id (FK, PK)
name addresssql
-- 一个用户对应一个详细信息
SELECT u.name, d.address
FROM users u
JOIN user_details d ON u.id = d.user_id;一对多关系(1:N)
一个表中的一条记录对应另一个表中的多条记录。
示例:用户和订单
users 表 orders 表
id (PK) → user_id (FK)
name order_id
amountsql
-- 一个用户可以有多个订单
SELECT u.name, o.order_id, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;多对多关系(M:N)
两个表中的记录可以相互对应多个。
示例:学生和课程
students 表 enrollments 表 courses 表
id (PK) → student_id (FK) id (PK)
name course_id (FK) namesql
-- 一个学生可以选修多门课程
-- 一门课程可以有多个学生
SELECT s.name, c.name
FROM students s
JOIN enrollments e ON s.id = e.student_id
JOIN courses c ON e.course_id = c.id;常见数据类型
数值类型
| 类型 | 说明 | 示例 |
|---|---|---|
| INT | 整数 | 1, 2, 100 |
| DECIMAL(M,D) | 小数 | 123.45, 99.99 |
| FLOAT | 浮点数 | 3.14, 2.718 |
| BIGINT | 大整数 | 9223372036854775807 |
字符串类型
| 类型 | 说明 | 最大长度 |
|---|---|---|
| CHAR(N) | 固定长度字符串 | 255 |
| VARCHAR(N) | 可变长度字符串 | 65535 |
| TEXT | 长文本 | 65535+ |
日期时间类型
| 类型 | 说明 | 格式 |
|---|---|---|
| DATE | 日期 | YYYY-MM-DD |
| TIME | 时间 | HH:MM:SS |
| DATETIME | 日期时间 | YYYY-MM-DD HH:MM:SS |
| TIMESTAMP | 时间戳 | YYYY-MM-DD HH:MM:SS |
布尔类型
| 类型 | 说明 | 值 |
|---|---|---|
| BOOLEAN | 布尔值 | TRUE, FALSE |
数据库设计原则
1. 数据规范化
规范化是组织数据库表的过程,目的是减少数据冗余和提高数据完整性。
2. 主键设计
- 使用单一列作为主键
- 使用自动增长的整数
- 避免使用有业务含义的列
3. 命名规范
- 使用有意义的名称
- 使用小写字母和下划线
- 避免使用保留字
实际示例:电商平台
数据库结构
sql
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at DATETIME
);
-- 商品表
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT DEFAULT 0
);
-- 订单表
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
total_amount DECIMAL(10,2),
order_date DATETIME,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 订单详情表
CREATE TABLE order_items (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10,2),
FOREIGN KEY (order_id) REFERENCES orders(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);数据关系
用户 (1) ←→ (N) 订单 (1) ←→ (N) 订单详情 (N) ←→ (1) 商品数据库操作的基本流程
1. 连接数据库
sql
-- 连接到数据库服务器
mysql -u username -p2. 选择数据库
sql
-- 使用特定的数据库
USE database_name;3. 执行查询
sql
-- 执行 SQL 语句
SELECT * FROM users;4. 断开连接
sql
-- 断开数据库连接
EXIT;小结
本章介绍了数据库的基础概念:
- 数据库定义:有组织的数据集合
- 关系数据库:基于关系模型的数据库
- 基本术语:表、列、行、主键、外键、索引
- 数据类型:数值、字符串、日期时间、布尔
- 关系类型:一对一、一对多、多对多
- 设计原则:规范化、主键设计、命名规范
理解这些基本概念是学习 SQL 的基础,在接下来的章节中,我们将学习如何使用 SQL 来实际操作数据库。
下一步: 学习 SQL 基础语法,开始编写你的第一条 SQL 语句。