Aggregate functions 聚合函数
从一组值计算单个结果集。
一.理论
1.COUNT
统计个数
SELECT COUNT(*)
FROM fake_apps
WHERE price=0;
2.SUM
SELECT SUM(downloads)
FROM fake_apps;
3.Max / Min
SELECT MAX(downloads)
FROM fake_apps;
SELECT MAX(price)
FROM fake_apps;
4.AVERAGE (AVG)
SELECT AVG(downloads)
FROM fake_apps;
SELECT AVG(price)
FROM fake_apps;
5.ROUND
取整
数字表示保留几位小数
SELECT ROUND(price, 0)
FROM fake_apps;
SELECT ROUND(AVG(PRICE),2)
FROM fake_apps;
6.GROUP BY
GROUP BY 总在 WHERE之后 ,ORDER BY 和 LIMIT 之前
SELECT AVG(imdb_rating)
FROM movies
WHERE year = 1999;
SELECT AVG(imdb_rating)
FROM movies
WHERE year = 2000;
SELECT AVG(imdb_rating)
FROM movies
WHERE year = 2001;
!可以写成
SELECT year,
AVG(imdb_rating)
FROM movies
GROUP BY year
ORDER BY year;
!将每种类别的下载量计算
SELECT category,SUM(downloads)
FROM fake_apps
GROUP BY category;
GROUP BY 使用数字表示按选中的第几列排布
SELECT category,
price,
AVG(downloads)
FROM fake_apps
GROUP BY 1;
7.HAVING
与WHERE很像但是排序比较靠后
WHERE过滤行 HAVING过滤组
SELECT price,
ROUND(AVG(downloads)),
COUNT(*) AS number
FROM fake_apps
GROUP BY price
HAVING number>10;
二.实战
将需要的显示的列写在select里
函数strftime(__, timestamp)
:
%Y
返回年份(YYYY)
%m
返回月份(01-12)
%d
返回当月的日期(1-31)
%H
返回24小时制(00-23)
%M
返回分钟(00-59)
%S
返回秒数(00-59)
SELECT strftime('%H', timestamp) AS 'Hour',
ROUND(AVG(score), 1) AS 'Average Score',
COUNT(*) AS 'Number of Stories'
FROM hacker_news
WHERE timestamp IS NOT NULL
GROUP BY 1
ORDER BY 2 DESC;
Database Schema
payments 2000 rows | |
---|---|
id | INTEGER |
user_id | INTEGER |
amount | REAL |
status | TEXT |
pay_date | TEXT |
users 1000 rows | |
---|---|
id | INTEGER |
first_name | TEXT |
last_name | TEXT |
TEXT | |
password | TEXT |
watch_history 2000 rows | |
---|---|
id | INTEGER |
user_id | INTEGER |
watch_date | TEXT |
watch_duration_in_minutes | REAL |
1.挑选最受欢迎的first_name
SELECT first_name,COUNT(*) AS 'count'
FROM users
GROUP BY first_name
ORDER BY 2 DESC;
统计时间和次数
SELECT ROUND(watch_duration_in_minutes,0) AS 'duration',COUNT(*) AS 'count'
FROM watch_history
GROUP BY 1
ORDER BY 1 ASC;
3.统计成功消费客户
SELECT user_id,SUM(amount)
FROM payments
WHERE status='paid'
GROUP BY 1
ORDER BY 2 DESC;