之前我们使用的内存数组存储数据,一旦服务器重启,所有数据都会丢失。数据库就是用来解决这个问题的:它能将数据持久化存储到硬盘上,即使服务器关机,数据也不会丢失。
关系型数据库 vs NoSQL 数据库:
数据库有很多种类,主要可以分为两大类:
- 关系型数据库 (Relational Database): 数据以表格 (Table) 的形式组织,表格之间通过关系(通常是外键)连接。数据结构严谨,适合存储结构化数据,保证数据的一致性和完整性。想象一下,仓库里的每种原材料(如蔬菜、肉类)都存放在各自的标准货架(表格)上,并且可以通过清单(关系)查到每种菜品需要哪些原材料。MySQL, PostgreSQL, SQL Server, Oracle 都是典型的关系型数据库。
- NoSQL 数据库 (Not Only SQL): 数据存储形式多样,比如键值对、文档、列族、图等。数据结构灵活,适合存储非结构化或半结构化数据,易于水平扩展。想象一下,一些不常用的或格式多样的物品,可能没有固定的货架,而是灵活存放。MongoDB, Redis, Cassandra 都是典型的 NoSQL 数据库。
本次教程我们将聚焦于关系型数据库,并以最流行的 MySQL 为例进行学习。
MySQL 是什么?
MySQL 是一个开源的、免费的(也有商业版本)关系型数据库管理系统 (RDBMS)。它是 Web 应用开发中最常用的数据库之一。
数据库基本概念:
在 MySQL 中,数据被组织在数据库中,一个数据库可以包含多个表 (Table)。
- 表 (Table): 类似于电子表格,由行和列组成。例如,一个
users
表用来存放所有用户的信息,一个products
表用来存放所有产品的信息。 - 行 (Row) / 记录 (Record): 表中的一行代表一个独立的数据项,比如
users
表中的一行就是一个用户的完整信息。 - 列 (Column) / 字段 (Field): 表中的一列代表数据项的某个属性,比如
users
表中的name
列、age
列。每一列都有特定的数据类型(如整数、字符串、日期等)。 - 主键 (Primary Key): 表中的一列或一组列,其值能唯一标识表中的每一行。主键值不能重复,也不能为 NULL。通常用一个自增的整数作为主键,如用户 ID。想象一下,仓库里的每个箱子都有一个唯一的编号。
- 外键 (Foreign Key): 表中的一列或一组列,它引用了另一个表中的主键。外键建立了表与表之间的关系。例如,在
orders
表中有一个user_id
列,它是users
表中id
列的外键,表示这个订单是哪个用户下的。这就像在菜品清单上,记录了这道菜需要哪些原材料,并通过原材料的编号(外键)指向原材料货架上的具体物品。
SQL (Structured Query Language):
SQL 是用于管理关系型数据库的标准语言。我们可以使用 SQL 语句来创建数据库、创建表、插入数据、查询数据、更新数据、删除数据等。这就像管理仓库时使用的指令语言。
核心的 SQL 操作(对应 CRUD):
- SELECT: 从表中查询 (Read) 数据。
SELECT * FROM users; -- 查询 users 表中的所有列所有行 SELECT name, age FROM users WHERE age > 25; -- 查询年龄大于 25 的用户的姓名和年龄
- INSERT: 向表中插入 (Create) 新数据。
INSERT INTO users (name, age) VALUES ('Alice', 30); -- 向 users 表插入一行数据
- UPDATE: 更新 (Update) 表中的现有数据。
UPDATE users SET age = 31 WHERE name = 'Alice'; -- 将名字为 Alice 的用户的年龄更新为 31
- DELETE: 从表中删除 (Delete) 数据。
DELETE FROM users WHERE age < 20; -- 删除年龄小于 20 的用户
- CREATE TABLE: 创建新表。
CREATE TABLE products ( id INT AUTO_INCREMENT PRIMARY KEY, -- 定义 id 列作为主键,自动递增 name VARCHAR(255) NOT NULL, -- 定义 name 列,字符串类型,不能为空 price DECIMAL(10, 2), -- 定义 price 列,十进制数字类型 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 定义 created_at 列,时间戳类型,默认当前时间 );
安装 MySQL:
请访问 MySQL 官方网站 (https://www.mysql.com/) 下载并安装 MySQL Server。安装过程中会让你设置 root 用户的密码。安装完成后,你可能需要安装一个 GUI 工具(如 MySQL Workbench, DBeaver)或使用命令行客户端来连接和管理数据库。
小例子:连接 MySQL 并执行基本 SQL
打开你的 MySQL 命令行客户端或 GUI 工具。
- 连接到数据库服务器。
- 创建新的数据库:
CREATE DATABASE my_webapp_db;
- 选择要使用的数据库:
USE my_webapp_db;
- 创建
users
表:CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, -- 用户名不能为空且唯一 email VARCHAR(255) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
- 插入数据:
INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com'); INSERT INTO users (username, email) VALUES ('bob', 'bob@example.com');
- 查询数据:
SELECT * FROM users; -- 应该能看到 alice 和 bob 的记录 SELECT username FROM users WHERE id = 1; -- 查询 id 为 1 的用户的用户名
- 更新数据:
UPDATE users SET email = 'bob.updated@example.com' WHERE username = 'bob';
- 删除数据:
DELETE FROM users WHERE username = 'alice';
- 再次查询,确认更新和删除生效:
SELECT * FROM users; -- 应该只能看到 bob 的更新后的记录
小结: 数据库是实现数据持久化的关键。关系型数据库(如 MySQL)以表格形式组织数据,并通过主键和外键建立关系。SQL 是操作关系型数据库的标准语言,掌握 SELECT, INSERT, UPDATE, DELETE 是数据库操作的基础。
练习:
- 安装 MySQL Server 和一个客户端工具。
- 创建一个名为
my_bookstore_db
的数据库。 - 在
my_bookstore_db
数据库中创建一个名为books
的表,包含以下列:id
: INT, 主键,自动递增title
: VARCHAR(255), 不能为空author
: VARCHAR(255), 不能为空publication_year
: INTisbn
: VARCHAR(13), 唯一created_at
: TIMESTAMP, 默认当前时间
- 使用
INSERT
语句向books
表中插入至少 3 本书籍记录。 - 使用
SELECT
语句查询所有书籍的标题和作者。 - 使用
UPDATE
语句修改其中一本图书的出版年份。 - 使用
DELETE
语句删除其中一本图书记录。 - 再次使用
SELECT
语句确认修改和删除生效。