MySQL数据库学习总结


MySQL学习总结


概述

  • MySQL属于数据库的一种,他被称为关系型数据库
  • MySQL数据是一种C/S模型,即客户端和服务端模型。客户端通过账号,密码连接服务器,连接成功后才可以进行数据操作(增删改查CRUD)
  • MySQL的服务端采用的是 IO复用+可伸缩的线程池,实现了网络高并发的经典模型

常用名词

  • 实体:现实世界中客观存在并可以被区别的事物,这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,例如“老师与学校的关系”
  • 属性:“实体所具有的某一特性”,属性一开始是个逻辑概念,在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”
  • 元组:表中的一行就是一个元组
  • 分量:元组的某个属性值
  • 码(键):表中可以唯一确定一个元组的某个属性(或者属性组)
  • 候选码(候选键): 能唯一标识关系中元组的一个属性或者属性集,称为候选码(候选键)
  • 主码(主键):若一个关系中有多个候选码,从候选码中选择一个作为CRUD元组的操作变量,这个候选码称为主码(主键)
  • 全码:如果一个码包含了所有的属性,这个码就是全码
  • 主属性:包含在主码中的各个属性就是主属性
  • 非主属性:没有在任何候选码中出现过,这个属性就是非主属性
  • 外码(外键):一个属性(或属性组),它不是当前表的主码,是另一个表的码,对当前表来说就是外码

数据库范式

  • 范式:在关系模式的分解中,函数依赖有很重要的作用,分解这些依赖后,衡量的标准就是范式(NF)
  • 好处:减少数据冗余、消除异常、让数据组织的更加和谐
  • 作用:进行数据库设计时字段、库表划分的依据
  • 分类
    • 第一范式 1NF:数据库中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性,如果出现重复的属性则需要重新构建实体,新的实体由重复的属性构成,不满足第一范式不能称之为关系型数据库
    • 第二范式 2NF:数据库的每个实例或行必须可以被唯一的区分,即表中要有一列属性可以将实体完全区分,这个属性就是主键,即每一个属性完全依赖于主键
      • 完全依赖概念:即非主属性不能依赖于主键的部分属性,必须依赖于主键的所有属性
    • 第三范式 3NF:数据库表中不包含已在其他表中已包含的非主关键字信息
    • 满足第三范式必须先满足第二范式,满足第二范式必须先满足第一范式

注释

  • 单行注释 : – 注释内容(注释与符号后需要一个空格)
  • 多行注释 : /* 注释内容 */
  • MySQL注释 : #注释内容

分类

  • DDL 数据定义语言 ------- 操作库与表
  • DML 数据操作语言 ------- 数据增删改操作
  • DQL 数据查询语言 ------- 数据查询
  • DCL 数据控制语言 ------- 操作权限
  • TCL 事务控制语句 ------- 操作事务

与非关系型数据库区别

  • 存储方式不同
    ①关系型数据库:采用关系模型来管理、存储数据的数据库,以便于用户理解的行与列组成数据表
    ②非关系型数据库:解决大规模集合数据的多重数据种类,常以key-value形式存储
  • 扩展性:关系<非关系
  • 稳定性:关系>非关系
  • 对大数据处理:非关系型数据库更好

DDL

操作库
  • 创建数据库
    • CREATE DATABASE [IF NOT EXISTS] 数据库名;
  • 设置数据库编码集
    • CREATE DATABASE 数据库名 CHARACTER SET 编码集;
  • 修改数据库的字符集
    • ALTER DATABASE 数据库名 CHARACTER SET 编码集;
  • 删除数据库(操作前需先备份)
    • DROP DATABASE [IF EXISTS] 数据库名;
  • 显示所有数据库
    • SHOW DATABASES;
  • 显示指定数据库的详细信息
    • SHOW CREATE DATABASE 数据库名;
  • 使用指定数据库
    • USE 数据库名;
  • 查询正在使用的数据库
    • SELECT DATABASE();
操作表
  • 创建表
    • CREATE TABLE 表名{
        列名1 数据类型,
        列名1 数据类型,
        …
      };
  • 添加新的字段(列)
    • ALTER TABLE 表名 ADD COLUMN 列名 数据类型;
  • 修改表的编码集
    • ALTER TABLE 表名 CHERACTER SET 编码集;
  • 修改表名
    • ALTER TABLE 表名 RENAME TO 新表名;
  • 修改列名,数据类型
    • ALTER TABLE 表名 CHANGE COLUMN 原列名 新列名 新类型;
  • 修改数据类型
    • ALTER TABLE 表名 MODIFY COLUMN 列名 新类型;
  • 查询当前数据库所有表
    • SHOW TABLES;
  • 查询表结构
    • DESC 表名;
  • 查询表创建的具体语句
    • SHOW CREATE TABLE 表名;
  • 删除表
    • DROP TABLE [IF EXISTS] 表名;
  • 删除列
    • ALTER TABLE 表名 DROP COLUMN 列名;
  • 复制表结构
    • CREATE TABLE 表名 LIKE 原表名;
  • 复制表
    • CREATE TABLE 表名 SELECT 查询列表 FROM 原表名 WHERE 筛选条件;
常见的数据类型
  • 数值型
    • 整形
      • Tinyint 一个字节
      • Int 四个字节
      • 默认有符号,UNSIGNED设置无符号
      • int(4) ZEROFILL 设置长度为4不足在前补0
    • 浮点型
      • float(M,D) 四个字节
      • double(M,D) 八个字节
      • M表示位数,D表小数占位数
    • 定点型
      • DECIMAL(M,D)/DEC(M,D) m+2个字节
      • 默认(10,0)
  • 字符型
    • char(M)
      • M表最大字符数,默认为1,可省略
      • 固定长度字符
    • varchar(M)
      • M表最大字符数,默认为1,不可省略
      • 可变长字符
    • text/blob
      • 存储较长文本
      • 扩展:LONGTEXT>MEDIUMTEXT>TEXT
    • ENUM(A,B,…)
      • 表只可存储特定值
    • Set(A,B,…)
      • 可存储特定值,一次可存储多个值
  • 日期值
    • date 四个字节,只保存日期
    • time 三个字节,只保存时间
    • year 一个字节,只保存年份
    • datatime 八个字节,保存日期与时间,范围1000-9999
    • timestamp 时间戳,四个字节,保存日期与时间,范围1970-2038,默认系统时间
常见约束
  • PRIMARY KEY : 主键
    • 用于保持该字段唯一且非空
    • 联合主键:PRIMARY KEY(字段1,字段2…)
  • FOREIGN KEY : 外键
    • 用于限制两个表的关系,保证该字段必须来自主表的关联列的值
    • 外键名定义格式: fk_主表名_从表名_字段名
    • 级联操作:主从表同时操作
      开启级联删除 ON DELETE CASCADE [SET NULL]
      开启级联更新 ON UPDATE CASCADE
      MySQL8开始支持SET NULL表示删除后值为null,若插入外键表的字段主键表中不存在则插入失败
    • 注:删除表的时候必须先删除外键表,再删除主键表
  • NOT NULL : 非空
    • 用于保持该字段不能为空
  • UNIQUE : 唯一
    • 用于保持该字段唯一
  • DEFAULT : 默认
    • 用于保证该字段有默认值
  • CHECK(检查值) : 检查
    • MySQL8开始支持
    • 格式:
      ①列名 类型 CHECK(列名 值限定)
      ②[CONSTRAINT 约束名] CHECK(列名 值限定)
  • 分类
    • 列级约束:
      • 包含在列定义中,放在该列的其他定义之后,用空格分隔,不必指定列名,是对某个特定列的约束
      • 支持主键,唯一,默认,非空,外键,检查
    • 表级约束:
      • 不包含在列定义中,与列定义相互独立,与定义用’,'分隔,通常用于对多个列进行约束
      • 支持主键,唯一,外键,检查
  • 添加
    • 添加列级约束:ALTER TABLE 表名 MODIFY COLUMN 列名 类型 新约束;
    • 添加表级约束:ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型(字段名) [REFERENCES 主表(主表字段)//外键的引用];
  • 删除列级约束
    • 删除主键:ALTER TABLE 表名 DROP PRIMARY KEY;
    • 删除唯一键:ALTER TABLE 表名 DROP INDEX 列名;
    • 删除外键:ALTER TABLE 表名 DROP FOREIGN KEY(外键字段);
    • 删除非空约束:
      ①ALTER TABLE 表名 MODIFY COLUMN 列名 类型;
      ②ALTER TABLE 表名 MODIFY COLUMN 列名 类型 NULL;
    • 删除默认约束:
      ①ALTER TABLE 表名 MODIFY COLUMN 列名 类型;
      ②ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;
-- 通用写法:
CREATE TABLE IF EXISTS 表名(
	id INT PRIMARY KEY,
	stuname VARCHAR(20) NOT NULL,
	sex CHAR(1),
	age INT DEFAULT 18,
	seat INT UNIQUE,
	majorid INT,
	CONSTRAINT 外键名 FOREIGN KEY(从表字段) REFERENCES 主表(主表字段)
)
  • 标识列(自增长列)
    • 在字段后添加 AUTO_INCREMENT 关键字
    • 与主键或唯一键搭配
    • 只能有一列为标识列且为数值型
    • SET AUTO_INCREMENT_INCREMENT 数值;//修改步幅
    • 设置标识列
      ALTER TABLE 表名 MODIFY COLUMN 列名 新类型 约束 AUTO_INCREMENT;
    • 删除标识列
      ALTER TABLE 表名 MODIFY COLUMN 列名 新类型 约束;

DML

插入语句
  • 方式一
    • 向表中插入一条数据
      • INSERT INTO 表名 VALUES (字段值1,字段值2,…);
    • 向表中指定字段插入数据
      • INSERT INTO 表名(字段名1,字段名2,…) VALUES (字段值1,字段值2,…);
    • 向表中指定字段插入多条数据
      • INSERT INTO 表名(字段名1,字段名2,…)
        VALUES (字段值1,字段值2,…),(字段值1,字段值2,…),…;
  • 方式二
    • 向表中插入一条数据
      • INSERT INTO 表名 SET 列名1=字段值1,列名2=字段值2,…;
  • 方式三
    • 向表中插入多条数据(表二查出的字段顺序要与表一相同)
      • INSERT INTO 表名(字段名1,字段名2,…) SELECT * FROM 表名2
修改语句
  • 修改单表中指定列的值
    • UPDATE 表名 SET 列名1=值,列名2=值,…;
  • 根据条件修改单表中指定列的值
    • UPDATE 表名 SET 列名1=值,列名2=值,… WHERE 条件;
  • 修改多表中指定列的值
    • sql92
      • UPDATE 表1 别名,表2 别名
        SET 列名1=值,列名2=值,…
        WHERE 连接条件 AND 筛选条件;
    • sql99
      • UPDATE 表1 别名
        INNER| LEFT|RIGHT JOIN 表2 别名
        ON 连接条件
        SET 列名1=值,列名2=值,…
        WHERE 筛选条件;
删除语句
  • 删除表中所有数据(保留表结构)
    • DELETE FROM 表名 [WHERE 条件];
  • 清空表中数据
    • TRUNCATE TABLE 表名;
  • 删除多表
    • sql92
      • DELETE 别名1,别名2
        FROM 表1 别名,表2 别名
        WHERE 连接条件 AND 筛选条件;
    • sql99
      • DELETE 别名1,别名2
        FROM 表1 别名
        INNER| LEFT|RIGHT JOIN 表2 别名
        ON 连接条件
        WHERE 筛选条件;

DQL

基础查询
  • 查询指定表中所有字段和数据信息
    • SELECT * FROM 表名;
  • 查询指定字段的数据
    • SELECT 字段1,字段2… FROM 表名;
  • 查询指定字段的不重复数据
    • SELECT DISTINCT 字段 FROM 表名;
条件查询
  • 单个条件查询
    • SELECT 字段 FROM 表名 WHERE 条件;
  • 多个条件查询
    • SELECT 字段 FROM 表名 WHERE 条件 逻辑运算符 条件;
  • 补充:
    ①起别名两种方式:(别名中有特殊符号要给别名加双引号)
      1.原列名 AS 别名
      2.原列名 别名
    ②字段可为常量,表达式,函数(字段是关键字时使用~转换为普通字符[例: ~ YEAR ~ ])
    ③数据库中的运算符
      1.算数运算符 :+、-、*、/(若操作数一方为字符型,则进行转换,不成功字符转换为0,若操作数一方为NULL,则结果必为NULL)
      2.关系运算符:=、>、>=、<、<=、<> 不等于、!= 不等于
      3.逻辑运算符:
       ①BETWEEN…AND…(两个相同字段的数值型条件且包含临界值)
       ②…AND…(两个及以上的任意字段)
       ③…OR…(不同字段)
       ④IN(X,Y…)或NOT IN(X,Y…) (相同字段):等于列表中的任意一个
       ⑤ANY(X,Y…)或SOME(X,Y…):比较列表中的某一个
       ⑥ALL(X,Y…):比较列表中的所有值
       ⑦… IS NULL或… IS NOT NULL(判断是否为null)
       ⑧NOT:表非
      4.安全等于:<=>(既可以判断null又可以判断普通数值)
模糊查询
  • 使用关键字LIKE
    • SELECT * FROM 表名 WHERE 字段 LIKE ‘通配符’;
  • 通配符
    • _ : 代表单个字符
    • % : 代表任意多个字符
  • 通配符变普通字符
    • 在通配符前加转义字符\
    • 自定义转义字符 ESCAPE ‘字符’
排序查询
  • 语法
    • SELECT * FROM 表名 [WHERE 筛选条件]
      ORDER BY 排序列表 [asc|desc];
    • 默认升序asc 即从小到大排列
  • ORDER BY子句可支持单个字段,多个字段,表达式,函数,别名
常见函数
  • 字符函数
    • 获取参数值的字节个数
      • LENGTH(‘字符’)
    • 拼接字符串
      • CONCAT(参数一,参数二,…)
    • 大小写变换
      • UPPER(‘字符’) LOWER(‘字符’)
    • 截取指定字符长度的字符串,sql索引从1开始
      • SUBSTR(‘字符’,起始索引)
      • SUBSTR(‘字符’,开始索引,结束索引)
    • 获取子串第一次出现的索引,若无则返回0
      • INSTR(‘字符’,‘子字符’)
    • 去除字符前后指定字符
      • TRIM(’ 字符 ') : 去前后空格
      • TRIM(‘子字符’ FROM ‘字符’) : 去除子字符
    • 用指定字符左填充指定长度
      • LPAD(‘原字符’,返回字符的长度,‘指定字符’)
      • 返回字符长度若小于原字符则截断
    • 用指定字符右填充指定长度
      • RPAD(‘原字符’,返回字符的长度,‘指定字符’)
      • 返回字符长度若小于原字符则截断
    • 指定字符替换
      • REPLACE(‘原字符’,‘替换字符’,‘指定字符’)
  • 数学函数
    • 四舍五入函数
      • ROUND(数值型)
      • ROUND(数值型,保留位数)
      • 注:若(数值型+0.5),表示只入不舍,若(数值型-0.5),表示只舍不入
    • 向上取整,获取>=该数值的最小整数
      • CEIL(数值型)
    • 向下取整,获取<=该数值的最大整数
      • FLOOR(数值型)
    • 截断
      • TRUNCATE(小数,小数点后保留位数)
    • 取余
      • MOD(被除数,除数)
      • 例MOD(a,b) : a-a/b*b
  • 日期函数
    • 获取当前系统日期与时间
      • NEW()/SYSDATE()
    • 获取当前系统日期
      • CURDATE()
    • 获取当前系统时间
      • CURTIME()
    • 获取年份,月份,日期等
      • YEAR(‘日期字段’)
      • MONTH(‘日期字段’)
      • DAY(‘日期字段’)
      • HOUR(‘日期字段’)
      • MINUTE(‘日期字段’)
      • SECOND(‘日期字段’)
      • MONTHNAME(‘日期字段’)月份英文名
    • 增加时间值
      • DATE_ADD(‘日期字段’,INTERVAL 数值型 TYPE)
      • 数值型为正整数表示增加时间,负整数表示减少时间,小数会自动转为整数
      • TYPE为YEAR等日期关键字
    • 将日期格式的字符串转换成日期时间类型
      • STR_TO_DATE(‘str’,‘format’)
      • 格式说明 : %Y 四位的年份、%y 两位的年份、%m 补0的月份、%c 不补0月份、%d 日期、%H 24小时制、%h 12小时制、%i 分钟、%s 秒
    • 将日期类型转换成指定格式的日期时间类型
      • DATE_FORMAT(‘date’,‘format’)
  • 其他函数
    • 版本号 : VERSION()
    • 当前数据库 : DATABASE()
    • 当前用户 : USER()
    • 替换null值 : IFNULL(字段,替换值)
  • 分组函数
    • SUM()求和、AVG()平均值、MAX()最大值、MIN()最小值、COUNT()总数
    • SUM与AVG一般用于处理数值型
    • MAX MIN COUNT可处理任何类型
    • 以上分组函数都忽略null值
    • 可以与DISTINCT搭配去重后计算
    • 解决忽略null值:①使用*号等特殊符号代替指定字段、②使用IFNULL()处理、③使用常量值代替指定字段(相当于在每行加一个常量在统计常量个数)
    • 与分组查询搭配使用才有意义
分组查询
  • 语法
    • SELECT 列(要求出现在group by后),分组函数
      FROM 表
      [WHERE 分组前筛选条件]
      GROUP BY 分组的列
      [HAVING 分组后筛选条件]
  • 特点
    • 以分组函数做条件肯定放在having子句中
    • 能用分组前筛选的,就优先考虑分组
    • GROUP BY子句可支持单个字段,多个字段,表达式,函数,别名
连接查询
  • 等值连接(sql92标准)
    • SELECT 查询列表
      FROM 主表名,复表名
      WHERE 主表列名 = 复表列名
      [AND 其他连接条件或筛选条件]
      [其他子句]
    • 一般需为表名起别名,后查询的字段就不能使用原来的表名
    • 连接结果为多表的交集部分
    • 多表顺序无关
  • 非等值连接(sql92标准)
    • SELECT 查询列表
      FROM 主表名,复表名
      WHERE 主表列名 非等于号的其他关系或逻辑运算符 复表列名
      [AND 其他连接条件或筛选条件]
      [其他子句]
  • 自连接(sql92标准)
    • SELECT 查询列表
      FROM 表名
      WHERE 表列名 = 表列名
      [AND 其他连接条件或筛选条件]
      [其他子句]
  • 自然连接(sql99标准)
    • 一种特殊的等值连接,两个表中相同的列(名,含义,类型)进行等值匹配,并且在结果中消除重复的属性列
    • SELECT 查询列表
      FROM 表1名
      NATURAL JOIN 表1名
  • 内连接(sql99标准)
    • SELECT 查询列表
      FROM 表1名 别名
      INNER JOIN 表2名 别名 ON 连接条件(可多个)
      [WHERE 筛选条件]
      [其他子句]
    • INNER 可省略
    • 连接条件中使用’主表列名 = 复表列名’则与等值连接(sql92标准)效果一致
    • 连接条件中使用非等于号的其他关系或逻辑运算符则与非等值连接(sql92标准)效果一致
    • 连接条件中使用’表列名 = 表列名’则与自连接(sql92标准)效果一致
  • 外连接(sql99标准)
    • 特点 : 连接结果为主表的所有记录
    • 左外连接 : LEFT [OUTER] JOIN(左边的表为主表)
    • 右外连接 : RIGHT [OUTER] JOIN(右边的表为主表)
    • 全外连接 : FULL [OUTER] JOIN(左右表都为主表,MySQL目前不支持)
  • 交叉连接(sql99标准)
    • CROSS JOIN(笛卡尔乘积)
    • 相当于SELECT 查询列表 FROM 表名1,…
子查询(查询嵌套)
  • 特点:①子查询放在小括号里
       ②子查询一般放在条件的右侧
       ③标量子查询一般搭配条件运算符,列子查询一般搭配逻辑运算符
       ④优先主查询执行
  • SELECT后放
    • 标量子查询(结果集只有一行一列)
  • FROM后放
    • 表子查询(结果集一般为多行多列)
  • WHERE或HAVING后放
    • 标量子查询(结果集只有一行一列)
    • 列子查询(结果集只有一列多行)
    • 行子查询(结果集有多列)
    • EXISTS后(相关子查询)
      • 表子查询(结果集一般为多行多列)
      • 返回结果0或1
      • 可与IN替换
分页查询
  • 前提:数据过多,分页提交sql请求
  • 语法:
    SELECT 查询列表
    FROM 表
    [JOIN 表2名 别名 ON 连接条件
    WHERE 筛选条件
    GROUP BY 分组字段
    HAVING 分组后筛选条件
    ORDER BY 排序字段
    LIMIT [起始索引,]条目个数];
  • LIMIT放在查询语句最后,只MySQL单独支持,执行顺序FROM→JOIN→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT
  • 公式 : 起始索引=(page-1)*条数
联合查询
  • 使用union关键字将多个查询语句的结果合并成一个结果
  • 语法:查询语句1 UNION 查询语句2 UNION …
  • 特点:多条查询语句的列数一致
    每列的类型和顺序保持一致
    默认去重(UNION ALL不去重)

DCL数据控制语言

  • 查看当前用户权限
    • SELECT * FROM user;
  • 创建用户
    • CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;
  • 删除用户
    • DROP USER ‘用户名’@‘主机名’;
  • 修改密码
    • UPDATE USER SET PASSWORD = PASSWORD(‘新密码’) WHERE USER = ‘用户名’;//普通方式
    • SET PASSWORD FOR ‘用户名’@‘主机名’ = PASSWORD(‘新密码’);//特有的简化方式
  • 查询权限
    • SHOW GRANTS FOR ‘用户名’@‘主机名’;
  • 授予权限
    • GRANT 权限列表 ON 数据库名.表名 TO ‘用户名’@‘主机名’;
    • GRANT ALL ON . TO ‘用户名’@‘主机名’; //使用通配符给用户授予全部权限
  • 撤销权限
    • REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名’@‘主机号’;
    • GRANT ALL ON . FROM ‘用户名’@‘主机号’;//撤销用户对数据库所有权限

TCL事务控制语言

  • 事务特性ACID: 原子性,一致性,隔离性,持久性
  • 事务使用步骤:
    • 1.开启事务SET autocommit = 0;(MySQL5开启事务START TRANSCATION)
      2.编写一组事务语句(设置保存点savepoint 名;)
      3.提交事务commit;(回滚事务rollback 名;回滚到保存点)
  • 并发运行多个事务问题
    • 脏读: T1读取了已经被T2更新但还没有被提交的字段,若T2回滚,T1读取的内容就是临时且无效的
    • 不可重复读: T1读取了一个字段,然后T2更新了该字段,T1再次读取该字段,值不相同了
    • 幻读: T1读取了一个字段,T2在表中插入或删除一行,T1再次读取同一个表,就多出或少了几行
  • 事务隔离级别:
    • READ UNCOMMITTED(读未提交数据),
      READ COMMITED(读已提交数据)—避免脏读,
      REPEATABLE READ(可重复读)默认—避免脏读 不可重复读,
      SERIALIZABLE(串行化)—避免脏读 不可重复读 幻读 性能较差
  • 查看当前隔离级别: SELECT @@tx_isolation;
  • 设置当前连接隔离级别: set transaction isolation level 级别;
  • 设置全局的隔离级别: set global transaction isolation level 级别;

视图

  • 含义:虚拟表,是通过表动态生成的数据
  • 优点:重用sql语句,简化复杂的sql操作,保护数据提高安全性
  • 创建:
    • CREATE VIEW 视图名 AS 查询语句
  • 修改:
    • ①CREATE OR REPLACE VIEW 视图名 AS 查询语句
      ②ALTER VIEW 视图名 AS 查询语句
  • 删除:
    • DROP VIEW 视图名,…;
  • 查看:
    • ①DESC 视图名;
      ②SHOW CREATE VIEW 视图名;
  • 查询:
    • SELECT * FROM 视图名;
  • 视图不建议更新(增删改)
    • 包含以下关键字不允许更新:分组函数,distinct,group by,having,union,union all
    • 增删改语句与操作表相同

索引

  • 分类
    • 主键索引(PRIMARY KEY),唯一索引(UNIQUE),普通索引(缺省),组合索引,全文索引(FULLTEXT),空间索引(SPATIAL)
  • 创建
    • CREATE [索引类型] INDEX 索引名 ON 表名(字段1,字段2…);
    • 索引名:idx_字段名_索引类型
  • 删除
    • DROP INDEX 索引名 ON 表名;
  • 显示索引信息
    • EXPLAIN 查询语句;
    • 查询结果id(查询编号),select_type(查询类型),table(查询表名),type(扫描类型),possible_keys(可能使用的索引),key(真正使用的索引),key_len(索引长度),ref(参考类型),rows(扫描影响的行数),extra(额外的)
  • 查看表的索引
    • SHOW INDEX FROM 表名;
  • 为表添加索引
    • ALTER TABLE 表名 ADD INDEX 索引名(索引长度);
  • 为表删除索引
    • ALTER TABLE 表名 DROP INDEX 索引名;
  • 创建表时添加索引
    • [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY 索引名(字段名[(长度)]);
  • 索引在创建前后使用相同查询语句速度会明显提升,如果一张表小于32列可根据实际创建索引列,若大于等于32列则最大为32列建立索引

分区

  • 分库:将一个数据库分割成多个子数据库

  • 分表:水平方向(横向)①根据安全级别分离表②根据字段类型分离表
    垂直方向(纵向):根据指定的字段或内容分离

  • RANGE分区:按照分区关键字的范围进行分区

    • 格式:
      PARTITION BY RANGE [COLUMNS] (字段)(
      PARTITION 分区名 VALUES LESS THAN(值),//小于等于
      …//MAXVALUE最大值
      );
    • 补充:使用COLUMNS对分区关键字限定,要求分区关键字必须是表中完整的列,当插入不符合分区要求的数据时插入失败
      从所有分区删除所有的数据使用TRUNCATE TABLE命令
      改变表的分区而又不丢失数据使用ALTER TABLE … REORGANIZE PARTITION语句
  • LIST分区:按照列表数据项进行分区

    • 格式:PARTITION BY LIST(字段)(
      PARTITION 分区名 VALUES IN (列表参数),

      );
  • HASH分区:按照分区字段对分区个数取余进行分区

    • 格式:PARTITION BY HASH (字段) PARTITIONS 个数;
  • KEY分区:对HASH分区的优化

    • 格式:PARTITION BY LINEAR KEY (字段) PARTITIONS 个数;
  • 分区管理

    • RANGE分区管理
      • 增加分区:ALTER TABLE 表名 ADD PARTITION (PARTITION 分区名 VALUES LESS THAN (值));
      • 删除分区:ALTER TABLE 表名 DROP PARTITION 分区名;//删除分区会将该分区中的数据同时删除
      • 重新分区:ALTER TABLE 表名 REORGANIZE PARTITION 分区名1[,…] INTO (
        PARTITION 分区名 VALUES LESS THAN (值),

        );
    • LIST分区管理
      • 增加分区:ALTER TABLE 表名 ADD PARTITION (PARTITION 分区名 VALUES IN (列表参数));
      • 删除分区:ALTER TABLE 表名 DROP PARTITION 分区名;//删除分区会将该分区中的数据同时删除
      • 重新分区:ALTER TABLE 表名 REORGANIZE PARTITION 分区名1[,…] INTO (
        PARTITION 分区名 VALUES IN (列表参数),

        );
    • HASH分区与KEY分区管理
      • 扩充:在原有值的基础上加个数
        ALTER TABLE 表名 ADD PARTITION PARTITIONS 个数;
      • 缩减:在原有值的基础上减个数
        ALTER TABLE 表名 COALESCE PARTITION 个数;
    • 其他分区管理
      • 重建分区:ALTER TABLE 表名 REBUILD PARTITION (重建分区名1,重建分区名2…);
      • 优化分区:ALTER TABLE 表名 OPTIMIZE PARTITION (优化分区名1,优化分区名2…);
      • 分析分区:ALTER TABLE 表名 ANALYZE PARTITION (分区名);
      • 维护分区:ALTER TABLE 表名 REPAIR PARTITION (维护分区名1,维护分区名2…);
      • 检查分区:ALTER TABLE 表名 CHECK PARTITION (分区名);
  • 显示每个分区数据量

    • SELECT PARTITION_NAME,TABLE_ROWS
      FROM information_schema.PARTITION
      WHERE TABLE_NAME = ‘表名’;

存储过程与函数

  • 变量
    • 系统变量
      1.由系统提供,不是用户定义,分为全局变量(GLOBAL)和会话变量(SESSION默认),对会话变量操作只对当前会话有效
      2.查看系统变量:
      SHOW [GLOBAL|SESSION] VARIABLES [LIKE ‘%char%’];
      3.查看指定的某个系统变量的值:
      SELECT @@[GLOBAL/SESSION].系统变量名;
      4.为某个系统变量赋值:
      SET [GLOBAL/SESSION] 系统变量名 = 值;
      SET @@[GLOBAL/SESSION].系统变量名 = 值;
    • 自定义变量
      由用户自定义,分为用户变量和局部变量
      • 用户变量(只对当前会话有效)
      1. 声明并初始化
        SET @用户变量名=值;
        [SET|SELECT] @用户变量名:=值;
      2. 赋值
        SET @用户变量名=值;
        [SET|SELECT] @用户变量名:=值;
        SELECT 字段 INTO 用户变量名 FROM 表;
      3. 查看
        SELECT @用户变量名;
      • 局部变量(begin end中有效)
      1. 声明并初始化
        DECLARE 变量名 类型 DEFAULT 值;
      2. 赋值
        SET 局部变量名[=|:=]值;
        SELECT @局部变量名:=值;
        SELECT 字段 INTO 局部变量名 FROM 表;
      3. 查看
        SELECT @用户变量名;
  • 存储过程
    含义:一组预先编译好的SQL语句的集合
    • 创建
      • CREATE PROCEDURE 存储过程名(参数列表)
        BEGIN
          存储过程体
        END
      • 参数列表定义(参数模式 参数名 参数类型)
        参数模式:
          IN:该参数需调用方传值(默认)
          OUT:该参数可以作为返回值
          INOUT:该参数既需要传入值,又可以作为返回值
      • 存储过程体只有一句话时BEGIN END可省略,每条SQL语句结尾必须加分号,可用DELIMITER(语法:DELIMITER 结尾标记)重新设置存储过程的结尾标记来结束存储过程,MySQL8缺陷见到;就结束
    • 删除
      DROP PROCEDURE 存储过程名;(不支持多个同时删除)
    • 查看
      SHOW CREATE PROCEDURE 存储过程名;
    • 调用
      CALL 存储过程名(实参列表);
  • 函数
    特点:有且只有一个返回值,适合做处理数据后返回一个结果的操作,而存储过程适合做批量操作
    • 创建
      • CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
        BEGIN
          函数体
        END
      • 参数列表:参数名 参数类型
      • 要有return语句(return 值;)
      • 函数体只有一句话BEGIN END可省略,每条SQL语句结尾必须加分号,可用DELIMITER(语法:DELIMITER 结尾标记)语句设置结束标记
    • 删除
      DROP FUNCTION 函数名;(不支持多个同时删除)
    • 查看
      SHOW CREATE FUNCTION 函数名;
    • 调用
      SELECT 函数名(参数列表) 结尾标记

触发器

  • 概述:触发器由一个事件来启动运行,即当某个事件发生时自动的隐式运行,触发器不能接收函数
  • 一张表最多有六个触发器
    INSERT BEFORE/AFTER
    UPDATE BEFORE/AFTER
    DELETE BEFORE/AFTER
  • DML触发器格式:
    CREATE [OR REPLACE] TRIGGER 触发器名
    BEFORE|AFTER //事件前触发还是事件后触发
    INSERT|DELETE|UPDATE [OF column [,column…]] //什么事件触发
    ON 表名 //作用在哪个表
    [FOR EACH ROW] //触发器为行级触发器默认为语句级
    [WHEN 触发条件]
    BEGIN
      触发体;
    END

流程控制结构

  • 分支结构
    • IF( 条件 , 成功执行 , 失败执行)
    • IF 条件1 THEN 语句1;
      ELSEIF 条件2 THEN 语句2;

      END IF;
      注:应用在begin end中
    • 类似于JAVA中switch语句
      CASE 变量|字段|表达式
      WHEN 常量1 THEN 要显示的值或[语句;]
      WHEN 常量2 THEN 要显示的值或[语句;]

      ELSE 要显示的值或[语句;]
      END [CASE];
      注:若ELSE省略WHEN条件都不满足,则返回null
    • 类似于JAVA中多重if语句
      CASE
      WHEN 条件1 THEN 要显示的值或[语句;]
      WHEN 条件2 THEN 要显示的值或[语句;]

      ELSE 要显示的值或[语句;]
      END [CASE];
      注:若ELSE省略WHEN条件都不满足,则返回null
  • 循环结构(应用在begin end中)
    • 先判断后执行(类似于JAVA中while循环语句)
      [别名:]WHILE 循环条件
      DO 循环体
      END WHILE [别名];
    • 先执行后判断(类似于JAVA中do…while循环语句)
      [别名:]REPEAT 循环体
      UNTIL 结束条件
      END REPEAT [别名];
    • 没有条件的死循环(类似于JAVA中for循环语句)
      [别名:]LOOP
      循环体
      END LOOP [别名];
    • 循环控制
      ITERATE (类似于JAVA中continue)
      LEAVE (类似于JAVA中break)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值