SQL的函数
函数就是将我们经常使用的代码封装起来, 需要的时候直接调用, 提高代码效率和可维护性.
SQL函数一般是在数据上执行, 可以方便地转换和处理数据.
常用的SQL函数
SQL提供了一些常用的内置函数, 也可以自定义, 内置的函数分为四类:
- 算数函数
- 字符串函数
- 日期函数
- 转换函数
算数函数
算数函数, 其实就是对数据类型的字段进行算术运算, 常用的如下:
SELECT ABS(-2); // 2
SELECT MOD(101, 3); // 2
SELECT ROUND(37.25, 1); // 37.3
字符串函数
常用的字符串函数如下:
SELECT CONCAT('abc', 123); // abc123
SELECT LENGTH('你好'); // 6
SELECT CHAR_LENGTH('你好'); // 2
SELECT LOWER('ABC'); // abc
SELECT UPPER('abc'); // ABC
SELECT REPLACE('fabcd', 'abc', 123); // f123d
SELECT SUBSTRING('fabcd', 1,3); // fab
日期函数
常用函数如下:
SELECT CURRENT_DATE; // 获取当前日期
SELECT CURRENT_TIME; // 获取当前时间
SELECT CURRENT_TIMESTAMP; // 获取当前日期 + 时间(时间戳)
SELECT EXTRACT(YEAR FROM '2019-07-07'); // 获取日期年
SELECT EXTRACT(MONTH FROM '2019-07-07'); // 获取日期月
SELECT EXTRACT(DAY FROM '2019-07-07'); // 获取日期天
SELECT DATE('2019-07-07 09:54:00'); // 获取日期
SELECT TIME('2019-07-07 09:54:00'); // 获取时间
SELECT TIMESTAMP('2019-07-07 09:54:00'); // 获取时间戳
以后日期类型的比较实用DATE()函数来进行. 这点很重要.
转换函数
转换函数的作用是用来转换数据类型的
SELECT CAST(123.123 AS INT); // 报错, 原数值有小数, 不会四舍五入, 转换出错
SELECT CAST(123.123 AS DECIMAL(8,2)); // 8表示整数+小数总共8位,2表示小数位数有两位
SELECT COALESCE(NULL, 1, 2); // 第一个部位null的数是1
聚集函数
聚集函数是对一组数据进行汇总的函数, 输入一组数据, 输出的是单个值. SQL中的聚集函数一共包括5个
SELECT COUNT(*) FROM heros WHERE hp_max > 6000; // 查询最大生命值大于6000的英雄数量
SELECT MAX(hp_max) FROM heros WHERE role_main = '射手' or role_assist = '射手'; // 查询主要定位和次要定位都是射手的英雄的最大生命值
SELECT COUNT(*), AVG(hp_max), MAX(mp_max), MIN(attack_max), SUM(defense_max) FROM heros WHERE role_main = '射手' or role_assist = '射手'; // 一次使用多个聚合函数
SELECT ROUND(AVG(DISTINCT hp_max), 2) FROM heros; // 计算最大生命的平均值,并保留小数点后两位
注意MAX, MIN, AVG函数会自动忽略值为NULL的数据行.
数据的分组和统计
对数据进行分组需要使用到GROUP BY子句:
SELECT COUNT(*), role_main FROM heros GROUP BY role_main; // 按照英雄的主要定位分组, 并统计每组的英雄数量
SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist ORDER BY num DESC; // 多个字段进行分组, 并按照数量进行降序排序
HAVING过滤分组
使用WHERE 条件可以进行数据的过滤, 但是在分组的时候, 过滤并不能使用WHERE, 而是需要使用HAVING, 简单的说WHERE用于数据行, HAVING用于分组.
SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC; // 按照主要定位和次要定位进行分组, 查询数量大于5的分组并降序排序
SELECT COUNT(*) as num, role_main, role_assist FROM heros WHERE hp_max > 6000 GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC; // WHERE和HAVING同时使用, WHERE先排除数据行, 之后分组过滤
SELECT的查询语句中, 关键字的顺序是不能颠倒的:
SELECT.....FROM......WHERE......GROUP BY......HAVING......ORDER BY......LIMIT......