MySQL--03
1、常用函数
时间和日期函数:
select CURRENT_DATE();//获取当前日期
select CURDATE();//获取当前日期 与上同
select NOW();//获取当前时间 (日期+时间)
select YEAR(date);//返回年
select MONTH(date);//返回月
select DAY(date);//返回天
select HOUR(date) select MINUTE(date) select SECOND(date)
系统:
select SYSTEM_USER(); select USER();//返回用户名
select VERSION();//版本号
2、聚合函数(常用)
能够统计表中数据count(),想查询一个表中有多少条记录就可以使用这个count()
count() 计数 select count(`id`) from student count(字段)会忽略所有的null值
select count(*) from student count(*) 不会忽略null值,本质就是计算行数
select count(1) from student count(1) 不会忽略null值,本质也是计算行数
sum() 求和 select sum(score) from result; 计算出学生成绩的综合
avg()平均值 select avg(score) from result; 计算出学生成绩的平均值
MAX() 最大值 select MAX(score) from result; 计算出学生成绩的最大值
MIN() 最小值 select MIN(score) from result; 计算出学生成绩的最小值
3、分组和过滤
group by... 列名
having 过滤条件
4、数据库级别的MD5加密
什么是MD5 :主要是增强算法复杂度和不可逆性
MD5不可逆,具体的值的MD5是一样的
MD5破解网站的原理,就是他们有一个字典,对应的是MD5加密前的值 -- MD5加密后的值
但只有一些比较常见的比如123456 稍微复杂一点都不可以
由于小马哥在设置密码的时候直接MD5加密掉了所以他的密码就是加密格式的
现在把剩下的两位小哥也加密一下
后台是怎么实现对用户密码的校验呢? ------> 后台对用户输入的密码进行MD5加密后和库中的MD5密码相比较,相同则输入正确
5、select小结
6、事务
要么都成功,要么都失败
事务原则: ACID 大神讲解:[https://blog.csdn.net/dengjili/article/details/82468576]
原子性:针对同一个事务
两个步骤一起成功或者一起失败,不能只发生其中一个动作
比如转账:A向B转账500块,那A转账成功B账户就必须多出500块,A账户必须少500块
一致性:针对一个事务操作前与操作后的状态一致
还是说转账的问题,比如AB账户一共有1000块,那么无论他们两个怎么转,转多少次,他们两个账户的总钱数都是1000块
持久性:表示事务结束后的数据不随着外界原因导致数据丢失
持久性就只有两种可能,一种是事务没有提交,恢复到原状,另一种是事务已经提交,持久化到数据库,打死都不会改变
即事务一旦提交就不可逆
隔离性:针对多个用户同时操作,主要是排除其他事务对本次事务的影响
举个例子,A向B转账 B在向C转账,同时进行操作,但是他们是隔离起来的 不会互相影响
【秦老师理解】:
原子性:要么都成功要么都失败
一致性:事务前后的数据完整性要保证一致
持久性(事务提交):事务一旦提交就不可逆转,被持久化到数据库中
隔离性:互不干扰 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
隔离所导致的一些问题:
脏读:指一个事务读取了另外一个事务未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一般是行影响,多了一行)
7、事务流程:
在这里看着并不是很明显,因为这是手动的一步步点执行
正常放在业务中是Java代码
可以把它看成是一个方法
放在trycatch中的代码
method(){ try{ "正常的业务代码“ "正常执行完之后" commit();//提交 } catch(){ //"出现错误之后在这里" rollback(): } }
8、索引
索引是帮助MySQL高效获取数据的数据结构
在一个表中,主键索引只能有一个,唯一索引可以有多个
·主键索引 PRIMARY KEY
唯一的标识,主键不可重复,只能有一个列作为主键。
·唯一索引 UNIQUE KEY
避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
·常规索引 KEY/INDEX
默认的索引 index key关键字来设置
·全文索引 FullText
在特定的数据库引擎下才有 MyISAM 用于快速定位数据
9、索引的使用:
1、在创建表的时候给字段增加索引
2、创建完毕后,增加索引 alter add
显示所有的索引信息:show index from 表名
增加一个全文索引: 索引名和列名一致就好了
alter table 表明.列名 add FULLTEXT INDEX 索引名(列名)
EXPLAIN 分析sql执行的状况
10、给某个表中的某个字段创建索引:
create index id_表名_字段名 on 表 (字段)
添加索引就是在内存中又新建了一颗树
怎么说呢
给表的某个列创建完索引之后,它本身是一行行的数据,但创建完索引之后,可以看上图就是在数据行的前面创建了一个树,给每个数据都增加了一个唯一的索引,让查找更加方便,在没有索引的时候,想要查询一个具体的数据那就要从这些数据中查找,在数据量比较大的时候可能会查询个几十万条数据才能找到,但你加上索引之后,他每个数据就相当于都有一个key:value相对应,我想找这个值value,只需要找到对应的key,就只需要查找一条数据就可以找到。
【索引在小数据量的时候,用处不大。但在大数据大的时候,区别十分明显】
11、索引原则
·索引不是越多越好
·不要对经常变动的数据加索引
·小数据量的表不需要加索引
·索引一般加在常用来查询的字段上
12、用户权限
--创建用户 create user 用户名 indetified by '密码' create user JzSpace identified by 'space1111' --修改密码(修改当前用户密码) set password = PASSWORD('space1111')
--修改指定用户密码 set password for username = password('space1111')
--重命名 rename user 原来名字 to 新的名字
rename user space1 to space2
--用户授权 ALL PRIVILEGES 全部的权限 *.*指所有库所有表
--create ALL PRIVILEGES ON 库.表 TO 用户
--查询权限
show grants for 用户 查询指定用户的权限
show grants for root@localhost
--root权限:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
--撤销权限 REMOVE 哪些权限 在哪个库撤销 给谁撤销
REMOVE ALL PRIVILEGES ON *.* FROM 用户
13、MySQL备份
为什么要备份:1、保证重要的数据不丢失 2、数据转移
MySQL数据库备份的方式
1、直接拷贝物理文件 data文件夹 2、在可视化工具中手动导出 右键库或者表 转储
3、使用命令行 mysqldump -h主机 -u用户名 -p密码 数据库 表 > 物理磁盘位置/文件名 D:/ 【> .... 到哪里】
导出一张表:mysqldump -hlocalhost -uroot -pspace999 jzspace student >D:/a.sql
导出多张表:mysqldump -hlocalhost -uroot -pspace999 jzspace student result subjecct >D:/b.sql
//表和表之间加空格 不加, 命令行里没有, 空格代表
导出数据库:mysqldump -hlocalhost -uroot -pspace999 jzspace >D:/b.sql
#sql文件导入数据库 #先登录数据库 mysql -uroot -pspace999 #导入表的话就切换到指定的数据库 use database 然后source D:/a.sql #如果是导入数据库就没必要选择数据库了 登录进来后直接source
@@推荐使用上面这种方式导入表或数据库,不容易将别人的表覆盖
另一种方法和上面的类似:
mysql -uroot -pspace999 < D:/a.sql
#就是一个符号的差别 <导入 >导出