1、聚合查询
1.1聚合函数
聚合函数查询又叫函数查询,它是通过一些特定的函数根据需求来查询相关的信息,常见的聚合函数为:
- COUNT - 求总数,不包含某字段为null值
- SUM - 求和,不包含某字段为null值
- AVG - 求平均值,不包含某字段为null值
- MAX - 求最大值,适用于数值、日期、字符串类型,不包含某字段为null值
- MIN - 求最小值,适用于数值、日期、字符串类型,不包含某字段为null值
聚合函数的使用是在select语句中实现的,因此它的语法为:select 聚合函数(字段) from 表名;
首先我们创建一个名为test的数据库:
//创建一个名为test的数据库 mysql> create database test charset utf8; Query OK, 1 row affected (0.00 sec) //使用test数据库 mysql> use test; Database changed
创建数据库后,我们得通过use指令来使用这个数据库,这样我们在创建表和对表进行操作时数据的来源都是在这个数据库中。
创建一个名为score的课程表:
//创建一个课程表score mysql> create table score( -> id int, -> name varchar(20), -> chinese int, -> math int, -> english int); Query OK, 0 rows affected (0.02 sec) //插入四行数据 mysql> insert into score(id,name,chinese,math,english) values -> (1,'张三',77,89,56), -> (2,'李四',85,98,32), -> (3,'王五',67,75,64), -> (4,'赵六',98,93,88); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0
此时score表的内容为:编辑
在创建好表后,下面我们就来看这些聚合函数在查询这张表中数据的具体的效果是什么样的,并且展示给大家。
1.1.1count函数
count函数我们不难理解,它是用来计数的一个函数。通常用来记录一个表中的某字段出现的次数。如使用count函数通过id计算总人数:
mysql> select count(id) from score; +-----------+ | count(id) | +-----------+ | 4 | +-----------+ 1 row in set (0.01 sec)
通过上述代码,我们可以看到通过count这个函数可以计算到了score表中id字段的总数。注意这里的总数是字段总个数,如果某一行为null则不列入计数总数当中。
1.1.2sum函数
sum函数,是用来计算总和的函数。如使用sum函数计算score表中chinese成绩的总数:
mysql> select sum(chinese) from score; +--------------+ | sum(chinese) | +--------------+ | 327 | +--------------+ 1 row in set (0.00 sec)
我们可以看到,使用sum函数可以很好的求道某一个字段的总和。当然在函数的后面也可以加上别名,如给sum(chinese)起别名位total:
mysql> select sum(chinese) as total from score; +-------+ | total | +-------+ | 327 | +-------+ 1 row in set (0.00 sec)
通过上述代码我们可以知道,聚合函数的后面是可以起别名的,起别名是通过as这个关键字来起的。其中as可以省略,但建议加上该关键字这样代码的可读性较高一些。
1.1.3avg函数
avg函数是用来求某一字段的平均值,如使用avg函数求english的平均值:
mysql> select avg(english) from score; +--------------+ | avg(english) | +--------------+ | 60.0000 | +--------------+ 1 row in set (0.00 sec)
通过上述代码我们可以看到,avg得到的结果默认保留了4位小数,那我们想要avg保留相应的小数可以这样做:
mysql> select round(avg(english),2) as avg from score; +-------+ | avg | +-------+ | 60.00 | +-------+ 1 row in set (0.00 sec)
使用round函数,使得avg的结果保留相应的小数位。在上述程序中,我保留的是2位小数,大家可以根据需求自行设计。
1.1.4max函数
max函数是求得的是某一字段的最大值,如使用max函数求得math成绩的最大值:
mysql> select max(math) from score; +-----------+ | max(math) | +-----------+ | 98 | +-----------+ 1 row in set (0.00 sec)
我们可以看到,math字段的最大值98被查询出来了,max函数的用法也是很简单。
1.1.5min函数
通过上方讲解我们知道了max函数是求最大值的,那么min函数是求得某一字段的最小值,如使用min函数求得english成绩的最小值:
mysql> select min(english) from score; +--------------+ | min(english) | +--------------+ | 32 | +--------------+ 1 row in set (0.00 sec)
通过上述代码可以看到,english字段的最小值32被查找出来了,min函数的使用方法也是比较的简单。详细的聚合函数在此篇博文中有介绍:数据处理函数。
1.2group by子句
在select中我们可以使用group by这个子句来对某一列来进行分组查询,同时在使用group by进行分组查询时,select指定的字段必需是分组依据字段进行查询的。它的语法为:select 字段 from 表名 group by 字段;
查询score表中的id,name,math信息,通过id进行分组查询:
mysql> select id,name,math from score group by id; +------+------+------+ | id | name | math | +------+------+------+ | 1 | 张三 | 89 | | 2 | 李四 | 98 | | 3 | 王五 | 75 | | 4 | 赵六 | 93 | +------+------+------+ 4 rows in set (0.00 sec)
我们可以发现上述的信息是按照id的升序进行排列的,当然这和我们默认的定义的一样的。如果我们想要进行降序排序,我们可以在group by 字段后面加上一个desc来达到降序排序效果:
mysql> select id,name,math from score group by id desc; +------+------+------+ | id | name | math | +------+------+------+ | 4 | 赵六 | 93 | | 3 | 王五 | 75 | | 2 | 李四 | 98 | | 1 | 张三 | 89 | +------+------+------+ 4 rows in set, 1 warning (0.00 sec)
1.3having
在进行group by子句进行分组后,需要对分组结果再进行条件过滤时,不得使用where语句只能使用having。它的用法为:group by 字段 having 条件;
如按照id升序查询数学成绩在80分以上的同学:
mysql> select id,name,math from score group by id having math > 80; +------+------+------+ | id | name | math | +------+------+------+ | 1 | 张三 | 89 | | 2 | 李四 | 98 | | 4 | 赵六 | 93 | +------+------+------+ 3 rows in set (0.00 sec)
通过上述代码我们可以看到,数学成绩为75的王五同学被过滤掉了。
mysql> select id,name,math from score group by id where math > 80; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where math > 80' at line 1
当我们使用where条件进行判断时就会出现报错。
本期博文到这里结束了,内容比较简单,大家可以下来了可以自行测试一下这些函数。感谢你的阅读,我们下期再见。