1MySQL函数
1常用函数
数据函数
SELECT ABS(-8); /*绝对值*/abs
SELECT CEILING(9.4); /*向上取整*/ceiling
SELECT FLOOR(9.4); /*向下取整*/ floor
SELECT RAND(); /*随机数,返回一个0-1之间的随机数*/rand
SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/sign
字符串函数
SELECT CHAR_LENGTH('狂神说坚持就能成功'); /*返回字符串包含的字符数*/char_length
SELECT CONCAT('我','爱','程序'); /*合并字符串,参数可以有多个*/concat
SELECT INSERT('我爱编程helloworld',1,2,'超级热爱'); /*替换字符串,从某个位置开始替换某个长度*/insert
SELECT LOWER('KuangShen'); /*小写*/ lower
SELECT UPPER('KuangShen'); /*大写*/ upper
SELECT LEFT('hello,world',5); /*从左边截取*/ left
SELECT RIGHT('hello,world',5); /*从右边截取*/ right
SELECT REPLACE('狂神说坚持就能成功','坚持','努力'); /*替换字符串*/ replace
SELECT SUBSTR('狂神说坚持就能成功',4,6); /*截取字符串,开始和长度*/ substr
SELECT REVERSE('狂神说坚持就能成功'); /*反转 reverse
-- 查询姓周的同学,改成邹
SELECT REPLACE(studentname,'周','邹') AS 新名字 replace
FROM student WHERE studentname LIKE '周%';
日期和时间函数
SELECT CURRENT_DATE(); /*获取当前日期*/ current_date
SELECT CURDATE(); /*获取当前日期*/ curdate
SELECT NOW(); /*获取当前日期和时间*/ now
SELECT LOCALTIME(); /*获取当前日期和时间*/ localtime 2021-02-22 09:28:09
SELECT SYSDATE(); /*获取当前日期和时间*/ sysdate 2021-02-22 09:27:34
-- 获取年月日,时分秒
SELECT YEAR(NOW()); year
SELECT MONTH(NOW()); month
SELECT DAY(NOW()); day
SELECT HOUR(NOW()); hour
SELECT MINUTE(NOW()); minute
SELECT SECOND(NOW());second
系统信息函数
SELECT VERSION(); /*版本*/
SELECT USER(); /*用户*/
2聚合函数
-- 聚合函数
/*COUNT:非空的*/
SELECT COUNT(studentname) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student; /*推荐*/
-- 从含义上讲,count(1) 与 count(*) 都表示对全部数据行的查询。
-- count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
-- count(*) 包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录;
-- count(1) 用1代表代码行,在统计结果的时候,包含字段为null 的记录 。
/*
很多人认为count(1)执行的效率会比count(*)高,原因是count(*)会存在全表扫描,而count(1)可以针对一个字段进行查询。其实不然,count(1)和count(*)都会对全表进行扫描,统计所有记录的条数,包括那些为null的记录,因此,它们的效率可以说是相差无几。而count(字段)则与前两者不同,它会统计该字段不为null的记录条数。
下面它们之间的一些对比:
1)在表没有主键时,count(1)比count(*)快
2)有主键时,主键作为计算条件,count(主键)效率最高;
3)若表格只有一个字段,则count(*)效率较高。
*/
SELECT SUM(StudentResult) AS 总和 FROM result;
SELECT AVG(StudentResult) AS 平均分 FROM result;
SELECT MAX(StudentResult) AS 最高分 FROM result;
SELECT MIN(StudentResult) AS 最低分 FROM result;
-- 查询不同课程的平均分,最高分,最低分
-- 前提:根据不同的课程进行分组
SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result AS r
INNER JOIN `subject` AS s
ON r.subjectno = s.subjectno
GROUP BY r.subjectno
HAVING 平均分>80;
/*
where写在group by前面.
要是放在分组后面的筛选
要使用HAVING..
因为having是从前面筛选的字段再筛选,而where是从数据表中的>字段直接进行的筛选的
*/
3MD5 加密
CREATE TABLE `testmd5` (
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO testmd5 VALUES(1,'kuangshen','123456'),(2,'qinjiang','456789')
//如果我们要对pwd这一列数据进行加密,语法是:
update testmd5 set pwd = md5(pwd);
//如果单独对某个用户(如kuangshen)的密码加密:
INSERT INTO testmd5 VALUES(3,'kuangshen2','123456')
update testmd5 set pwd = md5(pwd) where name = 'kuangshen2';
//插入新的数据自动加密
INSERT INTO testmd5 VALUES(4,'kuangshen3',md5('123456'));
//查询登录用户信息(md5对比使用,查看用户输入加密后的密码进行比对)
SELECT * FROM testmd5 WHERE `name`='kuangshen' AND pwd=MD5('123456');