为什么有时子查询可以像使用“分组依据”那样工作

时间:2019-01-31 08:21:49

标签: sql

我是sql的新手,不明白为什么有时子查询可以像使用'group by'一样工作。

说,数据库中有两个表。 “ food”是由以下人员创建的表格:

CREATE TABLE foods (
  id integer PRIMARY KEY,
  type_id integer,
  name text
);

'foods_episodes'是一个由以下人员创建的表:

CREATE TABLE foods_episodes (
  food_id integer,
  episode_id integer
);

现在,我使用以下两个sql并生成相同的结果。

SELECT name, (SELECT count(*) FROM foods_episodes WHERE food_id=f.id) AS frequency
FROM foods AS f
ORDER BY name;

SELECT name, count(*) AS frequency
FROM foods_episodes,
     foods AS f
WHERE food_id=f.id
GROUP BY name;

那么为什么第一个sql中的子查询像它那样按名称对结果进行分组? 当我单独运行子查询时:

SELECT count(*)
FROM foods_episodes,
     foods f
WHERE food_id=f.id

结果只有一行。为什么使用此sql作为子查询可以生成多行结果?

1 个答案:

答案 0 :(得分:2)

第一个查询实际上并未按name进行分组。如果您有多个具有相同名称(不同的ID)的记录,则会看到该记录显示了两次(因此,未按分组)。

第一个查询使用称为 correlated子查询 的子查询,它为该查询的每一行计算一次子查询(内部SELECT)。最多选择。由于最外面的FROM中的SELECT仅来自表foods,因此您将获得每种食物的一条记录+子查询的结果,因此无需分组。