聚合函数(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_budget
和avg_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表前十行如下:
id | title | release_year | country | duration | language | certification | gross | budget |
---|---|---|---|---|---|---|---|---|
1 | Intolerance: Love’s Struggle Throughout the Ages | 1916 | USA | 123 | null | Not Rated | null | 385907 |
2 | Over the Hill to the Poorhouse | 1920 | USA | 110 | null | null | 3000000 | 100000 |
3 | The Big Parade | 1925 | USA | 151 | null | Not Rated | null | 245000 |
4 | Metropolis | 1927 | Germany | 145 | German | Not Rated | 26435 | 6000000 |
5 | Pandora’s Box | 1929 | Germany | 110 | German | Not Rated | 9950 | null |
6 | The Broadway Melody | 1929 | USA | 100 | English | Passed | 2808000 | 379000 |
7 | Hell’s Angels | 1930 | USA | 96 | English | Passed | null | 3950000 |
8 | A Farewell to Arms | 1932 | USA | 79 | English | Unrated | null | 800000 |
9 | 42nd Street | 1933 | USA | 89 | English | Unrated | 2300000 | 439000 |
10 | She Done Him Wrong | 1933 | USA | 66 | English | Approved | null | 200000 |
people 表
people表前十行如下:
id | name | birthdate | deathdate |
---|---|---|---|
1 | 50 Cent | 1975-07-06 | null |
2 | A. Michael Baldwin | 1963-04-04 | null |
3 | A. Raven Cruz | null | null |
4 | A.J. Buckley | 1978-02-09 | null |
5 | A.J. DeLucia | null | null |
6 | A.J. Langer | 1974-05-22 | null |
7 | Aaliyah | 1979-01-16 | 2001-08-25 |
8 | Aaron Ashmore | 1979-10-07 | null |
9 | Aaron Hann | null | null |
10 | Aaron Hill | 1983-04-23 | null |
更多推荐
SQL新手入门 详细总结笔记(二)
发布评论