注:摘自极客时间《SQL必知必会》,纯属个人学习笔记总结
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
- 思考
- 什么是 SQL 函数?
- 内置的 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()
,运行结果为 2019-04-03。
SELECT CURRENT_TIME()
,运行结果为 21:26:34。
SELECT CURRENT_TIMESTAMP()
,运行结果为 2019-04-03 21:26:34。
SELECT EXTRACT(YEAR FROM '2019-04-03')
,运行结果为 2019。
SELECT DATE('2019-04-01 12:00:05')
,运行结果为 2019-04-01。 - 转换函数
SELECT CAST(123.123 AS INT)
,运行结果会报错。(不会四舍五入)
SELECT CAST(123.123 AS DECIMAL(8,2))
,运行结果为 123.12。
SELECT COALESCE(null,1,2)
,运行结果为 1。 - 总结
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
- 思考
- 聚集函数都有哪些,能否在一条 SELECT 语句中使用多个聚集函数;
- 如何对数据进行分组,并进行聚集统计;
- 如何使用 HAVING 过滤分组,HAVING 和 WHERE 的区别是什么。
- 聚集函数
(1).射手(主要定位或者次要定位是射手)的英雄数、平均最大生命值、法力最大值的最大值、攻击最大值的最小值,以及这些英雄总的防御最大值等汇总数据。
SELECT COUNT(*), AVG(hp_max), MAX(mp_max), MIN(attack_max),
SUM(defense_max) FROM heros WHERE role_main = '射手' or role_assist = '射手'
(2).AVG、MAX、MIN 等聚集函数会自动忽略值为 NULL 的数据行,MAX 和 MIN
函数也可以用于字符串类型数据的统计,如果是英文字母,则按照 A—Z 的顺序排列,越往后,数值越大。如果是汉字则按照全拼拼音进行排列。
SELECT MIN(CONVERT(name USING gbk)), MAX(CONVERT(name USING gbk)) FROM heros
(name 字段统一转化为 gbk)
(3).对数据行中不同的取值进行聚集,先用 DISTINCT 函数取不同的数据,然后再使用聚集函数。比如我们想要查询不同的生命最大值的英雄数量是多少。
SELECT COUNT(DISTINCT hp_max) FROM heros
(MIN, MAX除外)
- 如何对数据进行分组,并进行统计(GOUNP BY)
(1).按照英雄的主要定位进行分组,并统计每组的英雄数量:
SELECT COUNT(*), role_main FROM heros GROUP BY role_main
(2).使用多个字段进行分组,比如,按照英雄的主要定位、次要定位进行分组,查看这些英雄的数量,并按照这些分组的英雄数量从高到低进行排序。
SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist ORDER BY num DESC
- 如何使用 HAVING 过滤分组,它与 WHERE 的区别是什么?
HAVING 的作用和 WHERE 一样,都是起到过滤的作用,只不过 WHERE 是用于数据行,而 HAVING 则作用于分组。
比如:筛选最大生命值大于 6000 的英雄,按照主要定位、次要定位进行分组,并且显示分组中英雄数量大于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
- 总结
续~~ 见下一篇