关系型数据库与 NoSQL
1. 关系型数据库简介
关系型数据库(Relational Database)是一种基于关系模型的数据库,使用结构化查询语言(SQL)进行数据管理。关系型数据库的核心是表(Table),表由行(Row)和列(Column)组成,每个表都有一个唯一的键(Key)来标识每一行数据。
1.1 SQL 简介和历史
SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言。SQL 的历史可以追溯到 1970 年代,由 IBM 的研究员 Edgar F. Codd 提出关系模型。SQL 的标准化工作由 ANSI 和 ISO 组织进行,确保不同数据库系统之间的兼容性。
1.2 关系数据库概念
关系数据库的核心概念包括:
- 表(Table):数据的二维结构,由行和列组成。
- 行(Row):表中的一条记录。
- 列(Column):表中的一个字段,表示数据的某种属性。
- 主键(Primary Key):唯一标识表中每一行的字段。
- 外键(Foreign Key):用于建立表之间关系的字段。
2. 安装和配置数据库管理系统
2.1 安装 MySQL
MySQL 是一种流行的开源关系型数据库管理系统。以下是安装 MySQL 的基本步骤:
- 下载 MySQL 安装包。
- 运行安装程序,按照提示完成安装。
- 配置 MySQL 服务,设置 root 用户密码。
# 安装 MySQL
sudo apt-get install mysql-server
# 启动 MySQL 服务
sudo systemctl start mysql
# 设置 root 用户密码
sudo mysql_secure_installation
2.2 安装 PostgreSQL
PostgreSQL 是另一种强大的开源关系型数据库管理系统。以下是安装 PostgreSQL 的基本步骤:
- 下载 PostgreSQL 安装包。
- 运行安装程序,按照提示完成安装。
- 配置 PostgreSQL 服务,设置超级用户密码。
# 安装 PostgreSQL
sudo apt-get install postgresql
# 启动 PostgreSQL 服务
sudo systemctl start postgresql
# 设置超级用户密码
sudo -u postgres psql
ALTER USER postgres WITH PASSWORD 'yourpassword';
3. 基本 SQL 语法
3.1 创建和管理数据库
-- 创建数据库
CREATE DATABASE mydatabase;
-- 使用数据库
USE mydatabase;
-- 删除数据库
DROP DATABASE mydatabase;
3.2 创建表 (CREATE TABLE)
-- 创建表
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
salary DECIMAL(10, 2)
);
3.3 修改表结构 (ALTER TABLE)
-- 添加列
ALTER TABLE employees ADD COLUMN email VARCHAR(100);
-- 修改列
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12, 2);
-- 删除列
ALTER TABLE employees DROP COLUMN email;
3.4 删除表 (DROP TABLE)
-- 删除表
DROP TABLE employees;
4. 数据操作
4.1 插入数据 (INSERT)
-- 插入数据
INSERT INTO employees (id, name, department, salary)
VALUES (1, 'John Doe', 'IT', 5000.00);
4.2 更新数据 (UPDATE)
-- 更新数据
UPDATE employees
SET salary = 5500.00
WHERE id = 1;
4.3 删除数据 (DELETE)
-- 删除数据
DELETE FROM employees
WHERE id = 1;
5. 查询数据
5.1 基本查询 (SELECT)
-- 查询所有数据
SELECT * FROM employees;
-- 查询特定列
SELECT name, salary FROM employees;
5.2 WHERE 子句和条件过滤
-- 条件过滤
SELECT * FROM employees
WHERE department = 'IT';
5.3 排序 (ORDER BY)
-- 按工资排序
SELECT * FROM employees
ORDER BY salary DESC;
5.4 分组 (GROUP BY)
-- 按部门分组
SELECT department, COUNT(*) AS num_employees
FROM employees
GROUP BY department;
5.5 聚合函数 (SUM, AVG, COUNT, MAX, MIN)
-- 计算总工资
SELECT SUM(salary) AS total_salary
FROM employees;
-- 计算平均工资
SELECT AVG(salary) AS avg_salary
FROM employees;
6. 高级查询
6.1 子查询
-- 查询工资高于平均工资的员工
SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
6.2 表连接 (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN)
-- 内连接
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
6.3 自连接
-- 自连接
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;
7. 事务管理
7.1 事务概念
事务(Transaction)是一组数据库操作,要么全部执行成功,要么全部回滚。事务具有 ACID 属性:
- 原子性(Atomicity):事务是一个不可分割的工作单位。
- 一致性(Consistency):事务执行前后,数据库必须保持一致状态。
- 隔离性(Isolation):多个事务并发执行时,每个事务应该与其他事务隔离。
- 持久性(Durability):事务一旦提交,其结果应该永久保存在数据库中。
7.2 事务控制语句 (BEGIN, COMMIT, ROLLBACK)
-- 开始事务
BEGIN;
-- 插入数据
INSERT INTO employees (id, name, department, salary)
VALUES (2, 'Jane Smith', 'HR', 4500.00);
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
8. NoSQL 数据库简介
NoSQL(Not Only SQL)数据库是一种非关系型数据库,适用于处理大规模、高并发的数据存储需求。NoSQL 数据库不使用 SQL 作为查询语言,而是使用其他查询方式,如键值对、文档、列族和图形等。
8.1 NoSQL 数据库类型
- 键值存储(Key-Value Store):如 Redis、Riak。
- 文档存储(Document Store):如 MongoDB、CouchDB。
- 列族存储(Column Family Store):如 Cassandra、HBase。
- 图形数据库(Graph Database):如 Neo4j、OrientDB。
8.2 NoSQL 数据库的优势
- 高可扩展性:NoSQL 数据库通常设计为水平扩展,能够处理大规模数据。
- 灵活的数据模型:NoSQL 数据库支持多种数据模型,适用于不同的应用场景。
- 高性能:NoSQL 数据库通常具有较高的读写性能,适用于高并发的应用。
9. NoSQL 数据库实践
9.1 安装 MongoDB
MongoDB 是一种流行的文档存储 NoSQL 数据库。以下是安装 MongoDB 的基本步骤:
- 下载 MongoDB 安装包。
- 运行安装程序,按照提示完成安装。
- 配置 MongoDB 服务,启动 MongoDB 服务。
# 安装 MongoDB
sudo apt-get install mongodb
# 启动 MongoDB 服务
sudo systemctl start mongodb
9.2 基本操作
// 连接 MongoDB
const MongoClient = require('mongodb').MongoClient;
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect(err => {
const collection = client.db("test").collection("employees");
// 插入文档
collection.insertOne({ name: "John Doe", department: "IT", salary: 5000.00 }, function(err, res) {
console.log("Document inserted");
});
// 查询文档
collection.find({ department: "IT" }).toArray(function(err, docs) {
console.log("Found documents:", docs);
});
// 更新文档
collection.updateOne({ name: "John Doe" }, { $set: { salary: 5500.00 } }, function(err, res) {
console.log("Document updated");
});
// 删除文档
collection.deleteOne({ name: "John Doe" }, function(err, res) {
console.log("Document deleted");
});
client.close();
});
10. 实践练习
10.1 关系型数据库练习
- 创建一个名为
students的表,包含id、name、age、grade字段。 - 插入几条学生记录。
- 查询所有学生的信息,并按年龄排序。
- 更新某个学生的成绩。
- 删除某个学生的记录。
10.2 NoSQL 数据库练习
- 使用 MongoDB 创建一个名为
students的集合。 - 插入几条学生文档。
- 查询所有学生的信息,并按年龄排序。
- 更新某个学生的成绩。
- 删除某个学生的文档。
11. 总结
本教程介绍了关系型数据库和 NoSQL 数据库的基本概念、安装配置、基本操作和高级查询。通过实践练习,您可以更好地理解这两种数据库的使用方法和应用场景。关系型数据库适用于结构化数据的管理,而 NoSQL 数据库适用于大规模、高并发的数据存储需求。掌握这两种数据库技术,将有助于您在实际项目中选择合适的数据库解决方案。