鉴于架构here我试图理解和解决以下3 SQL查询,我很困惑使用GROUP BY的列和HAVING子句城市化率≥50%的国家的名称,城市化率,人均国内生产总值。请注意,城市化率是城市人口的百分比。不要 计算具有NULL值的城市人口。为什么在这些例子中
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;
在上面的查询,为什么我需要包括在GROUP BY
country.population
和economy.gdp
?如果我在GROUP BY
中尝试使用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;
为什么我需要上面的HAVING部分?
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 $$