百木园-与人分享,
就是让自己快乐。

MySQL基础笔记

基本

一、常见概念

  • 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 表; # 用AS
    SELECT 字段 别名 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_title
    FROM employees e, jobs j
    WHERE e.job_id = j.job_id;

  • 非等值连接
  • 案例:查询员工的工资和工资级别

    SELECT salary, grade_level
    FROM employees e, job_grades g
    WHERE salary BETWEEN g.lowest AND g.highest;

  • 自连接
    • 特点:一张表当作多张表使用(用别名)

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

    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 标准

  • 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 m
    WHERE e.`manager_id` IS NOT NULL
    AND 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 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
    );

  • SELECT 后面
    • 标量子查询
      案例:查询每个部门信息及其员工个数

    SELECT d.*, (
    SELECT COUNT(*)
    FROM employees e
    WHERE e.department_id = d.department_id
    )
    FROM departments d;

  • 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;

  • 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请求

  • LIMIT 语法
  • SELECT 查询列表 FROM 表
    ...
    LIMIT offset, size;
    /* 注:offset: 起始索引(从0开始) size: 每页条目数 */

  • 特点
    • LIMIT 语句放在所有语句的后面
    • 要显示的页数 page,每页条目数 size
      offset = (page-1)*size

    十、联合查询

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

  • UNION 语法
  • 查询语句1
    UNION
    查询语句2
    UNION
    ...
    /* 默认去重,使用 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; # 设置保存点 a
    ROLLBACK 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 中 */

    来源:https://www.cnblogs.com/WindChenCC/p/14642038.html
    图文来源于网络,如有侵权请联系删除。

    未经允许不得转载:百木园 » MySQL基础笔记

    相关推荐

    • 暂无文章