当前位置: 首页 > news >正文

MYSQL进阶知识

一、约束

(一)介绍

约束是对表中的数据进行限定,保证数据的正确性、有效性、完整性。

约束的分类

(二)主键约束

1. 主键约束的特点
  1. 主键约束默认包含非空和唯一两个功能
  2. 一张表只能有一个主键
  3. 主键一般用于表中数据的唯一标识

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.触发器分类

触发器类型OLDNEW
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支持的存储引擎有InnoDBMyISAMMEMORY(常用的)等。

常用存储引擎特征对比
常用存储引擎特征选择
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.列名,...);

http://www.dtcms.com/a/270379.html

相关文章:

  • 在keil中使用stlink下载程序报错Invalid ROM Table
  • Day07_C语言IO进程线程(重难点)
  • TensorFlow 和PyTorch的全方位对比和选择建议
  • Latex几种常用的花体
  • [2-02-02].第04节:环境搭建 - Linux搭建ES集群环境
  • [RPA] 影刀RPA基本知识
  • Kafka多组消费:同一Topic,不同Group ID
  • NV298NV312美光固态闪存NW639NW640
  • 基于mysqlfrm工具解析mysql数据结构文件frm表结构和数据库版本信息
  • 【Nginx】Nginx代理WebSocket
  • 扣子Coze远程连接数据库插件
  • C语言基础(1)
  • 【C++】AVL树底层思想 and 大厂面试
  • Python 的内置函数 slice
  • 为什么elementui的<el-table-column label=“名称“ prop=“name“ label不用写成:label
  • RS-232协议与RS485协议详解
  • [Backlog] 命令行界面CLI vs Web界面及服务端
  • 快手电商要投入多少钱?快手电商入驻条件和费用
  • 分布式无线工业数据采集终端应用场景简析
  • POI报表
  • Paimon本地表查询引擎LocalTableQuery详解
  • Mybits-plus 表关联查询,嵌套查询,子查询示例演示
  • 使用策略模式 + 自动注册机制来构建旅游点评系统的搜索模块
  • 音频被动降噪技术
  • Spring AI:ETL Pipeline
  • STM32-USART
  • 图像噪点消除:用 OpenCV 实现多种滤波方法
  • jmeter 性能测试步骤是什么?
  • 【深度学习新浪潮】什么是上下文长度?
  • MQTT QoS 2 详细流程解析