免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。本人尊重原创作者或出版方资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。
目录
一、数据库概述
1.数据库类型分类
早期较为时兴的数据库种类有三种,分别是层次型数据库、网状型数据库和关系型数据库。
而在如今的互联网中,最常见的数据库种类主要有2种,即关系型数据库和非关系型数据库。
2.数据库介绍
(1)层次数据库介绍
①概述:
层次数据库是最开始研制的数据库系统软件,它把数据根据层次构造(树结构)的方法呈现。
②特征(树的性质决定了树状数据模型的特征):
- 整个模型中有且仅有一个节点没有父节点,其余的节点必须有且仅有一个父节点,但是所有的节点都可以不存在子节点;
- 所有的子节点不能脱离父节点而单独存在,也就是说如果要删除父节点,那么父节点下面的所有子节点都要同时删除,但是可以单独删除一些叶子节点;
- 每个记录类型有且仅有一条从父节点通向自身的路径;
- 较为具备象征性的层次数据库是IMS(Information Management System)数据库,由IBM企业研发。
(2)网状型数据库介绍
①定义:
用有向图表示实体和实体之间的联系的数据结构模型称为网状数据模型。
②特征:
- 可以存在两个或者多个节点没有父节点;
- 允许单个节点存在多于一个父节点;
(3)关系型数据库(RDBMS)介绍
①概念:
建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
②特点:
- 用户开展储存时,关系型数据库无需声明数据的存储结构和相对路径。
- 使用表存储数据,格式统一,便于维护。
- 使用SQL语言操作,标准统一,使用方便。
③定义:
- 关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。
- 用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
- 和Excel工作簿一样,关系型数据库也选用由列和行构成的二维表来管理数据,简单易懂。另外,它还利用SQL(Structured Query Language,结构化查询语言)对数据开展实际操作。
(4)非关系型数据库详细介绍
①概述:
非关系型数据库主要是根据“非关系实体模型”的数据库,也称之为NoSQL数据库,NOSQL的原意是“Not only SQL”,而不是“NoSQL”的含意,因而,NoSQL的出现并不是要完全否认关系型数据库,只是做为传统关系型数据库的一个合理补充。NOSQL数据库在特殊的情景下能够充分发挥出无法想象的高效率和卓越性能。
②非关系型数据库分类:
- 键值(Key-Value)储存数据库;
- 列储存(Column-oriedted)数据库;
- 面向文本文档(Document-Oriented)数据库;
- 图型(Graph)数据库。
3.不同种类数据库应用角度区别
在数据库应用角度来区分的话,数据库还可以分为面向操作型和面向数据分析型。
(1)面向操作的关系型数据库
- 数据储存方法:表格
- 优点:完善的生态环境保护,事务保证/数据一致性
- 缺点:严苛的数据模型界定,数据库拓展限制,和非结构型的结合应用较难。
(2)面向数据分析的关系型数据库
- 数据储存方法:表格
- 优点:信息内容和计算的一致性
- 缺点:必须由数据库技术专业的IT工作人员维护保养,数据相应通常是分钟级
(3)面向操作的非关系型数据库
- 数据储存方法:有很多存储结构:document,graph,column,key-value,time series
- 优点:便捷性,协调能力(不用预定义的方式),水平伸缩(适应大规模数据量),成本低(开源系统)
- 缺点:欠缺事务保证
(4)面向数据分析的非关系型数据库
- 数据储存方法:Hadoop不用原有的数据构造;数据能够跨好几个服务器存储
- 优点:适用批量处理,并行处理文件;主要是开源的,资金投入较低
- 缺点:迟缓的响应速度;不宜迅速检索或高速更新
二、MySQL
1.MySQL数据库数据模型
2.SQL概述
(1)通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- SQL语句可以使用空格/缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
- 注释:
单行注释:-- 或 # (MySQL特有)
多行注释:/* 注释内容 */
(2)SQL分类
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Ouery Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
3.数据类型
(1)数值类型
数值类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 概述 |
---|---|---|---|---|
TINYINT | 1 byte | (-2^7,2^7-1) | (0,2^8-1) | 小整数值 |
SMALLINT | 2 bytes | (-2^15,2^15-1) | (0,2^16-1) | 大整数值 |
MEDIUMINT | 3 bytes | (-2^23,2^23-1) | (0,2^24-1) | 大整数值 |
INT或 INTEGER | 4 bytes | (-2^31,2^31-1) | (0,2^32-1) | 大整数值 |
BIGINT | 8 bytes | (-2^63,2^63-1) | (0,2^64-1) | 极大整数值 |
FLOAT | 4 bytes | (-3.402823466 E +38,3.402823466351 E+38) | 0和(1.175494351 E-38,3.402823466 E+38) | 单精度浮点数值 |
DOUBLE | 8 bytes | (-1.7976931348623157 E +308,1.7976931348623157 E+308) | 0和(2.2250738585072014 E-308,1.7976931348623157 E+308) | 双精度浮点数值 |
DECIMAL | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
DOUBLE(4,1):精度为4,标度为5。
(eg:123.4)
(2)字符串类型
类型 | 大小 | 概述 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65 535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
- CHAR(10):最大储存长度为10,定长字符串(无论如何分配10个字节),性能好。一般用作性别
- VARCHAR(10):最大储存长度为10,变长字符串(根据内容分配字节,最多为10),性能差。一般用作用户名
(3)时间类型
类型 | 大小 | 范围 | 格式 | 概述 |
---|---|---|---|---|
DATE | 3 字节 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 字节 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 字节 | 1901 至 2155 | YYYY | 年份值 |
DATETIME | 8 字节 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 字节 | 1970-01-01 00:00:01至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳 |
三、SQL语法
注意:[ ...... ] 为可选参数
1.DDL
(1)数据库操作
①查询
查询所有数据库
SHOW DATABASES;
查询当前数据库
SELECT DATABASE();
②创建
创建一个数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
③删除
删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
④使用
使用选定数据库
USE 数据库名;
(2)表操作
①查询
查询当前数据库所有表
SHOW TABLES;
查询表结构
DESC 表名
查询指定建表语句
SHOW CREATE TABLE 表名;
②创建
创建一个表
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释],
字段1 字段1类型 [COMMENT 字段1注释],
......
字段n 字段n类型 [COMMENT 字段n注释]
) [COMMENT 表注释];
注意:最后一个字段后没有逗号
③添加
添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
④修改
修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
修改表名
ALTER TABLE 表名 RENAME TO 新表名;
⑤删除
删除字段
ALTER TABLE 表名 DROP 字段名;
删除指定表内容,保留表结构(删除表重新创建)
TRUNCATE TABLE 表名;
2.DML
①添加
给指定字段添加数据
INSERT INTO 表名(字段名1,字段名2, ......) VALUES (值1,值2, ......);
给全部字段添加数据
INSERT INTO 表名 (字段名1,字段名2, ...) VALUES(值1,值2, ...),(值1,值2,….),(值1,值2, ...);
INSERT INTO 表名 VALUES (值1,值2, …),(值1,值2, …),(值1,值2, ...);
注意:
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的,
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,应该在字段的规定范围内。
②修改
修改数据
UPDATE 表名 SET 字段名1=值1,字段名2=值2, … [WHERE 条件];
注意:条件 where 可以有也可以没有,如果没有将修改整张表的数据。
③删除
删除数据
DELETE FROM 表名 [WHERE 条件];
注意:
- DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
- DELETE 语句不能删除某一个字段的值(可以使用 UPDATE 将数据设置为 null)。
3.DQL
(1)DQL执行顺序
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
(2)查询分类
①基本查询
②条件查询(WHERE)
③聚合函数(count、max、min、avg、sum)
④分组查询(GROUP BY)排序查询(ORDER BY)
⑤分页查询(LIMIT)
(3)基本查询
①语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
②条件类型
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<>或 != | 不等于 |
BETWEEN ... AND ... | 在某个范围之内(含最小、最大值) |
IN(...) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配( _ 匹配单个字符,%匹配任意个字符) |
IS NULL | 是NULL |
注意:
- BETWEEN ... AND ... : 必须左边值小,右边值大
- IN(...) :age in(25,30,20) 等价于 age=25 || age=20 || age=30
- LIKE 占位符:
- 若条件为名字为两个字:name LlKE ' _ _ ' (LIKE后面加引号)
- 若条件为最后一位是X:idcard LIKE ' % X '
逻辑运算符 | 功能 |
---|---|
AND 或 && | 并且(多个条件同时成立) |
OR 或 || | 或者(多个条件任意一个成立) |
NOT 或 ! | 非 |
(4)聚合函数
①概述:
作用于某一列,将一列数据作为一个整体,进行纵向计算
②常见聚合函数
函数 | 功能 |
---|---|
count | 统计数量 |
mаx | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
③语法
SELECT 聚合函数(字段列表) FROM 表名;
注意:所有null值不参与计算
(5)分组查询
语法
SELECT 字段列表 FROM 表名[WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
注意:
- where与having区别:
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
- 执行顺序:where > 聚合函数 > having
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
(6)排序查询
①语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
②排序方式
ASC:升序(默认值)
DESC:降序
注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
eg:先按a降序,再按b升序: order by A desc,B asc
(7)分页查询
语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
注意:
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
4.DCL
- 分为用户管理、用户权限控制
- 这类SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库管理员)使用
(1)用户管理
①查询用户
USE mysql;
SELECT * FROM user;
②创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
注意:
- 若主机名为 localhost 则只能在当前主机访问
- 若主机名为 % 则可在所有主机访问,% 为通配符
③修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码'
④删除用户
DROP USER '用户名'@'主机名';
(2)权限控制
①常见权限名称
权限 | 概述 |
---|---|
ALL,ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
②查询权限
SHOW GRANTS FOR '用户名'@'主机名';
③授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
④撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意:
- 多个权限之间,使用逗号分隔
- 授权时,数据库名和表名可以使用 * 进行通配,代表所有
四、函数
1.字符串函数
函数 | 功能 |
---|---|
CONCAT(S1,S2, ... ,Sn) | 将S1,S2,... ,Sn拼接成一个字符串 |
LOWER(str) | 将字符串str全部转为小写 |
UPPER(str) | 将字符串str全部转为大写 |
LPAD(str,n,pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
RPAD(str,n,pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
TRIM(str) | 去掉字符串头部和尾部的空格 |
SUBSTRING(str,start,len) | 返回从字符串str从start位置起的len个长度的字符串 |
2.数值函数
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x,y) | 返回x/y的模 |
RAND() | 返回0~1内的随机数 |
ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
3.日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE ADD(date,INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
4.流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
函数 | 功能 |
---|---|
IF(value ,t,f) | 如果value为true,则返回t,否则返回f |
IFNULL(value1 ,value2) | 如果value1不为空,返回value1,否则返回value2 |
CASE WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果value1不为空,返回value1,否则返回value2(具体值匹配) |
CASE [expr] WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END | 如果expr的值等于val1,返回res1,… ,否则返回default默认值(范围值匹配) |
五、约束
1.定义
约束是作用于表中字段上的规则,用于限制存储在表中的数据。
2.目的
保证数据库中数据的正确、有效性和完整性。
3.分类
约束 | 概述 | 关键字 |
---|---|---|
非空约束 | 限制该字段的数据不能为null | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束 | 保证字段值满足某一个条件 | CHECK |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
自增长约束 | 使该字段的所有数据自增长 | AUTO_INCREMENT |
零填充约束 | 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0 | ZEROFILL |
注意:
- 约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
- 检查约束:8.0.16版本之后
- 零填充约束:
- 当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128到+127,无符号为0到256。
- zerofill默认为int(10)
- 插入数据时,当该字段的值的长度小于定义的长度时会在该值的前面补上相应的0
- 主键约束:当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
4.外键约束
(1)概述:
- 外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
- 具有外键的表叫子表(从表),外键关联的另一张表为父表(主表)。
(2)语法
①添加外键
CREATE TABLE 表名(
字段名 数据类型,
......
[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
);
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE
②删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
(3)外键的删除/更新行为
行为 | 概述 |
---|---|
NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 |
RESTRICT | |
CASCAD | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录 |
SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null) |
SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持) |
六、多表查询
1.多表关系
(1)概述:
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系。
(2)分类:
①一对多(多对一):在多的一方建立外键,指向一的一方的主键。(员工-->部门)
②多对多:建立一张中间表,中间表至少含有两个外键,分别关联两方主键。(学生-->课程)
③一对一:在任意一方加入外键,关联另一方主键,并设置外键为唯一的(UNIQUE)用于单表的拆分,将一张表的基础字段放到一张表中,其他详情字段放到另一张表中,以提升操作效率。(用户-->用户)
2.笛卡尔积
(1)概述:
在多表查询中,笛卡尔积(Cartesian Product)是一个基本的结果集。它表示两个或多个表的所有可能的行组合。笛卡尔积通常通过不带连接条件的 JOIN
操作或在 WHERE
子句中缺少合适的连接条件的情况下出现。
(2)解释:
假设我们有两个表:
table1
和table2
。
table1
:
id name 1 Alice 2 Bob
table2
:
id hobby 1 Reading 2 Swimming 3 Traveling 如果我们对这两个表进行笛卡尔积查询:
SELECT * FROM table1, table2;
结果将会是每一行
table1
和每一行table2
的所有可能组合:
id name id hobby 1 Alice 1 Reading 1 Alice 2 Swimming 1 Alice 3 Traveling 2 Bob 1 Reading 2 Bob 2 Swimming 2 Bob 3 Traveling 笛卡尔积的结果行数是
table1
和table2
行数的乘积。在大多数实际应用中,笛卡尔积往往不是我们所需要的结果,因为它会生成大量无用的数据。为了避免笛卡尔积,我们通常需要在查询中指定连接条件(JOIN
条件)。例如,我们可以使用内连接(INNER JOIN)来避免笛卡尔积:
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
假设两个表中都存在 id 的对应关系,那么上述查询只会返回匹配的行:
id name id hobby 1 Alice 1 Reading 2 Bob 2 Swimming
3.概述
(1)定义:
指从多张表中查询数据
(2)分类
连接查询
- 内连接:相当于查询A、B交集部分数据
- 外连接:
- 左外连接:查询左表所有数据,以及两张表交集部分数据
- 右外连接:查询右表所有数据,以及两张表交集部分数据
- 自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询
4.连接查询
(1)内连接
隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件 …;
显式内连接
SELECT 字段列表 FROM 表1[INNER]JOIN 表2 ON 连接条件 …;
内连接查询的是两张表的交集。
(2)外连接
左外连接
SELECT 字段列表 FROM 表1 LEFT[OUTER]JOIN 表2 ON 条件 …;
相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据。
右外连接
SELECT 字段列表 FROM 表1 RIGHT[OUTER]JOIN 表2 ON 条件 …;
相当于查询表2(右表)的所有数据 包含 表1和表2交集部分的数据。
(3)自连接
SELECT字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 …;
自连接查询,可以是内连接查询,也可以是外连接查询。
5.联合查询
(1)概述:
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
(2)语法:
SELECT 字段列表 FROM 表A …;
UNION [ ALL ]
SELECT 字段列表 FROM 表B …;
- 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
- union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。
6.子查询
(1)概述:
SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
(2)语法:
SELECT*FROM t1 WHERE column1=(SELECT columnl FROM t2 );
子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。
(3)分类:
根据子查询结果不同:
- 标量子查询(子查询结果为单个值)
- 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式。
- 常用的操作符:= <> > >= < <=
- 列子查询(子查询结果为一列)
- 子查询返回的结果是一列(可以是多行)
- 常用的操作符:IN、NO TIN、ANY、SOME、ALL
操作符 概述 IN 在指定的集合范围之内,多选一 NOT IN 不在指定的集合范围之内 ANY 子查询返回列表中,有任意一个满足即可 SOME 与ANY等同,使用SOME的地方都可以使用ANY ALL 子查询返回列表的所有值都必须满足描述
- 行子查询(子查询结果为一行)
- 子查询返回的结果是一行(可以是多列)
- 常用的操作符:=、IN、NOT IN
- 表子查询(子查询结果为多行多列)
- 子查询返回的结果是多行多列
- 常用的操作符:IN
根据子查询位置:
- WHERE之后
- FROM之后
- SELECT之后
七、事务
1.概述
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
2.四大特性
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
3.事务操作
查看/设置事务提交方式
SELECT @@autocommit; 提交方式为 自动提交 此时@@autocommit值为1
SET @@autocommit=0; 提交方式为 手动提交 需要commit提交事务
提交事务
COMMIT;
回滚事务
ROLLBACK;
开启事务
START TRANSACTION 或 BEGIN;
4.并发事务问题
问题 | 概述 |
---|---|
脏读 | 一个事务读到另外一个事务还没有提交的数据。 |
不可重复读 | 一个事务先后读取同一条记录,数据期间被修改,两次读取的数据不同,称之为不可重复读。 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影。 |
5.事务隔离级别
(1)分类
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable Read(默认) | × | × | √ |
Serializable | × | × | × |
(2)语法
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
- SESSlON: Sets the transaction isolation level for the current session only.
- GLOBAL: Sets the transaction isolation level for all sessions.
- 事务隔离级别越高,数据越安全,但是性能越低。