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