一、数据库基础概念1.1 什么是数据库通俗理解数据库是一个超级智能的电子文件柜按照特定规则存储和管理数据便于长期保存和快速查找。想象一下你有一个通讯录里面记录了1000个朋友的姓名、电话、地址。如果用一个普通的Word文档记录每次找一个人可能要翻半天但用数据库只需输入一句查询一秒钟就能找到。技术定义数据库是按照数据结构来组织、存储和管理数据的仓库建立在文件系统之上。数据库不仅保存数据本身还保存数据之间的关系。**举个生活化的例子一家电商网站的所有商品信息、订单信息、用户信息都存储在数据库中你在淘宝搜索手机时数据库瞬间从数百万商品中筛选出相关结果你下单后数据库同时更新库存、生成订单记录、扣减余额——这一系列操作由数据库统一管理1.2 数据库解决的核心问题问题场景传统方式文件/Excel数据库方式多人同时修改容易冲突、数据错乱并发控制保证数据一致性数据安全文件丢失就没了备份机制、权限控制数据量很大打开慢、行数有限高效索引支持海量数据复杂查询手动筛选、计算SQL语句一键完成详细举例说明场景1多人同时修改并发控制假设一家公司有一个Excel文件记录员工工资表放在共享文件夹中。传统方式A和B同时打开文件A修改了张三的工资从8000→9000B修改了李四的工资从7000→7500。A先保存B后保存结果A的修改被B的旧版本覆盖了。数据库方式A和B可以同时操作数据库数据库通过行级锁定机制保证两人的修改都能正确保存互不冲突。-- A执行 UPDATE employees SET salary 9000 WHERE name 张三; -- B执行 UPDATE employees SET salary 7500 WHERE name 李四; -- 两条语句独立执行互不影响场景2数据安全传统方式硬盘坏了或误删文件数据就没了。数据库方式可以定期备份Backup即使服务器出问题可以从备份恢复Restore。# 数据库备份命令示例 mysqldump -uroot -p my_db backup_20260605.sql ​ # 数据库恢复命令示例 mysql -uroot -p my_db backup_20260605.sql场景3数据量很大传统方式Excel超过100万行数据打开极慢甚至无法打开。数据库方式MySQL可以轻松处理上千万甚至上亿条记录通过索引快速定位。-- 从1000万条记录中查找有索引的查询只需毫秒级响应 SELECT * FROM orders WHERE order_id 2026060500123;场景4复杂查询传统方式需要手动筛选、排序、计算耗时耗力。数据库方式一条SQL语句完成复杂的筛选、分组、聚合、排序。-- 查询2026年5月每个部门工资总额按总额降序 SELECT department, SUM(salary) AS total_salary FROM employees WHERE hire_date 2026-05-01 GROUP BY department ORDER BY total_salary DESC;1.3 数据库的四大核心操作CRUDCRUD是数据库的四种基本操作几乎所有业务系统都围绕这四个操作构建。**假设我们有一张学生表studentsidnameagegender1张三20男2李四21男Create创建新增一条数据-- 新增一个学生 INSERT INTO students (id, name, age, gender) VALUES (3, 王五, 19, 女);操作后表中多了一行idnameagegender1张三20男2李四21男3王五19女Read读取查询已有数据-- 查看所有学生 SELECT * FROM students; ​ -- 只看年龄大于20的学生 SELECT * FROM students WHERE age 20;查询结果idnameagegender2李四21男Update更新修改已有数据-- 将张三的年龄改为21岁 UPDATE students SET age 21 WHERE id 1;操作后idnameagegender1张三21男2李四21男3王五19女Delete删除移除不需要的数据-- 删除王五的记录 DELETE FROM students WHERE id 3;操作后idnameagegender1张三21男2李四21男**生活化的CRUD场景举例电商下单流程-- 1. Create用户注册 → 新增订单 INSERT INTO orders (order_id, user_id, product_id, amount) VALUES (20260605001, 1001, 5001, 299.00); ​ -- 2. Read用户查看订单列表 SELECT * FROM orders WHERE user_id 1001; ​ -- 3. Update用户修改收货地址 UPDATE orders SET address 北京市朝阳区XX路 WHERE order_id 20260605001; ​ -- 4. Delete用户取消订单通常是逻辑删除实际不常用软删除 -- UPDATE orders SET status cancelled WHERE order_id 20260605001;1.4 数据库分类关系型数据库SQL数据以二维表格形式存储类似Excel表与表之间可建立关联关系必须遵守ACID特性保证数据一致性常见产品MySQL、Oracle、SQL Server、SQLite关系型数据库的表格示例students学生表idnameclass_id1张三12李四2classes班级表idnameteacher1高三(1)班王老师2高三(2)班李老师两张表通过class_id关联可以通过JOIN查询SELECT s.name AS student_name, c.name AS class_name FROM students s JOIN classes c ON s.class_id c.id;查询结果student_nameclass_name张三高三(1)班李四高三(2)班非关系型数据库NoSQL不强制使用表格结构数据模型更灵活常见形态Key-Value、文档型、列式等常见产品Redis缓存、MongoDB文档、HBase列式Key-Value数据库Redis示例SET user:1001:name 张三 SET user:1001:age 20 GET user:1001:name → 张三文档型数据库MongoDB示例// 一条文档记录结构灵活可嵌套 { _id: abc123, name: 张三, age: 20, contacts: [ { type: phone, value: 13800138000 }, { type: email, value: zhangsanexample.com } ] }关系型 vs 非关系型对比维度关系型数据库非关系型数据库数据结构固定表格行列严格灵活多变结构自由查询语言SQL结构化查询各自的查询语言事务支持完善ACID部分支持较弱扩展性垂直扩展升级硬件水平扩展加机器适用场景业务系统、金融、银行缓存、日志、社交、大数据1.5 DB、DBMS、SQL的关系术语全称说明DBDatabase数据库存储数据的仓库DBMSDatabase Management System数据库管理系统操作数据库的软件SQLStructured Query Language结构化查询语言与数据库通信的语言三者关系示意图用户你 ↓ 用SQL语言说话 SQL 语句SELECT * FROM students; ↓ DBMSMySQL软件 ← 翻译SQL ↓ 操作 DB实际存储的数据文件 ↓ 返回 查询结果表格生活化类比DB就像图书馆存放所有书籍数据DBMS就像图书管理员负责帮你找书、整理书籍SQL就像你跟管理员说的话请帮我找计算机类的所有图书具体到MySQL中三者的体现你在命令行输入 mysql SELECT name, age FROM students WHERE age 20; ​ ↓ DBMSMySQL Server解析SQL找到数据文件 ​ ↓ 结果 ----------- | name | age | ----------- | 李四 | 21 | -----------二、MySQL数据库介绍2.1 MySQL的特点✅开源免费社区版完全免费适合个人学习和中小企业 ✅功能强大支持上千万条记录的大型数据库 ✅标准SQL使用通用SQL语言易于学习和迁移 ✅跨平台支持Windows、Linux、Mac等操作系统 ✅多语言支持Python、Java、C等都有客户端驱动特点详细说明与举例开源免费MySQL Community Server 是完全开源免费的任何人都可以下载使用无需支付授权费用。这使得它成为个人开发者、初创公司和中小企业的首选。相比之下Oracle 数据库的企业版授权费用可能高达数十万元。对比 - MySQL社区版0功能完整适合学习和小型项目 - Oracle企业版100万/年功能超强适合大型企业功能强大MySQL 能够处理大型数据集支持复杂查询、事务、存储过程、触发器、视图、开窗函数等高级特性。-- 举例复杂查询 SELECT department, COUNT(*) AS emp_count, AVG(salary) AS avg_salary, RANK() OVER(ORDER BY AVG(salary) DESC) AS rank_num FROM employees GROUP BY department HAVING COUNT(*) 5 ORDER BY avg_salary DESC;标准SQLMySQL 遵循 ANSI SQL 标准你在 MySQL 中学到的知识可以轻松迁移到 Oracle、SQL Server 等其他关系型数据库。-- 标准SQL语句在任何主流关系数据库都能运行 SELECT name, age FROM students WHERE age 20;跨平台MySQL 可以在 Windows、Linux、MacOS 等多种操作系统上运行。你的数据库在 Windows 开发环境写的应用部署到 Linux 服务器上几乎不需要修改。多语言支持几乎所有主流编程语言都有 MySQL 的驱动程序# Python 使用 pymysql 连接 MySQL import pymysql conn pymysql.connect(hostlocalhost, userroot, password123456, databasemy_db) cursor conn.cursor() cursor.execute(SELECT * FROM students) results cursor.fetchall()// Java 使用 JDBC 连接 MySQL Connection conn DriverManager.getConnection( jdbc:mysql://localhost:3306/my_db, root, 123456); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT * FROM students);2.2 版本选择推荐MySQL 8.0 社区版MySQL Community Server企业版需付费提供官方技术支持学习用社区版足够MySQL 版本历史简要说明版本发布时间主要特性MySQL 5.62013年全文搜索、性能优化MySQL 5.72015年JSON支持、优化器改进MySQL 8.02018年窗口函数、CTE、更好的字符集utf8mb4MySQL 8.42024年LTS版本性能持续优化为什么推荐 8.0支持窗口函数Window Functions可以很方便地实现排名、分组计算等功能支持通用表表达式CTE可以编写更易读的复杂查询默认字符集 utf8mb4完美支持 emoji 和各种生僻字性能显著提升查询速度比 5.7 快数倍-- MySQL 8.0 新增的窗口函数示例5.7及之前版本不支持 SELECT name, score, RANK() OVER(ORDER BY score DESC) AS rank_num FROM students;2.3 常用数据库产品对比数据库厂商类型特点应用场景MySQLOracle关系型开源免费功能强大Web应用、企业管理系统OracleOracle关系型大型收费稳定可靠银行、金融系统SQL ServerMicrosoft关系型Windows平台常用.NET开发项目SQLiteD. Richard Hipp关系型轻量级嵌入式手机App、小型工具RedisRedis Labs非关系型内存缓存速度极快缓存、会话管理MongoDBMongoDB Inc非关系型文档型灵活大数据、日志存储各数据库典型应用举例MySQL— 中小电商网站的产品库CREATE TABLE products ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(200) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT DEFAULT 0 );Oracle— 银行核心交易系统需要极高的稳定性和安全性SQL Server— .NET 企业应用配合微软生态系统使用SQLite— 手机App中的本地数据库如微信的聊天记录、手机游戏存档Redis— 电商秒杀库存缓存SET product:1001:stock 100 # 设置商品库存 DECR product:1001:stock # 下单时扣减库存原子操作MongoDB— 存储用户评论结构灵活可嵌套{ user: 张三, content: 这本书很好, replies: [ {user: 李四, content: 我同意}, {user: 王五, content: 我觉得一般} ] }三、MySQL安装与配置3.1 验证安装打开命令提示符或PowerShellmysql --version成功输出示例mysql Ver 8.0.45 for Win64 on x86_64 (MySQL Community Server - GPL)如果未安装提示信息说明# Windows提示 mysql 不是内部或外部命令也不是可运行的程序这时你需要去 MySQL 官网下载安装包https://dev.mysql.com/downloads/mysql/选择适合你的操作系统的版本。Windows安装步骤简要说明下载 MySQL Installer for Windows选择 Developer Default开发默认或 Server only仅服务器按照安装向导完成安装设置 root 密码务必记住配置端口默认3306选择 Configure MySQL Server as a Windows Service3.2 配置环境变量目的让系统能直接找到mysql命令如果不配置环境变量每次使用 mysql 命令需要写完整路径C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe -uroot -p配置环境变量后可以直接mysql -uroot -p详细步骤Windows找到MySQL的bin目录默认路径C:\Program Files\MySQL\MySQL Server 8.0\bin右键点击「此电脑」→「属性」→「高级系统设置」→「环境变量」在「系统变量」中找到Path点击「编辑」点击「新建」将MySQL的bin目录路径粘贴进去一路点击「确定」保存关闭旧终端重新打开新终端输入mysql --version验证常见问题排查问题原因解决方法提示找不到mysql命令环境变量未正确配置检查路径是否正确重启终端Access denied for user rootlocalhost密码错误使用正确的密码登录Cant connect to MySQL serverMySQL服务未启动在服务中启动MySQL服务3.3 登录MySQL# 方式1交互式输入密码推荐安全 mysql -uroot -p ​ # 方式2指定主机地址远程连接 mysql -uroot -p -h 127.0.0.1 ​ # 方式3完整参数写法 mysql --userroot --password --host127.0.0.1成功登录后显示Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.45 MySQL Community Server - GPL ​ Copyright (c) 2000, 2024, Oracle and/or its affiliates. ​ Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. ​ Type help; or \h for help. Type \c to clear the current input statement. ​ mysql看到mysql提示符表示已成功连接。退出MySQL命令exit; -- 或 quit; -- 或 \q参数说明-u用户名user如root、admin-p密码password不直接跟密码更安全。如果硬写密码如-p123456密码会保存在历史记录中有风险-h主机地址host127.0.0.1或localhost表示本机远程连接写服务器IP-P端口号Port默认3306大写P完整参数示例# 连接远程数据库 mysql -u admin -p -h 192.168.1.100 -P 3306 ​ # 连接后直接进入某个数据库 mysql -uroot -p my_db登录后的常用初始命令-- 查看当前用户 SELECT USER(); ​ -- 查看当前数据库 SELECT DATABASE(); ​ -- 查看所有数据库 SHOW DATABASES; ​ -- 查看MySQL版本 SELECT VERSION();四、SQL语句基础4.1 SQL语句分类分类简称作用关键字数据定义语言DDL创建/修改/删除数据库对象CREATE, ALTER, DROP数据操作语言DML增删改表中数据INSERT, UPDATE, DELETE数据查询语言DQL查询表中数据SELECT数据控制语言DCL管理用户权限和事务GRANT, REVOKE, COMMIT, ROLLBACK各类语句详细举例说明DDLData Definition Language—— 定义数据结构DDL操作的对象是「数据库对象」表、索引、视图等不是数据本身。DDL语句执行后立即生效不可回滚。-- 创建表 CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50) ); ​ -- 修改表结构 ALTER TABLE employees ADD COLUMN salary DECIMAL(10,2); ​ -- 删除表 DROP TABLE employees;类比DDL就像盖房子先画图纸设计表结构盖房子创建表装修修改表结构拆房删除表。DMLData Manipulation Language—— 操作数据DML操作的对象是表中的数据行。可以通过事务控制回滚。-- 插入数据 INSERT INTO employees (id, name, salary) VALUES (1, 张三, 8000); ​ -- 更新数据 UPDATE employees SET salary 9000 WHERE id 1; ​ -- 删除数据 DELETE FROM employees WHERE id 1;类比DML就像日常往房子里搬家具INSERT、挪家具UPDATE、扔家具DELETE。DQLData Query Language—— 查询数据DQL只有一个核心关键字SELECT。用来从数据库中读取数据不修改数据。-- 最简单的查询 SELECT * FROM employees; ​ -- 带条件的查询 SELECT name, salary FROM employees WHERE salary 8000; ​ -- 排序分组查询 SELECT name, salary FROM employees WHERE salary 8000 ORDER BY salary DESC LIMIT 10;DCLData Control Language—— 控制权限和事务管理谁能访问什么数据以及事务的提交和回滚。-- 创建用户 CREATE USER app_userlocalhost IDENTIFIED BY password123; ​ -- 授予权限 GRANT SELECT, INSERT ON my_db.* TO app_userlocalhost; ​ -- 回收权限 REVOKE INSERT ON my_db.* FROM app_userlocalhost; ​ -- 事务控制 START TRANSACTION; UPDATE accounts SET balance balance - 100 WHERE id 1; UPDATE accounts SET balance balance 100 WHERE id 2; COMMIT;四类语句记忆口诀DDL定义对象 —— CREATE, ALTER, DROPDML操作数据 —— INSERT, UPDATE, DELETEDQL查询数据 —— SELECTDCL控制权限 —— GRANT, REVOKE, COMMIT, ROLLBACK4.2 SQL语法规范分号结尾每条SQL语句以;结束关键字大写建议关键字大写如SELECT、FROM空格缩进可换行和缩进增强可读性注释方式-- 单行注释 /* 多行注释 */ # MySQL特有单行注释规范详细说明与举例1. 分号结尾在MySQL中分号是语句结束的标志。不写分号MySQL会认为语句还没写完继续等待输入。-- 正确写法 SELECT * FROM students; ​ -- 不写分号的后果MySQL会等待你继续输入 mysql SELECT * FROM students - ​ -- 此时需要补一个分号或者按CtrlC取消在MySQL客户端中可以使用DELIMITER临时改变结束符常用于存储过程DELIMITER // CREATE PROCEDURE GetStudents() BEGIN SELECT * FROM students; END // DELIMITER ;2. 关键字大写虽然SQL不区分大小写但约定俗成关键字大写表名列名小写使代码更易读。-- 推荐写法关键字大写 SELECT id, name, age FROM students WHERE age 20 ORDER BY age DESC; ​ -- 不推荐写法全小写可读性差 select id, name, age from students where age 20 order by age desc; ​ -- 也不推荐关键字和表名列名混写 SELECT ID, NAME, AGE FROM STUDENTS WHERE AGE 20;3. 空格与缩进复杂查询建议换行和缩进清晰表达层级关系。-- 推荐写法缩进对齐 SELECT s.name, c.name AS class_name, AVG(sc.score) AS avg_score FROM students s INNER JOIN classes c ON s.class_id c.id LEFT JOIN scores sc ON sc.student_id s.id WHERE s.age 18 AND c.name LIKE 高三% GROUP BY s.name, c.name HAVING avg_score 80 ORDER BY avg_score DESC LIMIT 10; ​ -- 不推荐写法一行到底 SELECT s.name, c.name AS class_name, AVG(sc.score) AS avg_score FROM students s INNER JOIN classes c ON s.class_id c.id LEFT JOIN scores sc ON sc.student_id s.id WHERE s.age 18 AND c.name LIKE 高三% GROUP BY s.name, c.name HAVING avg_score 80 ORDER BY avg_score DESC LIMIT 10;4. 注释方式注释不会被执行用于解释代码逻辑。-- 这是单行注释从--开始到行尾 SELECT name FROM students; -- 也可以写在语句后面 ​ /* 这是多行注释 可以写多行内容 常用于注释掉一大段代码 */ SELECT id, name FROM students; ​ # MySQL特有的单行注释不推荐跨数据库使用 SELECT * FROM students;注释的实际应用场景-- 2026-06-05统计各班级人数用于月报 SELECT class_id, COUNT(*) FROM students GROUP BY class_id; ​ /* 以下语句用于数据修复 UPDATE students SET status active WHERE created_at 2026-01-01; 暂时注释掉等确认后再执行 */MySQL中的一些特殊规则数据库名、表名、列名可以用反引号包裹避免与关键字冲突字符串用单引号或双引号包裹推荐使用单引号