mysql高级
最后更新日期2020-05-06;
今日学习内容
- mysql数据库的数据结构
- mysql中的常见函数
- 数据库设计的范式
- 事务的概念
易错点
-
在select语句中同优先级情况下不能将一个函数结果重命名之后作为另一个函数的输入值
select first_name,last_name,concat(first_name,last_name) con,length(con) as len from employees ordor by len desc; -- 错误例子 select first_name,last_name,length(concat(first_name,last_name)) as len from employees ordor by len desc; -- 正确例子
-
如果root密码忘记如何修改其他用户的密码和权限
MySQL中常用的数据类型
整型(tinyint smallint mediumint int bigint)
- 格式:类型[(M)[unsigned][zerofill]] eg:id int unsigned zerofill
- M:指定显示的宽度(十进制位数默认M=10),以实际取值为准,实际的值超出过现实的宽度,宽度自动增加
- unsigned:设置为无符号数。
- zerofill:填充0(设置zerofill后默认设置为unsigned)。
- 如果一个数字的宽度小于所允许的最大宽度,在这个值的前边用0填充
- 如果一个数字宽度大于所允许的最大宽度但不超过其取值范围,以实际值为准,不会进行填充0的操作;如果超如范围会报错,存储失败。
小数
-
定点小数(精确小数类型) decimal 或者dec numeric fixed
- 格式:DEC[(M[,D)] [unsigned] [zerofill]] eg: id DEC(5,3) unsigned
- M:精度,(整数位+小数位)不包含小数点(1~30),不写默认为10
- D:小数位数,如果不写默认为0,如果位数不够,小数末尾补0,不能超出最大范围,超出则报错。
- 格式:DEC[(M[,D)] [unsigned] [zerofill]] eg: id DEC(5,3) unsigned
-
浮点数
- float 单精度浮点数
- 格式:float[(length) | (,)]
- double 双精度浮点数
- 格式:double[(length) | (,)]
- 区别:在于两者的值所保留的存储空间的数量不同。
- 注意事项:对于一个浮点数来讲,可用的存储空间有限,如果你存储的数字非常大或者非常小,将会存储这个数字的近似值而不是精确值。
- 使用一个参数来指定浮点类型
- length:在一个浮点数中指定长度来确认浮点类型
- 0~24:单精度浮点数 float,从第七位有效位开始进行四舍五入,存储六位小数
- 25~30:双精度浮点数double,从16位开始,开始进行四舍五入。
- 使用两个参数来指定浮点类型
- 单精度 float(m,d):m代表精度(0~24),d代表小数位数
- 双精度 double(m,d): m代表精度(25~30), d代表小数位数
- length:在一个浮点数中指定长度来确认浮点类型
eg:
create table t1(id float(8)); insert into t1 values(123); insert into t1 values(1234567); -- 12345670 insert into t1 values(123456789); -- 12345670 insert into t1 values(0.123456789); -- 0.123457
- float 单精度浮点数
字符
-
类型:
- char(n): 固定长多,最多255个字符
- varchar(n):
- text:
-
当输入的是数字类型时可以直接插入,当插入的是字符时需要用单/双引号,如果需要在中间增加单/双引号需要使用/进行转义
-
char 与 varchar text三者之间的区别
- char与varchar的区别:
- char(n)若存入的字符小于n,则以空格补充,查询时再讲空格去除
- char(n)固定长度,无论存入几个字符,都将占用4字节
- varchar是存入实际的字符数(+1字节(n<=255)|+2个字节(n>255))
- 因为varchar类型需要计算长度,所以char类型的字符串检索速度要比varchar类型快。
- varchar和text的区别:
- varchar可以指定n,text不行。 varchar是存入的实际字符+1|+2个字符,text永远是实际字符+2个字节。
- varchar可以指定默认值,text不行。
- varchar可以直接创建索引,text不行。
- char与varchar的区别:
日期
-
date:日期
-
time:时间
-
datetime:时间日期
-
timestamp:时间戳类型(自动保存记录修改的时间) -->如果数据库表中有timestamp类型,必须要考虑时区的原因
-
获取当前时间now() sysdate()
-
now()在执行时就获取到了值,sysdate()在函数执行时会动态获取
SELECT NOW(),SLEEP(3),NOW(); SELECT SYSDATE(),SLEEP(3),SYSDATE();
-
位类型
- bit(n): 二进制
- hex(n): 十六进制
枚举
- 单选字符串数据类型,适合存储表单界面中的的’单选值’。
- 设定enum类型的时候,需要给定’固定的几个选项’;存储时就只能存储其中的一个值。
- 格式:enum(‘枚举值1’,‘枚举值2’……);
- 设定的枚举值都会对应一个数字,从1开始最多可以65535个选项。
set(集合)
- 多选字符串数据类型,存储表单主界面中的’选值’
- 设定set类型的时候,需要给定’固定的几个选项’;存储时就只能存储其中的多个值。
- 格式:set(‘类型1’,‘类型2’……);
- 设定的类型都会对应一个数字,从1开始以1,2,4,8的形式增加最多可以64个选项,可以使用多个选项的数字之和eg: 7(1+2+4)。
mysql中常见的函数
-
字符函数
-
大小写控制函数
- lower(str):字符转小写
- upper(str):字符转大写
-
字符控制函数
- concat(str1,str2,……):字符串拼接
- substr(str,start_index,length): 字符串截取,从1开始不指定长度截取到字符串末尾,和substring用法相同。
- length(): 字符串的字符长度,在utf8编码一个中文字符为3个字符长度。
- instr(str,target_str): 查找字符串位置,不区分大小写。
- Lpad(str,length,specific_str): 显示length长度的字符,如果大于原字符串则左边填充指定字符串,如果小于只显示指定长度的字符。一直相对的有RPAD()。
- trim(): 去空格
- trim(str): 只去除字符串前后的空格不去除字符串内部的空格。LTRIM/RTRIM去除左/右边的空格
- trim(leading/trailing/both str from str1): 删除str1的首/尾/首尾指定字符
- replace(str,search,replace): 将str中的所有search字段替换成replace字段
-
-
数字函数
- round(str,len): 将str保留len位的有效小数进行四舍五入。
- truncate(str,len): 将str保留len为有效数字后全部截取当len为负数是则将小数点前len位置零。
- mod(num1,num2): 取余num1为被除数,num2位除数。
-
日期函数
-
now() sysdate(): 获取当前时间
-
str_to_date(‘2020-01-01 11:11:11’,’%Y-%m-%d %H:%i:%s’): 字符串转日期。
str_to_date('2020-01-01 11:11:11','%Y-%m-%d %H:%i:%s')
-
date_format():日期转字符串
date_format('2020/01/01','%Y-%m-%d')
-
-
其他函数
select * case when then when then from table1
数据库设计的范式
事务
事务的概念
事务的基本操作
-
自动提交
系统变量autocommit默认值为1,当任意的sql语句发送到服务器服务器会立即执行并更新数据库
-
如何修改事务的默认提交方式
使用set autocommit=0,关闭服务器自动提交功能
-
开启事务
start transaction | begin
-
回滚
rollback
可以在特定的点设置savepoint p1;
使用rollback to savepoint p1;回滚到p1点
-
提交
commit
事务的特征(ACID)
-
事务的四大特征(ACID)
- 原子性:事务中的操作同时成功或同时成功的
- 一致性:事务在执行数据库前的状态和执行数据库后的状态,数据总量不发生改变
- 隔离性:保证多个事务同时处理且互不干扰
- 持久性:事务被提交以后不能再被撤销
事务的隔离级别
-
概念
定义了事务之间隔离和交互的程度
-
存在的问题
-
脏读:一个事务读取到另一个书屋尚未提交的数据
-
不可重复读:在同一个事务当中两次读取的数据内容不一致(引起的原因是另一个事务针对同样的数据进行update引发的问题)
-
幻读:一个事务中两次的读取的数据不一致(引起的原因是另一个事务针对同样的数据进行insert和delete操作引发的问题)
-
高级别的事务隔离可以有效地实现并发,但会降低事务并发访问的性能
-
低级别的事务隔离可以提高事务的并发访问性能,但可能导致并发实物中的脏读、不可重复读和幻读等问题。
-
-
隔离级别
-
read uncommitted:读取未提交数据
产生问题:脏读 不可重复读 幻读
最小的隔离程度,该隔离级别的事务可以读到其他事务还没有提交的数据
-
read committed:读取提交的数据
该隔离级别的事务可以读取其他事务已提交的数据
产生问题:不可重复读 幻读
解决了脏读问题
-
repeatable read:可重复读
默认的隔离级别,相同的查询语句执行结果总是相同的。
产生问题:幻读
解决了脏读和不可重复读
-
serializable:串行化
最高级别的,将事务一个接一个按照顺序执行。
解决了所有问题。
-
-
语法
select @@session.tx_isolation -- 询当前会话的隔离级别 select @@global.tx_isolation -- 询全局事务隔离级别 set session transaction isolation level read uncommitted -- 置当前会话的隔离级别 set global transaction isolation level read uncommitted -- 置全局离级别
DCL
-
DBA:数据库管理员
-
管理用户
-
添加用户
create user 'username'@'hostname' identified by 'password' -- 添加用户
-
删除用户
drop user 'username'@'host' -- 删除用户
-
修改用户(密码)
set password for 'username'@'host' = password = ('newpassword');-- 重启生效 update user set password = password('newpassword') where user = 'username';
- 修改root账户密码
- 命令行停止mysql
- 使用无验证的方式启动mysql服务 – mysql – skip-grand-tables
- 打开新的cmd窗口,直接输入mysql 敲入回车即可登录成功
- 修改root密码为新密码
- 将两个cmd窗口关闭,打开任务管理器,手动关闭MySQL.exe进程;
- 启动MySQL服务,使用心得密码登录即可
- 修改root账户密码
-
查询用户:
切换到mysql数据库
查询user表
use mysql; select * from user; -- 通配符%是可以在任意一台主机登录数据库
-
-
权限管理
-
查询权限
show grants for 'username'@'host';
-
授予权限
grant 权限1,权限2,…… on 数据库名称.表名 to 'username'@'host'; grant all on *.* to 'username'@'host';-- 赋予所有权限
-
撤销权限
revoke 权限1,权限2,…… on 数据库名称.表名 to 'username'@'host'; revoke all on *.* to 'username'@'host';-- 撤销所有权限
-