1、常用函数
数据函数
SELECT ABS(-8); /*绝对值*/ SELECT CEILING(9.4); /*向上取整*/ SELECT FLOOR(9.4); /*向下取整*/ SELECT RAND(); /*随机数,返回一个0-1之间的随机数*/ SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/
字符串函数
SELECT CHAR_LENGTH(‘寇大大‘); /*返回字符串包含的字符数*/ SELECT CONCAT(‘我‘,‘爱‘,‘罗‘); /*合并字符串,参数可以有多个*/ SELECT INSERT(‘爱辽深木闭烟霞‘,1,2,‘best‘); /*替换字符串,从某个位置开始替换某个长度*/ SELECT LOWER(‘Koudada‘); /*小写*/ SELECT UPPER(‘Koudada‘); /*大写*/ SELECT LEFT(‘hello,world‘,5); /*从左边截取*/ SELECT RIGHT(‘hello,world‘,5); /*从右边截取*/ SELECT REPLACE(‘寇门贤良宰相家‘,‘清泊清霜冰上加‘,‘海天一色博游客‘); /*替换字符串*/ SELECT SUBSTR(‘寇门贤良宰相家‘,4,6); /*截取字符串,开始和长度*/ SELECT REVERSE(‘寇门贤良宰相家‘); /*反转 -- 查询姓寇的同学,改成何 SELECT REPLACE(studentname,‘寇‘,‘何‘) AS 新名字 FROM student WHERE studentname LIKE ‘寇%‘;
日期和时间函数
SELECT CURRENT_DATE(); /*获取当前日期*/ SELECT CURDATE(); /*获取当前日期*/ SELECT NOW(); /*获取当前日期和时间*/ SELECT LOCALTIME(); /*获取当前日期和时间*/ SELECT SYSDATE(); /*获取当前日期和时间*/ -- 获取年月日,时分秒 SELECT YEAR(NOW()); SELECT MONTH(NOW()); SELECT DAY(NOW()); SELECT HOUR(NOW()); SELECT MINUTE(NOW()); SELECT SECOND(NOW());
系统信息函数
SELECT VERSION(); /*版本*/ SELECT USER(); /*用户*/
2、聚合函数
-- 聚合函数 /*COUNT:非空的*/ SELECT COUNT(studentname) FROM student; SELECT COUNT(*) FROM student; SELECT COUNT(1) FROM student; /*推荐*/ SELECT SUM(StudentResult) AS 总和 FROM result; SELECT AVG(StudentResult) AS 平均分 FROM result; SELECT MAX(StudentResult) AS 最高分 FROM result; SELECT MIN(StudentResult) AS 最低分 FROM result;
从含义上讲,count(1) 与 count(*) 都表示对全部数据行的查询。下面它们之间的一些对比:
- 在表没有主键时,count(1)比count(*)快
- 有主键时,主键作为计算条件,count(主键)效率最高;
- 若表格只有一个字段,则count(*)效率较高。
查询不同课程的平均分,最高分,最低分
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是从数据表中的>字段直接进行的筛选的 */
MD5 加密
实现数据加密
新建一个表 testmd
CREATE TABLE `testmd` ( `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 testmd VALUES(1,‘koudada‘,‘123456‘),(2,‘kouxiaoxiao‘,‘456789‘)
我们要对pwd这一列数据进行加密,语法是:
update testmd set pwd = md5(pwd);
如果单独对某个用户(如koudada)的密码加密:
INSERT INTO testmd VALUES(3,‘koudada2‘,‘123456‘) update testmd set pwd = md5(pwd) where name = ‘koudada2‘;
插入新的数据自动加密
INSERT INTO testmd VALUES(4,‘koudada3‘,md5(‘123456‘));
查询登录用户信息
SELECT * FROM testmd WHERE `name`=‘koudada‘ AND pwd=MD5(‘123456‘);
3、小结
-- ================ 内置函数 ================ -- 数值函数 abs(x) -- 绝对值 abs(-10.9) = 10 format(x, d) -- 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46 ceil(x) -- 向上取整 ceil(10.1) = 11 floor(x) -- 向下取整 floor (10.1) = 10 round(x) -- 四舍五入去整 mod(m, n) -- m%n m mod n 求余 10%3=1 pi() -- 获得圆周率 pow(m, n) -- m^n sqrt(x) -- 算术平方根 rand() -- 随机数 truncate(x, d) -- 截取d位小数 -- 时间日期函数 now(), current_timestamp(); -- 当前日期时间 current_date(); -- 当前日期 current_time(); -- 当前时间 date(‘yyyy-mm-dd hh:ii:ss‘); -- 获取日期部分 time(‘yyyy-mm-dd hh:ii:ss‘); -- 获取时间部分 date_format(‘yyyy-mm-dd hh:ii:ss‘, ‘%d %y %a %d %m %b %j‘); -- 格式化时间 unix_timestamp(); -- 获得unix时间戳 from_unixtime(); -- 从时间戳获得时间 -- 字符串函数 length(string) -- string长度,字节 char_length(string) -- string的字符个数 substring(str, position [,length]) -- 从str的position开始,取length个字符 replace(str ,search_str ,replace_str) -- 在str中用replace_str替换search_str instr(string ,substring) -- 返回substring首次在string中出现的位置 concat(string [,...]) -- 连接字串 charset(str) -- 返回字串字符集 lcase(string) -- 转换成小写 left(string, length) -- 从string2中的左边起取length个字符 load_file(file_name) -- 从文件读取内容 locate(substring, string [,start_position]) -- 同instr,但可指定开始位置 lpad(string, length, pad) -- 重复用pad加在string开头,直到字串长度为length ltrim(string) -- 去除前端空格 repeat(string, count) -- 重复count次 rpad(string, length, pad) --在str后用pad补充,直到长度为length rtrim(string) -- 去除后端空格 strcmp(string1 ,string2) -- 逐字符比较两字串大小 -- 聚合函数 count() sum(); max(); min(); avg(); group_concat() -- 其他常用函数 md5(); default();