我是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作为子查询可以生成多行结果?
答案 0 :(得分:2)
第一个查询实际上并未按name
进行分组。如果您有多个具有相同名称(不同的ID
)的记录,则会看到该记录显示了两次(因此,未按分组)。
第一个查询使用称为 correlated子查询 的子查询,它为该查询的每一行计算一次子查询(内部SELECT
)。最多选择。由于最外面的FROM
中的SELECT
仅来自表foods
,因此您将获得每种食物的一条记录+子查询的结果,因此无需分组。