![在这里插入图片描述](https://img-blog.csdnimg.cn/20201225163841270.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI5MjU3MjAx,size_16,color_FFFFFF,t_70)
前言
函数的作用:把经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。Mysql中内置函数如下:
- 算术函数,顾名思义就是对数值类型的字段进行算术运算。
- 常用的字符串函数操作包括了字符串拼接,大小写转换,求长度以及字符串替换和截取等。
- 日期函数是对数据表中的日期进行处理。
- 转换函数可以转换数据之间的类型。
- 聚集函数:它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。
命名规范:
- 关键字和函数名称全部大写;
- 数据库名、表名、字段名称全部小写;
- SQL 语句必须以分号结尾
基本函数
算数函数
字符串函数
日期函数
转换函数
聚集函数
基本聚集函数
例子一,查询最大生命值大于 6000 的英雄数量。:COUNT(*)
mysql> SELECT COUNT(*) FROM heros WHERE hp_max > 6000;
+----------+
| COUNT(*) |
+----------+
| 41 |
+----------+
1 row in set (0.00 sec)
例子二,询最大生命值大于 6000,且有次要定位的英雄数量。
mysql> SELECT COUNT(role_assist) FROM heros WHERE hp_max > 6000;
+--------------------+
| COUNT(role_assist) |
+--------------------+
| 23 |
+--------------------+
1 row in set (0.00 sec)
注意:COUNT(role_assist)
会忽略值为 NULL 的数据行,而 COUNT(*) 只是统计数据行数,不管某个字段是否为 NULL。
例子三:
mysql> SELECT COUNT(*), AVG(hp_max), MAX(mp_max), MIN(attack_max), SUM(defense_max) FROM heros WHERE role_main = '射手' or role_assist = '射手';
+----------+-------------+-------------+-----------------+------------------+
| COUNT(*) | AVG(hp_max) | MAX(mp_max) | MIN(attack_max) | SUM(defense_max) |
+----------+-------------+-------------+-----------------+------------------+
| 10 | 5798.5 | 1784 | 362 | 3333 |
+----------+-------------+-------------+-----------------+------------------+
1 row in set (0.00 sec)
注意:AVG、MAX、MIN 等聚集函数会自动忽略值为 NULL 的数据行;
对数据分组统计
例子一:按照英雄的主要定位进行分组,并统计每组的英雄数量。
mysql> SELECT COUNT(*), role_main FROM heros GROUP BY role_main;
+----------+-----------+
| COUNT(*) | role_main |
+----------+-----------+
| 10 | 坦克 |
| 18 | 战士 |
| 19 | 法师 |
| 6 | 辅助 |
| 10 | 射手 |
| 6 | 刺客 |
+----------+-----------+
6 rows in set (0.00 sec)
例子二:按照英雄的主要定位进行分组,并统计每组的英雄数量。
mysql> SELECT COUNT(*), role_assist FROM heros GROUP BY role_assist;
+----------+-------------+
| COUNT(*) | role_assist |
+----------+-------------+
| 6 | 战士 |
| 10 | 坦克 |
| 5 | 辅助 |
| 40 | NULL |
| 2 | 法师 |
| 6 | 刺客 |
+----------+-------------+
6 rows in set (0.00 sec)
例子三:使用多个字段进行分组,并按照数量从高到第排列。
mysql> SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist ORDER BY num DESC;
+-----+-----------+-------------+
| num | role_main | role_assist |
+-----+-----------+-------------+
| 12 | 法师 | NULL |
| 9 | 射手 | NULL |
| 8 | 战士 | NULL |
| 6 | 战士 | 坦克 |
| 5 | 坦克 | NULL |
| 3 | 坦克 | 辅助 |
| 3 | 刺客 | NULL |
| 3 | 刺客 | 战士 |
| 3 | 战士 | 刺客 |
| 3 | 辅助 | NULL |
| 2 | 法师 | 辅助 |
| 2 | 法师 | 刺客 |
| 2 | 坦克 | 战士 |
| 2 | 辅助 | 坦克 |
| 2 | 法师 | 坦克 |
| 1 | 辅助 | 法师 |
| 1 | 法师 | 战士 |
| 1 | 战士 | 法师 |
| 1 | 射手 | 刺客 |
+-----+-----------+-------------+
19 rows in set (0.00 sec)
HAVING与WHERE的区别?
SELECT查询中,关键字顺序:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
WHERE
和 HAVING
区别主要是:WHERE
是用于过滤数据行,而HAVING
则作用于分组。
例子一:
mysql> SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC;
+-----+-----------+-------------+
| num | role_main | role_assist |
+-----+-----------+-------------+
| 12 | 法师 | NULL |
| 9 | 射手 | NULL |
| 8 | 战士 | NULL |
| 6 | 战士 | 坦克 |
+-----+-----------+-------------+
4 rows in set (0.00 sec)
注意:以上代码,通过role_main
和role_assit
进行分组,同时,通过HAVING
,过滤掉<=5
的分组。
例子二:
mysql> 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;
+-----+-----------+-------------+
| num | role_main | role_assist |
+-----+-----------+-------------+
| 8 | 战士 | NULL |
| 6 | 战士 | 坦克 |
+-----+-----------+-------------+
2 rows in set (0.00 sec)
注意:以上代码,首先通过WHERE
过滤掉数据行 hp_max<=6000
,再通过HAVING
过滤掉num <=5
的分组。