引言
数据库非常重要,本篇为总结第三篇
MySql常用函数
SELECT ABS(-8);//绝对值
SELECT CEILING(9.4);//向上取整
SELECT FLOOR(9.4);//向下取整
SELECT RAND();//返回一个0到1的随机数
SELECT SIGN(10);//判断一个数的符号,0-0 <0--1 >0-1
---字符串函数-----
SELECT CHAR_LENGTH('阿三大苏打 ');//字符串长度
SELECT CONCAT('1','0');//拼接字符串
SELECT INSERT('我爱编程',1,2,'超级热爱');//查询从某个位置开始替换某个长度
SELECT LOWER('SDA');//小写字母
SELECT UPPER('sda');//大写字母
SELECT INSTR('asdas','d');//返回第一次出现字母的索引
SELECT REPLACE('坚持就能成功','坚持','努力');//替换字符串
SELECT SUBSTR('坚持就能成功',4,2);//第几个位置截几个字符
SELECT REVERSE('坚持就能');//反转字符串
SELECT REPLACE(name,'周','州') FROM STUDENT where name like '周%';
//时间日期函数(记住)
SELECT CURRENT_DATE();//获取当前日期
SELECT CURDATE();//当前日期
SELECT LOCALTIME();//本地时间
SELECT NOW();//当前时间
SELECT SYSDATE();//系统时间
SELECT YEAR(NOW());
聚合函数
COUNT() //计数
SUM() //求和
AVG() //平均值
MAX() //最大值
MIN() //最小值
===================
SELECT COUNT(name) FROM student; //指定字段忽略null值
SELECT COUNT(*) FROM student; //不忽略null值 计算行数
SELECT COUNT(1) FROM student; //忽略null值 计算行数
//用法大致相同
SELECT SUM(grade) FROM student;//求总和
===查询不同课程的平均分,最高分,最低分
核心:根据不同课程的课程分组
select name,AVG(grade),MIN(grade)
FROM result r
INNER JOIN 'subject' sub
ON r.rno=sub.rno
GROUP BY r.rno //通过什么分组
----加一个平均分大于80分 用where报错
#### HAVING
select name,AVG(grade) AS '平均分',MIN(grade)
FROM result r
INNER JOIN 'subject' sub
ON r.rno=sub.rno
GROUP BY r.rno
HAVING '平均分'>80
MD5加密
UDATE 表名 SET pwd=MD5(pwd);
INSERT into Values(4,'小明',MD5('12345'));
//如何校验
将用户传进来的值进行MD5加密然后再进行对比
SELECT * FROM user where name='xi' and pwd=MD5('12345');
事务
ACID
A原子性:一起成功一起失败,不单独一方成功和失败,
C一致性:事务完成符合逻辑,
I隔离性:每个事务执行不应相互影响 ,
D持久性:没有提交就恢复原状,如果提交不可逆了就持久化到数据库了
脏读:如果隔离失败就读取错误的数据了,2人相互转账,如果脏读就出现了错误
不可重复读: 在一个事务内多次读取结果不同,不一定错可能场合问题,查询的时候可能刚好有人转账过来
幻读(虚读): 读取到了别的事务插入的数据,前后不一致
//手动事务代码
//mysql默认开启
set autocommit=1 |开启
START TRANSACTION//开始事务
//两个人互相转账
COMMIT //提交
ROLLBACK //回滚
set autocommit=0 关闭
索引
//能够更快的查询数据,提高查询效率
主键索引 primary key 一个表一个主键,不可重复
唯一索引 unique key 避免重复的列,可多个唯一
常规索引 key 默认的,index,key 关键字修饰
全文索引 FullText 特定数据库引擎才有,快速定位数据
//显示所有索引
SHOW INDEX FROM STUDENT;
//增加一个全文索引
ALTER TABLE SCHOOL.STUDENT ADD FULLTEXT INDEX sname(sname);
//EXPLAIN 分析sql执行情况
EXPLAIN SELECT * FROM student;--非全文索引
SELECT * FROM student where MATCH(sname)AGAINST('刘');
插入100万条数据
DELIMITER $$ --写函数之前必须写
Create FUNCTION mock_data()
RETURN INT
BEGIN
DECLARE num INT DEFAULT 100000
WHILE I<num Do
SET i=i+1;
INSERT INTO app_user(name,sex)Values(Concat('用户',i),FLOOR(RAND()*2);
END WHILE
RETURN i;
END;
SELECT mock_data();
//创建索引,查数据1秒就完成了
create INDEX id_app_user_name ON app_user(name);
索引原则
- 不是越多越好
- 不要对经常变动的数据加索引
- 一般加在常用的字段上
反思:
- 虽然学习完了,但是仍然要多去读sql多练习
- 其次,发现基本知识非常重要,嗯去看看JVM下次写笔记