MySQL基础学习
参考资料
- MySQL 全部详细知识点
- https://blog.csdn.net/liwuqianhzc/article/details/141035862
- SQL 语法
- Windows 安装 MySQL5.7
- Linux 安装 MySQL5.7
- Linux 安装 MySQL 8.0
简介
数据库连接工具可使用 Navicat 等软件。
基本语法
- SQL 语句不区分大小写,但关键字建议大写
- 语句需要以分号分隔
- 可以写成一行也可以分为多行
- 使用两个横杠
--进行注释
SQL 分类
-
数据定义语言(DDL):用于定义数据结构和数据库对象,如 CREATE、ALTER、DROP
-
数据操纵语言(DML):用于访问数据库中的对象和数据,如 INSERT、UPDATE、DELETE、SELECT(增删改查)
-
事务控制语言(TCL):用于管理数据库中的事务,如 COMMIT、ROLLBACK
-
数据控制语言(DCL):用于控制数据访问权限,如 GRANT、REVOKE
命名规范
数据库表名和字段名可选择驼峰式或下划线式命名,但不推荐混用。
|
|
小写下划线式对大小写不敏感的数据库有好处。
常见命名示例
|
|
选择命名方式时可参考对应数据库平台官方推荐。PostgreSQL 建议使用 snake_case,SQL Server 可用 CamelCase。结合所使用的 ORM 框架进一步考虑。无论选择哪种风格,重要的是整个项目或团队保持一致。
数据库操作
显示数据库版本:SELECT VERSION();
显示时间:SELECT NOW();
查看所有数据库:SHOW DATABASES;
创建用于练习的数据库:CREATE DATABASE mytest_school CHARSET=utf8;
切换到数据库:USE mytest_school;
查看当前使用的数据库:SELECT DATABASE();
删除数据库:DROP DATABASE IF EXISTS mytest_school;
退出:exit 或 quit
数据表操作
创建表
定义字段时需考虑:字段名、类型(如 INT、VARCHAR)、是否为主键、是否 NOT NULL、可选的 DEFAULT 值。
常用约束:
INT UNSIGNED:无符号整型AUTO_INCREMENT:设置自增,通常用于主键NOT NULL:设置字段不能为空PRIMARY KEY:设置主键DEFAULT:设置默认值ENGINE=InnoDB:设置存储引擎
|
|
查看已有表格:SHOW TABLES;
查看表结构:DESC students;
删除表
|
|
修改表
- 添加列
|
|
- 删除列
|
|
- 修改列名
|
|
- 修改表名
|
|
- 修改默认值
|
|
- 修改列的类型或约束
|
|
- 修改表的编码格式
|
|
utf8mb4 编码是 utf8 的超集,兼容 utf8 并能存储 4 字节的表情字符。如果表的编码指定为 utf8,在保存 emoji 时会报错。
数据操作
增(INSERT)
全列插入:主键字段可以用 0、NULL、DEFAULT 来占位。
|
|
部分插入:
|
|
多行插入:
|
|
三种插入方式的区别:
INSERT INTO:遇到重复主键会报错REPLACE INTO:遇到重复主键会进行替换INSERT IGNORE:遇到重复主键会直接忽略
删(DELETE)
物理删除:
|
|
逻辑删除:用字段标识数据是否可用。
|
|
改(UPDATE)
|
|
重要:删除和修改操作务必加上 WHERE 条件限制,否则会作用于全表。
查(SELECT)
查询所有列:
|
|
查询指定列:
|
|
条件查询:
|
|
使用 AS 为列或表指定别名:
|
|
表连接类型
CROSS JOIN:两两结合,不需要条件,类似笛卡尔积INNER JOIN或JOIN:返回两张表中具有匹配值的记录LEFT JOIN、RIGHT JOIN:属于外连接,左外连接的左表记录全部保留,右表匹配到就加入;右外连接同理,缺失数据显示为 NULL
视图
对视图的操作与对普通表的操作一样。但视图是 MySQL 中的虚拟表,基于一个或多个实际表的查询结果,本身不存储数据,不能对其进行索引操作。
特点
- 虚拟表:不存储实际数据,只存储查询定义
- 简化复杂查询:将复杂查询封装
- 数据安全:可以限制用户访问底层表的特定列,提高数据库安全性
- 逻辑独立性:可以屏蔽表结构变化对应用的影响
缺点
- 复杂视图可能导致查询性能下降
- 过多视图会使数据库维护困难
视图操作
创建视图:
|
|
查询视图:
|
|
删除视图:
|
|
常用函数
聚合函数
SUM()、AVG()、COUNT()、MAX()、MIN()
一般配合 GROUP BY 使用。分组 GROUP BY ..., ... 支持多字段。
日期函数
DATE()、DATETIME()、TIME()
计算两个日期相差的时间:
|
|
时间段数据查询:
|
|
字符串与日期格式的转换:
|
|
排序
ORDER BY 可以指定多个字段排序。先对字段 a 升序,再对字段 b 降序:
|
|
字符串函数
判断是否为空:
|
|
大小写转换:
|
|
截取和拼接:
|
|
其他处理:
|
|
条件表达式
|
|
等同于 CASE 语句:
|
|
子查询
IN 语句:
|
|
EXISTS 语句:逻辑运算符,返回布尔值,用于检查子查询是否返回任何行。一旦子查询找到匹配行,EXISTS 返回 TRUE 并停止处理;没有返回任何行则返回 FALSE。
|
|
示例:查找有订单的客户,使用 NOT EXISTS 则查找没有订单的客户:
|
|
EXISTS 特别适用于基于相关子查询的存在性来过滤数据的场景。
拼接表
|
|
窗口函数
窗口函数是一种强大的查询工具,允许对分组数据进行计算,同时保留原始行的详细信息。通过指定字段将数据分为几个窗口,再使用聚合函数进行分析。
支持的窗口函数
包括 RANK、DENSE_RANK、ROW_NUMBER,以及所有聚合函数等。
特点
- 相比 GROUP BY,执行完后数据条数不变
- 只能在 SELECT 子句中使用
示例
分组后组内求和:
|
|
SUM 函数可替换为 AVG、MIN、MAX 等。需计算同组内的累加和时,需要加上 ORDER BY:
|
|
排序函数:
|
|
三种排序函数的区别:
| 函数 | 作用 |
|---|---|
| RANK | 排名,遇并列会跳过名次,例如:1,2,2,4,5 |
| DENSE_RANK | 排名,遇并列不跳过名次,例如:1,2,2,3,4 |
| ROW_NUMBER | 连续序号,例如:1,2,3,4,5 |
LAG、LEAD 用于相邻行的比较。
事务
事务用于保证一组操作要么全部成功,要么全部失败。
ACID 特性
- 原子性(Atomicity):事务是整体,要么全部执行,要么都不执行
- 一致性(Consistency):事务执行前后,数据应保持一致状态,如银行转账前后两个账户总额不变
- 隔离性(Isolation):多个事务同时执行时,它们之间不会互相影响
- 持久性(Durability):事务一旦提交,对数据库的改变是永久的
基本使用
- 打开事务:
BEGIN或START TRANSACTION - 执行操作:INSERT、UPDATE、DELETE
- 确认修改:
COMMIT - 撤销操作:
ROLLBACK
示例
回滚示例:打开一个终端执行 BEGIN 后修改数据再 ROLLBACK,数据会恢复为原始值。
原子性与一致性示例:打开两个终端,在终端 1 中执行 BEGIN 后修改数据,此时终端 1 能看到修改,但终端 2 看不到(因为未提交)。终端 1 执行 COMMIT 后,终端 2 才能看到更新。
隔离性示例:终端 1 执行 BEGIN 后修改某行并持有行锁。终端 2 尝试更新同一行会阻塞等待。终端 1 执行 COMMIT 后,终端 2 的阻塞解除,更新生效。
持久性:事务提交(COMMIT)后,修改将永久保存到数据库。
注意事项
- InnoDB 引擎支持事务,MyISAM 等其他引擎不支持
- Python 操作数据库时默认开启事务,需手动 COMMIT 提交增删改操作
- 终端客户端(如 MySQL CLI)会默认自动提交,可通过
SET autocommit=0关闭
事务的意义
保证操作的原子性,例如银行转账必须完整执行,不允许部分成功。
其他
数据库备份与恢复
导出数据库:mysqldump –u root –p 数据库名 > python.sql
导入数据库:mysql -u root –p 新数据库名 < python.sql
复制表
- 只复制结构:
CREATE TABLE b LIKE a - 复制结构及数据:
CREATE TABLE b SELECT * FROM a
连接表
MySQL 不支持全连接,使用 JOIN 需要搭配 ON,默认 JOIN 是 INNER JOIN。
连接两个含有相同字段的表格可使用 UNION,UNION 会去重,UNION ALL 直接合并。
操作符
| 符号 | 描述 |
|---|---|
= |
等于 |
<> != |
不等于 |
> >= |
大于 大于等于 |
< <= |
小于 小于等于 |
BETWEEN |
在某范围内 |
IN |
在指定集合中 |
IS NULL |
为空 |
IS NOT NULL |
不为空 |
AND |
并且 |
OR |
或者 |
NOT |
否定 |
ASC |
升序(默认) |
DESC |
降序 |
通配符
| 符号 | 描述 |
|---|---|
LIKE |
针对文本值字段的匹配 |
% |
任何字符任意次数 |
_ |
任何字符出现一次 |
[] |
字符集合中的任意一个 |
Linux 系统下安装 MySQL
Ubuntu 可直接 sudo apt-get install mysql-server
查看运行状态:/etc/init.d/mysql status
如果能直接 apt install 是最好的,可以减少很多麻烦。问题是只能安装仓库中已有的版本。
也可以下载二进制文件安装:
下载地址:https://downloads.mysql.com/archives/community/
|
|
常见问题
新版本 Ubuntu 安装 MySQL 5.7.x 可能遇到各种问题:
-
缺少 libtinfo5:参考 https://www.cnblogs.com/mili0601/p/18652590 和 https://blog.csdn.net/aajjw/article/details/111144100
-
缺少 libaio.so.1:参考 https://blog.csdn.net/qq_36514197/article/details/118522552
完全卸载 MySQL:
|
|
Windows 系统下安装 MySQL
my.ini 配置文件
配置文件通常在 C:\ProgramData\MySQL\MySQL Serverx.x 目录下,或自行在解压路径下新建:
|
|
设置密码
打开 CMD,输入 mysql -u root -p,默认无密码直接回车。
|
|
设置远程连接
|
|
安装完成后需配置环境变量,才能在 CMD 中使用 mysql 命令。
拓展与后续学习建议
- 索引优化:深入学习复合索引的最左前缀原则、覆盖索引、回表查询等概念
- 查询优化:学习使用 EXPLAIN 分析执行计划,理解 type、key、Extra 等关键字段含义
- 分区表:了解 MySQL 分区表的原理和使用场景
- 数据库安全:学习用户权限精细化管理、SQL 注入防护、数据加密存储等安全相关知识
- 数据库监控:了解慢查询日志、性能
_schema、information_schema的使用方法