MYSQL进阶知识
一、约束
(一)介绍
约束是对表中的数据进行限定,保证数据的正确性、有效性、完整性。

(二)主键约束
1. 主键约束的特点
- 主键约束默认包含非空和唯一两个功能
- 一张表只能有一个主键
- 主键一般用于表中数据的唯一标识
2.添加主键约束语法
CREATE TABLE 表名(
列名 数据类型 PRIMARY KEY,
...
列名 数据类型 约束
);
3.删除主键约束语法
ALTER TABLE 表名 DROP PRIMARY KEY;
4.建表后单独添加主键约束语法
ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;
(三)主键自增约束(MYSQL中的自增约束,必须配合键的约束一起使用)
1.建表时添加语法
CREATE TABLE 表名(
列名 数据类型 PRIMARY KEY AUTO_INCREMENT,
...
列名 数据类型 约束
);
2.删除语法
ALTER TABLE 表名 MODIFY 列名 数据类型;
3.建表后单独添加语法
ALTER TABLE 表名 MODIFY 列名 数据类型 AUTO_INCREMENT;
(四)唯一约束(即不会出现重复的值)
1.建表时添加语法
CREATE TABLE 表名(
列名 数据类型 UNIQUE,
...
列名 数据类型 约束
);
2.删除唯一约束语法
ALTER TABLE 表名 DROP INDEX 列名;
3.建表后单独添加唯一约束语法 (如果已有非唯一的值,则语法无法执行,报错)
ALTER TABLE 表名 MODIFY 列名 数据类型 UNIQUE;
(五)非空约束
1.建表时添加非空约束
CREATE TABLE 表名(
列名 数据类型 NOT NULL,
...
列名 数据类型 约束
);
2.删除非空约束
ALTER TABLE 表名 MODIFY 列名 数据类型;
3. 建表后单独添加非空约束(如果已经有null,能够执行语法,则会将null值删除)
ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;
(六)外键约束
1.作用:
让表与表之间产生关联关系,从而保证数据的准确性。
2.建表时添加外键约束
CREATE TABLE 表名(
列名 数据类型 约束,
...
CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名)
);
3.删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
4.建表后单独添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名 (主键列名);
(七)外键的级联更新和级联删除
1.级联更新/删除:
当想把主表的数据进行修改/删除时,我期望从表中有关联的数据也会随之修改/删除。
2.添加级联更新
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES (主键列名) ON UPDATE CASCADE;
3.添加级联删除
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON DELETE CASCADE;
4.同时添加级联更新和级联删除
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE ON DELETE CASCADE;
二、多表操作
(一)介绍
多个表之间进行操作,表与表之间有关联(通过外键约束实现),分为一对一、一对多、多对多。
(二)多表的关系
1.一对一
建表原则:在任意一个表建立外键,去关联另外一个表的主键。
2.一对多
建表原则:在多的一方,建立外键约束,来关联一的一方主键。
3.多对多
建表原则:需要借助第三张中间表,中间表至少包含两个列。这两个列作为中间表的外键,分别关联两张表的主键。
(三)多表查询
分类:内连接查询、外连接查询、子查询、自关联查询
1.内连接查询
查询的是两张表有交集的部分数据(有主外键关联的数据)
2.外连接查询
①左外连接
查询左表的全部数据,和左右两张表有交集部分的数据
②右外连接
查询右表的全部数据,和左右两张表有交集部分的数据
3.子查询
查询语句中嵌套了查询语句
①结果为单行单列
可以将查询的结果作为另一条语句的查询条件,使用运算符判断。= / > / >= / < / <=等。
②结果为多行单列
可以作为条件,使用运算符IN或NOT IN进行判断。
③结果为多行多列
可以作为一张虚拟表参与查询。
4.自关联查询
在同一张表中数据有关联性,我们可以把这张表当成多个表来查询。
(四)内连接查询
1.显示内连接查询语法
SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 条件;
2.隐式内连接查询语法
SELECT 列名 FROM 表名1,表名2 WHERE 条件;
(五)外连接查询
1.左外连接查询语法
SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件;
2.右外连接
SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件;
(六)子查询
1.结果为单行单列的查询语法
SELECT 列名 FROM 表名 WHERE 列名=(SELECT 列名 FROM 表名 [WHERE 条件]);
2.结果为多行单列的查询语法
SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]);
3.结果为多行多列的查询语法
SELECT 列名 FROM 表名 [别名],(SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE 条件];
(七)自关联查询
没有固定查询语法,语句复杂,需要分析。
三、视图
(一)介绍
视图:是一种虚拟存在的数据表,这个虚拟表并不在数据库中实际存在
作用:将一些较为复杂的查询语句的结果,封装到一个虚拟表中,后期再有相同需求时,直接查询该虚拟表即可。
(二) 视图的创建和查询
1.创建视图语法
CREATE VIEW 视图名称 [(列名列表)] AS 查询语句;
2.查询视图语法
SELECT * FROM 视图名称;
(三)视图的修改和删除(原表的数据也会被自动修改)
1.修改视图数据语法
UPDATE 视图名称 SET 列名=值 WHERE 条件;
2.修改视图结构语法
ALTER VIEW 视图名称 (列名列表) AS 查询语句;
3.删除视图语法
DROP VIEW [IF EXISTS] 视图名称;
四、数据库备份和恢复
(一)命令行方式cmd
1.备份
登录cmd输入:
mysqldump -u root -p 数据库名称 > 文件保存路径
2.恢复
①登录MYSQL数据库:
可查看—— MYSQL基础内容-CSDN博客 ——的“登录MYSQL”中的内容
②删除已备份的数据库:
drop database 数据库名称;
③重新创建名称相同的数据库:
create database 数据库名称;
④使用该数据库:
use 数据库名称;
⑤导入文件执行:
source 备份文件全路径
(二)图形化工具方式(Navicat)
1.打开Navicat
2.在要备份的数据库右键
3.点击Dump SQL File,再点击Structure And Data...,然后选择要存储的路径,点击保存
4.在Navicat中删除已备份的数据库:
drop database 数据库名称;
5.在Navicat中重新创建名称相同的数据库:
create database 数据库名称;
6.在数据库上右键,点击Execute SQL File...
7.在File中找到备份的数据库的路径,点击Start,等进度条结束,点击Close,备份完成
五、 存储过程和存储函数
(一)介绍
1.定义
是事先经过编译并存储在数据库中的一段SQL语句的集合。
2.作用
①提高代码的复用性
②减少数据在数据库和应用服务器之间的传输,提高效率
③减少代码层面的业务处理
3.区别
存储函数必须有返回值
存储过程可以没有返回值
(二)存储过程的创建和调用
1.创建存储过程语法
--修改结束分隔符
DELIMITER $
--创建存储过程
CREATE PROCEDURE 存储过程名称(参数列表)
BEGIN
SQL语句列表
END$
--修改结束分隔符
DELIMITER;
2.调用存储过程
CALL 存储过程名称(实际参数);
(三)存储过程的查看和删除
1.查看数据库中所有的存储过程
SELECT * FROM mysql.proc WHERE db='数据库名称';
2.删除存储过程
DROP PROCEDURE [IF EXISTS] 存储过程名称;
(四)存储过程的变量
1.定义变量
DECLARE 变量名 数据类型 [DEFAULT 默认值];
2.变量赋值方式一
SET 变量名 = 变量值;
3.变量赋值方式二
SELECT 列名 INTO 变量名 FROM 表名 [WHERE 条件];
4.使用变量
SELECT 变量名;
(五)存储过程的if语句
1.if语句标准语法
IF 判断条件1 THEN 执行的sql语句1;
[ELSEIF 判断条件2 THEN 执行的sql语句2;]
...
[ELSE 执行的sql语句n;]
END IF;
(六)存储过程的参数传递
1.存储过程的参数和返回值
CREATE PROCEDURE 存储过程([IN/OUT/INOUT] 参数名 数据类型)
BEGIN
SQL语句列表;
END$
2.调用存储过程带参数和返回值
CALL 存储过程名(变量名[如果变量是函数返回值,则在变量名前加@符]);
3.查看变量(如果是存储过程返回值)
SELECT @变量名;
4.解释
IN:代表输入参数,需要由调用者传递实际数据(默认)
OUT:代表输出参数,该参数可以作为返回值
INOUT:代表既可以作为输入参数,也可以作为输出参数
(七)存储过程语法——while循环
1.初始化语句语法
WHLE 条件判断语句 DO
循环体语句;
条件控制语句;
END WHLE;
(八)存储函数(必须有返回值)
1.创建存储函数
CREATE FUNCTION 函数名称(参数列表)
RETURNS 返回值类型
BEGIN
SQL语句列表;
RETURN 结果;
END$
2.调用存储函数
SELECT 函数名称(实际参数);
3.删除存储函数
DROP FUNCTION 函数名称;
六、 触发器
(一)介绍
1.定义
是与表有关的数据库对象,可以在insert、update、delete之前或之后触发并执行触发器中定义的SQL语句。
2.作用
这种特性可以协助应用系统在数据库端确保数据的完整性、日志记录、数据校验等操作。
3.方法
使用别名NEW和OLD来引用触发器中发生变化的内容记录
4.触发器分类
触发器类型 | OLD | NEW |
INSERT型触发器 | 无(因为插入前无数据) | NEW表示将要或者已经新增的数据 |
UPDATE型触发器 | OLD表示修改之前的数据 | NEW表示将要或已经修改后的数据 |
DELETE型触发器 | OLD表示将要或者已经删除的数据 | 无(因为删除后状态无数据) |
(二)创建触发器语法
DELIMITER$
CREATE TRIGGER 触发器名称
BEFORE / AFTER + INSERT / UPDATE / DELETE
ON 表名
FOR EACH ROW
BEGIN
触发器要执行的功能;
END$
DELIMITER;
(三)触发器操作
1.查看触发器
SHOW TRIGGERS;
2.删除触发器
DROP TRIGGER 触发器名称;
七、事务
(一)介绍
1.定义
一条或多条SQL语句组成一个执行单元,其特点是这个单元要么同时成功要么同时失败。
单元中的每条SQL语句都互相依赖,形成一个整体。
如果某条SQL语句执行失败或者出现错误,那么整个单元就会撤回到事务最初的状态。
如果单元中所有的SQL语句都执行成功,则事务就顺利执行。
2.事务的四大特征
①原子性
指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对是数据库有任何影响。
②一致性
指书屋必须使数据库从一个一致性状态变换到另一个一致性状态。
③隔离性
指当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要互相隔离。
④持久性
指一个事务一旦被提交,那么对数据库中的数据的改变就是永久性的。
3.事务的隔离级别
指多个客户端操作时,各个客户端的事务之间应该是隔离的,互相独立的,不受影响的。而且如果多个事务操作同一批数据时,就会产生不同的问题,我们需要设置不同的隔离级别来解决这些问题。
隔离级别 | 名称 | 会引发的问题 |
---|---|---|
read uncommitted | 读未提交 | 脏读、不可重复读、幻读 |
read committed | 读已提交 | 不可重复读、幻读 |
repeatable read(默认) | 可重复读 | 幻读 |
serializable | 串行化 | 无 |
注意:
隔离级别从上到下安全性越来越高,但是效率越来越低,所以不建议修改数据库默认的隔离级别。
(二)事务的基本操作
1.开启事务
START TRANSACTION;
2.回滚事务
ROLLBACK;
3.提交事务
COMMIT;
(三)事务的提交方式
1.分类
自动提交(MYSQL默认)(1)
手动提交(0)
2.查看事务提交方式的语法
SELECT @@AUTOCOMMIT;
3.修改事务提交方式的语法
SET @@AUTOCOMMIT = 数字;
(四)事务的隔离级别操作
1.查询数据库隔离级别的语法
SELECT @@TX_ISOLATION;
2.修改数据库隔离级别的语法(修改后需要重新连接)
SET GLOBAL TRANSACTIONISOLATIONLEVEL 级别字符串;
八、 MYSQL的存储引擎
(一)MYSQL的体系结构
1.客户端连接
支持接口:支持的客户端连接,例如C、Java、PHP等语言来连接MYSQL数据库。
2.第一层:网络连接层
连接池:管理、缓冲用户的连接,线程处理等需要缓存的需求。
3.第二层:核心服务层
管理服务和工具:系统的管理和控制工具,例如备份恢复、复制、集群等。
SQL接口:接受SQL 命令,并且返回查询结果。
查询解析器:验证和解析SQL命令,例如过滤条件、语法结构等。
查询优化器:在执行查询之前,使用默认的一套优化机制进行优化SQL语句。
缓存:如果缓存当中有想查询的数据,则直接将缓存中的数据返回。没有的化再重新查询。
4.第三层:存储引擎层
插件式存储引擎:管理和操作数据的一种机制,包括(存储数据、如何更新、查询数据等)
5.第四层:系统文件层
文件系统:配置文件、数据文件、日志文件、错误文件、二进制文件等等的保存。
( 二)存储引擎介绍
1.定义
①MYQL数据库使用不同的机制存取表文件,包括存储方式、索引技巧、锁定水平等不同的功能。这些不同的技术以及配套的功能称为存储引擎。
②MYSQL能够针对不同的需求,配置不同的存储引擎,就会让数据库采取不同处理数据的方式和扩展功能。
③MYSQL支持的存储引擎有InnoDB、MyISAM、MEMORY(常用的)等。
常用存储引擎 | 特征 | 选择 |
---|---|---|
InnoDB | 支持事务和外键操作,支持并发控制,占用磁盘空间大(MYSQL5版本后默认) | 对事务的晚自习有比较高的要求,在并发条件下要求数据的一致性,读写频繁的操作。 |
MyISAM | 访问快,不支持事务和外键操作 | 以查询操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高 |
MEMORY | 内存存储,速度快,不安全,适合小量快速访问的数据 | 更新不太频繁的小表,用于快速得到访问的结果 |
(三)存储引擎操作
1.查询数据库支持的存储引擎
SHOW ENGINES;
2.查询某个数据库中所有数据表的存储引擎
SHOW TABLE STATUS FROM 数据库名称;
3.查询某个数据库中某个数据表的存储引擎
SHOW TABLE STATUS FROM 数据库名称 WHERE NAME = '数据表名称';
4.创建数据表,指定存储引擎
CREATE TABLE 表名(
列名,数据类型,
...
)ENGINE = 引擎名称;
5.修改数据表的存储引擎
ALTER TABLE 表名 ENGINE = 引擎名称;
九、索引
(一)介绍
在表数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向指向数据,这样就可以在这些数据结构上实现高级查找算法的一种数据结构。
(二)分类
索引 | 介绍 |
---|---|
普通索引 | 最基本的索引,没有任何限制 |
唯一索引 | 索引列的值必须唯一,但允许有空值。如果是组合索引,则列值组合必须唯一 |
主键索引 | 一种特殊的唯一索引,不允许有空值。在建表时有主键列同时创建主键索引。 |
联合索引 | 将单列索引进行组合 |
外键索引 | 只有InnoDB引擎支持外键索引,用来保证数据的一致性、完整性和实现级联操作 |
全文索引 | 快速匹配全部文档的方式。InnoDB引擎5.6版本后才支持全文索引。MEMORY引擎不支持 |
索引 | 介绍 |
---|---|
BTree索引 | MYSQL使用最频繁的一个索引数据结构,是InnoDB和MyISAM存储引擎默认的索引类型 |
Hash索引 | MYSQL中Memory存储引擎默认支持的索引类型 |
(三)索引的原理
索引是在存储引擎中实现的,不同的存储引擎所支持的索引也不一样,接下来介绍InnoDB引擎的BTree索引。
BTree索引类型是基于B+Tree数据结构的,而B+Tree数据结构又是BTree数据结构的变种,通常使用在数据库和操作系统的文件系统,特点是能够保持数据稳定有序。
磁盘存储:系统从磁盘读取数据到内存时是以磁盘块为基本单位,位于同一磁盘块中的数据会被一次性读取出来。(InnoDB存储引擎中有页的概念,将多个地址连接磁盘块来达到页的大小16KB)
BTree:每个节点中不仅包含key值,还有数据。会增加查询数据时磁盘的IO次数。
B+Tree:非叶子节点只存储key值,所有数据存储在叶子节点,所有叶子节点之间都有连接指针。
(三)索引操作
1.创建索引
CREATE [UNIQUE(唯一) / FULLTEXT(全文)] INDEX 索引名称
[ USING 索引类型] --默认是BTREE
ON 表名(列名...);
2.查看索引(主键列/外键列自带主键索引/外键索引)
SHOW INDEX FROM 表名;
3. 添加索引
普通索引:ALTER TABLE 表名 ADD INDEX 索引名称(列名);
组合索引:ALTER TABLE 表名 ADD INDEX 索引名称(列名1,列名2,...);
主键索引:ALTER TABLE 表名 ADD PRIMARY KEY(主键列名);
外键索引:ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(本表外键列名) REFERENCES 主表名(主键列名);
唯一索引:ALTER TABLE 表名 ADD UNIQUE 索引名称(列名);
全文索引:ALTER TABLE 表名 ADD FULLTEXT 索引名称(列名);
4.删除索引
DROP INDEX 索引名称 ON 表名;
十、锁
(一)介绍
锁机制:数据库为保证数据的一致性,在共享的资源被并发访问时变得安全所设计的一种规则。


(二)InnoDB共享锁(能被多个事务查询,但不能被修改,多个共享锁是兼容)
1.创建共享锁的语法(在主键列加锁—加的是行锁,不在主键加锁—加的是表锁)
SELECT 语句 LOCK IN SHARE MODE;
(三)InnoDB排他锁(加锁的数据不能被其他事务加锁查询或修改)
1.创建排他锁的语法
SELECT 语句 FOR UPDATE;
(四)MyISAM读锁(所有连接只能查询数据,不能修改)
1.读锁加锁的语法(MyISAM没有事务,所以不用开启事务)(且只有表锁)
LOCK TABLE 表名 READ;
2.读锁解锁的语法
UNLOCK TABLES;
(五)MyISAM写锁(其他连接不能查询和修改数据)
1.写锁加锁的语法
LOCK TABLE 表名 WRITE;
2.写锁解锁的语法
UNLOCK TABLES;
十一、MyCat中间件
(一)介绍
MyCat是一款出色的数据库集群软件,支持常用关系型数据库,提供高可用性数据分片集群。
十二、一些不常用语法
1.获取即刻时间
NOW();
2.获取新增数据的内容
NEW.列名;
3.获取更新前的数据内容
OLD.列名;
4.实现字符串拼接
CONCAT('拼接内容',NEW.列名,...);