mysql学习笔记
2023-11-09 13:38:00 15 举报
AI智能生成
mysql学习笔记
作者其他创作
大纲/内容
本人最开始的学习笔记
视图
触发器
事务
between
字段其他修饰符
unsigned
auto_increment
default
comment
查询语句基本结构
查询语句基本结构:
select 列名,【列名】from 表名 where 行选择条件 group by 分组依据列 having 组选择条件 order by 排序依据
select 列名,【列名】from 表名 where 行选择条件 group by 分组依据列 having 组选择条件 order by 排序依据
具体简单流程
库:database
create
drop
show databases
修改
use 数据库名;
删除表数据:delete
表:table
create
create1
create2
删除表:结构和数据:drop
alter
show tables
查看表结构:desc 表名
根据查询结果创建表
表间数据复制
select
向表中插入数据:insert
insert1
insert2
insert3
insert4
insert5
更新、修改:update
嵌套更新
where条件子句
比较运算符
=
>
<
!=或者<>
分组
group by 列名
例子
having子句用于分组判断
例子
多表查询
逗号分隔取别名
多表联合查询
语法
注意
多表链接查询
语法
内连接(只显示符合条件的数据)
外连接
左外(左边表中的数据优先全部显示)
右外(右边表中的数据优先全部显示)
全连接查询(显示左右表中全部数据)
例子
复制条件多表查询
子查询
单行子查询
使用比较运算符判断
多行子查询
in或者not in
> all
> any
exists
例子
简单嵌套查询
带in的嵌套查询
带any的嵌套查询
带all的嵌套查询
并操作的嵌套查询:union关键字
例子
模糊匹配 like
逻辑运算符
and
or
not
关键字
去重复:distinct
分页取指令条数:limit
order by
例子
between and
in
函数
单行函数
数学函数
字符串函数
时间函数
加密函数
流程控制函数
if 三目表达式
例子
系统信息函数
格式化函数
类型转化函数
case
组函数(配合分组)
avg
max
min
sum
count
group_concat()
功能
语法
说明
例子
约束
非空
not null
唯一约束
unique
例子
主键约束
普通主键
联合主键
外键约束
定义外键的条件:
级联删除、级联修改
索引
存储过程
union
数据类型
tinyint
int和Integer
decimal
timestamp
char
varchar
别名
MYSQL系统整理(基础)
1.数据库
数据库(DataBase简称DB)
关系型数据库和非关系型数据库
关系型数据库
什么是关系型数据库
采用了关系模型来组织数据的数据库。
关系模型指的就是二维表格模型(表结构),而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
关系:表面
元祖:一行数据
属性:列名
关系型数据库优点
容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
使用方便:通用的SQL语言使得操作关系型数据库非常方便
易于维护
关系型数据库缺点
网站的并发性很高,对于关系型数据库来说 硬盘IO是一个瓶颈
在一张包含海量数据的表中查询,效率是非常低的
很难横向拓展,无法通过添加节点来扩展性能和负载能力,当需要对数据库系统进行升级和扩展时,往往需要停机维护和数据迁移。
性能欠佳:在关系型数据库中,导致性能欠佳的最主要原因是多表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询
非关系型数据库
什么是非关系型数据库
指非关系型的,分布式的,且一般不保证遵循事务四大原则的数据存储系统
非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,
每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
优点
用户可以根据需要去添加自己需要的字段,为了获取用户的不同信息,不像关系型数据库中,要对多表进行关联查询。
系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库难以应付,需要新的结构化数据存储。由于不可能用一种数据结构化存储应付所有的新的需求,因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
缺点
只适合存储一些较为简单的数据,对于需要进行较复杂查询的数据,关系型数据库显的更为合适。不适合持久存储海量数据
二者比较
非关系的成本低
非关系的数据在缓存中,关系的数据在硬盘中,非关系的查找快
非关系的支持键值对,图片,文档,对象,集合等多种形式,而关系型的只支持基本数据类型
非关系的没有耦合性容易水平扩展,而关系的有连表查询的限制,很难扩展
非关系不适合持久储存,关系的适合
非关系不支持事务。关系支持。
my.ini
C:\ProgramData\MySQL\MySQL Server 5.7
mysql的配置文件
mysql的配置文件
[client]
[client]
# pipe=
# socket=MYSQL
port=3306
# pipe=
# socket=MYSQL
port=3306
如果更改端口号可以从这里该
[mysql]
default-character-set
更改默认的编码集
一般我们不需要更改
一般我们不需要更改
【mysqld】
datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data
数据表的存放位置
数据表的存放位置
default-storage-engine=INNODB
默认存储引擎
默认存储引擎
max_connections
最大同时连接数,会保留一个给管理员用
最大同时连接数,会保留一个给管理员用
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
表示SQL模式的参数,通过这个参数可以设置检验SQL语句的严格程度
表示SQL模式的参数,通过这个参数可以设置检验SQL语句的严格程度
以及INNODB的一些设置参数
数据库管理系统(DataBase Management System简称DBMS)
常见的数据库管理系统(DataBase Management System)
Oracle
DB2
SQL Server
MySQL
Mysql安装
MySQL图形化操作工具Navicat下载安装
查询语句基本结构:
select 列名【,列名】from 表名 where 行选择条件 group by 分组依据列 having 组选择条件 order by 排序依据
select 列名【,列名】from 表名 where 行选择条件 group by 分组依据列 having 组选择条件 order by 排序依据
1、查看所有数据库
show databases
注意s
2、切换(选择要操作的)数据库
use 数据库名
3、创建数据库
create database 【if not exists】mydb1 【charset=utf8】
4、删除数据库
drop database 【if exists】mydb1
5、修改数据库编码
alter database mydb1 character set utf8
查看该数据库基本信息
show create database 数据库名;
查看当前使用的数据库
select database();
注意该语句最后有个括号()
2.数据类型
创建表时要为每一列指定数据类型
创建表时要为每一列指定数据类型
int 整型
double 浮点型 格式:double(5,2)最多五位,小数点后两位
decimal 浮点型 不会出现精度缺失问题
char 固定长度字符串类型
varchar 可变长度字符串类型
text(clob)字符串类型 范围:2^16-1B
blob 字节类型
date 日期类型 格式:YYYY-MM-dd:
time 时间类型 格式:hh:mm:ss
timestamp 时间戳类型
3.SQL分类
注意:
1、在数据库中所有字符串类型,必须使用单引,不能使用双引;日期类型也要使用单引
2、exit
退出
DDL
创建表
create table【if not exists 】表名(
列名 列类型,
列名 列类型,
列名 列类型
);
列名 列类型,
列名 列类型,
列名 列类型
);
查看当前数据库所有表名称
show tables
模糊查询 show tables LIKE '%u%'
查看指定表的创建语句
show create table 表名 (了解即可)
查看表结构
desc 表名;
删除表
drop table 表名
修改表: 前缀:alter table 表名
添加列
alter table 表名 ADD(
列名 列明类型,
列名 列明类型
);
列名 列明类型,
列名 列明类型
);
修改列类型
如果已存在数据,可能有影响
如果已存在数据,可能有影响
alter table 表名 modify 列名 列类型;
修改列名
alter table 表名 change 原列名 新列名 列类型;
删除列
alter table 表名 drop 列名;
修改表名称
alter table 原表名 rename to 新表名;
DCL
1、创建用户
create user 用户名@IP地址 identified by ‘密码’;
用户只能在指定的IP地址上登录
create user 用户名@* identified by ‘密码’;
用户可以在任意IP地址上登录
登录用户
mysql -u用户名 -p密码 [-h IP地址(可以不写默认localhost)]
2、给用户授权
grant 权限1,...,权限n on 数据库.* to 用户名@IP地址;
权限、用户、数据库
给用户分派在指定数据库上的指定权限
给用户分派在指定数据库上的指定权限
grant all on 数据库.* to 用户名@IP地址;
给用户分派指定数据库上的所有权限
注意:root用户才拥有最大权限,所有使用root用户去授权
权限一般有:create、alter、drop、insert、update、delete、select等,可以去第四步查看一下
权限一般有:create、alter、drop、insert、update、delete、select等,可以去第四步查看一下
3、撤销授权
revoke 权限1,...,权限n on 数据库.* from 用户名@IP地址;
撤销指定用户在指定数据库上的指定权限
4、查看授权
show grants for 用户名@IP地址
查看指定用户的权限
5、删除用户
drop user 用户名@IP地址
注意:一个项目创建一个用户,一个项目对应的数据库只有一个
这个用户只能对这个数据库有权限,其他数据库你就操作不了了
这个用户只能对这个数据库有权限,其他数据库你就操作不了了
DML
插入数据
insert into 表名(列名1,列名2,...) values (列值1,列值2,...);
没有给出列名,则等同插入null
列值必须与列名顺序对应
列值必须与列名顺序对应
insert into 表名 values(列值1,列值2,...);
没给出要插入的列,表示插入所有列
值的个数必须是列的个数
值的顺序,必须与表列的顺序相同
值的个数必须是列的个数
值的顺序,必须与表列的顺序相同
修改数据
update 表名 set 列名1=列值1,列名2=列值2,...[where 条件];
条件可选,必须是一个boolean类型的值或者表达式
运算符:=、!=、<>、>、<、>=、<=、between...and、in(...)、is null、is not null、not、or、and
删除数据
delete from 表名 (where 条件);
truncate table 表名:truncate是DDL语句,它是先删除drop该表,再create该表。而且无法回滚
联表删除
DQL
select * from 表名;
数据查询语言
一、基本查询
1、字段(列)控制
查询所有列
select * from 表名;
*代表所有列
查询指定列
select 列1[,列2,...,列n] from 表名;
去除重复行 查询
select distinct *|列1[,列2,...,列n] from 表名;
如果列里的数据存在相同的,则查询结果显示一次
关键字:distinct
列运算
数量类型可以做加减乘除
select 列名*1.5 from emp;
注意列的类型
字符串类型可以做连续运算
select concat(‘我叫’,ename,‘我是’,job)from emp;
concat(,)连接字符串 我叫小明我是文员
转换null值
select ifnull(comm,0)+100 from emp;
comm列如果存在null值,则使用0替换掉
注意:任何东西加null为null
给列起别名
as
空格
2、条件控制
条件查询
where子句控制,和update、delete语句一样
模糊查询
select * from emp where ename like ‘张%’;
百分号
匹配任意一个字符
下划线
匹配一个任意字符
二、排序
select * from emp order by sal asc,comm desc,empno asc;
关键字
order by 排序字段 asc|desc【,排序字段 asc|desc】
升序 asc 默认可不写
降序 desc
注意:1、多列排序,先排前边的,如果分出胜负则没有后边的事了,如果没有,则按后边的排序接着排
2、limit关键字若有,则在其之后
2、limit关键字若有,则在其之后
三、聚合函数
聚合函数用来做某列的纵向运算 比如统计总人数
select count(*) 总人数,sum(sal) 工资总和,max(sal) 最高工资,min(sal) 最低工资,avg(sal) 平均工资 from emp;
1、count
count(*)==count(随便一个数字)
计算表中所有列都不为null的记录的行数
count(comm)
计算表中comm列不为null的记录的行数
2、max(列名)
查询此列中的最大数
3、min(列名)
查询此列中的最小数
4、sum(sal)
查询工资和
5、avg(sal)
查询平均工资
四、分组查询
把记录使用某一列进行分组,然后查询组信息 比如按部门分组,查询每个部门的人数
select deptno,count(*) from emp group by deptno;
注意:要查询的东西只能是分组列和聚合函数
关键字:group by 分组依据列 having 分组后条件
和分组无关的条件写在group by前的where语句中,
和分组后有关的写在having 后,并且having后的条件只能使用聚合函数做条件
和分组后有关的写在having 后,并且having后的条件只能使用聚合函数做条件
HAVING是对于 GROUP BY对象进行筛选
顺序
查询关键字 select、from、where、group by、having、order by
书写顺序
select --> from -- >where --> group by--> having --> order by --> limit
执行顺序
from --> where --> group by --> having > --select > --order by > --limit
执行计划
五、limit子句(mysql方言)
用来限定查询结果的起始行,以及总行数
查询起始行第一行,查询5行数据
select * from emp limit 0,5;
一般用于分页查询
一页的记录数为10行,查询第三页
select * from emp limit 20,10;
查询起始行的计算:
(当前页-1)*每页记录数
例:查询第17页,每页8行数据
(17-1)*8=128
select * from emp limit 128,8;
4、编码
1、查看MySQL数据库编码:
show variables link ‘cahr%’;
2、编码解释
character_set_client:
??
character_set_results:
??
3、控制台乱码问题
插入或修改时出现乱码:
??
查询出的数据乱码:
??
设置变量的语句:
set character_set_client=gbk;
set character_set_results=gbk;
注意:设置变量值对当前连接有效,退出窗口后,再次登录mysql,还需再次设置变量。
为了一劳永逸,可以再my.ini中设置:
default-character-set=gbk即可。同时文件中也可以设置端口号
为了一劳永逸,可以再my.ini中设置:
default-character-set=gbk即可。同时文件中也可以设置端口号
4、指定默认编码
我们在安装mysql的时候已经默认编码为utf-8,所以我们在创建数据库,创建表时,都无需再次指定编码。
为了一劳永逸,可以在my.ini中设置:
character-set-server=utf8
为了一劳永逸,可以在my.ini中设置:
character-set-server=utf8
5、备份与恢复
1、数据库导出sql脚本(备份数据库内容,并不是备份数据库)
mysqldump -u用户名 -p密码 数据库名>生成的脚本路径(例c:\mydb.sql)
注意:不要打分号、不要登录mysql,直接在cmd下运行
生成的脚本文件中不包含create database语句
生成的脚本文件中不包含create database语句
2、执行sql脚本
第一种
mysql -u用户名 -p密码 数据库<脚本文件路径
注意:不要打分号、不要登录mysql,直接在cmd下运行
生成的脚本文件中不包含create database语句
生成的脚本文件中不包含create database语句
第二种
登录mysql,删库建库,切换到库
source sql脚本路径
注意:若有重复数据库,先删库再建库,然后进行操作
范式
第一范式
要求就是表中不能有重复字段,并且每个字段不能拆分
第二范式
要求数据库表中的每个实例或行必须可以被惟一地区分。也就是说单一主键来标记整条记录,不要出现多个主键。
第三范式
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)
要求一个数据库表中不包含已在其它表中已包含的非主关键字信息
要求一个数据库表中不包含已在其它表中已包含的非主关键字信息
BCN范式
在1NF基础上,任何非主属性不能对主键子集依赖[在3NF基础上消除对主码子集的依赖
总结:
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
6、约束
1、主键约束(唯一标识)
非空、唯一、被引用
当表的某一列被指定为主键后,该列不能为空,不能有重复值出现
建表时指定主键的两种方式
CREATE TABLE student(
id int primary key,
name varchar(50)
);
id int primary key,
name varchar(50)
);
CREATE TABLE student(
id int,
name varchar(50),
primary key(id)
);
id int,
name varchar(50),
primary key(id)
);
若采用该方式非常便于设置联合主键
在该示例中,将classid和studentid定义为联合主键
在该示例中,将classid和studentid定义为联合主键
CREATE TABLE student(
classid int,
studentid int,
name varchar(50),
primary key(classid,studentid)
);
classid int,
studentid int,
name varchar(50),
primary key(classid,studentid)
);
修改表示设置主键
CREATE TABLE student(
id int,
name varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);
id int,
name varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);
在该示例中,先创建了表,然后利用ALTER语句设置id字段为主键.
删除主键
alter table 表名 drop primary key;
2、主键自增长
字段名 数据类型 AUTO_ INCREMENT;
CREATE TABLE student(
id int primary key auto_increment,
name varchar(50)
);
id int primary key auto_increment,
name varchar(50)
);
修改表时设置主键自增长
alter table 表名 change 列名 列名 int auto_increment;
修改表时删除主键自增长
alter table 表名 change 列名 列名 int;
3、非空约束
某些列的值不可为null
字段名 数据类型 NOT NULL;
CREATE TABLE student(
id int PRIMARY KEY,
name varchar(50) NOT NULL,
gender varchar(10)
);
id int PRIMARY KEY,
name varchar(50) NOT NULL,
gender varchar(10)
);
4、唯一约束
某些列不能设置重复的值
字段名 数据类型 UNIQUE;
CREATE TABLE student(
id int primary key,
name varchar(50) unique
);
id int primary key,
name varchar(50) unique
);
默认值
字段名 数据类型 DEFAULT 默认值;
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE,
gender VARCHAR(10) DEFAULT '女'
);
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE,
gender VARCHAR(10) DEFAULT '女'
);
5、概念模型
概述模型 is a
在完成一个软件系统中,把系统中的实体抽取出来,行程概念模型
例如 部门、员工都是系统的实体,概念模型中的实体,最后都会成为java中的类、数据库中的表
实体类中存在关系:一对一,一对多,多对多
实体类中存在关系:一对一,一对多,多对多
谁少谁是主,谁多谁是从
对象模型 use a
关系模型(数据模型)has a
6、外键约束
特点
外键必须是另一表(或自己表)的主键的值(外键要引用主键)
外键可以重复
外键可以为空
一张表可以有多个外键
外键约束即FOREIGN KEY常用于多张表之间的约束
创建表时
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
修改表时
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);
外键名常用命名方式:
fk_从表名_从表外键字段
数据一致性
删除外键约束
alter table 从表名 drop foreign key 外键名;
关系
一对一
wid与hid相同,都是主键保证了唯一,一对一
从表的主键就是外键
从表的主键就是外键
多对多
7、多表查询
1、分类
合并结果集(了解)
要求被合并的表中,列的类型和列数相同(查询的结果集相同即可)
union 去除重复行
union all 不去除重复行
select * from cd
union
select * from ab;
union
select * from ab;
连接查询
分类
内连接
方言:
select * from 表1 别名1,表2 别名2 where 别名1.xx=别名2.xx;
select * from 表1 别名1,表2 别名2;
笛卡尔积
推荐 标准:
select * from 表1 别名1 inner join 表2 别名2 on 别名1.xx=别名2.xx;
自然连接:
select * from 表1 别名1 natural join 表2 别名2;
实际还是标准连接,自动加on条件,条件为两张表完全一样的列的等
可读性差
可读性差
自然连接:只是省略on条件,默认添加
内连接查询出的所有记录都满足条件
外连接
左外连接
select * from 表1 别名1 left join 表2 别名2 on 别名1.xx=别名2.xx;
left join是left outer join的简写
左表记录无乱满足什么条件都会查询出来,右表只有满足条件才会查询出来,
、左表中不满足条件的记录,右表部分都为null
、左表中不满足条件的记录,右表部分都为null
左外自然
select * from 表1 别名1 natural left join 表2 别名2;
右外连接
select * from 表1 别名1 right join 表2 别名2 on 别名1.xx=别名2.xx;
右外自然
select * from 表1 别名1 natural right join 表2 别名2;
全连接
外连接+合并结果集 :可查两表所有信息,包括为null的
子查询
1、出现的位置
where后作为条件存在
from后作为表存在(多行多列,一般需要起别名)
2、条件
单行单列
select * from 表1 别名1 where 列1 [=、>、<、>=、<=、!=](select 列 from 表2 别名2 where 条件);
多行单列
select * from 表1 别名1 where 列1【=、>、<、>=、<=】[in、all全部、any任意](select 列 from 表2 别名2 where 条件);
单行多列
select * from 表1 别名1 where (列1,列2) in (select 列1,列2,from 表2 别名2 where 条件);
多行多列
select * from 表1 别名1,(select) 别名2 where条件
8、数据库事务及其隔离级别
1、定义:
所谓事务就是针对数据库的一组操作(由一条或多条SQL语句组成)进行管控。
如果其中任一条语句无法执行,那么所有的语句都不会执行。
也就是说,事务中的语句要么都执行,要么都不执行。
如果其中任一条语句无法执行,那么所有的语句都不会执行。
也就是说,事务中的语句要么都执行,要么都不执行。
2、过程
使用事务时必须先开启事务
start transaction;
事务开启之后就可以执行SQL语句,
SQL语句执行成功后,需要使用相应语句提交事务
SQL语句执行成功后,需要使用相应语句提交事务
commit;
注意:平常我们在MySQL中直接书写的SQL语句都是自动提交的它会立即生效;
但是,事务中的操作语句都需要使用COMMIT语句手动提交,否则不会生效。
如果不想提交当前事务还可以使用相关语句取消事务(也称回滚)
但是,事务中的操作语句都需要使用COMMIT语句手动提交,否则不会生效。
如果不想提交当前事务还可以使用相关语句取消事务(也称回滚)
rollback;
ROLLBACK语句只能针对未提交的事务执行回滚操作,已提交的事务是不能回滚的。
3、必须同时满足4个特性
原子性
事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功才算整个事务执行成功。
如果事务中有任何一个SQL语句执行失败,则已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态。
如果事务中有任何一个SQL语句执行失败,则已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态。
—致性
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
例如:假设用户A和用户B两者的钱加起来一共为3000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还是3000。
例如:假设用户A和用户B两者的钱加起来一共为3000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还是3000。
隔离性
数据库为每一个用户开启的事务不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
例如:多个用户操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
例如:对于任意两个并发的事务T1和T2。从事务T1的角度看来:T2要么在T1开始之前就已经结束,要么T2在T1结束之后才开始。也就是说:每个事务都感觉不到有其它事务在并发地执行。
例如:多个用户操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
例如:对于任意两个并发的事务T1和T2。从事务T1的角度看来:T2要么在T1开始之前就已经结束,要么T2在T1结束之后才开始。也就是说:每个事务都感觉不到有其它事务在并发地执行。
持久性
事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不 应该对其有任何影响。
需要注意的是,事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,
而一些外部原因导致数据库发生故障,如硬盘损坏,那么所提交的数据可能都会丢失。
需要注意的是,事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,
而一些外部原因导致数据库发生故障,如硬盘损坏,那么所提交的数据可能都会丢失。
4、事务的隔离级别
1、概念
通常情况下数据库是多线程并发访问的,所以很容易出现多个线程同时开启事务的情况。
在该情况下和可能出现脏读、重复读以及幻读的情况,为了避免这种情况的发生,就需要为事务设置隔离级别。
在此,我们分别介绍在MySQL中事务的4种隔离级别
在该情况下和可能出现脏读、重复读以及幻读的情况,为了避免这种情况的发生,就需要为事务设置隔离级别。
在此,我们分别介绍在MySQL中事务的4种隔离级别
2、事务的隔离级别
Read Uncommitted
(读未提交)是事务中最低的级别。
在该级别下的事务可以读 取到另一个事务中未提交的数据也被称为脏读(Dirty Read)。
由于该级别太低,所以在实际开发中避免不了任何情况,所以极少使用。
在该级别下的事务可以读 取到另一个事务中未提交的数据也被称为脏读(Dirty Read)。
由于该级别太低,所以在实际开发中避免不了任何情况,所以极少使用。
-- 设置事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 查询事务隔离级别
SELECT @@tx_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 查询事务隔离级别
SELECT @@tx_isolation;
READ COMMITTED
大多数的数据库管理系统(例如Oracle)的默认隔离级别都是READ COMMITTED(读提交)。
该级别下的事务只能读取其它事务已经提交的内容,可以避免脏读但不能避免重复读和幻读的情况。
重复读就是在事务内重复读取别的线程已经提交的数据的时读取的结果不一致。导致该问题的原因是查询的过程中其它事务做了更新操作。
幻读又被称为虚读,是指在一个事务内两次查询中数据条数不一致。导致该问题的原因是查询的过程中其它的事务做了添加操作。
该级别下的事务只能读取其它事务已经提交的内容,可以避免脏读但不能避免重复读和幻读的情况。
重复读就是在事务内重复读取别的线程已经提交的数据的时读取的结果不一致。导致该问题的原因是查询的过程中其它事务做了更新操作。
幻读又被称为虚读,是指在一个事务内两次查询中数据条数不一致。导致该问题的原因是查询的过程中其它的事务做了添加操作。
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
repeatable read
(可重复读)是MySQL默认的事务隔离级别。它可以避免脏读和不可重复读。
但理论上,该级别会出现幻读的情况。不过,MySQL的存储引擎通过多版本并发控制机制解决了该问题,因此该级别是可以避免幻读的。
但理论上,该级别会出现幻读的情况。不过,MySQL的存储引擎通过多版本并发控制机制解决了该问题,因此该级别是可以避免幻读的。
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
serializable
(可串行化)是事务的最高隔离级别,它会强制对事务进行排序,使之不会发生冲突,从而解决脏读、幻读、重复读的问题。
但是,该级别可能导致大量的超时现象和锁竞争,实际应用中很少使用。
但是,该级别可能导致大量的超时现象和锁竞争,实际应用中很少使用。
-- 设置事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 查询事务隔离级别
SELECT @@tx_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 查询事务隔离级别
SELECT @@tx_isolation;
9、存储过程及游标使用
存储过程
1、概念
在开发过程中,我们经常会遇到重复使用某一功能的情况。为此,MySQL引人了存储过程(Stored Procedure)这一技术。所谓存储过程指的就是一条或多条SQL语句的集合。存储过程可以将一些列复杂操作封装成一个代码块,以便重复使用,从而极大地减少数据库开发人的工作量提升开发效率。SQL语句需要先编译然后执行,而存储过程可将为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字通过传参的方式对其进行调用。存储过程可看做是编程的函数,它允许以传参调用的访问方式。
2、编写存储过程
```
mysql> DELIMITER //
mysql> CREATE PROCEDURE procedureHelloWorld(IN sage INT)
-> BEGIN
-> SELECT * FROM student WHERE age>sage;
-> END //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
```
mysql> DELIMITER //
mysql> CREATE PROCEDURE procedureHelloWorld(IN sage INT)
-> BEGIN
-> SELECT * FROM student WHERE age>sage;
-> END //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
```
在该存储过程中我们期望依据传入的指定年纪查询出符合条件的学生;详解如下:
MySQL默认以;为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理从而造成编译过程会报错。所以需要事先用DELIMITER //声明当前段分隔符,让编译器把两个//之间的内容当做存储过程的代码。在编写完存储过程之后利用DELIMITER ;把分隔符还原为默认分隔符;。DELIMITER也可以指定其他符号作为结束符。需要格外注意的是:DELIMITER与要设定的结束符之间一定要有一个空格,否则设定无效。
利用CREATE PROCEDURE 存储过程名称(参数)创建存储过程,即示例代码:CREATE PROCEDURE procedureHelloWorld(IN sage INT)
存储过程的过程体以BEGIN开始以END 结束
MySQL默认以;为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理从而造成编译过程会报错。所以需要事先用DELIMITER //声明当前段分隔符,让编译器把两个//之间的内容当做存储过程的代码。在编写完存储过程之后利用DELIMITER ;把分隔符还原为默认分隔符;。DELIMITER也可以指定其他符号作为结束符。需要格外注意的是:DELIMITER与要设定的结束符之间一定要有一个空格,否则设定无效。
利用CREATE PROCEDURE 存储过程名称(参数)创建存储过程,即示例代码:CREATE PROCEDURE procedureHelloWorld(IN sage INT)
存储过程的过程体以BEGIN开始以END 结束
3、调用存储过程
call procedureHelloWorld(15);
利用call 存储过程名(参数);调用存储过程,即示例代码:call procedureHelloWorld(15);类似地,可利用DROP PROCEDURE 存储过程名;删除存储过程。
4、存储过程的参数
CREATE PROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类型...])
IN表示输入参数,表示该参数的值必须在调用存储过程时指定
示例代码
在此定义存储过程findStudent,该存储过程中有个IN参数,该参数为INT类型叫做sage
通过call findStudent(16);并出入16作为IN参数调用存储过程。
其实,我们还可以在调用存储过程中使用用户变量。
用户变量语法,形式如下:
其实,我们还可以在调用存储过程中使用用户变量。
用户变量语法,形式如下:
@var_name
创建用户变量,方式如下:
SET 用户变量=初始值;
查看用户变量的值,方式如下:
SELECT 用户变量;
当定义用户变量后可方便开发过程的代码编写,只要连接未关闭我们均可直接使用该变量。当然,当连接关闭时所有客户变量将自动释放。
OUT表示输出参数,可在存储过程内改变该值并将其返回
示例代码
定义存储过程countStudent,该存储过程中有个OUT参数,该参数为INT类型叫做total。在存储体中将统计的结果利用INTO存入total中。在调用存储过程中将用户变量@number作为参数传入,然后利用SELECT @number参看结果。
INOUT表示输入输出参数,可在调用存储过程时指定该参数并在存储体中改变该值并将其返回
示例代码
定义存储过程searchStudentGender,该存储过程中有个INOUT参数,该参数为VARCHAR(50)类型叫做message。在该示例中message既当做输入参数又当做输出参数,即输入参数为学生的姓名lili返回的是学生的性别male。在调用存储过程时将初始值为lili的用户变量@info传入存储过程,调用存储过程结束后再次查询@info的值为male。
变量
在编写存储过程中有时需要使用变量保存数据处理过程中的值。这些变量的作用范围为BEGIN…END,语法如下:
DECLARE varName dataType [DEFAULT value];
在该语法中:关键字DECLARE用于定义变量,varNarne为局部变量的名称,
dataType为局部变量的类型,可选项DEFAULT value为变量默认值。
在该语法中:关键字DECLARE用于定义变量,varNarne为局部变量的名称,
dataType为局部变量的类型,可选项DEFAULT value为变量默认值。
在定义变量之后,可使用SET为变量赋值或者修改变量的默认值
SET varName = value;
变量使用示例
1
2
5、流程控制
IF
语法
```
IF expr_condition THEN statement_list
[ELSE expr_condtion THEN statement_list] ...
[ELSE statement_list]
END IF
```
IF expr_condition THEN statement_list
[ELSE expr_condtion THEN statement_list] ...
[ELSE statement_list]
END IF
```
示例
CASE
第一种语法格式
```
CASE case_expr
WHEN value THEN statement_list
[WHEN value THEN statement_list] ...
[ELSE statement_list]
END CASE;
```
CASE case_expr
WHEN value THEN statement_list
[WHEN value THEN statement_list] ...
[ELSE statement_list]
END CASE;
```
示例
第二种语法格式
```
CASE
WHEN expr_condition THEN statement_list
[WHEN expr_condition THEN statement_list] ...
[ELSE statement_list]
END CASE;
```
CASE
WHEN expr_condition THEN statement_list
[WHEN expr_condition THEN statement_list] ...
[ELSE statement_list]
END CASE;
```
示例
LOOP
ITERATE
REPEAT语句
WHILE
游标
1、概念
在数据库中游标(cursor)是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段。就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。例如,在编写存储过程时,查询语句可能会返回多条记录或大量记录,此时则需要使用游标来逐条读取查询结果集中的记录。
游标使用步骤为:定义游标、打开游标、使用游标、关闭游标、释放游标;
游标使用步骤为:定义游标、打开游标、使用游标、关闭游标、释放游标;
10、视图
1、概念
视图是从一个或多个表中导出的表,它是一种虚拟存在的表。视图的结构和数据都依赖于原表(亦称为基本表)。通过视图不仅可以查看存放在基本表中的数据并且还可以像操作基本表一样,对视图中存放的数据进行查询、修改和删除
2、优点
简化查询语
安全
逻辑数据独立性
3、语法
创建
-- 创建视图
DROP VIEW IF EXISTS view_student;
CREATE VIEW view_student AS SELECT math, chinese,math+chinese FROM student;
DROP VIEW IF EXISTS view_student;
CREATE VIEW view_student AS SELECT math, chinese,math+chinese FROM student;
子主题
子主题
说明
创建的视图字段名称和基本表的字段名称是一样的,但也可根据实际的需要指定视图字段的名称
-- 创建视图
DROP VIEW IF EXISTS view_student;
CREATE VIEW view_student(m,c,s) AS SELECT math, chinese,math+chinese FROM student;
-- 查看视图
SELECT * FROM view_student;
DROP VIEW IF EXISTS view_student;
CREATE VIEW view_student(m,c,s) AS SELECT math, chinese,math+chinese FROM student;
-- 查看视图
SELECT * FROM view_student;
多表上建立视图
-- 创建视图
DROP VIEW IF EXISTS view_student_studentInfo;
CREATE VIEW view_student_studentInfo (id,name,province,fname,mname)
AS
SELECT student.sid, student.sname,studentInfo.province,studentInfo.fatherName,studentInfo.motherName
FROM student,studentInfo WHERE student.sid=studentInfo.sid;
-- 查看视图
SELECT * FROM view_student_studentInfo;
DROP VIEW IF EXISTS view_student_studentInfo;
CREATE VIEW view_student_studentInfo (id,name,province,fname,mname)
AS
SELECT student.sid, student.sname,studentInfo.province,studentInfo.fatherName,studentInfo.motherName
FROM student,studentInfo WHERE student.sid=studentInfo.sid;
-- 查看视图
SELECT * FROM view_student_studentInfo;
查看视图
-- 查看视图
SELECT * FROM view_student;
SELECT * FROM view_student;
更新视图
更新视图是指通过视图来更新(UPDATE)、插入(INSERT)、删除(DELETE)基本表中的数据。
当通过视图更新数据时其实是在更新基本表中的数据;也就是说:如果对视图中的数据进行操作时实际上就是在对基本表中的数据进行操作。
当通过视图更新数据时其实是在更新基本表中的数据;也就是说:如果对视图中的数据进行操作时实际上就是在对基本表中的数据进行操作。
删除视图
DROP VIEW [IF EXISTS] 视图名;
如果存在
11、索引
1、引出及概念
在数据库操作中,我们经常需要查找特定的数据;例如,执行SELECT * FROM student WHERE id=100000;时MySQL数据库必须从第1条记录开始遍历直到找到id为100000的数据。显然,这样的效率非常低下。为此,在MySQL可通过建立索引来加快数据表的查询和排序。打个比方:数据库的索引好比新华字典的音序表,它是对数据库表中一列或多列的值进行排序后的一种结构,其作用就是提高查询的速度。虽然索引可提高数据的查询速度,但索引会占用一定的磁盘空间,并且在创建和维护索引时其消耗的时间是随着数据量的增加而同步增加的。
2、分类
普通索引
普通索引由KEY或INDEX定义,它可以创建在任何数据类型的字段上。
唯一性索引
唯一性索引由UNIQUE定义,该索引所在字段的值必须是唯一的。
全文索引
全文索引由FULLTEXT定义,它只能创建在CHAR、VARCHAR或 TEXT类型的字段上。
单列索引
单列索引指的是在表中单个字段上创建索引,它可以是普通索引、唯一性索引或者全文索引,只要保证该索引只对应表中一个字段即可。
多列索引
多列索引指的是在表中多个字段上创建索引,只有在查询条件中使用了这些字段中的第一个字段时,该索引才会被使用。例如,在student表的id、name和score字段上创建一个多列索引;那么,只有查询条件中使用了 id字段时该索引才会被使用。
空间索引
空间索引由SPATIAL定义,它只能创建在空间数据类型的字段上。 MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING和 POLYGON。
请注意:必须将创建空间索引的字段声明为NOT NULL,并且空间索引只能在存储引擎为MylSAM的表中创建。空间索引使用较少
请注意:必须将创建空间索引的字段声明为NOT NULL,并且空间索引只能在存储引擎为MylSAM的表中创建。空间索引使用较少
3、创建索引
创建表时创建索引
CREATE TABLE 表名(字段名1 数据类型[完整性约束条件],
字段名2 数据类型[完整性约束条件],
...........
[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY
[别名](索引字段名 [(长度)])[ASC|DESC])
字段名2 数据类型[完整性约束条件],
...........
[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY
[别名](索引字段名 [(长度)])[ASC|DESC])
分类注释中写明
利用CREATE INDEX在已有表创建索引
在一个已经存在的表上创建索引,则可使用CREATE INDEX语句
语法
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名
ON 表名 (字段名 [(长度)] [ASC|DESC]);
ON 表名 (字段名 [(长度)] [ASC|DESC]);
利用ALTER TABLE在已有表创建索引
在已经存在的表中创建索引除了可以使用CREATE INDEX还可使用 ALTER TABLE语句
语法
ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX
ON 表名 (字段名 [(长度)] [ASC|DESC]);
ON 表名 (字段名 [(长度)] [ASC|DESC]);
4、删除索引
利用ALTER TABLE删除索引
ALTER TABLE 表名 DROP INDEX 索引名;
利用DROP INDEX删除索引
DROP INDEX 索引名 ON 表名;
5、综上
普通的索引的创建:
CREATE INDEX (自定义)索引名 ON 数据表(字段);
复合索引的创建:
CREATE INDEX (自定义)索引名 ON 数据表(字段,字段,。。。);
删除索引:DROP INDEX 索引名;
CREATE INDEX (自定义)索引名 ON 数据表(字段);
复合索引的创建:
CREATE INDEX (自定义)索引名 ON 数据表(字段,字段,。。。);
删除索引:DROP INDEX 索引名;
12、触发器
1、概述
触发器(TRIGGER)是MySQL的数据库对象之一,该对象与编程语言中的函数非常类似,都需要声明、执行等。但是触发器的执行不是由程序调用也不是由工程师手工启动,而是由事件来触发、 激活从而得以执行。
那么什么时候会用到触发器呢?我们来看两个例子:
在班级表中拥有班级号,班级总人数;学生表中有学生姓名,学号,学生所属班级;每当在学生表中添加一条学生记录时,班级表中对应班级的学生总数就必须同时改变。
顾客信息表中拥有顾客名字,顾客的电话、顾客的地址、每当添加一条关于顾客记录时,都需要检查电话号码格式是否正确。
这两个例子虽然所需实现的业务逻辑不同,但是它们有个共同之处:都需要在表发生更改时, 自动进行相关处理。这时就可以使用触发器处理数据库对象。例如,可以创建一个触发器对象,每次添加一条学生记录时就执行一次计算学生总数的操作,从而保证每次添加一条学生记录后学生总数与学生记录数一致。
在MySQL可在执行DELETE 、INSERT 、UPDATE、LOAD DATA 和、REPLACE等语句时激活触发器;除此以外,其它SQL语句则不会激活触发器。
那么什么时候会用到触发器呢?我们来看两个例子:
在班级表中拥有班级号,班级总人数;学生表中有学生姓名,学号,学生所属班级;每当在学生表中添加一条学生记录时,班级表中对应班级的学生总数就必须同时改变。
顾客信息表中拥有顾客名字,顾客的电话、顾客的地址、每当添加一条关于顾客记录时,都需要检查电话号码格式是否正确。
这两个例子虽然所需实现的业务逻辑不同,但是它们有个共同之处:都需要在表发生更改时, 自动进行相关处理。这时就可以使用触发器处理数据库对象。例如,可以创建一个触发器对象,每次添加一条学生记录时就执行一次计算学生总数的操作,从而保证每次添加一条学生记录后学生总数与学生记录数一致。
在MySQL可在执行DELETE 、INSERT 、UPDATE、LOAD DATA 和、REPLACE等语句时激活触发器;除此以外,其它SQL语句则不会激活触发器。
2、创建触发器
CREATE TRIGGER triggerName
BEFORE丨AFTER triggerEVENT ON tableName FOR EACH ROW
BEGIN
triggerSTMT
END
BEFORE丨AFTER triggerEVENT ON tableName FOR EACH ROW
BEGIN
triggerSTMT
END
子主题
子主题
子主题
备注
例
子主题
子主题
子主题
要点概述:
该示例中存在两张表,即学生表studen和班级表class。其中,学生表用于存放学生信息,在该表中有一个字段classID表示该学生属于哪个班级;班级表用于存放班级信息,在该表中使用classID表示班级编号,studentCount表示该班级的学生总数
当向学生表中插入数据之后(AFTER)更新班级表中该学生所属班级的学生总数
在该示例中使用了NEW关键字。MySQL中定义了 NEW和 OLD用来表示触发器的所在表中,触发了触发器的那一行数据.
(1)、在INSERT型触发器中NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据
(2)、在UPDATE型触发器中OLD 用来表示将要(BEFORE)或已经(AFTER)被修改的原数据,NEW用来表示将要(BEFORE)或已经(AFTER)修改的新数据
(3)、在 DELETE 型触发器中OLD 用来表示将要(BEFORE)或已经(AFTER)被删除的原数据
该示例中存在两张表,即学生表studen和班级表class。其中,学生表用于存放学生信息,在该表中有一个字段classID表示该学生属于哪个班级;班级表用于存放班级信息,在该表中使用classID表示班级编号,studentCount表示该班级的学生总数
当向学生表中插入数据之后(AFTER)更新班级表中该学生所属班级的学生总数
在该示例中使用了NEW关键字。MySQL中定义了 NEW和 OLD用来表示触发器的所在表中,触发了触发器的那一行数据.
(1)、在INSERT型触发器中NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据
(2)、在UPDATE型触发器中OLD 用来表示将要(BEFORE)或已经(AFTER)被修改的原数据,NEW用来表示将要(BEFORE)或已经(AFTER)修改的新数据
(3)、在 DELETE 型触发器中OLD 用来表示将要(BEFORE)或已经(AFTER)被删除的原数据
3、查看触发器
SHOW TRIGGERS;
4、删除触发器
DROP TRIGGER [IF EXISTS] 触发器名称;
13、MySQL函数
1.数学函数
ABS()绝对值
PI() π值
RAND()返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
ROUND(x,y)返回参数x的四舍五入的有y位小数的值
MOD(x,y) 返回x/y的模(余数)
2.聚合函数
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
SUM(col)返回指定列的所有值之和
3.字符串函数
UCASE(str)或UPPER(str) 返回将字符串str中所有字符转变为大写后的结果
TRIM(str)去除字符串首部和尾部的所有空格
RTRIM(str) 返回字符串str尾部的空格
LTRIM(str) 从字符串str中切掉开头的空格
LENGTH(s)返回字符串str中的字符数
ASCII(char)返回字符的ASCII码值
4.日期和时间函数
CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
FROM_UNIXTIME(时间戳) 格式化传入的时间戳,转成日期格式
UNIX_TIMESTAMP()获取系统当前的时间戳
NOW()返回当前的时间的日期
5.加密函数
MD5() 计算字符串str的MD5校验和
PASSWORD(str) 返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
SHA() 计算字符串str的安全散列算法(SHA)校验和
6.控制流程函数
7.格式化函数
8.类型转化函数
9.系统信息函数
DATABASE() 返回当前数据库名
USER()或SYSTEM_USER() 返回当前登陆用户名
VERSION() 返回MySQL服务器的版本
CONNECTION_ID() 返回当前客户的连接ID
BENCHMARK(count,expr) 将表达式expr重复运行count次
内置库表
MySQL版本大于5.0时,有个默认数据库information_schema,
里面存放着所有数据库的信息(比如表名、 列名、对应权限等),
通过这个数据库,我们就可以跨库查询,爆表爆列
里面存放着所有数据库的信息(比如表名、 列名、对应权限等),
通过这个数据库,我们就可以跨库查询,爆表爆列
爆库
select SCHEMA_NAME from information_schema.SCHEMATA limit 5,1/* 5,1表示从第1个开始,数到第5个
查询数据库名,逗号隔开
select GROUP_CONCAT(SCHEMA_NAME) from information_schema.SCHEMATA where SCHEMA_NAME like '%库名关键字%'
爆表
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=0×6D656D626572 limit 5,1/TABLE_SCHEMA=后面是库名的16进制
爆字段
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=0×61646D5F75736572 limit 5,1/
查询所有库学生表的字段并集
select column_name from information_schema.columns WHERE table_name = 'pe_student' GROUP BY column_name
查询字段
select table_schema,column_name from information_schema.columns WHERE table_name = 'pe_student' and column_name like '%address%' GROUP BY column_name;
select a.* from (
select table_schema,column_name from information_schema.columns WHERE table_name = 'pe_student' GROUP BY column_name
) a
where
column_name like '%address%'
select a.* from (
select table_schema,column_name from information_schema.columns WHERE table_name = 'pe_student' GROUP BY column_name
) a
where
column_name like '%address%'
information_schema.columns
从information_schema.columns这个表里,我们可以查到所有的信息,因为它在里面,
table_schema、 table_name、column_name这个三个列都有,
所以我们可以直接通过这个表,查出我们需要的所有信息,就省了换表这一步了,进一步提升速度
table_schema、 table_name、column_name这个三个列都有,
所以我们可以直接通过这个表,查出我们需要的所有信息,就省了换表这一步了,进一步提升速度
列值
一些sql
SELECT
TABLE_SCHEMA AS '数据库',
TABLE_NAME AS '表名',
column_name AS '字段名称',
COLUMN_TYPE AS '字段类型',
IS_NULLABLE AS '是否为空',
COLUMN_DEFAULT AS '默认值',
column_comment AS '字段备注'
FROM
information_schema. COLUMNS
WHERE
table_name = 'yyd_elife_city'
OR table_name = 'yyd_elife_column_list'
OR table_name = 'yyd_elife_coupon_list'
OR table_name = 'yyd_elife_goods_label_list'
OR table_name = 'yyd_elife_member_extend'
OR table_name = 'yyd_biz_content_log'
OR table_name = 'yyd_e_refund'
OR table_name = 'yyd_e_statistic_goods'
OR table_name = 'yyd_e_statistic_ip'
OR table_name = 'yyd_e_statistic_main'
TABLE_SCHEMA AS '数据库',
TABLE_NAME AS '表名',
column_name AS '字段名称',
COLUMN_TYPE AS '字段类型',
IS_NULLABLE AS '是否为空',
COLUMN_DEFAULT AS '默认值',
column_comment AS '字段备注'
FROM
information_schema. COLUMNS
WHERE
table_name = 'yyd_elife_city'
OR table_name = 'yyd_elife_column_list'
OR table_name = 'yyd_elife_coupon_list'
OR table_name = 'yyd_elife_goods_label_list'
OR table_name = 'yyd_elife_member_extend'
OR table_name = 'yyd_biz_content_log'
OR table_name = 'yyd_e_refund'
OR table_name = 'yyd_e_statistic_goods'
OR table_name = 'yyd_e_statistic_ip'
OR table_name = 'yyd_e_statistic_main'
-- 不存在某表的数据库
SELECT
*
FROM
information_schema. COLUMNS
WHERE
NOT EXISTS (
-- 存在某表的数据库
SELECT
*
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'module_enroll_user_info'
GROUP BY
TABLE_SCHEMA
)
GROUP BY
TABLE_SCHEMA;
SELECT
*
FROM
information_schema. COLUMNS
WHERE
NOT EXISTS (
-- 存在某表的数据库
SELECT
*
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'module_enroll_user_info'
GROUP BY
TABLE_SCHEMA
)
GROUP BY
TABLE_SCHEMA;
-- 存在某个字段
SELECT
*
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'module_enroll_user_info'
AND COLUMN_NAME = 'site_code'
and TABLE_SCHEMA = 'risen'
SELECT
*
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'module_enroll_user_info'
AND COLUMN_NAME = 'fk_enroll_core_id'
and IS_NULLABLE = 'NO';
SELECT
*
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'module_enroll_user_info'
AND COLUMN_NAME = 'fk_enroll_step_id'
and IS_NULLABLE = 'NO';
SELECT
*
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'module_enroll_user_info'
AND COLUMN_NAME = 'site_code'
and TABLE_SCHEMA = 'risen'
SELECT
*
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'module_enroll_user_info'
AND COLUMN_NAME = 'fk_enroll_core_id'
and IS_NULLABLE = 'NO';
SELECT
*
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'module_enroll_user_info'
AND COLUMN_NAME = 'fk_enroll_step_id'
and IS_NULLABLE = 'NO';
差集求不存在某表的数据库名
select * from (
select SCHEMA_NAME from information_schema.SCHEMATA where SCHEMA_NAME like '%risen%'
) a
left join (
SELECT
TABLE_SCHEMA
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'pe_student'
AND COLUMN_NAME = 'registration_date'
and TABLE_SCHEMA like '%risen%'
) b on a.SCHEMA_NAME = b.TABLE_SCHEMA
where b.TABLE_SCHEMA is null
select SCHEMA_NAME from information_schema.SCHEMATA where SCHEMA_NAME like '%risen%'
) a
left join (
SELECT
TABLE_SCHEMA
FROM
information_schema. COLUMNS
WHERE
TABLE_NAME = 'pe_student'
AND COLUMN_NAME = 'registration_date'
and TABLE_SCHEMA like '%risen%'
) b on a.SCHEMA_NAME = b.TABLE_SCHEMA
where b.TABLE_SCHEMA is null
查询所有关键字有risen的数据库
select GROUP_CONCAT(SCHEMA_NAME) from information_schema.SCHEMATA where SCHEMA_NAME like '%risen%'
优化(中高级)
1.索引底层数据结构
索引本质
索引是帮助MySQL高效获取数据的排好序的数据结构
为什么使用B+树
为了查询效率
比较二叉树 红黑树 b树 b+树 的数据结构
存储引擎
作用级别
形容表的,表级别生效
文件结构
mysql位置
C:\ProgramData\MySQL\MySQL Server 5.7\Data\test
使用两种引擎分别建一张表,可见InnoDB有两个文件,.idb存储所有数据,
MyISAM有三个文件,.MYD和.MYI两个文件存储数据
MyISAM有三个文件,.MYD和.MYI两个文件存储数据
文件说明
db.opt
用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,
那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。
那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。
.frm
与表相关的元数据信息都存放在.frm文件中,主要是表结构的定义信息,不论什么存储引擎,每一个表都会有一个以表名命名的.frm文件。
.MYD和.MYI
.MYD:MY Data,是MyISAM存储引擎专用的用于存放MyISAM表的数据;
.MYI:MY Index,也是专属于MyISAM存储引擎的主要存放MyISAM表的索引相关信息。
.MYI:MY Index,也是专属于MyISAM存储引擎的主要存放MyISAM表的索引相关信息。
.ibd和.ibdata
两者都是专属于InnoDB存储引擎的数据库文件。
当采用共享表空间时所有InnoDB表的数据均存放在.ibdata中,所以当表越来越多时,这个文件会变得很大;
相对应的.ibd就是采用独享表空间时InnoDB表的数据文件。
修改为独享表空间的方法是在my.ini配置文件中添加/修改此条:
Innodb_file_per_table=1
注意:笔者所用的MySQL-5.7是默认独享表空间的,不用特意在配置文件中添加。
当然,就算开启了独享表空间,.ibdata文件也会越来越大,因为这个文件里还存储了:
变更缓冲区
双写缓冲区
撤销日志
当采用共享表空间时所有InnoDB表的数据均存放在.ibdata中,所以当表越来越多时,这个文件会变得很大;
相对应的.ibd就是采用独享表空间时InnoDB表的数据文件。
修改为独享表空间的方法是在my.ini配置文件中添加/修改此条:
Innodb_file_per_table=1
注意:笔者所用的MySQL-5.7是默认独享表空间的,不用特意在配置文件中添加。
当然,就算开启了独享表空间,.ibdata文件也会越来越大,因为这个文件里还存储了:
变更缓冲区
双写缓冲区
撤销日志
删除数据库表数据 ibd文件的大小不会变的
MyISAM存储引擎
非聚集
索引文件和数据文件是分离的
InnoDB
聚集
索引文件和数据文件是在一起的
表数据文件本身就是按B+Tree组织的一索引结构文件
聚集索引-叶节点包含了完整的数据记录
为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
为什么建议InnoDb表必须建主键?
因为是B+tree存储,如果不建,mysql会自己找个数据不相同的列为索引,如果没有自己建一个隐藏列来做这个事情,
所以为了效率,咱们自己建主键。
所以为了效率,咱们自己建主键。
为什么推荐使用整型的?
因为查找的时候,如果是字符串那要逐一比对ASCII码,整型效率肯定是高。
为什么要自增?
插入无序,MySQL存储排序。自增不需要分裂,也无需平衡,效率高。
为什么非主键索引结构叶子节点存储的是主键值? (一致性和节省存储空间)
索引方法
HASH
对索引的key进行一次hash计算就可以定位出数据存储的位置
很多时候Hash索引要比B+树索引更高效
仅能满足"=" , "IN" ,不支持范围查询
hash冲突问题
很多时候Hash索引要比B+树索引更高效
仅能满足"=" , "IN" ,不支持范围查询
hash冲突问题
BTREE
非叶子节点不存储data,只存储,引(冗余),可以放更多的索引
叶子节点包含所有索引字段
叶子节点用指针连接,提高区间问的性能
叶子节点包含所有索引字段
叶子节点用指针连接,提高区间问的性能
范围查找(B+tree通过指针查找,MySQL优化了,改为双箭头)
索引最左前缀原理
联合索引的底层存储结构长什么样?
原理:联合索引是按先后顺序排的,整张表来说后边索引不一定是排好序的,只有第一个相同,第二个才是排好序的。
2.Explain
工具介绍
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈
在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL
注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中
在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL
注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中
官网文档
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
Explain分析示例
示例表
mysql> explain select * from actor;
在查询中的每个表会输出一行,如果有两个表通过 join 连接查询,那么会输出两行
explain 两个变种
1)explain extended
在 explain 的基础上额外提供一些查询优化的信息。紧随其后通过 show warnings 命令可以得到优化后的查询语句,从而看出优化器优化了什么。额外还有 filtered 列,是一个半分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。
mysql> explain extended select * from film where id = 1;
mysql> show warnings;
2)explain partitions
相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。
explain中的列
1. id列
id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
2. select_type列
select_type 表示对应行是简单还是复杂的查询。
1)simple:简单查询。查询不包含子查询和union
mysql> explain select * from film where id = 2;
2)primary:复杂查询中最外层的 select
3)subquery:包含在 select 中的子查询(不在 from 子句中)
4)derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)
用这个例子来了解 primary、subquery 和 derived 类型
mysql> set session optimizer_switch='derived_merge=off'; #关闭mysql5.7新特性对衍生表的合并优化
mysql> explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der;
mysql> explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der;
mysql> set session optimizer_switch='derived_merge=on'; #还原默认配置
5)union:在 union 中的第二个和随后的 select
mysql> explain select 1 union all select 1;
3. table列
这一列表示 explain 的一行正在访问哪个表。
当 from 子句中有子查询时,table列是 <derivenN> 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。
当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id。
当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id。
4. type列
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref
一般来说,得保证查询达到range级别,最好达到ref
NULL
mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表
mysql> explain select min(id) from film;
const, system
mysql能对查询的某部分进行优化并将其转化成一个常量(可以看show warnings 的结果)。用于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条元组匹配时为system
mysql> explain extended select * from (select * from film where id = 1) tmp;
mysql> show warnings;
eq_ref
primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。
mysql> explain select * from film_actor left join film on film_actor.film_id = film.id;
ref
相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
1. 简单 select 查询,name是普通索引(非唯一索引)
mysql> explain select * from film where name = 'film1';
2.关联表查询,idx_film_actor_id是film_id和actor_id的联合索引,
这里使用到了film_actor的左边前缀film_id部分。
这里使用到了film_actor的左边前缀film_id部分。
mysql> explain select film_id from film left join film_actor on film.id = film_actor.film_id;
range
范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。
mysql> explain select * from actor where id > 1;
index
扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。
mysql> explain select * from film;
ALL
即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。
mysql> explain select * from actor;
5. possible_keys列
这一列显示查询可能使用哪些索引来查找。
explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。
6. key列
这一列显示mysql实际采用哪个索引来优化对该表的访问。
如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。
7. key_len列
这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。
举例来说,film_actor的联合索引 idx_film_actor_id 由 film_id 和 actor_id 两个int列组成,并且每个int是4字节。
通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。
通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。
mysql> explain select * from film_actor where film_id = 2;
key_len计算规则如下:
字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字或字母占1个字节,一个汉字占3个字节
char(n):如果存汉字长度就是 3n 字节
varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为varchar是变长字符串
数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节
时间类型
date:3字节
timestamp:4字节
datetime:8字节
如果字段允许为 NULL,需要1字节记录是否为 NULL
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。
字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字或字母占1个字节,一个汉字占3个字节
char(n):如果存汉字长度就是 3n 字节
varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为varchar是变长字符串
数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节
时间类型
date:3字节
timestamp:4字节
datetime:8字节
如果字段允许为 NULL,需要1字节记录是否为 NULL
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。
8. ref列
这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id)
9. rows列
这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。
10. Extra列
这一列展示的是额外信息。常见的重要值如下:
1)Using index:使用覆盖索引
覆盖索引定义:mysql执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说是用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值
mysql> explain select film_id from film_actor where film_id = 1;
2)Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖
mysql> explain select * from actor where name = 'a';
3)Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围;
mysql> explain select * from film_actor where film_id > 1;
4)Using temporary:mysql需要创建一张临时表来处理查询。
出现这种情况一般是要进行优化的,首先是想到用索引来优化。
出现这种情况一般是要进行优化的,首先是想到用索引来优化。
1. actor.name没有索引,此时创建了张临时表来distinct
mysql> explain select distinct name from actor;
2. film.name建立了idx_name索引,此时查询时extra是using index,没有用临时表
mysql> explain select distinct name from film;
5)Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。
这种情况下一般也是要考虑使用索引来优化的。
这种情况下一般也是要考虑使用索引来优化的。
1. actor.name未创建索引,会浏览actor整个表,保存排序关键字name和对应的id,然后排序name并检索行记录
mysql> explain select * from actor order by name;
2. film.name建立了idx_name索引,此时查询时extra是using index
mysql> explain select * from film order by name;
6)Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段是
mysql> explain select min(id) from film;
索引最佳实践
3.SQL执行过程
4.索引优化
5.事务隔离级别与锁机制
6.MVCC与BufferPool缓存机制
集群
基础
主从复制
高可用方案
MMM
MHA
MGR
分库分表
方式
垂直分片
按照业务来对数据进行分片,又称为纵向分片。他的核心理念就是转库专用。在拆分之前,一个数据库由多个数据表组成,每个表对应不同的业务。而拆分之后,则是按照业务将表进行归类,分布到不同的数据库或表中,从而将压力分散至不同的数据库或表。例如,下图将用户表和订单表垂直分片到不同的数据库
水平分片
又称横向分片。相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。
分片策略
取余\取模 : 优点 均匀存放数据,缺点 扩容非常麻烦
按照范围分片 : 比较好扩容, 数据分布不够均匀
按照时间分片 : 比较容易将热点数据区分出来。
按照枚举值分片 : 例如按地区分片
按照目标字段前缀指定进行分区:自定义业务规则分片
水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是分库分表的标准解决方案。
按照范围分片 : 比较好扩容, 数据分布不够均匀
按照时间分片 : 比较容易将热点数据区分出来。
按照枚举值分片 : 例如按地区分片
按照目标字段前缀指定进行分区:自定义业务规则分片
水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是分库分表的标准解决方案。
一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案
缺点
事务一致性问题
跨节点关联查询问题
跨节点分页、排序函数
主键避重问题
公共表处理
运维工作量
分库分表组件
shardingsphere
mycat
DBLE
日常笔记
日常记录
主要运用一些函数
日期
格式化
select * from test where date_format(create_time,'%Y-%m-%d')
between '2018-07-30' and '2018-07-31';
between '2018-07-30' and '2018-07-31';
按月查詢每天的sql數量
select date_format(operateDate,'%Y-%m-%d'),count(id)
from t_log
where datediff(now(),operateDate)<=30
GROUP BY date_format(operateDate,'%Y-%m-%d');
from t_log
where datediff(now(),operateDate)<=30
GROUP BY date_format(operateDate,'%Y-%m-%d');
设置创建时间
类型 :datetime
DEFAULT值 :CURRENT_TIMESTAMP
DEFAULT值 :CURRENT_TIMESTAMP
更新时间
类型 :timestamp
DEFAULT值 :CURRENT_TIMESTAMP
DEFAULT值 :CURRENT_TIMESTAMP
FIND_IN_SET()
注意:mysql字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必须以","分割开。
总结:like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。
总结:like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。
case when
间隔取值、模运算
以30秒为间隔取数据
select * from tablename where time >='2017-1-1' and mod(second(real_time),2)=0
财务金额
select format(1111111111.425231213,2)
mybaitis返回主键
插入更新操作
sql
username username UNIQUE BTREE
唯一主键判断,若唯一主键重复执行修改,若不重复则插入,mysql方言
不存在
drop table if exists excostbean2;
CREATE TEMPORARY TABLE if not EXISTS `excostbean2` (
CREATE TEMPORARY TABLE if not EXISTS `excostbean2` (
id递增,如何找到最后一条记录
下边的效率高
select * from tt order by id desc limit 1
select a.* from tt a
inner join
(select max(id) as ma from tt) b
on a.id=b.ma
还可以加上条件 ,例如具体是谁的
inner join
(select max(id) as ma from tt) b
on a.id=b.ma
还可以加上条件 ,例如具体是谁的
设置mysql7允许远程连接
1、使用mysql
use mysql;
2、查询
select host, user, authentication_string, plugin from user;
3、设置
update user set host='%' where user='root';
4、刷新权限
flush privileges;
如果是mysql8
mysql错误:mysql_native_password
mysql8.0 引入了新特性 caching_sha2_password;这种密码加密方式客户端不支持;
客户端支持的是mysql_native_password 这种加密方式;
客户端支持的是mysql_native_password 这种加密方式;
我们可可以查看mysql 数据库中user表的 plugin字段;
select host,user,plugin from user;
可以使用命令将他修改成mysql_native_password加密模式
mysql> updates user set plugin='mysql_native_password' where user='root';
mysql> select host,user,plugin from user;
mysql> select host,user,plugin from user;
flush privileges;
远程备份
navicat
数据库的大小
1.查看所有数据库容量大小
2.查看所有数据库各表容量大小
3.查看指定数据库容量大小
例:查看mysql库容量大小
例:查看mysql库容量大小
4.查看指定数据库各表容量大小
例:查看mysql库各表容量大小
例:查看mysql库各表容量大小
根据表名查所在数据库
select table_schema from information_schema.TABLES WHERE table_name = '表名';
问题
MySql数据库导入sql错误 Unknown collationutf8mb4_0900_ai_ci
错误原因:高版本数据库(8.0)转存sql文件 并导入低版本数据库(5.7)
解决办法:
方案一:升级mysql至高版本
方案二:将需要导入的sql文件,把其中的
utf8mb4_0900_ai_ci全部替换为utf8_general_ci
utf8mb4替换为utf8
--------------------------------------------------------------------------------
重新执行sql文件
解决办法:
方案一:升级mysql至高版本
方案二:将需要导入的sql文件,把其中的
utf8mb4_0900_ai_ci全部替换为utf8_general_ci
utf8mb4替换为utf8
--------------------------------------------------------------------------------
重新执行sql文件
导入大文件sql MySQL server has gone away错误的解决办法
在我们使用mysql导入大文件sql时可能会报MySQL server has gone away错误,该问题是max_allowed_packet配置的默认值设置太小,只需要相应调大该项的值之后再次导入便能成功。该项的作用是限制mysql服务端接收到的包的大小,因此如果导入的文件过大则可能会超过该项设置的值从而导致导入不成功!下面我们来看一下如何查看以及设置该项的值。
查看 max_allowed_packet 的值
show global variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 4194304 |
+--------------------+---------+
可以看到默认情况下该项的大小只有4M,接下来将该值设置成150M(1024*1024*150)
set global max_allowed_packet=157286400;
此时再查看大小
show global variables like 'max_allowed_packet';
查看 max_allowed_packet 的值
show global variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 4194304 |
+--------------------+---------+
可以看到默认情况下该项的大小只有4M,接下来将该值设置成150M(1024*1024*150)
set global max_allowed_packet=157286400;
此时再查看大小
show global variables like 'max_allowed_packet';
心得
关于常识,不要使用其他语言的
and
or
is null
is not null
一些函数
select CONCAT('前','拼接字符串','后');
select locate('111111','是否包含前边的字符串 111,包含返回位置,不包含结果是0');
select substring_index('是否包含第二个字符串,然后截断,多个由第三个参数选择截断第几个',',',1);
回车换行符
char(13) char(10)
替换字符串
select REPLACE("1234",'1','5')
正则匹配
REGEXP
匹配中文
select '111asda自hlk' REGEXP '[一-龥]'
正则表达式 匹配
[一-龥] 中文字符
[ a-zA-Z] 英文字母
[ 0-9] 数字
[ぁ-ゞァ-ヾ] 日文字符
[一-龥] 中文字符
[ a-zA-Z] 英文字母
[ 0-9] 数字
[ぁ-ゞァ-ヾ] 日文字符
true 1
false 0
关于存储过程
临时表可临时存储
存储过程可相互调用
其他
show full processlist;
同navcat里的工具-服务监控
0 条评论
下一页