给定架构 here我很困惑,试图理解并解决以下 3 个 sql 查询:
1- 出示一张表格,列出城市化率≥ 50% 的国家/地区名称 率、城市化率和人均 GDP。注意 城市化率是居住在城市的人口百分比。不要 计算人口值为 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 $$
最佳答案
1)
您在聚合函数(COUNT()、AVG() 和 SUM())之外的选择中使用了 country.population 和 economy.gdp,并且您有一个 GROUP BY。您选择的所有内容都必须在 GROUP BY 中或聚合函数内。
2)
因为您被要求展示拥有超过 5000 万人口的所有国家/地区的组织。使用 HAVING,您可以检查该组织是否拥有适当数量的国家/地区。
3)
organization."name"= 'Tivoli' 它应该是: 组织名称
关于sql - 为什么在这些示例中的 GROUP BY 和 HAVING 子句中使用许多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46085548/