聚合函数(Aggregate Functions)

我们常常需要对数据库中的数据执行一些计算。SQL提供了一些函数,称为聚合函数,可以用以解决这些问题。常用的有
AVG - 均值, SUM - 求和, MAX/MIN - 最大/最小值等,使用如下:

SELECT AVG(budget)
FROM films;

SELECT MAX(budget)
FROM films;

SELECT SUM(budget)
FROM films;

聚合函数与WHERE的组合

聚合函数可以与WHERE子句结合使用,以从数据中获得进一步的信息。
例如,要获得2010年或之后年份的制作的电影的总预算:

SELECT SUM(budget)
FROM films
WHERE release_year >= 2010;

基本运算

除了使用聚合函数外,SQL中还可以使用+-*/等符号执行基本算术。

SELECT (4 * 3);

SELECT (4 / 3); # 返回结果为 1

SELECT (4.0 / 3.0) AS result; # 返回结果为 1.3333

SQL假设,如果用一个整数除以一个整数,那么我们希望得到一个整数。所以在做除法时,如果想有更高的精度,可以在数字上加上小数位。

AS 别名

如果我们同时对不同列使用两个max函数,会产生什么结果呢?

SELECT MAX(budget), MAX(duration)
FROM films;

我们会得到两个列名为max的列,就很有迷惑性。为了避免这种情况,SQL提供了一种称为别名的操作。别名仅仅意味着给某个东西指定一个临时名称。要使用别名,可以使用AS关键字。

例如,在上面的示例中,我们可以使用别名使结果更清晰:

SELECT MAX(budget) AS max_budget,
       MAX(duration) AS max_duration
FROM films;

ORDER BY

在SQL中,ORDER BY关键字用于根据一列或多列的值按升序或降序对结果进行排序。
默认情况下,“ORDER BY”将按升序排序。如果要按降序对结果排序,可以使用DESC关键字。例如,

SELECT title
FROM films
ORDER BY release_year DESC;

将按发行年份从最新到最久远的顺序排序电影标题。

order by也可以用于对多个列进行排序。它将按指定的第一列排序,然后按下一列排序,然后按下一列排序,依此类推。例如,

SELECT birthdate, name
FROM people
ORDER BY birthdate, name;

先按出生日期排序(从最早到最新),然后按姓名的字母顺序排序。

列的顺序很重要!
另,要指定多列进行排序时,可以用逗号分隔列名。

GROUP BY

经常,我们需要汇总结果。例如,可能需要计算公司中男女员工的数量。那么,我们需要的是把所有的男性聚集在一起,数一数;把所有的女性员工聚集在一起,数一数。在SQL中,GROUP BY允许我们按一列或多列对结果进行分组,如下所示:

SELECT sex, count(*)
FROM employees
GROUP BY sex;

值得注意的是,如果选择不在GROUP BY子句中的字段,而不使用它来计算整个组的某种值,那么SQL将返回错误。

group by 也能和order by 组合使用, 例如:

select release_year, country, max(budget)
from films
group by release_year, country
order by release_year, country

HAVING

在SQL中,聚合函数不能用在WHERE子句中。例如,以下查询无效

SELECT release_year
FROM films
GROUP BY release_year
WHERE COUNT(title) > 10;

这意味着,如果要基于聚合函数的结果进行筛选,则需要另一种方法.这就是HAVING
子句的由来。例如,

SELECT release_year
FROM films
GROUP BY release_year
HAVING COUNT(title) > 10;

仅显示发行超过10部电影的年份。

此外,如果只想返回一定数量的结果,可以使用LIMIT关键字规定返回的行数。
比如, 获取制作了10部以上电影的国家的国家名、平均预算和平均总收入。按国家名称对结果进行排序,并将显示的结果数限制为5个。你应该把平均数分别命名为avg_budgetavg_gross

-- select country, average budget, 
--     and average gross
select country, avg(budget) as  avg_budget, avg(gross) as avg_gross
-- from the films table
from films
-- group by country 
group by country
-- where the country has more than 10 titles
having count(title) > 10
-- order by country
order by country
-- limit to only show 5 results
limit 5

示例代码中用到的表

films 表

films表前十行如下:

idtitlerelease_yearcountrydurationlanguagecertificationgrossbudget
1Intolerance: Love’s Struggle Throughout the Ages1916USA123nullNot Ratednull385907
2Over the Hill to the Poorhouse1920USA110nullnull3000000100000
3The Big Parade1925USA151nullNot Ratednull245000
4Metropolis1927Germany145GermanNot Rated264356000000
5Pandora’s Box1929Germany110GermanNot Rated9950null
6The Broadway Melody1929USA100EnglishPassed2808000379000
7Hell’s Angels1930USA96EnglishPassednull3950000
8A Farewell to Arms1932USA79EnglishUnratednull800000
942nd Street1933USA89EnglishUnrated2300000439000
10She Done Him Wrong1933USA66EnglishApprovednull200000

people 表

people表前十行如下:

idnamebirthdatedeathdate
150 Cent1975-07-06null
2A. Michael Baldwin1963-04-04null
3A. Raven Cruznullnull
4A.J. Buckley1978-02-09null
5A.J. DeLucianullnull
6A.J. Langer1974-05-22null
7Aaliyah1979-01-162001-08-25
8Aaron Ashmore1979-10-07null
9Aaron Hannnullnull
10Aaron Hill1983-04-23null

更多推荐

SQL新手入门 详细总结笔记(二)