子查询多嵌套一层有什么不一样?
比如我有如下两张表
tb_group
id | name |
---|---|
1 | 管理员 |
2 | 销售 |
tb_user
id | group_id | age |
---|---|---|
1 | 1 | 18 |
2 | 1 | 20 |
3 | 2 | 20 |
下列两个语句和结果:
SELECT * FROM tb_group WHERE id IN(
SELECT group_id FROM tb_user GROUP BY age
)
id | name |
---|---|
1 | 管理员 |
2 | 销售 |
SELECT * FROM tb_group WHERE id IN(
SELECT group_id FROM (
SELECT group_id FROM tb_user GROUP BY age
) a
)
id | name |
---|---|
1 | 管理员 |
我知道这么写有区别,但不知道原因。明明子查询单独使用的结果都是一样的,但做为in条件就不一样了,有大佬能解释一下吗?
你的子查询里面使用了
group by age
而 select 部分 仅取了group_id
字段,实际上你这里group by
的结果中,group_id
确实存在 1 和 2 两种结果。group_id
现在既不属于被group by
的字段,自身又没有被聚合函数所使用,所以这会变成一个未定义的情况,即这里的group_id
的结果可能会不符合预期。最终构成的 SQL
SQL 1
SQL 2