Sql 为什么在这些示例中使用GROUPBY和HAVING子句中的许多列

Sql 为什么在这些示例中使用GROUPBY和HAVING子句中的许多列,sql,postgresql,Sql,Postgresql,鉴于该模式,我试图理解并解决以下3个sql查询,因为我感到困惑: 1-提交一份表格,列出有争议的国家的名称≥ 50%的城市化 利率、城市化率和人均GDP。注意 城市化率是居住在城市中的人口百分比。不要 统计人口值为空的城市 SELECT country.name, round(sum(city.population)/country.population, 3) AS urban, round(gdp/country.population, 3) AS gdppc FROM city INN

鉴于该模式,我试图理解并解决以下3个sql查询,因为我感到困惑:

1-提交一份表格,列出有争议的国家的名称≥ 50%的城市化 利率、城市化率和人均GDP。注意 城市化率是居住在城市中的人口百分比。不要 统计人口值为空的城市

SELECT country.name, round(sum(city.population)/country.population, 3) AS urban, round(gdp/country.population, 3) AS gdppc 
FROM city 
INNER JOIN country ON code = country 
INNER JOIN economy ON code = economy.country 
WHERE city.population IS NOT NULL 
GROUP BY country.name, country.population, economy.gdp 
HAVING round(sum(city.population)/country.population, 3) >= 0.5 
ORDER BY urban DESC;
在上面的查询中,为什么我需要将
国家.人口
经济.gdp
包含在
分组中?如果我尝试仅在
组中使用
country.name
,我会收到一个错误,说我应该包括其他人。

2-展示拥有超过5000万人口的所有欧洲国家成员的组织

SELECT name 
FROM organization 
INNER JOIN (SELECT organization
            FROM country 
            INNER JOIN encompasses 
            ON code = encompasses.country 
            INNER JOIN ismember 
            ON code = ismember.country 
            WHERE population > 50000000 AND continent = 'Europe' 
            GROUP BY organization 
            HAVING count(ismember.country) = (SELECT count(*) 
                                              FROM country 
                                              INNER JOIN encompasses 
                                              ON code = country 
                                              WHERE population > 50000000 AND continent = 'Europe')) 
            AS innerQuery 
            ON abbreviation = innerQuery.organization;
为什么我需要上面的部分?

3-插入一个名为“Tivoli”的新组织和一个触发器,该触发器表示如果德国加入“Tivoli”,那么英国和法国也必须加入。将德国加入“Tivoli”组织。确认正确的行为

我尝试了下面的脚本,但它不起作用,有什么建议吗

do $$
begin
IF(NOT EXISTS ( SELECT 1 FROM organization WHERE organization."name" = 'Tivoli' AND organization.country = 'D' ))
BEGIN
    INSERT INTO organization VALUES ('Tivoli','Tivoli organization',NULL,'F',NULL,NULL);
        INSERT INTO organization VALUES ('Tivoli','Tivoli organization',NULL,'GB',NULL,NULL);

END;
end $$
(一)

您在选择中使用了country.population and economy.gdp,在聚合函数(COUNT()、AVG()和SUM()之外)中使用了GROUP BY。您选择的所有内容都必须位于GROUP BY或聚合函数内部

(二)

因为你被要求向所有拥有5000万以上人口的国家/地区的组织展示。使用have,您可以检查该组织是否拥有适当数量的国家

(三)

组织。“名称”=“Tivoli” 应该是: 组织机构名称

1)

您在选择中使用了country.population and economy.gdp,在聚合函数(COUNT()、AVG()和SUM()之外)中使用了GROUP BY。您选择的所有内容都必须位于GROUP BY或聚合函数内部

(二)

因为你被要求向所有拥有5000万以上人口的国家/地区的组织展示。使用have,您可以检查该组织是否拥有适当数量的国家

(三)

组织。“名称”=“Tivoli” 应该是:
组织名称首先,你应该把一个问题限制在一个,而不是三个。但以下是所有3项的一些要点:

在上面的查询中,为什么我需要将
国家.人口
经济.gdp
包含在
分组中?如果我试着在组中只使用
country.name
,我会得到一个错误,说我应该包括其他人

这是一项要求。只有当已知其他两个字段在功能上依赖于
国家/地区.name
时,仅按
国家/地区.name
分组才有效(在Postgres 9.1+中)。但可能
country.name
不是
country
表的主键,因此理论上,该表中可能有两条记录具有相同的名称,但人口不同

SELECT country.name, round(sum(city.population)/country.population, 3) AS urban, round(gdp/country.population, 3) AS gdppc 
FROM city 
INNER JOIN country ON code = country 
INNER JOIN economy ON code = economy.country 
WHERE city.population IS NOT NULL 
GROUP BY country.name, country.population, economy.gdp 
HAVING round(sum(city.population)/country.population, 3) >= 0.5 
ORDER BY urban DESC;
规则是:

当存在“分组依据”
时,
选择“
列表表达式引用未分组的列是无效的,聚合函数中除外,或者如果未分组的列在功能上依赖于分组的列,因为对于未分组的列,可能会返回多个值如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖关系。

这是从9.1版开始实施的

为什么我需要上面的部分

因为只有在分组后才能执行聚合上的条件(
count,在本例中为
),因此不能在
where
子句中表示。在这种情况下,
having
条款确保该组织不仅存在于一些欧盟大成员国,而且存在于所有欧盟大成员国

我尝试了下面的脚本,但它不起作用,有什么建议吗

do $$
begin
IF(NOT EXISTS ( SELECT 1 FROM organization WHERE organization."name" = 'Tivoli' AND organization.country = 'D' ))
BEGIN
    INSERT INTO organization VALUES ('Tivoli','Tivoli organization',NULL,'F',NULL,NULL);
        INSERT INTO organization VALUES ('Tivoli','Tivoli organization',NULL,'GB',NULL,NULL);

END;
end $$
如果没有正确的数据库模式,就不可能为您提供正确的SQ,但是从ERD图来看,
组织
表似乎没有
国家
字段。相反,
ismember
表将组织与国家连接起来。您只需插入一个
组织
,但要插入几个
ismember
记录(每个涉及的成员国一个)


最好在
insert
语句中命名字段,这样就可以清楚地知道哪个值对应哪个字段。

首先,您应该将问题限制为一个,而不是三个。但以下是所有3项的一些要点:

在上面的查询中,为什么我需要将
国家.人口
经济.gdp
包含在
分组中?如果我试着在组中只使用
country.name
,我会得到一个错误,说我应该包括其他人

这是一项要求。只有当已知其他两个字段在功能上依赖于
国家/地区.name
时,仅按
国家/地区.name
分组才有效(在Postgres 9.1+中)。但可能
country.name
不是
country
表的主键,因此理论上,该表中可能有两条记录具有相同的名称,但人口不同

SELECT country.name, round(sum(city.population)/country.population, 3) AS urban, round(gdp/country.population, 3) AS gdppc 
FROM city 
INNER JOIN country ON code = country 
INNER JOIN economy ON code = economy.country 
WHERE city.population IS NOT NULL 
GROUP BY country.name, country.population, economy.gdp 
HAVING round(sum(city.population)/country.population, 3) >= 0.5 
ORDER BY urban DESC;
规则是:

当存在“分组依据”
时,
选择“
列表表达式引用未分组的列是无效的,聚合函数中除外,或者如果未分组的列在功能上依赖于分组的列,因为对于未分组的列,可能会返回多个值如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖关系。

这是从9.1版开始实施的

为什么我需要上面的部分<