后台-插件-广告管理-内容页广告位一(手机)

您现在的位置是:首页 > 开发类 > 数据库数据库

MySQL基础笔记

2021-04-18 18:35:30数据库人已围观

简介基本
一、常见概念

DD:数据库,存储数据的容器
DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理 DB
SQL:结构化查询语言,用于和数据库通信的语言

二、MySQL语

基本

一、常见概念

  1. DD:数据库,存储数据的容器
  2. DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理 DB
  3. SQL:结构化查询语言,用于和数据库通信的语言

二、MySQL语法规范

  1. 不区分大小写,简答关键字大写
  2. 每条命令最好用分号结尾
  3. 每条命令根据需要,可以缩进或者换行
  4. 注释格式
单行注释:#注释文字
单行注释:--注释文字
多行注释:/*注释文字*/

三、服务启动/登录

  1. MySQL服务启动与停止
启动服务:net start 服务名
停止服务:net stop 服务名
  1. 服务的登录和退出
退出: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

    特点

    1. 查询列表可以是:字段、常量值、表达式、函数
    2. 查询结果是一个虚拟表格
  1. 查询字段
SELECT 字段 FROM 表;		 # 查询单个字段
SELECT 字段1, 字段2 FROM 表; # 查询多个字段
SELECT * FROM 表;		   # 查询所有字段
/* 注:`XX`(着重号,非单引号)代表XX为字段名 */
  1. 查询常量值、表达式、函数
SELECT 常量值/表达式/函数;
/* 例子 */
SELECT 100;
SELECT 100%3;
SELECT VERSION();
  1. 起别名

(1) 便于理解
(2) 查询字段若有重名可以用别名区分

SELECT 字段 AS 别名 FROM 表;		# 用AS
SELECT 字段 别名 FROM 表;		# 用空格
/* 注:别名含有特殊符号或关键字时,添加双引号或单引号 */
  1. 结果去重

字段前加 DISTINCT 即可结果去重

SELECT DISTINCT 字段 FROM 表;
  1. +号作用

(1) 两个操作数都为数值型做加法运算
(2) 其中一个为 NULL 则结果为 NULL
(3) 其中一个为字符型,则视图转换为数值型

SELECT '12'+1;		# 转换成功做加法运算
SELECT 'A'+1;		# 转换失败,将字符型转换成0

二、条件查询

  1. WHERE 语法
SELECT 查询列表 FORM 表 WHERE 筛选条件
  1. 分类
  • 按条件表达式筛选
    条件运算符:> < = != <> >= <=

  • 按表达式筛选
    逻辑运算符:&& || ! 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和普通数值 */

三、排序查询

  1. ORDER BY 语法
SELECT 字段 FROM 表 [WHERE 条件] 
ORDER BY 排序列表 ASC|DESC
/* ASC 升序  DESC 降序  不写默认升序 */
  1. 特点
  • 排序列表可以是表达式或函数
  • 排序列表可设置多个,按列表先后顺序排序
  • 排序列表可写别名
  • ODER BY 语句在其他语句后面 LIMIT 语句前面

四、常见函数

  1. 字符函数
函数 用法及作用 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
  1. 数学函数
函数 用法及作用 ROUND() ROUND(X) 四舍五入
ROUND(X, D) X保留D位小数 CELL() CELL(X) 返回大于等于X的最小整数(向上取整) FLOOR() FLOOR(X) 返回小于等于X的最大整数(向下取整) MOD() MOD(m, n) 取余 m%n
  1. 日期函数
函数 用法及作用 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)
  1. 其他函数
函数 用法及作用 VERSION() 返回当前版本 USER() 返回当前用户 ISNULL() IFNULL(XXX, 值)
判断字段或表达式是否为NULL,若为NULL返回指定值,否则返回原本值 ISNULL() 判断字段或表达式是否为NULL,NULL返回1,否则返回0

五、分组函数

  1. 分组函数(统计函数)
函数 用法及作用 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 COUNT() 计算非空值个数
COUNT(*)/COUNT(任意常量) 统计行数
效率:
MYSISAM 存储引擎,COUNT(*)的效率高
INNODB存储引擎,COUNT(*)和COUNT(1)基本相同,但比COUNT(字段)效率高

六、分组查询

  1. GROUP BY 语法
SELECT 查询列表 FROM 表
GROUP BY 分组列表
[HAVING 筛选条件]
/* HAVING 可用于分组后数据筛选 */
  1. 特点
  • 分组前筛选用 WHERE 放 GROUP BY 前面
    分组后筛选用 HAVING 放 GROUP BY 后面

  • 支持单个字段分组,多个字段分组(逗号隔开),表达式分组


七、连接查询

  • 连接查询又称多表查询

  • 笛卡尔乘积现象:表1 m 行 表2 n 行,结果 m*n 行
    发生原因:没有有效的连接条件

  • 连接查询分类

    按年代分类 按功能分类 sql92 标准:内连接 内连接:
    等值连接
    非等值连接
    自连接 sql99 标准:
    MySQL支持 内连接、外连接(左外 右外)、交叉连接 外连接:
    左外连接
    右外连接
    全外连接 交叉连接(笛卡尔积)

SQL92 标准

  1. 等值连接
  • 特点
    (1) 多表等值连接结果为多表的交集部分
    (2) n表连接至少需要n-1个连接条件
    (3) 一般需要为表起别名
    (4) 可以使用筛选、排序、分组等
    (5) 多表顺序无要求

案例:查询员工名、工种号、工种名

SELECT e.job_id, j.job_id, j.job_title
FROM employees e, jobs j
WHERE e.job_id = j.job_id;
  1. 非等值连接

案例:查询员工的工资和工资级别

SELECT salary, grade_level
FROM employees e, job_grades g
WHERE salary BETWEEN g.lowest AND g.highest;
  1. 自连接
  • 特点:一张表当作多张表使用(用别名)

案例:查询员工及其领导名字

SELECT e.name 员工, m.name 领导
FROM employees e, employees m
WHERE e.`manager_id` IS NOT NULL
AND e.`manager_id` = m.`employee_id`

SQL99 标准

  1. SQL99 语法
SELECT 查询列表
FROM 表1 别名 [连接类型]
JOIN 表2 别名
ON 连接条件
[WHERE 筛选条件]
  1. 连接类型
分类 连接类型 内连接 INNER 外连接 左外:LEFT [OUTER]
右外:RIGHT [OUTER]
全外:FULL [OUTER] 交叉连接 CROSS
  1. 内连接
  • 特点:
    (1) INNER 可以省略
    (2) JOIN 连接和 SQL92 标准中连接效果一样
    (3) 连接条件放 ON 后面
    (4) 除连接写法不同外,其他同 SQL92

案例:查询员工及其领导名字(自连接)

SELECT e.name 员工, m.name 领导
FROM employees e, employees m
WHERE e.`manager_id` IS NOT NULL
AND e.`manager_id` = m.`employee_id`
  1. 外连接

应用场景:查询一个表中有,另一个表中无的记录(相对补集)

  • 特点:
    (1) 外连接分主从表
    (2) 外连接的查询结果为主表的所有记录
    若从表中有与主表相匹配的,则显示匹配值,否则显示NULL
    (3) 左外连接:LEFT JOIN 左边为主表
    右外连接:RIGHT JOIN 右边为主表
  1. 交叉连接

查询结果即笛卡尔乘积

八、子查询

  • 含义
    出现在其他语句中的 SELECT 语句,称为子查询或内查询
    外部的查询语句,称为主查询或外查询

  • 分类

按结果集的行列数

分类 结果集 标量子查询 一行一列 列子查询 一行多列 行子查询 一行多列 表子查询 多行多列

按子查询出现位置

出现位置 支持类型 SELECT 后面 标量子查询 FROM 后面 表子查询 WHERE 或 HAVING 后面 标量子查询(单行)
列子查询(多行) EXISTS 后面(相关子查询) 表子查询
  • 子查询优先于主查询
  • 子查询放在小括号内
  • 子查询一般放在条件的右侧
  • 标量子查询,一般搭配单行操作符使用 > < = 等
  • 列子查询,一般搭配多行操作符使用 IN ANY/SOME ALL
多行比较操作符 作用 IN / NOT IN 等于(不等于)列表中的任意一个值 ANY / SOME 和子查询返回的某一个值比较 ALL 和子查询返回的所有值比较
  1. WHERE 或 HAVING 后面
  • 标量子查询(单行子查询)
    案例:查询比 Abel 工资高的员工
SELECT * FROM employees
WHERE salary > (
	SELECT salary
	FROM employees
	WHERE last_name='Abel'
);
  • 列子查询(多行子查询)
    案例:返回 location_id 为1400或1700的部门的员工
SELECT name FROM employees
WHERE department_id IN (
	SELECT DISTINCT department_id
	FROM departments
	WHERE location_id IN(1400, 1700)
);
  • 行子查询(多列子查询)
    案例:查询 id 最小且工资最高的员工
SELECT * FROM employees
WHERE (employee_id, salary) = (
	SELECT MIN(employee_id), MAX(salary)
	FROM employees
);
  1. SELECT 后面
  • 标量子查询
    案例:查询每个部门信息及其员工个数
SELECT d.*, (
	SELECT COUNT(*)
	FROM employees e
	WHERE e.department_id = d.department_id
)
FROM departments d;
  1. FROM 后面
  • 表子查询:将查询结果作为一张表,必须起别名

案例:查询每个部门平均工资的工资等级

SELECT ag_dep.*, g.grade_level
FROM (
	SELECT AVG(salary) ag, department_id
	FROM employees
	GROUP BY department_id
) ag_dep	# 此处必须为表起别名
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN g.lowest AND g.highest;
  1. EXISTS 后面
  • 结果不为空 返回 1 结果为空 返回 0
    案例:查询有员工的部门
SELECT department_name
FROM departments d
WHERE EXISTS(
	SELECT *
	FROM employees e
	WHERE d.department_id = e.department_id
);
/* 注:EXISTS 通常可用 IN 替代 */

九、分页查询

应用场景:当显示数据一页显示不全,需要分页提交sql请求

  1. LIMIT 语法
SELECT 查询列表 FROM 表
...
LIMIT offset, size;
/* 注:offset: 起始索引(从0开始) size: 每页条目数 */
  1. 特点
  • LIMIT 语句放在所有语句的后面
  • 要显示的页数 page,每页条目数 size
    offset = (page-1)*size

十、联合查询

应用场景:查询结果来自多个表,查询信息一致

  1. UNION 语法
查询语句1
UNION
查询语句2
UNION
...
/* 默认去重,使用 UNION ALL 显示重复项 */
  1. 特点
  • 要求查询语句结果列数一致
  • 要求查询语句的每一列类型和顺序一致
  • UNION 默认去重,使用 UNION ALL 可包含重复项

DML 语言

含义:数据操作语言 Data Manipularion Language

一、插入语句

  1. INSERT 语法

语法一:

INSERT INTO 表[(字段1, ...)] VALUES(值1, ...);

(1) 插入的值类型与字段的类型一致或兼容
(2) 不可为NULL的列必须插入值
(3) 列的顺序可以调换
(4) 列数和值数必须一致
(5) 可以省略字段,默认为所有列,字段顺序和表中顺序一致

语法二:

INSERT INTO 表 SET 字段1 = 值1, …, 字段n = 值n;

两种方式对比:

  • 语法一支持多行插入,语法二不支持
    VALUES(...), (...), (...)
  • 语法一支持子查询,可插入查询结果,语法二不支持
    INSERT INTO 表(字段, ...) SELECT ...;

二、修改语句

  1. 修改单表记录
UPDATE 表 SET 字段1 = 新值, 字段2 = 新值, ...
[WHERE 筛选条件]
  1. 修改多表记录
/* SQL99 */
UPDATE 表1 别名
连接类型 JOIN 表2 别名
ON 连接条件
SET 字段 = 新值, ...
[WHERE 筛选条件]

三、删除语句

  1. DELETE 语法
DELETE FROM 表 [WHERE 筛选条件]
/* 多表删除类似于 UPDATE */
  1. TRUNCATE 语法
TRUNCATE TABLE 表; # 清空表中数据
  1. DELETE 与 TRUNCATE 对比
  • DELETE 可以加 WHERE 条件,TRUNCATE 不能加
  • TRUNCATE 删除效率略高于 DELETE
  • 若要删除的表中有自增长列,DELETE 删除后再插入数据,自增长列的值从断点开始;TRUNCATE 删除后,再插入数据,自增长从1开始
  • DELETE 有返回值(有几行受影响),TRUNCATE 无返回值
  • DELETE 删除在事务中能回滚,TRUNCATE 删除不能回滚

DDL 语言

含义:数据定义语言 Data Definition Language

一、库的管理

  1. 库的创建
CREATE DATABASE 库;
CREATE DATABASE IF NOT EXISTS 库; # 防止重复创建报错
  1. 库的修改
/* 一般库不进行修改 */
ALTER DATABASE 库 CHARACTER SET 字符集; # 修改字符集
  1. 库的删除
DROP DATABASE 库; 
DROP DATABASE IF EXISTS 库; # 防止不存在时删除报错

二、表的管理

  1. 表的创建
CREATE TABLE 表(
    字段 字段类型 [长度 约束],  
    …
);
  1. 表的修改
/* 修改表名 */
ALTER TABLE 表 RENAME TO 新表名;
/* 修改字段名 (COLUMN 可以省略,同时可更改字段类型)*/
ALTER TABLE 表 CHANGE COLUMN 字段 新字段 字段类型; 
/* 修改字段名 */
ALTER TABLE 表 MODIFY COLUMN 字段 新类型 [约束];
/* 添加字段 */
ALTER TABLE 表 ADD COLUMN 字段 类型;
/* 删除字段 */
ALTER TABLE 表 DROP COLUMN 字段;
  1. 表的删除
/* 表的删除 */
DROP TABLE 表;
DROP TABLE IF EXISTS 表;
  1. 表的复制
/* 复制表的结构 */
CREATE TABLE 表 LIKE 复制的表;
/* 复制表的部分结构 */
CREATE TABLE 表
SELECT 字段1, 字段2, …
FROM 复制的表
WHERE 不成立的条件(如0)
/* 复制表的结构和数据 */
CREATE TABLE 表
SELECT *     # 可以复制全部或部分数据
FROM 复制的表    

三、常见数据类型

  1. 数值型

整型

整数类型 字节 范围 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) 定点型精确度较高,插入数据精度要求高则优先定点型
  1. 字符型

较短字符串

字符串类型 最多字节数 描述及存储需求 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 用于保存集合

  1. 日期型
日期和时间类型 字节 范围 DATE 4 DATETIME 8 TIMESTAMP 4 19700101080001-2038年某个时间 TIME 3 YEAR 1
  • 特点:
    TIMESTAMP 和实际时区有关,更能反应实际的日期,DATETIME 则只能反应出插入时的当地时区,TIMESTAMP 受MySQL 版本和 SQLMode 的影响很大

四、常见约束

约束:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性

  1. 约束分类
约束 作用 NOT NULL 非空,该字段不能为空 DEFAULT 默认,该字段值有默认值 PRIMARY KEY 主键,该字段值有唯一性且非空 FOREIGN KEY 外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值 UNIQUE 唯一键,该字段值有唯一性,可为空 CHECK 检查,mysql 不支持
  • 外键
    (1) 要求在从表上设置外键
    (2) 主表的关联列必须是一个key(主键或唯一)
    (3) 插入数据时,先插入主表再插入从表,删除时先删除从表再删除主表

  • 主键与唯一键

唯一性 是否允许为空 一个表中数量 主键 √ 否 至多1个 唯一键 √ 是 可以多个
  1. 标识列
  • 又称为又称为自增长列,可以不用手动插入值,系统提供默认的序列值

设置标识列:AUTO_INCREMENT

更改标识列步长:SET auto_increment_increment = 值

  • 特点
    (1) 标识列必须和Key一起使用
    (2) 一个表中最多一个标识列
    (3) 标识列的类型只能是数值型
    (4) 可设置步长,手动插入值设置起始值
  1. 约束添加分类

列级约束

在创建或求改表时类型的后面添加,六个约束语法上都支持,但外键约束无效果

表级约束

在所有字段最下面,非空和默认不支持表级约束

[CONSTRAINT 约束名] 约束类型(字段);
/* 不设置约束名时默认为字段名,主键设置约束名无效果 */
/* 添加外键 */
ALTER TABLE 从表 ADD CONSTRAINT 外键名
FOREIGN KEY(字段) REFERENCES 主表(字段);
CREATE TABLE 表名(
	字段名 字段类型 列级约束,
	字段名 字段类型 列级约束,
	表级约束
);
  1. 约束的修改与删除

修改 / 添加

/* 列级约束 */
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 外键名;
  1. 级联删除与置空

级联删除:
在添加外键语句后添加ON DELETE CASCADE设置级联删除
删除主表记录的同时删除从表相关联记录

级联置空:
在添加外键语句后添加ON DELETE SET NULL设置级联置空
删除主表记录的同时将从表相关联记录的值置为 NULL


TCL 语言

含义:事务控制语言 Transaction Control Language

一、事务

  1. 事务概念
  • 事务:事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的
  1. 存储引擎
  • 存储引擎:mysql中用的最多的存储引擎有:innodb, myisam, memory等,其中innodb支持事务,其他不支持
  1. 事务特性(ACID)
  • 原子性(Atomicity):一个事务不可再分割,要么执行要么都不执行
  • 一致性(Consistency):一个事务执行会使数据从一个一致状态切换到另一个一致状态
  • 隔离性(Isolation):一个事务的执一个事务一旦提交,则会永久改变数据库行不受到其他事务的干扰
  • 持久性(Durability):一个事务一旦提交,则会永久改变数据库

二、事务处理

  1. 事务创建

隐式事务

  • 事务没有明显的开启和结束的标记,自动提交 如: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;  # 设置保存点 a
ROLLBACK TO a;  # 回滚到保存点 a
  1. 并发问题
  • 同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
    (1) 脏读
    (2) 不可重复读
    (3) 幻读
  1. 事务隔离级别
隔离级别 描述 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,两者都不加默认会话级别
会话变量:
仅仅作用于当前会话(连接)
全局变量:
作用于所有会话,服务器每次启动时将为所有全局变量赋初始值

三、自定义变量

  1. 用户变量

作用于当前会话(连接),同会话变量作用域

/* 声明并初始化 */
SET @用户变量名 = 值
SET @用户变量名 := 值
SELECT @用户变量名 := 值

/* 赋值(更新变量值) */
SELECT 字段 INTO 变量名 FROM 表
/* 也可用声明初始化方式赋值 */
  1. 局部变量

仅仅在定义它的 begin end 中有效,应用在 begin end 第一句话

/* 声明 */
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFALT 值;

/* 赋值 */
SELECT 字段 INTO 变量名 FROM 表;
SET 变量名 = 值
SET 变量名 := 值
SELECT 变量名 := 值

存储过程与函数

一、存储过程

含义:一组预先编译好的SQL语句的集合

  • 作用
    (1) 提高代码重用性
    (2) 简化操作
    (3) 减少了编译次数并且减少了和数据库服务器的连接次数,调高效率
  1. PROCEDURE 语法
/* 创建存储过程 */
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
  存储过程体
END

/* 调用存储过程 */
CALL 存储过程名(实参列表);

/* 删除存储过程 */
DROP PROCEDURE 存储过程名;

/* 查看存储过程信息 */
SHOW CREATE PROCEDURE 存储过程名;
  • 参数列表
    参数参数列表包含三部分 参数模式 参数名 参数类型
参数模式 描述 IN 该参数可以作为输入(需要传入值) OUT 该参数可以作为输出(可以作为返回值)
(OUT 变量名 类型) INOUT 该参数既可作为输入,又可作为输出
(INOUT 变量名 类型)
  • 注意
    (1) 若存储过程体仅有一句话,BEGIN END可以省略
    (2) 存储过程体中的每条SQL语句结尾必须加分号
    (3) 可以使用 DELIMITER 结束标记 重新设置存储过程结尾的结束标记

二、函数

  1. FUNCTION 语法
/* 创建函数 */
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
  函数体
END

/* 调用函数 */
SELECT 函数名(参数列表)

/* 删除函数 */
DROP FUNCTION 函数名;

/* 查看函数信息 */
SHOW CREATE FUNCTION 函数名;
  1. 函数与存储过程对比
  • 存储过程:可以有0个返回,也可以多个返回,适合做批量插入,批量更新
  • 函数:有且仅有一个返回,适合做处理数据后返回一个结果

流程控制结构

一、分支结构

  1. IF 函数

功能:简单的双分支

语法:IF(表达式1, 表达式2, 表达式3)
若表达式1成立则返回表达式2,否则返回表达式3

  1. IF 结构

功能:实现多重分支

语法:

IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
ELSE 语句n;
END IF;
  • 特点:只能在 BEGIN END 中使用
  1. 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)

  1. 循环结构语法
/* WHILE 先判断后执行 */
[标签:] WHILE 循环条件 DO
  循环体;
END WHILE [标签];

/* LOOP 死循环 */
[标签:] LOOP 
  循环体;
END LOOP[标签];

/* REPEAT 先执行后判断 */
[标签:]REPEAT
  循环体;
UNTIL 结束循环条件
END REPEAT [标签];

/* 以上循环都需要在 BEGIN END 中 */

文章来源:查看

Tags:基础   笔记   MySQL

很赞哦! ()

后台-插件-广告管理-内容页广告位二(手机)

相关文章

后台-插件-广告管理-内容页广告位三(手机)

随机图文

后台-插件-广告管理-内容页广告位四(手机)

文章评论

留言与评论(共有 0 条评论)
   
验证码:

本栏推荐

站点信息

  • 文章统计13614篇文章
  • 浏览统计468次浏览
  • 评论统计1个评论
  • 标签管理标签云
  • 统计数据:统计代码
  • 微信公众号:扫描二维码,关注我们