sql 计算某个值的占比
在本文中,我将重点介绍使用简单的SQL SELECT语句对满足特定条件的表中的行数进行计数,并将结果按表的特定列分组。 这些都是SQL的基本概念,但是将它们混合使用就可以对关系数据库中存储的数据进行不同且有用的表示。 本文中涉及SQL查询的特定方面并用简单的示例进行了说明,它们是聚合函数count() , WHERE , GROUP BY和HAVING 。 这些将用于构建简单的单个SQL查询,该查询指示表中与该表中给定列的不同值匹配的行数。
我需要一些简单SQL数据进行演示。 以下SQL代码演示了在PostgreSQL数据库中如何创建名为ALBUMS的表,然后使用INSERT语句填充该表。
createAndPopulateAlbums.sql
CREATE TABLE albums
(
title text,
artist text,
year integer
);
INSERT INTO albums (title, artist, year)
VALUES ('Back in Black', 'AC/DC', 1980);
INSERT INTO albums (title, artist, year)
VALUES ('Slippery When Wet', 'Bon Jovi', 1986);
INSERT INTO albums (title, artist, year)
VALUES ('Third Stage', 'Boston', 1986);
INSERT INTO albums (title, artist, year)
VALUES ('Hysteria', 'Def Leppard', 1987);
INSERT INTO albums (title, artist, year)
VALUES ('Some Great Reward', 'Depeche Mode', 1984);
INSERT INTO albums (title, artist, year)
VALUES ('Violator', 'Depeche Mode', 1990);
INSERT INTO albums (title, artist, year)
VALUES ('Brothers in Arms', 'Dire Straits', 1985);
INSERT INTO albums (title, artist, year)
VALUES ('Rio', 'Duran Duran', 1982);
INSERT INTO albums (title, artist, year)
VALUES ('Hotel California', 'Eagles', 1976);
INSERT INTO albums (title, artist, year)
VALUES ('Rumours', 'Fleetwood Mac', 1977);
INSERT INTO albums (title, artist, year)
VALUES ('Kick', 'INXS', 1987);
INSERT INTO albums (title, artist, year)
VALUES ('Appetite for Destruction', 'Guns N'' Roses', 1987);
INSERT INTO albums (title, artist, year)
VALUES ('Thriller', 'Michael Jackson', 1982);
INSERT INTO albums (title, artist, year)
VALUES ('Welcome to the Real World', 'Mr. Mister', 1985);
INSERT INTO albums (title, artist, year)
VALUES ('Never Mind', 'Nirvana', 1991);
INSERT INTO albums (title, artist, year)
VALUES ('Please', 'Pet Shop Boys', 1986);
INSERT INTO albums (title, artist, year)
VALUES ('The Dark Side of the Moon', 'Pink Floyd', 1973);
INSERT INTO albums (title, artist, year)
VALUES ('Look Sharp!', 'Roxette', 1988);
INSERT INTO albums (title, artist, year)
VALUES ('Songs from the Big Chair', 'Tears for Fears', 1985);
INSERT INTO albums (title, artist, year)
VALUES ('Synchronicity', 'The Police', 1983);
INSERT INTO albums (title, artist, year)
VALUES ('Into the Gap', 'Thompson Twins', 1984);
INSERT INTO albums (title, artist, year)
VALUES ('The Joshua Tree', 'U2', 1987);
INSERT INTO albums (title, artist, year)
VALUES ('1984', 'Van Halen', 1984);
接下来的两个屏幕快照显示了在psql中运行此脚本的结果:
在这一点上,如果我想查看每年发行了多少张专辑,可以使用以下几个单独SQL查询语句:
SELECT count(1) FROM albums where year = 1985;
SELECT count(1) FROM albums where year = 1987;
可能需要查看每年发行多少张专辑而无需每年进行单独查询。 这是在使用带有GROUP BY子句的count()之类的聚合函数时很方便的地方。 下一个查询很简单,但是利用GROUP BY来显示按专辑发行年分组的每个“组”行的计数。
SELECT year, count(1)
FROM albums
GROUP BY year;
通过指定缩小条件,可以正常使用WHERE子句来缩小返回的行数。 例如,以下查询返回在1988年之后的一年中发行的专辑。
SELECT year, count(1)
FROM albums
WHERE year > 1988
GROUP BY year;
我们可能只想返回表中有多张专辑(不止一张)的年份。 第一个天真的方法可能如下所示(不起作用,如下面的屏幕快照所示):
-- Bad Code!: Don't do this.
SELECT year, count(1)
FROM albums
WHERE count(1) > 1
GROUP BY year;
上一个屏幕快照显示“在WHERE中不允许使用聚合函数”。 换句话说,我们不能在WHERE子句中使用count() 。 这是HAVING子句有用的地方,因为HAVING缩小结果的方式与WHERE相似,但是与聚合函数和GROUP BY 。
下一个SQL清单演示了如何使用HAVING
子句来完成较早尝试的任务(列出表中存在多个专辑行的年份):
SELECT year, count(1)
FROM albums
GROUP BY year
HAVING count(1) > 1;
最后,我可能希望对结果进行排序,以便将它们以递增(较晚)的年份列出。 这里显示了前面演示的两个SQL查询,其中添加了ORDER BY 。
SELECT year, count(1)
FROM albums
GROUP BY year
ORDER BY year;
SELECT year, count(1)
FROM albums
GROUP BY year
HAVING count(1) > 1
ORDER BY year;
与我刚开始使用SQL相比,SQL已经成为一种更加丰富的语言,但是多年来可用的基本SQL仍然有效且有用。 尽管本文中的示例已使用PostgreSQL进行了演示,但这些示例应在实现ANSI SQL的大多数关系数据库上运行。
sql 计算某个值的占比