在 Web 后端开发中,数据库扮演着至关重要的角色,它是存储和管理数据的核心组件。近期学习了数据库相关知识,在此分享学习过程中的重点内容,涵盖数据库基础概念、MySQL 操作以及 SQL 语句的详细使用等方面。
一、数据库基础概念
- 数据库(DataBase - DB):形象地说,它就像是一个大型的数据仓库,专门用于高效地存储和管理海量数据。例如,在金融领域,同花顺的数据中心需要存储海量的股票、基金等金融数据,包括股票代码、价格、涨跌幅、资金流向等信息,这些数据都存放在数据库中,以便随时查询和分析。
- 数据库管理系统(DataBase Management System - DBMS):是操作和管理数据库的强大软件工具。常见的有 Oracle、SQL Server、PostgreSQL、DB2、SQLite、MariaDB 和 MySQL 等。以 MySQL 为例,它在众多中小型企业的 Web 应用开发中被广泛使用,能够稳定地处理大量的用户数据和业务数据。
- SQL(Structured Query Language):作为操作关系型数据库的标准编程语言,它为开发者提供了统一的操作规范。无论是哪种关系型数据库,都可以使用 SQL 进行数据的增删改查等操作,大大提高了开发效率和数据处理的便捷性。
二、MySQL 概述
- 版本选择:MySQL 提供商业版(MySQL Enterprise Edition)和社区版(MySQL Community Server)。商业版收费但提供 30 天试用和官方技术支持,社区版免费但无官方技术支持。本课程采用 MySQL Community Server 8.0.34 版本,其下载地址为 MySQL :: Download MySQL Community Server 。
- 安装与连接:安装完成后,通过命令行连接 MySQL,语法为
mysql -u用户名 -p密码 [-h数据库服务器 IP 地址 -P端口号]
。例如,在本地连接 MySQL 服务器,假设用户名是root
,密码是1234
,端口号为3306
,则在命令行输入mysql -uroot -p1234 -h127.0.0.1 -P3306
即可成功连接。 - 数据模型:MySQL 是关系型数据库(RDBMS),由多张相互关联的二维表构成。比如在企业管理系统中,会有员工表和部门表。员工表包含员工编号、姓名、工作岗位、所属部门编号等字段,部门表包含部门编号、部门名称等字段,通过部门编号这一外键将两张表关联起来,实现数据的有效组织和管理。
三、SQL 语句分类与示例
(一)DDL(Data Definition Language)
- 数据库操作:
- 查询所有数据库:
SHOW DATABASES;
- 查询当前数据库:
SELECT DATABASE();
- 使用 / 切换数据库:
USE 数据库名;
- 创建数据库:
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET utf8mb4];
例如创建一个名为test_db
的数据库,可使用CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARSET utf8mb4;
- 删除数据库:
DROP DATABASE [IF EXISTS] 数据库名;
- 查询所有数据库:
- 表结构操作:
- 创建表:
CREATE TABLE tablename(字段 1 字段类型 [约束] [COMMENT 字段 1 注释],... 字段 2 字段类型 [约束] [COMMENT 字段 2 注释]) [COMMENT 表注释];
例如创建员工表:
- 创建表:
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工编号',
name VARCHAR(20) NOT NULL COMMENT '员工姓名',
age INT COMMENT '员工年龄',
gender ENUM('男', '女') DEFAULT '男' COMMENT '员工性别',
department_id INT COMMENT '所属部门编号',
hire_date DATE COMMENT '入职日期',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '员工信息表';
- 查询表结构:
DESC 表名;
如查询employees
表结构,使用DESC employees;
- 查询建表语句:
SHOW CREATE TABLE 表名;
- 添加字段:
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
例如为employees
表添加一个新字段phone_number VARCHAR(11) COMMENT '手机号码';
,使用ALTER TABLE employees ADD phone_number VARCHAR(11) COMMENT '手机号码';
- 修改字段类型:
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
若要将employees
表中age
字段的数据类型修改为SMALLINT
,可使用ALTER TABLE employees MODIFY age SMALLINT;
- 修改字段名与字段类型:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
如将employees
表中的phone_number
字段重命名为mobile_phone
并修改类型为CHAR(11)
,使用ALTER TABLE employees CHANGE phone_number mobile_phone CHAR(11) COMMENT '手机号码';
- 删除字段:
ALTER TABLE 表名 DROP COLUMN 字段名;
要删除employees
表中的mobile_phone
字段,使用ALTER TABLE employees DROP COLUMN mobile_phone;
- 修改表名:
ALTER TABLE 表名 RENAME TO 新表名;
若将employees
表重命名为staff_info
,使用ALTER TABLE employees RENAME TO staff_info;
- 删除表:
DROP TABLE [IF EXISTS] 表名;
(二)DML(Data Manipulation Language)
- 插入数据(INSERT):
- 指定字段添加数据:
INSERT INTO 表名(字段名 1, 字段名 2) VALUES (值 1, 值 2);
例如向employees
表中插入一条员工数据,只插入name
和age
字段的值,使用INSERT INTO employees(name, age) VALUES ('张三', 25);
- 全部字段添加数据:
INSERT INTO 表名 VALUES (值 1, 值 2,...);
如插入一条完整的员工数据INSERT INTO employees VALUES (1, '李四', 30, '男', 1, '2023-01-01', '2023-01-01 00:00:00', '2023-01-01 00:00:00');
- 批量添加数据(指定字段):
INSERT INTO 表名 (字段名 1, 字段名 2) VALUES (值 1, 值 2), (值 1, 值 2);
例如批量插入两条员工数据的部分字段INSERT INTO employees(name, age) VALUES ('王五', 28), ('赵六', 32);
- 批量添加数据(全部字段):
INSERT INTO 表名 VALUES (值 1, 值 2,...), (值 1, 值 2,...);
- 指定字段添加数据:
- 修改数据(UPDATE):
UPDATE 表名 SET 字段名 1 = 值 1, 字段名 2 = 值 2,... [WHERE 条件];
比如将employees
表中所有年龄大于 30 岁的员工的部门编号修改为 2,使用UPDATE employees SET department_id = 2 WHERE age > 30;
- 删除数据(DELETE):
DELETE FROM 表名 [WHERE 条件];
若要删除employees
表中所有入职日期早于2020-01-01
的员工数据,使用DELETE FROM employees WHERE hire_date < '2020-01-01';
(三)DQL(Data Query Language)
- 基本查询:
- 查询多个字段:
SELECT 字段 1,字段 2,字段 3 FROM 表名;
如查询employees
表中的员工姓名和年龄,使用SELECT name, age FROM employees;
- 查询所有字段(通配符):
SELECT * FROM 表名;
例如SELECT * FROM employees;
- 为查询字段设置别名:
SELECT 字段 1 [AS 别名 1], 字段 2 [AS 别名 2] FROM 表名;
如查询员工姓名并设置别名为employee_name
,使用SELECT name AS employee_name FROM employees;
- 去除重复记录:
SELECT DISTINCT 字段列表 FROM 表名;
若要查询employees
表中不同的部门编号,使用SELECT DISTINCT department_id FROM employees;
- 查询多个字段:
- 条件查询:
SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
例如查询employees
表中年龄在 25 到 35 岁之间的员工信息,使用SELECT * FROM employees WHERE age BETWEEN 25 AND 35;
还可以使用比较运算符(>
、>=
、<
、<=
、=
、<>
或!=
)、逻辑运算符(AND
、OR
、NOT
)以及模糊匹配(LIKE
搭配%
和_
通配符)等进行复杂条件查询。 - 分组查询:
SELECT 字段列表 FROM 表名 [WHERE 条件列表] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
例如统计每个部门的员工数量,使用SELECT department_id, COUNT(*) FROM employees GROUP BY department_id;
注意WHERE
用于分组前过滤,HAVING
用于分组后对结果过滤,且HAVING
可以对聚合函数进行判断,而WHERE
不能。 - 排序查询:
SELECT 字段列表 FROM 表名 [WHERE 条件列表] [GROUP BY 分组字段名 HAVING 分组后过滤条件] ORDER BY 排序字段 排序方式;
如查询员工信息并按照年龄升序排序,使用SELECT * FROM employees ORDER BY age;
若要按照年龄降序和入职日期升序排序,使用SELECT * FROM employees ORDER BY age DESC, hire_date ASC;
- 分页查询:
SELECT 字段 FROM 表名 [WHERE 条件] [GROUP BY 分组字段 HAVING 过滤条件] [ORDER BY 排序字段] LIMIT 起始索引,查询记录数;
假设每页显示 10 条数据,查询第 2 页的员工数据,起始索引为(2 - 1) * 10 = 10
,使用SELECT * FROM employees LIMIT 10, 10;
四、总结
通过本次学习,对数据库的基本概念、MySQL 的安装与使用以及 SQL 语句的各种操作有了较为深入的理解。在实际应用中,需要根据具体的业务需求合理设计数据库表结构,并熟练运用 SQL 语句进行数据的管理和查询,以确保数据的完整性、准确性和高效性。后续还需不断练习和实践,进一步提升在数据库领域的技能水平,为 Web 后端开发项目提供坚实的数据支持。