学习笔记 —— MySQL 基础知识点整理 DML、DDL、DCL

MySQL 基础

MySQL 数据库基础学习参考:学习教程 —— 以实战案例方式逐丝剥茧学习 MySQL基础及知识点归纳

数据库操作

  • 连接数据库:mysql -u root -p <****>
  • 选择数据库:use ;
  • 查看数据库:show databases;
  • 查看告警源:show warnings;
  • 查看编码式:show create database ;
  • 数据库端口:show global variables like ‘port’;
  • 退出数据库:exit;
  • 新增数据库:CREATE DATABASE ; - 用于创建一个名为 的数据库
  • 修改数据库:ALTER DATABASE ; - 用于修改一个名为 的数据库
  • 删除数据库:DROP DATABASE ; - 用来删除一个名为 的数据库

数据类型

数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型

分为三类:数值类型、日期/时间类型、字符串类型

数值类型

类型 大小 用途
TINYINT 1 字节 小整数值
SMALLINT 2 字节 大整数值
MEDIUMINT 3 字节 大整数值
INT或INTEGER 4 字节 大整数值
BIGINT 8 字节 极大整数值
FLOAT 4 字节 单精度浮点数
DOUBLE 8 字节 双精度浮点数
DECIMAL DECIMAL(M, D) 小数值

日期和时间类型

类型 大小 格式 用途
DATE 3 YYYY-MM-DD 日期值
TIME 3 HH:MM:SS 时间值或持续时间
YEAR 1 YYYY 年份值
DATETIME 8 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 8 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535字节 变长字符串
TINYBLOB 0-255字节 不超过255个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65535字节 二进制形式的长文本数据
TEXT 0-65535字节 长文本数据
MEDIUMBLOB 0-16777215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16777215字节 中等长度文本数据
LONGBLOB 0-4294967295字节 二进制形式的极大文本数据
LONGTEXT 0-4294967295字节 极大文本数据

语法规范

  • 关键字与函数名称全部大写
  • 数据库名称、表名称、字段名称全部小写
  • SQL 语句必须以分号结尾
  • 使用关键字命名数据库、表、字段名称使用时,必须通过反引号包括

数据表操作

  • 创建数据表:CREATE TABLE (column_name column_type, …);
  DROP TABLE IF EXISTS `user`;
  CREATE TABLE IF NOT EXISTS `user` (
  	`id` INT(8) UNSIGNED AUTO_INCREMENT,
  	`username` VARCHAR(20) NOT NULL UNIQUE KEY COMMENT '账号',
  	`password` VARCHAR(40) NOT NULL COMMENT '密码',
  	PRIMARY KEY (`id`)
  ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;

  DROP TABLE IF EXISTS `person`;
  CREATE TABLE IF NOT EXISTS `person` (
  	`id` INT(8) UNSIGNED AUTO_INCREMENT,
  	`sex` VARCHAR(1) NOT NULL DEFAULT '男' COMMENT '性别',
  	`realname` VARCHAR(10) NOT NULL COMMENT '姓名',
  	`birthday` DATE NOT NULL COMMENT '出生日期',
  	`userid` INT(8) UNSIGNED NOT NULL,
  	PRIMARY KEY (`id`)
  ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
    • IF EXISTS 判断当前只有存在才执行
    • IF NOT EXISTS 判断当前只有不存在才执行
    • UNSIGNED 表示当前数值类型为无符号位
    • NOT NULL 表示当前字段非空,主键字段自动设置为 NOT NULL
    • AUTO_INCREMENT 表示当前字段自增操作,必须与主键使用
    • UNIQUE KEY 表示当前字段的值不能重复出现,可用于用户注册时,检测账户是否已存在
    • PRIMARY KEY (id) 表示 id 为主键,用于关联其他表
    • DEFAULT ‘男’ 设置当前字段默认值
    • COMMENT ‘性别’ 设置字段注释说明描述
    • ENGINE = InnoDB 表示数据表的存储引擎为 InnoDB
    • AUTO_INCREMENT = 1 表示数据表的自增量从 1 开始
    • CHARSET = utf8 表示数据表的编码格式为 utf-8 模式
  • 删除数据表:DROP TABLE ;

  • 插入数据表:INSERT INTI (field, …) VALUES (value, …);

    • id 是自增型,插入数据时不需要传值
    • 字段涉及到关键词需要使用反引号包括(``)
    • 存在默认值字段传值空的话会使用默认值
  • 多条数据插入可以共用一个 INSERT INTO,多个录入数据之间使用逗号隔开

  • 查询数据表:SELECT field, … FROM ;

  • 查询表过滤:在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据,也可以使用 GROUP BY 读取表中不重复数据来达到过滤重复

  • 查看表结构:SHOW COLUMNS FROM ;

  • 查看表创建:SHOW CREATE TABLE ;

  • 查看表索引:SHOW INDEXES FROM ;

  • 更新数据表:UPDATE SET field = newVal, …;

  • 更换表数据:REPLACE INTO (field, …) VALUES (value, …);

    • 基于 id 主键判断,存在则效果相当于更新数据 UPDATE
    • 基于 id 主键判断,不存在则效果相当于插入数据 INSERT
  • 清空数据表:DELETE FROM ;

  • 表数据导入:在老旧项目升级开发中,项目中的表格数据大多都是多表联合查询的结果,那么就需要通过数据转移来到处数据

    PS:剔出原数据中的一些相关数据(例如类型、品牌等),提高效率,需要通过 INSERT - SELECT 或 CREATE - SELECT 来智能录入
    DROP TABLE IF EXISTS `course`;
    CREATE TABLE IF NOT EXISTS `course` (
    	`id` INT(8) UNSIGNED AUTO_INCREMENT,
    	`tellscore` INT(2) UNSIGNED NOT NULL COMMENT '语文考分',
    	`fatescore` INT(2) UNSIGNED NOT NULL COMMENT '数学考分',
    	`heroscore` INT(2) UNSIGNED NOT NULL COMMENT '英语考分',
    	PRIMARY KEY (`id`)
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
    INSERT INTO `course` (tellscore, fatescore, heroscore) SELECT tellscore, fatescore, heroscore FROM `fraction`;
    -------------------------------------------------------------------------------------
    DROP TABLE IF EXISTS `course`;
    CREATE TABLE IF NOT EXISTS `course` (
    	`id` INT(8) UNSIGNED AUTO_INCREMENT,
    	`tellscore` INT(2) UNSIGNED NOT NULL COMMENT '语文考分',
    	`fatescore` INT(2) UNSIGNED NOT NULL COMMENT '数学考分',
    	`heroscore` INT(2) UNSIGNED NOT NULL COMMENT '英语考分',
    	PRIMARY KEY (`id`)
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8
    SELECT tellscore, fatescore, heroscore FROM `fraction`;
    ---------------------------------------------------------------------------------------------------------
    PS: 在剔出的一些相关数据后,需要将导出出具表对应的数据(例如类型、品牌等)更新为剔出数据表对应的 id 值,甚至修改导出表对应的字段类型及名字,推荐使用 ALTER - CHANGE 同时修改表字段名称及字段类型,同样可以设置对应的外键属性
    

MySQL 条件

数据表条件:比较条件、逻辑条件、布尔条件、相似条件、正则匹配、查询条件

数据表条件:SELECT field, … FROM WHERE condition;

比较条件

比较条件:= (相等)、> (大于)、< (小于)、>= (大于等于)、<= (小于等于)、!= | <> (不等)

逻辑条件

逻辑条件:AND 逻辑与,要求逻辑与左右两边都相等,OR 逻辑或,要求满足最少一个条件

布尔条件

布尔条件:IS NULL 为空,IS NOT NULL 非空,IN 在内存在,NOT IN 在内不存在

相似条件

模糊之间:LIKE 模糊查询,BETWEEN - AND 两者之间

正则匹配

正则表达式:REGEXP 正则匹配,^ 以什么开头,$ 以什么结尾

查询条件

-- 多表联合查询,表之间具有共同条件
SELECT a.username, a.`password`, b.sex, b.realname, b.birthday FROM `user` a, person b WHERE b.userid = a.id;

-- 通过关键字处理子查询多条件问题,可以通过使用 IN 或 NOT IN 来处理相同需求功能查询
SELECT * FROM person WHERE id >= ANY (SELECT personid FROM fraction WHERE tellscore >= 60);
SELECT * FROM person WHERE id >= SOME (SELECT personid FROM fraction WHERE tellscore >= 60);
SELECT * FROM person WHERE id >= ALL (SELECT personid FROM fraction WHERE tellscore >= 60);

区域条件:ANY、SOME、ALL 根据条件运算符判断,取最大值或最小值作条件

运算符 ANY SOME ALL
>、>= 最小值 最小值 最大值
<、<= 最大值 最大值 最小值
= 任意值 任意值
<>、!= 任意值

MySQL 约束

包含:主键自增、字段唯一、默认取值、非空约束、外键约束

  • 通过 PRIMARY KEY 设置字段主键约束,确保每条数据的唯一性,删除不可复录入,常用于表字段 ID
  • 使用 AUTO_INCREMENT 定义一个字段自增,常用于建表时设置主键,保存当前数据表数据唯一性
  • 通过 UNIQUE KEY 设置字段唯一约束,确保每条数据的某个字段唯一性,与主键约束不同的时,删除了可复录入
  • 通过 DEFAULT 设置字段默认约束,确保当前字段没赋值时具有一个默认值,在插入数据时,可以不录入数据值
  • 通过 NOT NULL 设置字段非空约束,确保当前字段不能为空,在插入数据时,必须录入数据值

主键自增

  • 主键自增空表时以 1 开始自增,没插入一个递增加一

  • 主键自增字段在插入表数据时是不需要录入表字段值的

  • 主键自增字段被删除最后一个时,不会重置被删除那条主键字段的值

  • AUTO_INCREMENT = 1 定义了 user 的 id 从 1 开始,每 INSERT 插入一条数据,id 都自增加 1

外键约束

确保数据的一致性、完整性,实现一对一或一对多的表数据关系

  • 两表必须使用相同的存储引擎且都为 InnoDB (如果不是 InnoDB 需要设置数据库配置文件),而且禁止使用临时表

  • 外键列和参照列必须具有相似的数据类型,数值类型长度需要相同,有符号位也必须相同

  • 外键列和参照列必须创建索引,如果外键列不存在索引的话,MYSQL 将自动创建索引

  • 通过 CONSTRAINT _ibfk_1 声明一个约束

  • FOREIGN KEY () 定义那个字段为外键列

  • REFERENCES (id) 定义外键列参考表 ID 字段

  • ON DELETE 当参考表发生删除事件时,同时执行某种事件

  • ON UPDATE 当参考表发生更新事件时,同时执行某种事件

    • = RESTRICT 表示参考表发生删除、更新事件时,存在关联,拒绝删除、更新外键表关联数据
    • = NO ACTION 标准 SQL 的关键词,同 RESTRICT 功能,先检查外键
    • = CASCADE 表示参考表发生删除、更新事件时,允许外键表发生对应的删除、更新事件
    • = SET NULL 表示参考表发生删除、更新事件时,将外键表关联所在列设为 null

默认取值

性别设置了默认值为 男,如果在 INSERT 插入用户表数据时,不录入性别字段值或使用 DEFAULT,生成插入数据性别字段为 ‘男’

非空约束

  • 主键字段自动设置为 NOT NULL
  • 设置字段为 NOT NULL 表示当前字段在 INSERT 插入数据时不能不录入
  • 非主键字段不设置非空约束默认为 NULL,默认可以为空
  • 非空字段一般常用于客户保存数据,插入到数据空时保证必填项

MySQL 调整

表数据进行排序、分组、筛选、分页、连接及表字段操作

数据排序

语法:SELECT field, … FROM ORDER BY field, … ASC | DESC;

  • ORDER BY field 针对某个字段进行排序
  • ASC 默认,顺序排列;DESC 倒序排列

数据分组

语法:SELECT field, … FROM GROUP BY field [HAVING ];

  • GROUP BY field 基于某个字段进行分组,数据分组后,会将重复字段数据去除掉
  • HAVING 分组完成后可进行条件筛选过滤得到结果

数据分页

语法:SELECT field, … FROM LIMIT [, ];

  • LIMIT 表示查询表数据前几条数据
  • LIMIT , 表示查询表数据从那个索引开始的几条数据

多表连接

  • UNION:对两个结果集进行并行操作,不包含重复行,同时进行默认规则的排序;
  • UNION ALL:对两个结果集进行并集操作,包括重复行,不进行排序
  • INNER JOIN:等值连接,只返回两个表中联结字段相等的行
  • RIGHT JOIN:右联接,返回包括右表中的所有记录和左表中联结字段相等的记录
  • LEFT JOIN:左联接,返回左表中的所有记录和右表中联结字段相等的记录

字段操作

语法:ALTER TABLE

MySQL 内置

  • 内置函数:字符函数、数学函数、日期函数、系统函数、加密函数
  • 内置运算:算数运算、比较运算、逻辑运算、位运算

字符函数

函数 描述 结果
CONCAT(s1,s2,…,sn) 字符连接 返回多个字符串拼接的结果
CONCAT_WS(x,s1,s2,…,sn) 使用指定的分隔符进行字符连接 返回多个字符串拼接并添加分隔符的结果
FORMAT(x,n) 实现字符格式化操作 返回格式化后的字符串
LOWER(s) 转换成小写字符 返回字符串转换为小写的字符串
LCASE(s) 转换成小写字符 返回字符串转换为小写的字符串
UPPER(s) 转换成大写字符 返回字符串转换为大写的字符串
UCASE(s) 转换成大写字符 返回字符串转换为大写的字符串
LEFT(s,n) 获取左侧字符 返回字符串左侧截取的几个字符
RIGHT(s,n) 获取右侧字符 返回字符串右侧截取的几个字符
函数 描述 结果
LENGTH(s) 字符长度 返回字符串的总字符数
CHAR_LENGTH(s) 字符长度 返回字符串的总字符数
CHARACTER_LENGTH(s) 字符长度 返回字符串的总字符数
LTRIM(s) 去除左侧空格 返回去除左侧空格的字符串
RTRIM(s) 去除右侧空格 返回去除右侧空格的字符串
TRIM(s) 去除左右两侧空格 返回去除左右两侧空格的字符串
SUBSTRING(s,start,length) 裁剪固定位置长度字符 返回裁剪后的剪切字符
SUBSTR(s,start,length) 裁剪固定位置长度字符 返回裁剪后的剪切字符
MID(s,n,length) 裁剪固定位置长度字符 返回裁剪后的剪切字符
REPLACE(s,s1,s2) 替换字符串某个字符 返回替换字符后的字符串
INSERT(s1,x,len,s2) 替换字符串某段字符 返回替换字符后的字符串
函数 描述 结果
REVERSE(s) 将字符串反转 返回反转后的字符串
STRCMP(s1,s2) 比较两个字符串 返回比较结果:0 相等、1 大于、-1 小于
LPAD(s1,len,s2) 在字符串开始处填充字符 返回填充后的字符串
RPAD(s1,len,s2) 在字符串结尾处填充字符 返回填充后的字符串
REPEAT(s,n) 将字符串重复几次拼接 返回拼接后的字符串
POSITION(s1 IN s) 获取某个字符在字符串中的索引 返回某个字符的索引值
LOCATE(s1,s) 获取某个单词在字符串中的索引 返回某个单词的位置
FIND_IN_SET(s1,s2) 获取某个字符在字符串中的索引 返回某个字符的索引值
FIELD(s,s1,s2…) 获取某个字符在多个字符列中的位置 返回当前字符在字符列中的位置
ASCII(s) 首字符的 ASCII 码 返回字符串首字符的 ASCII 码
SPACE(n) 设置几个空格 返回几个空格字符串
SUBSTRING_INDEX(s, delimiter, number) 获取字符串分隔符前或后面索引字符 返回分隔符前或后面的索引字符

数学函数

函数 描述 结果
CEIL(x) 取最小整数 返回浮点数靠近最小整数,大于浮点数
CEILING(x) 取最小整数 返回浮点数靠近最小整数,大于浮点数
FLOOR(x) 取最大整数 返回浮点数靠近最大整数,小于浮点数
ROUND(x) 取整 返回就近整数,小数位四舍五入
TRUNCATE(x,y) 保留几位小数 返回保留几位小数,不执行四舍五入
m DIV n 整除,m 被除数,n 除数 返回整除结果
MOD(x,y) 求余 返回余数
POWER(x,y) 求次方 返回次方的结果
POW(x,y) 求次方 返回次方的结果
SQRT(x) 求开方 返回平方根
RAND() 随机数 返回 0 到 1 的随机数
PI() 取圆周率 返回圆周率
ABS(x) 绝对值 返回绝对值
函数 描述 结果
EXP(x) 求 e 的次方 返回 e 的几次方
LN(n) 求 e 的对数 返回 e 的对数
LOG(base,x) 求某个数的对数 返回某个数的数
LOG2(x) 求 2 的对数 返回 2 的对数
LOG10(x) 求 10 的对数 返回 10 的对数
SIGN(x) 判断值是正数、负数还是为 0 返回判断结果:1 正数、-1 负数、0 即为 0
GREATEST(expr1, expr2, expr3, …) 求列表中的最大值 返回列表中的最大值
LEAST(expr1, expr2, expr3, …) 求列表中的最小值 返回列表中的最小值
函数 描述 结果
DEGREES(x) 将弧度转换为角度 返回角度值
RADIANS(x) 将角度转换为弧度 返回弧度
SIN(x) 正弦值 返回正弦值
COS(x) 余弦值 返回余弦值
TAN(x) 正切值 返回正切值
COT(x) 余切值 返回余切值
ASIN(x) 反正弦值 返回反正弦值
ACOS(x) 反余弦值 返回反余弦值
ATAN(x) 反正切值 返回反正切值
ATAN2(n, m) 反正切值 返回反正切值
函数 描述 结果
SUM(expression) 求和 返回总和
AVG(expression) 求平均值 返回平均值
COUNT(expression) 求总数 返回总条数
MAX(expression) 求最大值 返回最大值
MIN(expression) 求最小值 返回最小值

日期函数

函数 描述 结果
NOW() 当前日期和时间 返回当前日期和时间
SYSDATE() 当前日期和时间 返回当前日期和时间
CURRENT_DATE() 当前日期 返回当前日期
CURRENT_TIME() 当前时间 返回当前时间
CURRENT_TIMESTAMP() 当前日期和时间 返回当前日期和时间
LOCALTIME() 当前日期和时间 返回当前日期和时间
LOCALTIMESTAMP() 当前日期和时间 返回当前日期和时间
CURDATE() 当前日期 返回当前日期
CURTIME() 当前时间 返回当前时间
DATE_ADD(d,INTERVAL num EXTRACT) 修改时间段 返回修改后的日期时间
ADDDATE(d,n) 增加日期天数 返回增加后的日期
ADDTIME(t,n) 增加时间秒数 返回增加后的时间
SUBDATE(d,n) 减少日期天数 返回减少后的日期
SUBTIME(t,n) 减少时间秒数 返回减少后的时间
DATEDIFF(d1,d2) 两日期之间间隔天数 返回两日期间隔天数
TIMEDIFF(time1, time2) 计算时间差值 返回两时间差值
DATE_FORMAT(d,f) 格式化日期时间 返回格式化后的日期时间

EXTRACT 可取值如下:

  • YEAR 按年修改日期时间
  • MONTH 按月修改日期时间
  • DAY 按天修改日期时间,默认
  • HOUR 按时修改日期时间
  • MINUTE 按分修改日期时间
  • SECOND 按秒修改日期时间
  • MICROSECOND 按微秒修改日期时间
  • WEEK 按周修改日期时间
  • QUARTER 按季修改日期时间
函数 描述 结果
YEAR(d) 获取日期年份 返回日期年份,格式:YYYY
MONTH(d) 获取日期月份 返回日期月份
DAY(d) 获取日期部分 返回日期部分
HOUR(t) 获取日期小时 返回日期小时
MINUTE(t) 获取日期分钟 返回日期分钟
SECOND(t) 获取日期秒数 返回日期秒数
WEEKDAY(d) 获取日期星期 返回日期星期
QUARTER(d) 获取日期季度 返回日期季度
MONTHNAME(d) 获取日期月份名称 返回日期月份名称
DAYNAME(d) 获取日期星期名称 返回日期星期名称
DAYOFYEAR(d) 获取日期是本年第几天 返回日期日期是本年第几天
DAYOFMONTH(d) 获取日期是本月第几天 返回日期是本月第几天
DAYOFWEEK(d) 获取日期是本周第几天 返回日期是本周第几天
WEEK(d) 计算日期是本年第几个星期 返回计算日期是本年第几个星期,范围:0~53
WEEKOFYEAR(d) 计算日期是本年第几个星期 返回计算日期是本年第几个星期,范围:0~53
函数 描述 结果
TIME_TO_SEC(t) 将时间转换为秒 返回转换后的秒数
SEC_TO_TIME(s) 将秒数转换为时间 返回转换后的时间
LAST_DAY(d) 查询月份的最后一天 返回月份的最后一天
PERIOD_ADD(period, number) 为 年-月 组合日期添加一个时段 返回添加后的结果
PERIOD_DIFF(period1, period2) 两个时段之间的月份差值 返回两个时段之间的月份差值
TIME_FORMAT(t,f) 按某个表达式的要求显示时间 返回符合要求的时间

系统函数

函数 描述 结果
CONNECTION_ID() 服务器的连接数 返回服务器的连接数
DATABASE() 当前数据库名 返回当前数据库名
LAST_INSERT_ID() 生成的 AUTO_INCREMENT 值 返回最近生成的 AUTO_INCREMENT 值
USER() 当前用户 返回当前用户
SYSTEM_USER() 当前用户 返回当前用户
SESSION_USER() 当前用户 返回当前用户
CURRENT_USER() 当前用户 返回当前用户
VERSION() 数据库的版本号 返回数据库的版本号
CAST(x AS type) 转换数据类型 返回转换数据类型的结果
ISNULL(expression) 判断表达式是否为 NULL 返回判断结果:1 为空,0 非空
IF(expr,v1,v2) IF 分支语句 返回表达式成立的结果
CASE-WHEN-THEN-ELSE-END CASE ( SWITCH ) 分支语句 返回表达式成立的结果
BIN(x) 二进制编码 返回二进制编码
CONV(x,f1,f2) 将一种进制数变成另一种进制数 返回转换后的进制数

加密函数

函数 描述 结果
MD5() 信息摘要算法 返回 MD5 加密数据
PASSWORD() 密码算法 返回密码加密数据

自定义函数

语法:CREATE FUNCTION 函数名([参数列表]) RETURNS 数据类型 BEGIN sql语句; return 值; END;

  • 函数的查看:SHOW CREATE FUNCTION ;

  • 函数的修改:ALTER FUNCTION option;

  • 函数的删除:DROP FUNCTION ;

算术运算

运算符 作用
+ 加法
- 减法
* 乘法
/ 或 DIV 除法
% 或 MOD 取余

比较运算

符号 描述 备注
= 等于
<>, != 不等于
> 大于
< 小于
<= 小于等于
>= 大于等于
BETWEEN 在两值之间 >=min&&<=max
NOT BETWEEN 不在两值之间
IN 在集合中
NOT IN 不在集合中
<=> 严格比较两个NULL值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
LIKE 模糊匹配
REGEXP 或 RLIKE 正则式匹配
IS NULL 为空
IS NOT NULL 不为空

逻辑运算

运算符号 作用
NOT 或 ! 逻辑非
AND 逻辑与
OR 逻辑或
XOR 逻辑异或

位运算

运算符号 作用
& 按位与
| 按位或
^ 按位异或
! 取反
<< 左移
>> 右移

优先级

优先级顺序 运算符(从高到低)
1 !
2 -(一元减号),~(一元比特反转)
3 ^
4 *,/,DIV,%,MOD
5 -,+
6 <<,>>
7 &
8 |
9 =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
10 BETWEEN,CASE,WHEN,THEN,ELSE
11 NOT
12 &&,AND
13 ||,OR,XOR
14 :=

MySQL 存储

分析
错误
执行
返回
错误
SQL 命令
MySQL 引擎
语法正确
可识别命令
不可识别
执行结果
客户端

系统变量

  • 全局变量:作用于整个服务器,针对于所有的会话(连接)有效,但不能跨重启(要求跨重启需要修改配置文件)
  • 会话变量:作用于当前会话(连接)有效,每个连接中的会话变量是独立的

自定义变量

  • 用户变量:针对于当前会话(连接)有效,同会话变量的作用于,常放置在 BEGIN - END 内
  • 局部变量:仅仅作用在定义的 BEGIN - END 中有效,用于存储过程内

流程控制

  • 顺序结构:程序从上往下依次执行
  • 分支结构:程序从两条或多条路径中选择一条去执行
  • 循环结构:程序在满足一定条件的基础上,重复执行一段代码(循环语句:while、loop、repeat,循环控制:iterate、leave)
名称 语法 特点 位置
while w:while condition do loop_list end while w; 先判断后执行 begin - end 中
repeat r:repeat loop_list until condition end repeat r; 先执行后判断 begin - end 中
loop l:loop loop_list end loop l; 没有条件的死循环 begin - end 中

存储过程

存储过程是 SQL 语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理

  • 增强了 SQL 语句的功能和灵活性
  • 实现l 较快的执行速度
  • 减少了网络流量

语法:CREATE PROCEDURE 存储过程名 ([参数列表]) BEGIN 过程体; END;

  • IN 表示该参数的值必须在调用存储过程时需要指定,只进不出,无返回
  • OUT 表示该参数的值可以被存储过程改变,并可以返回
  • INOUT 表示该参数的调用时指定,并且可以被改变和返回,可进可出,有返回

存储过程与函数的区别

  • 存储过程可以实现的功能要复杂一些,而函数的针对性更强
  • 存储过程可以返回多个值,但函数只能有一个返回值
  • 存储过程一般独立的来执行的,而函数可以作为其他 SQL 语句的组成部分来出现

存储引擎

MySQL 可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎

包含:MyISAM、InnoDB、Memory、CSV、Archive(推荐在创建表时进行存储引擎设置)

  • 并发控制:当多个连接对记录进行修改时保证数据的一致性和完整性
  • 事务处理:用于保证数据库的完整性
  • 外键约束:用于保证数据的一致性策略
  • 索引定位:用于对数据表中的一列或多列的值进行排序的一种结构
特点 MyISAM InnoDB Memory Archive
存储限制 256TB 64TB
事务安全 - 支持 - -
支持索引 支持 支持 支持
锁颗粒 表锁 行锁 表锁 行锁
数据压缩 支持 - - 支持
支持外键 - 支持 - -

MySQL 事务

事务是一个最小的不可分割的工作单元,能够保证一个业务的完整性

提交方式

  • 自动提交:@@AUTOCOMMIT = 1,不支持回滚
  • 手动提交:@@AUTOCOMMIT = 0,支持回滚,但需要手动 COMMIT 提交
  • 事务回滚:ROLLBACK 回滚会撤销未提交的数据

事务特性

手动开启:BEGIN 或 START TRANSACTION 用来开启事务回滚功能

  • 原子性:事务是最小的单位,不可以再分割
  • 一致性:要求同一事务中的 SQL 语句必须保证同时成功或者同时失败
  • 隔离性:事务 1 和事务 2 之间是具有隔离的
  • 持久性:事务一旦提交,就不可以回滚

事务隔离

InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE

  • READ UNCOMMITTED:读未提交的
  • READ COMMITTED:读已经提交的
  • REPEATABLE READ:可以重复读
  • SERIALIZABLE:串行化

MySQL 索引

SQL 编写顺序

  • SELECT
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY

MySQL 解析器顺序

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • ORDER BY

索引概念

MySQL 索引的建立对于数据库的高效运行是很重要的,可以大大提高数据库的检索速度

索引优化

  • 查询尽量用确定的列明,少用 * 号
  • 尽量少嵌套子查询,这种查询会消耗大量的 CPU 资源
  • 避免使用耗费资源的操作:DISTINCT、UNION、UNION ALL、ORDER BY、MINUS、INTERSECT
  • 对于有比较多 or 运算的查询,建议分成多个查询,用 UNION ALL 联结起来
  • 合理使用索引

优化策略

  • 尽量全值匹配(尽量多的条件判断)
  • 不在索引列上做任何的操作(计算、函数、类型转换)
  • 范围条件后索引失效
  • 覆盖索引尽量使用(查询列和索引列一致就叫覆盖索引)
  • 不等于要慎用
  • NOT NULL 对索引有影响
  • LIKE 查询注意事项
  • 字符类型的引号不可以省区,会进行类型的自动转换,索引失效
  • OR 改 UNION 效率高
  • EXISTS 替换 IN

MySQL 视图

临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间

视图表

  • 多个地方用到同样的查询结果
  • 该查询结果使用的 sql 语句较复杂
区别 临时表 视图
本质 内容 内容 窗口
虚实 实表 实表 虚表
物理记录 没有
物理空间 占用 占用 不占用
影响 - 不影响 不影响对应表
安全 低于视图 低于视图 高于表
关联 - - 基于表

你可能感兴趣的:(学习笔记,mysql)