鑑於架構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 $$