【问题标题】:HAVING and WHERE SQLHAVING 和 WHERE SQL
【发布时间】:2019-12-09 17:03:39
【问题描述】:

我正在自学 SQL 并搜索练习进行练习,但我遇到了一个问题。

2010年各大洲的总人口是多少?

我们有 2 个表“countries”和“years_population”,这是它的架构

CREATE TABLE countries (
      id INTEGER NOT NULL,
      name TEXT NOT NULL,
      continent TEXT NOT NULL,
      PRIMARY KEY(id)
    );
CREATE TABLE population_years (
      id INTEGER NOT NULL,
      population NUMBER,
      year NUMBER,
      country_id INTEGER NOT NULL,
      PRIMARY KEY(id),
      FOREIGN KEY(country_id) REFERENCES countries(id)
    );

为了解决这个问题,我尝试了这段代码,但没有成功:

SELECT SUM(population) FROM population_years 
JOIN countries ON countries.id = population_years.country_id 
GROUP BY continent HAVING year = 2010;

但是解决办法是这样的:

SELECT SUM(population), continent FROM population_years
INNER JOIN countries ON
countries.id = population_years.country_id
WHERE year = 2010
GROUP BY continent; 

我的逻辑是将人口相加,然后按年份加入国家及其人口(JOIN 子句),然后 GROUP BY 大陆,最后选择年份,但我的逻辑有什么问题?

【问题讨论】:

  • 您需要将聚合结果过滤为总和(人口)。如果该值不是聚合结果,您可以使用 where。年份是保存在表格行中的数据,因此您可以使用 where

标签: sql sqlite


【解决方案1】:

Having 用于计算聚合函数。就像在上面的情况一样,如果您想找出 Sum(population) 大于 2,000,000 的国家/地区的名称,那么您可以应用像这样的有条款

   SELECT SUM(population) FROM population_years 
   JOIN countries ON countries.id = population_years.country_id 
   GROUP BY continent HAVING SUM(population) > 2000000;

有关相同内容的更多信息,您可以找到link

【讨论】:

    【解决方案2】:

    这是您的查询(在结果集中包含表别名、限定列名和continent):

    SELECT c.continent, SUM(py.population)
    FROM population_years py JOIN
         countries c
         ON c.id = py.country_id 
    GROUP BY c.continent
    HAVING py.year = 2010;
    

    为什么这不起作用?事实上,在大多数数据库中,查询甚至不会运行,因为您指的是year,它不在GROUP BY 中(或在SELECT 中定义。

    此查询所做的是按大陆聚合所有行。那将是所有年。然后您按年份过滤。 SQLite 允许这样做(违反 SQL 标准)。它只是从任意行分配year 进行比较。但是,计算的值是错误的——假设有一年以上。

    您想在聚合之前过滤

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 2021-12-31
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      相关资源
      最近更新 更多