基本
一、常见概念
- DD:数据库,存储数据的容器
- DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理 DB
- SQL:结构化查询语言,用于和数据库通信的语言
二、MySQL语法规范
- 不区分大小写,简答关键字大写
- 每条命令最好用分号结尾
- 每条命令根据需要,可以缩进或者换行
- 注释格式
单行注释:#注释文字单行注释:--注释文字多行注释:/*注释文字*/
三、服务启动/登录
- MySQL服务启动与停止
启动服务:net start 服务名停止服务:net stop 服务名
- 服务的登录和退出
退出:exit登录:mysql [-h 主机名 -p端口号] -u 用户名 -p密码/*端口号与p之间无空格*/
四、常见命令
SHOW DATABASES; # 查看所有数据库USE 库名 # 打开指定库SHOW TABLES; # 查看当前库所有表SHOW TABLES FROM 库名; # 查看指定库所有表DESC 表名; # 查看表结构SELECT VERSION(); # 查看服务器版本SHOW ENGINES; # 查看存储引擎SELECT @@tx_isolation; # 查看隔离界别(8.0之前)SELECT @@transaction_isolation; # 隔离级别(8.0之后)SHOW CREATE TABLE 表名 # 查看表创建过程SHOW CREATE VIEW 视图名 # 查看视图创建过程SHOW PROCEDURE 存储过程名 # 查看存储过程创建过程
DQL语言
含义:数据查询语言 Data Query Language
一、基础查询
SELECT
特点
- 查询列表可以是:字段、常量值、表达式、函数
- 查询结果是一个虚拟表格
- 查询字段
SELECT 字段 FROM 表; # 查询单个字段SELECT 字段1, 字段2 FROM 表; # 查询多个字段SELECT * FROM 表; # 查询所有字段/* 注:`XX`(着重号,非单引号)代表XX为字段名 */
- 查询常量值、表达式、函数
SELECT 常量值/表达式/函数;/* 例子 */SELECT 100;SELECT 100%3;SELECT VERSION();
- 起别名
(1) 便于理解
(2) 查询字段若有重名可以用别名区分
SELECT 字段 AS 别名 FROM 表; # 用ASSELECT 字段 别名 FROM 表; # 用空格/* 注:别名含有特殊符号或关键字时,添加双引号或单引号 */
- 结果去重
字段前加 DISTINCT 即可结果去重
SELECT DISTINCT 字段 FROM 表;
- +号作用
(1) 两个操作数都为数值型做加法运算
(2) 其中一个为 NULL 则结果为 NULL
(3) 其中一个为字符型,则视图转换为数值型
SELECT '12'+1; # 转换成功做加法运算SELECT 'A'+1; # 转换失败,将字符型转换成0
二、条件查询
- WHERE 语法
SELECT 查询列表 FORM 表 WHERE 筛选条件
- 分类
按条件表达式筛选
条件运算符:> < = != <> >= <=按表达式筛选
逻辑运算符:&& || ! and or not模糊查询
LIKE /* 一般搭配通配符使用,前面可加NOT通配符:% 代表任意多个字符(包括0个)- 代表任意单个字符注:若查询名字中包含通配符的字段需要用 \ 转义ESCAPE可自定义转义字符*/BETWEEN AND/* BETWEEN A AND B 包含 A 和 B */IN /* IN(值1, 值2, ...) 列表的值必须一致或兼容 */IS NULL/IS NOT NULL /* = 和 <> 不能用于判断NULL值,需要用IS NULL/IS NOT NULL *//* 注:<=> 为安全等于,可以判断NULL和普通数值 */
三、排序查询
- ORDER BY 语法
SELECT 字段 FROM 表 [WHERE 条件] ORDER BY 排序列表 ASC|DESC/* ASC 升序 DESC 降序 不写默认升序 */
- 特点
- 排序列表可以是表达式或函数
- 排序列表可设置多个,按列表先后顺序排序
- 排序列表可写别名
- ODER BY 语句在其他语句后面 LIMIT 语句前面
四、常见函数
- 字符函数
函数 | 用法及作用 |
---|---|
LENGTH() | 获取参数的字节个数 |
CONCAT() | 拼接字符串 |
UPPER() LOWER() | UPPER() 将参数转为大写 LOWER() 将参数转为小写 |
SUBSTR() SUBSTRING() | SUBSTR(str, pos) 截取 pos 以及之后的所有字符 SUBSTR(str, pos, len) 截取 pos 处开始长度为 len 的字符 |
INSTR() | INSERT(str, substr) 返回 substr 在 str 中第一次的索引,若无索引返回0 |
TRIM() | TRIM(str) 去掉 str 两端空格 TRIM(str1 FROM str2) 去掉 str2 两端的 str1 字符 |
LPAD() RPAD() | LPAD / RPAD(str, len, padstr) 在 str 左端/右端填充 padstr 字符,直到 str 长度变为 len,若 str 本身超过 len 长度,则从左往右截取长度为 len 的字符串 |
REPLACE() | REPLACE(str, from_str, to_str) 将 str 中所有 from_str 替换为 to_str |
- 数学函数
函数 | 用法及作用 |
---|---|
ROUND() | ROUND(X) 四舍五入 ROUND(X, D) X保留D位小数 |
CELL() | CELL(X) 返回大于等于X的最小整数(向上取整) |
FLOOR() | FLOOR(X) 返回小于等于X的最大整数(向下取整) |
MOD() | MOD(m, n) 取余 m%n |
- 日期函数
函数 | 用法及作用 |
---|---|
NOW() | 返回当前系统日期+时间 |
CURDATE() | 返回当前系统日期 |
CURTIME() | 返回当前系统时间 |
YEAR() MONTH() DAY() HOUR() MINUTE() SECOND() | YEAR(NOW()) YEAR('2020-1-1') 返回年/月/日/时/分/秒 MONTHNAME() 返回月的英文 |
STR_TO_DATE() | STR_TO_DATE(str, format) 将指定日期格式的字符转换标准格式 STR_TO_DATE('1-1-2020', '%m-%d-%Y'); |
DATEDIFF() | DATEDIFF(startdate, enddate) 返回两个日期之间相差天数 如:DATEDIFF('2008-12-29', '2008-12-30')结果为-1 |
格式符 | 功能 |
---|---|
%Y | 四位年份 |
%y | 2位年份 |
%m | 月份(01, 02 ... 11, 12) |
%c | 月份(1, 2, ... 11, 12) |
%d | 日(01, 02, ...) |
%H | 小时(24小时制) |
%h | 小时(12小时制) |
%i | 分钟(00, 01 ... 59) |
%s | 秒(00, 01, ... 59) |
- 其他函数
函数 | 用法及作用 |
---|---|
VERSION() | 返回当前版本 |
USER() | 返回当前用户 |
ISNULL() | IFNULL(XXX, 值) 判断字段或表达式是否为NULL,若为NULL返回指定值,否则返回原本值 |
ISNULL() | 判断字段或表达式是否为NULL,NULL返回1,否则返回0 |
五、分组函数
- 分组函数(统计函数)
函数 | 用法及作用 |
---|---|
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
COUNT() | 计算非空值个数 COUNT(*)/COUNT(任意常量) 统计行数 效率: MYSISAM 存储引擎,COUNT(*)的效率高 INNODB存储引擎,COUNT(*)和COUNT(1)基本相同,但比COUNT(字段)效率高 |
六、分组查询
- GROUP BY 语法
SELECT 查询列表 FROM 表GROUP BY 分组列表[HAVING 筛选条件]/* HAVING 可用于分组后数据筛选 */
- 特点
分组前筛选用 WHERE 放 GROUP BY 前面
分组后筛选用 HAVING 放 GROUP BY 后面支持单个字段分组,多个字段分组(逗号隔开),表达式分组
七、连接查询
连接查询又称多表查询
笛卡尔乘积现象:表1 m 行 表2 n 行,结果 m*n 行
发生原因:没有有效的连接条件连接查询分类
按年代分类 按功能分类 sql92 标准:内连接 内连接:
等值连接
非等值连接
自连接sql99 标准:
MySQL支持 内连接、外连接(左外 右外)、交叉连接外连接:
左外连接
右外连接
全外连接交叉连接(笛卡尔积)
SQL92 标准
- 等值连接
- 特点
(1) 多表等值连接结果为多表的交集部分
(2) n表连接至少需要n-1个连接条件
(3) 一般需要为表起别名
(4) 可以使用筛选、排序、分组等
(5) 多表顺序无要求
案例:查询员工名、工种号、工种名
SELECT e.job_id, j.job_id, j.job_titleFROM employees e, jobs jWHERE e.job_id = j.job_id;
- 非等值连接
案例:查询员工的工资和工资级别
SELECT salary, grade_levelFROM employees e, job_grades gWHERE salary BETWEEN g.lowest AND g.highest;
- 自连接
- 特点:一张表当作多张表使用(用别名)
案例:查询员工及其领导名字
SELECT e.name 员工, m.name 领导FROM employees e, employees mWHERE e.`manager_id` IS NOT NULLAND e.`manager_id` = m.`employee_id`
SQL99 标准
- SQL99 语法
SELECT 查询列表FROM 表1 别名 [连接类型]JOIN 表2 别名ON 连接条件[WHERE 筛选条件]
- 连接类型
分类 | 连接类型 |
---|---|
内连接 | INNER |
外连接 | 左外:LEFT [OUTER] 右外:RIGHT [OUTER] 全外:FULL [OUTER] |
交叉连接 | CROSS |
- 内连接
- 特点:
(1) INNER 可以省略
(2) JOIN 连接和 SQL92 标准中连接效果一样
(3) 连接条件放 ON 后面
(4) 除连接写法不同外,其他同 SQL92
案例:查询员工及其领导名字(自连接)
SELECT e.name 员工, m.name 领导FROM employees e, employees mWHERE e.`manager_id` IS NOT NULLAND e.`manager_id` = m.`employee_id`
- 外连接
应用场景:查询一个表中有,另一个表中无的记录(相对补集)
- 特点:
(1) 外连接分主从表
(2) 外连接的查询结果为主表的所有记录
若从表中有与主表相匹配的,则显示匹配值,否则显示NULL
(3) 左外连接:LEFT JOIN 左边为主表
右外连接:RIGHT JOIN 右边为主表
- 交叉连接
查询结果即笛卡尔乘积
八、子查询
含义
出现在其他语句中的 SELECT 语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询分类
按结果集的行列数
分类 | 结果集 |
---|---|
标量子查询 | 一行一列 |
列子查询 | 一行多列 |
行子查询 | 一行多列 |
表子查询 | 多行多列 |
按子查询出现位置
出现位置 | 支持类型 |
---|---|
SELECT 后面 | 标量子查询 |
FROM 后面 | 表子查询 |
WHERE 或 HAVING 后面 | 标量子查询(单行) 列子查询(多行) |
EXISTS 后面(相关子查询) | 表子查询 |
- 子查询优先于主查询
- 子查询放在小括号内
- 子查询一般放在条件的右侧
- 标量子查询,一般搭配单行操作符使用 > < = 等
- 列子查询,一般搭配多行操作符使用 IN ANY/SOME ALL
多行比较操作符 | 作用 |
---|---|
IN / NOT IN | 等于(不等于)列表中的任意一个值 |
ANY / SOME | 和子查询返回的某一个值比较 |
ALL | 和子查询返回的所有值比较 |
- WHERE 或 HAVING 后面
- 标量子查询(单行子查询)
案例:查询比 Abel 工资高的员工
SELECT * FROM employeesWHERE salary > ( SELECT salary FROM employees WHERE last_name='Abel');
- 列子查询(多行子查询)
案例:返回 location_id 为1400或1700的部门的员工
SELECT name FROM employeesWHERE department_id IN ( SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400, 1700));
- 行子查询(多列子查询)
案例:查询 id 最小且工资最高的员工
SELECT * FROM employeesWHERE (employee_id, salary) = ( SELECT MIN(employee_id), MAX(salary) FROM employees);
- SELECT 后面
- 标量子查询
案例:查询每个部门信息及其员工个数
SELECT d.*, ( SELECT COUNT(*) FROM employees e WHERE e.department_id = d.department_id)FROM departments d;
- FROM 后面
- 表子查询:将查询结果作为一张表,必须起别名
案例:查询每个部门平均工资的工资等级
SELECT ag_dep.*, g.grade_levelFROM ( SELECT AVG(salary) ag, department_id FROM employees GROUP BY department_id) ag_dep # 此处必须为表起别名INNER JOIN job_grades gON ag_dep.ag BETWEEN g.lowest AND g.highest;
- EXISTS 后面
- 结果不为空 返回 1 结果为空 返回 0
案例:查询有员工的部门
SELECT department_nameFROM departments dWHERE EXISTS( SELECT * FROM employees e WHERE d.department_id = e.department_id);/* 注:EXISTS 通常可用 IN 替代 */
九、分页查询
应用场景:当显示数据一页显示不全,需要分页提交sql请求
- LIMIT 语法
SELECT 查询列表 FROM 表...LIMIT offset, size;/* 注:offset: 起始索引(从0开始) size: 每页条目数 */
- 特点
- LIMIT 语句放在所有语句的后面
- 要显示的页数 page,每页条目数 size
offset = (page-1)*size
十、联合查询
应用场景:查询结果来自多个表,查询信息一致
- UNION 语法
查询语句1UNION查询语句2UNION.../* 默认去重,使用 UNION ALL 显示重复项 */
- 特点
- 要求查询语句结果列数一致
- 要求查询语句的每一列类型和顺序一致
- UNION 默认去重,使用 UNION ALL 可包含重复项
DML 语言
含义:数据操作语言 Data Manipularion Language
一、插入语句
- INSERT 语法
语法一:
INSERT INTO 表[(字段1, ...)] VALUES(值1, ...);
(1) 插入的值类型与字段的类型一致或兼容
(2) 不可为NULL的列必须插入值
(3) 列的顺序可以调换
(4) 列数和值数必须一致
(5) 可以省略字段,默认为所有列,字段顺序和表中顺序一致
语法二:
INSERT INTO 表 SET 字段1 = 值1, …, 字段n = 值n;
两种方式对比:
- 语法一支持多行插入,语法二不支持
VALUES(...), (...), (...)
- 语法一支持子查询,可插入查询结果,语法二不支持
INSERT INTO 表(字段, ...) SELECT ...;
二、修改语句
- 修改单表记录
UPDATE 表 SET 字段1 = 新值, 字段2 = 新值, ...[WHERE 筛选条件]
- 修改多表记录
/* SQL99 */UPDATE 表1 别名连接类型 JOIN 表2 别名ON 连接条件SET 字段 = 新值, ...[WHERE 筛选条件]
三、删除语句
- DELETE 语法
DELETE FROM 表 [WHERE 筛选条件]/* 多表删除类似于 UPDATE */
- TRUNCATE 语法
TRUNCATE TABLE 表; # 清空表中数据
- DELETE 与 TRUNCATE 对比
- DELETE 可以加 WHERE 条件,TRUNCATE 不能加
- TRUNCATE 删除效率略高于 DELETE
- 若要删除的表中有自增长列,DELETE 删除后再插入数据,自增长列的值从断点开始;TRUNCATE 删除后,再插入数据,自增长从1开始
- DELETE 有返回值(有几行受影响),TRUNCATE 无返回值
- DELETE 删除在事务中能回滚,TRUNCATE 删除不能回滚
DDL 语言
含义:数据定义语言 Data Definition Language
一、库的管理
- 库的创建
CREATE DATABASE 库;CREATE DATABASE IF NOT EXISTS 库; # 防止重复创建报错
- 库的修改
/* 一般库不进行修改 */ALTER DATABASE 库 CHARACTER SET 字符集; # 修改字符集
- 库的删除
DROP DATABASE 库; DROP DATABASE IF EXISTS 库; # 防止不存在时删除报错
二、表的管理
- 表的创建
CREATE TABLE 表( 字段 字段类型 [长度 约束], …);
- 表的修改
/* 修改表名 */ALTER TABLE 表 RENAME TO 新表名;/* 修改字段名 (COLUMN 可以省略,同时可更改字段类型)*/ALTER TABLE 表 CHANGE COLUMN 字段 新字段 字段类型; /* 修改字段名 */ALTER TABLE 表 MODIFY COLUMN 字段 新类型 [约束];/* 添加字段 */ALTER TABLE 表 ADD COLUMN 字段 类型;/* 删除字段 */ALTER TABLE 表 DROP COLUMN 字段;
- 表的删除
/* 表的删除 */DROP TABLE 表;DROP TABLE IF EXISTS 表;
- 表的复制
/* 复制表的结构 */CREATE TABLE 表 LIKE 复制的表;/* 复制表的部分结构 */CREATE TABLE 表SELECT 字段1, 字段2, …FROM 复制的表WHERE 不成立的条件(如0)/* 复制表的结构和数据 */CREATE TABLE 表SELECT * # 可以复制全部或部分数据FROM 复制的表
三、常见数据类型
- 数值型
整型
整数类型 | 字节 | 范围 |
---|---|---|
TINYINT | 1 | 有符号:-128~127 无符号:0~255 |
SMALLINT | 2 | 有符号:-32768~32767 无符号:0~65535 |
MEDIUMINT | 3 | 有符号:-8388608~8388607 无符号:0~1677215 |
INT / INTEGER | 4 | 有符号:-8388608~8388607 无符号:0~1677215 |
BIGINT | 8 | 很大 |
- 特点:
(1) 类型后加 UNSIGNED 可设置为无符号
(2) 若不设置长度,则使用默认长度
(3) 长度代表显示的最大宽度,若不够使用0左填充,使用 ZEROFILL 可以显示填充的0(使用了 ZEROFILL 会变为无符号)
小数
浮点数类型 | 字节 | 范围 |
---|---|---|
FLOAT(M, D) | 4 | 很大 |
DOUBLE(M, D) | 8 | 很大 精度比 FLOAT 高 |
浮点数类型 | 字节 | 范围 |
---|---|---|
DEC(M, D) DECIMAL(M,D) | M+2 | 最大取值范围同 DOUBLE,有效取值范围由M和D决定 |
- 特点:
(1) M:整数位数+小数位数 D:小数位数
(2) (M, D) 可省略, DECIMAL 的 M 默认为10,D 默认为0
(3) 定点型精确度较高,插入数据精度要求高则优先定点型
- 字符型
较短字符串
字符串类型 | 最多字节数 | 描述及存储需求 |
---|---|---|
CHAR(M) | M | M 为0~255之间整数 |
VARCHAR(M) | M | M为0~65535之间整数 |
特点:
(1) M 代表最大字符数(非字节数)
(2) CHAR 为固定长度字符串 效率高,VARCHAR 可变长度字符串 效率低
(3) CHAR 的 M 可省略,默认为1,VARCHAR 的 M 不可省略其他:
(1) TEXT 用于较长文本
(2) BLOB 用于较大二进制(如图片)
(3) BINARY 和 VARBINARY 用于较短二进制
(4) ENUM 用于保存枚举
(5) SET 用于保存集合
- 日期型
日期和时间类型 | 字节 | 范围 |
---|---|---|
DATE | 4 | |
DATETIME | 8 | |
TIMESTAMP | 4 | 19700101080001-2038年某个时间 |
TIME | 3 | |
YEAR | 1 |
- 特点:
TIMESTAMP 和实际时区有关,更能反应实际的日期,DATETIME 则只能反应出插入时的当地时区,TIMESTAMP 受MySQL 版本和 SQLMode 的影响很大
四、常见约束
约束:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性
- 约束分类
约束 | 作用 |
---|---|
NOT NULL | 非空,该字段不能为空 |
DEFAULT | 默认,该字段值有默认值 |
PRIMARY KEY | 主键,该字段值有唯一性且非空 |
FOREIGN KEY | 外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值 |
UNIQUE | 唯一键,该字段值有唯一性,可为空 |
CHECK | 检查,mysql 不支持 |
外键
(1) 要求在从表上设置外键
(2) 主表的关联列必须是一个key(主键或唯一)
(3) 插入数据时,先插入主表再插入从表,删除时先删除从表再删除主表主键与唯一键
唯一性 | 是否允许为空 | 一个表中数量 | |
---|---|---|---|
主键 | √ | 否 | 至多1个 |
唯一键 | √ | 是 | 可以多个 |
- 标识列
- 又称为又称为自增长列,可以不用手动插入值,系统提供默认的序列值
设置标识列:AUTO_INCREMENT
更改标识列步长:SET auto_increment_increment = 值
- 特点
(1) 标识列必须和Key一起使用
(2) 一个表中最多一个标识列
(3) 标识列的类型只能是数值型
(4) 可设置步长,手动插入值设置起始值
- 约束添加分类
列级约束
在创建或求改表时类型的后面添加,六个约束语法上都支持,但外键约束无效果
表级约束
在所有字段最下面,非空和默认不支持表级约束
[CONSTRAINT 约束名] 约束类型(字段);/* 不设置约束名时默认为字段名,主键设置约束名无效果 *//* 添加外键 */ALTER TABLE 从表 ADD CONSTRAINT 外键名FOREIGN KEY(字段) REFERENCES 主表(字段);
CREATE TABLE 表名( 字段名 字段类型 列级约束, 字段名 字段类型 列级约束, 表级约束);
- 约束的修改与删除
修改 / 添加
/* 列级约束 */ALTER TABLE 表 MODIFY COLUMN 字段 类型 约束;/* 表级约束 */ALTER TABLE 表 ADD [CONSTRAINT 约束名] 约束(字段);
删除
/* 删除非空 */ALTER TABLE 表 MODIFY COLUMN 字段 类型 NULL;/* 删除默认 */ALTER TABLE 表 MODIFY COLUMN 字段 类型;/* 删除主键 */ALTER TABLE 表 DROP PRIMARY KEY;/* 删除唯一键 */ALTER TABLE 表 DROP INDEX 字段;/* 删除外键 */ALTER TABLE 表 DROP FOREIGN KEY 外键名;
- 级联删除与置空
级联删除:
在添加外键语句后添加ON DELETE CASCADE
设置级联删除
删除主表记录的同时删除从表相关联记录
级联置空:
在添加外键语句后添加ON DELETE SET NULL
设置级联置空
删除主表记录的同时将从表相关联记录的值置为 NULL
TCL 语言
含义:事务控制语言 Transaction Control Language
一、事务
- 事务概念
- 事务:事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的
- 存储引擎
- 存储引擎:mysql中用的最多的存储引擎有:innodb, myisam, memory等,其中innodb支持事务,其他不支持
- 事务特性(ACID)
- 原子性(Atomicity):一个事务不可再分割,要么执行要么都不执行
- 一致性(Consistency):一个事务执行会使数据从一个一致状态切换到另一个一致状态
- 隔离性(Isolation):一个事务的执一个事务一旦提交,则会永久改变数据库行不受到其他事务的干扰
- 持久性(Durability):一个事务一旦提交,则会永久改变数据库
二、事务处理
- 事务创建
隐式事务
- 事务没有明显的开启和结束的标记,自动提交 如:insert update delete语句
显式事务
- 前提必须先设置自动提交功能为禁用
SET autocommit = 0
/* 步骤1:开启事务 */SET autocommit = 0;START TRANSACTION; # 此语句可省略/* 步骤2:编写事务中的 SQL 语句如 SELECT INSERT UPDATE DELETE etc. *//* 步骤3:结束事务(提交或回滚) */COMMIT; # 提交事务ROLLBACK; # 回滚事务
SAVEPOINT的使用:
事务中可设置保存点用于回滚
SAVEPOINT a; # 设置保存点 aROLLBACK TO a; # 回滚到保存点 a
- 并发问题
- 同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
(1) 脏读
(2) 不可重复读
(3) 幻读
- 事务隔离级别
隔离级别 | 描述 |
---|---|
READ UNCOMMMITTED (读未提交数据) | 允许事务读取违背其他事务提交的变更。脏读、不可重复读和幻读问题都会出现 |
READ COMMITED (读已提交数据) | 只允许事务读取已被其他事务提交的变更。可以避免脏读,但不可重复读和幻读问题仍然可能出现 |
REPEATABLE READ (可重复读) | 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读,但幻读问题仍然存在 |
SERIALIZABLE (串行化) | 确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有并发问题都可以避免,但性能十分低下 |
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
READ UNCOMMITTED | √ | √ | √ |
READ COMMITTED | × | √ | √ |
REPEATABLE READ | × | × | √ |
SERIALIZABLE | × | × | × |
设置当前 mysql 连接的隔离级别SET TRANSACTION ISOLATION LEVEL 隔离级别;
设置数据库系统的全局隔离级别SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
- 注意
(1) Mysql 默认的事务隔离级别为:REPEATABLE READ(可重复读)
(2) 每启动一个 mysql 程序,就会获得一个单独的数据库连接。每个数据库连接都有一个全局变量 @@transaction_isolation 表示当前的事务隔离级别
视图
含义:虚拟表(只保存 sql 逻辑),和普通表一样使用。mysql5.1 版本后的新特性,是通过表动态生成的数据
- 应用场景
(1) 多个地方用到同样的查询结果
(2) 该查询结果使用的sql语句较复杂
一、VIEW 语法
/* 创建方式一 */CREATE VIEW 视图名 AS 查询语句;/* 创建方式二 */ALTER VIEW 视图名 AS 查询语句;/* 修改视图 */CREATE OR REPLACE VIEW 视图名 AS 查询语句;/* 删除视图 */DROP VIEW 视图名, 视图名, …;/* 查看视图 */DESC 视图名; # 查看结构SHOW CREATE VIEW 视图名; # 查看创建过程/* 注:视图创建后和表使用方式相同 */
变量
一、变量分类
系统变量:全局变量 会话变量
自定义变量:用户变量 局部变量
二、系统变量
由系统提供,属于服务器层面
查看所有系统变量
SHOW GLOBAL VARIABLES;
SHOW [SESSION] VARIABLES;
查看满足条件的系统变量
可使用LIKE
进行筛选查看指定的某个系统变量的值
会话SELECT @@[SESSION.]系统变量名;
全局SELEC @@GLOBAL.系统变量;
为某个系统变量赋值
SET GLOBAL/[SESSION]系统变量=值;
SET @@GLOBAL/[SESSION].系统变量=值;
注:全局级别需要加GLOBAL,会话级别加SESSION,两者都不加默认会话级别
会话变量:
仅仅作用于当前会话(连接)
全局变量:
作用于所有会话,服务器每次启动时将为所有全局变量赋初始值
三、自定义变量
- 用户变量
作用于当前会话(连接),同会话变量作用域
/* 声明并初始化 */SET @用户变量名 = 值SET @用户变量名 := 值SELECT @用户变量名 := 值/* 赋值(更新变量值) */SELECT 字段 INTO 变量名 FROM 表/* 也可用声明初始化方式赋值 */
- 局部变量
仅仅在定义它的 begin end 中有效,应用在 begin end 第一句话
/* 声明 */DECLARE 变量名 类型;DECLARE 变量名 类型 DEFALT 值;/* 赋值 */SELECT 字段 INTO 变量名 FROM 表;SET 变量名 = 值SET 变量名 := 值SELECT 变量名 := 值
存储过程与函数
一、存储过程
含义:一组预先编译好的SQL语句的集合
- 作用
(1) 提高代码重用性
(2) 简化操作
(3) 减少了编译次数并且减少了和数据库服务器的连接次数,调高效率
- PROCEDURE 语法
/* 创建存储过程 */CREATE PROCEDURE 存储过程名(参数列表)BEGIN 存储过程体END/* 调用存储过程 */CALL 存储过程名(实参列表);/* 删除存储过程 */DROP PROCEDURE 存储过程名;/* 查看存储过程信息 */SHOW CREATE PROCEDURE 存储过程名;
- 参数列表
参数参数列表包含三部分 参数模式 参数名 参数类型
参数模式 | 描述 |
---|---|
IN | 该参数可以作为输入(需要传入值) |
OUT | 该参数可以作为输出(可以作为返回值) (OUT 变量名 类型) |
INOUT | 该参数既可作为输入,又可作为输出 (INOUT 变量名 类型) |
- 注意
(1) 若存储过程体仅有一句话,BEGIN END可以省略
(2) 存储过程体中的每条SQL语句结尾必须加分号
(3) 可以使用DELIMITER 结束标记
重新设置存储过程结尾的结束标记
二、函数
- FUNCTION 语法
/* 创建函数 */CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型BEGIN 函数体END/* 调用函数 */SELECT 函数名(参数列表)/* 删除函数 */DROP FUNCTION 函数名;/* 查看函数信息 */SHOW CREATE FUNCTION 函数名;
- 函数与存储过程对比
- 存储过程:可以有0个返回,也可以多个返回,适合做批量插入,批量更新
- 函数:有且仅有一个返回,适合做处理数据后返回一个结果
流程控制结构
一、分支结构
- IF 函数
功能:简单的双分支
语法:IF(表达式1, 表达式2, 表达式3)
若表达式1成立则返回表达式2,否则返回表达式3
- IF 结构
功能:实现多重分支
语法:
IF 条件1 THEN 语句1;ELSEIF 条件2 THEN 语句2;...ELSE 语句n;END IF;
- 特点:只能在 BEGIN END 中使用
- CASE 结构
功能:类似java的switch语句,实现等值判断;类似java的多重if语句,实现区间判断
语法:
CASE 变量/表达式/字段WHEN 判断的值 THEN 返回值1 或 语句…ELSE 返回值n 或 语句END CASE;
- 特点
(1) 可以作为表达式,嵌套其他语句使用,可以放任何地方
(2) 可以作为独立语句使用,只能放在BEGIN END中
(3) ELSE可省略
二、循环结构
分类:
WHILE LOOP REPEAT
循环控制:ITERATE(类似continue)LEAVE(类似于break)
- 循环结构语法
/* WHILE 先判断后执行 */[标签:] WHILE 循环条件 DO 循环体;END WHILE [标签];/* LOOP 死循环 */[标签:] LOOP 循环体;END LOOP[标签];/* REPEAT 先执行后判断 */[标签:]REPEAT 循环体;UNTIL 结束循环条件END REPEAT [标签];/* 以上循环都需要在 BEGIN END 中 */
原文转载:http://www.shaoqun.com/a/679740.html
贝恩投资公司:https://www.ikjzd.com/w/1336
cima:https://www.ikjzd.com/w/1372
基本一、常见概念DD:数据库,存储数据的容器DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DBSQL:结构化查询语言,用于和数据库通信的语言二、MySQL语法规范不区分大小写,简答关键字大写每条命令最好用分号结尾每条命令根据需要,可以缩进或者换行注释格式单行注释:#注释文字单行注释:--注释文字多行注释:/*注释文字*/三、服务启动/登录MySQL服务启动与停止启动服务:n
parenthood:https://www.ikjzd.com/w/2497
派代:https://www.ikjzd.com/w/2197
黑石集团:https://www.ikjzd.com/w/1339.html
突发!欧洲站补税潮来了!已有卖家因漏缴被封号!:https://www.ikjzd.com/home/135913
亚马逊FBA仓与第三方海外仓的区别之处:https://www.ikjzd.com/home/11774
医院护士对我很温柔 口述我和护士的一次特殊情缘:http://www.30bags.com/m/a/250340.html