这篇文章将介绍一个sql的实用技巧,就是max函数和count函数的复合使用,来直接求得COUNT(*)的最大值。这个技巧在很多场合都会需要使用,而我自己探索发现这个技巧的契机则是我的sql课程的某一道练习题,那么就让我们从我解决这道练习题的思路过程来顺着理解吧。
首先我们有一个关于电影的数据库,其中有个表名为people记录了电影人的信息,我们的问题是在这个表中找到suename列里出现次数最多的surname进行计数。
“The most common surname in the database can be found how many times?”
也就是说我们需要计数(count函数)和取最大值(max函数)两种操作,即对不同的surname计数,并在计数中取到最大值。
最开始我直接MAX(COUNT(*))但是这样子的写法显然是不对的,代码会报错:
misuse of aggregate function COUNT(): SELECT surname,
COUNT(surname) FROM people
GROUP BY surname
HAVING COUNT(*) = MAX(COUNT(*));
我于是开始想能不能按顺序排列一下,也就是用到ORDER BY。事实上这样子的确能够解答问题,代码如下:
SELECT surname,
COUNT(surname) FROM people
GROUP BY surname
ORDER BY COUNT(surname) DESC;
“the most common surname”的确被找到并且计数了,但是却是从一列降序排列的数据中的出得结论,而不是直接得到的答案,总令人产生一种取巧的感觉,而且觉得并不是很好的直接解决问题。我想能不能直接得到COUNT(*)的最大值呢?答案当然也是可以的,那就是max和count函数的复合使用。
MAX函数无法直接查询COUNT(*),但是可以建立inner query,再从中查询,具体流程可由下图直观的呈现
具体代码如下:
SELECT MAX (mycount)
FROM (SELECT agent_code,COUNT(agent_code) mycount
FROM orders
GROUP BY agent_code);
应用到本题中的话就是:
SELECT surname, COUNT(surname)
FROM people GROUP BY surname
HAVING COUNT (surname)=(
SELECT MAX(mycount)
FROM (
SELECT surname, COUNT(surname) mycount
FROM people
GROUP BY surname));
这样就完美解决问题啦,只有一条数据显示“the most common surname”,而不是某个降序表来自己看出来~
reference:
http://www.w3school.com.cn/sql/sql_func_max.asp
http://www.w3school.com.cn/sql/sql_func_count.asp
https://www.w3resource.com/sql/aggregate-functions/max-count.php