MySQL 函数
- 发布
- 分类
- MySQL
- 篇幅
- 111 字 / 1 分钟
- 阅读
- 387
SQL 函数
算术处理、字符串处理、日期处理、数据类型转换
算术处理
SELECT ABS(-2);
SELECT MOD(101,3);
SELECT ROUND(37.25,1);
字符串处理
SELECT CONCAT('abc', 123);
SELECT LENGTH('你好');
SELECT CHAR_LENGTH('你好');
SELECT LOWER('ABC');
SELECT UPPER('abc');
SELECT REPLACE('fabcd', 'abc', 123);
SELECT SUBSTRING('fabcd', 1,3);
日期处理
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();
SELECT CURRENT_TIMESTAMP();
SELECT EXTRACT(YEAR FROM '2019-04-03');
SELECT DATE('2019-04-01 12:00:05');
SELECT YEAR('2019-04-01 12:00:05');
SELECT MONTH('2019-04-01 12:00:05');
SELECT DAY('2019-04-01 12:00:05');
SELECT HOUR('2019-04-01 12:00:05');
SELECT MINUTE('2019-04-01 12:00:05');
SELECT SECOND('2019-04-01 12:00:05');
eg1:
日期比较
SELECT AVG(hp_max), AVG(mp_max), MAX(attack_max) FROM heros WHERE DATE(birthdate)>'2016-10-01';
数据类型转换
SELECT CAST(123.123 AS INT) -- CAST函数在转换数据类型的时候,不会四舍五入,这里直接报错
SELECT CAST(123.123 AS DECIMAL(8,2)); -- 这里可以截取 精度 8 位, 其中 2 位小数
SELECT COALESCE(null,1,2); -- 返回第一个非空数值
聚集函数
| 函数 | 说明 |
|---|---|
| COUNT() | 总行数 |
| SUM() | 求和 |
| MIN() | 最小值 |
| MAX() | 最大值 |
| AVG() | 平均值 |
eg1:
-- AVG、MAX、MIN等聚集函数会自动忽略值为NULL的数据行
SELECT COUNT(*), AVG(hp_max), MAX(mp_max), MIN(attack_max), SUM(defense_max) FROM heros WHERE role_main = '射手' or role_assist = '射手'
eg2:
-- MAX和MIN函数也可以用于字符串类型数据的统计,如果是英文字母,则按照A—Z的顺序排列,越往后,数值越大。如果是汉字则按照全拼拼音进行排列
SELECT MIN(CONVERT(name USING gbk)), MAX(CONVERT(name USING gbk)) FROM heros;
-- 可以对数据中不同的取值进行聚集
SELECT COUNT(DISTINCT hp_max) FROM heros;
SELECT ROUND(AVG(DISTINCT hp_max), 2) FROM heros;
SELECT count(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC; -- 多个字段分组,相当于对这些字段可能出现的所有的取值情况都进行分组
-- 筛选最大生命值大于6000的英雄,按照主要定位进行分组,选择分组英雄数量大于5的分组,按照分组英雄数从高到低进行排序,并显示每个分组的英雄数量、主要定位和平均最大生命值。
SELECT count(*) AS num, role_main, AVG(hp_max) FROM heros WHERE hp_max > 6000 GROUP BY role_main HAVING num > 5 ORDER BY num DESC;
-- 筛选最大生命值与最大法力值之和大于7000的英雄,按照攻击范围来进行分组,显示分组的英雄数量,以及分组英雄的最大生命值与法力值之和的平均值、最大值和最小值,并按照分组英雄数从高到低进行排序,其中聚集函数的结果包括小数点后两位
SELECT count(*) AS num, ROUND(AVG(hp_max + mp_max), 2), ROUND(MAX(hp_max + mp_max), 2), ROUND(MIN(hp_max + mp_max), 2) FROM heros where (hp_max + mp_max) > 7000 GROUP BY attack_range ORDER BY num DESC;