子查询多嵌套一层有什么不一样?
比如我有如下两张表
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条件就不一样了,有大佬能解释一下吗?



关于 LearnKu
你的子查询里面使用了
group by age而 select 部分 仅取了group_id字段,实际上你这里group by的结果中,group_id确实存在 1 和 2 两种结果。group_id现在既不属于被group by的字段,自身又没有被聚合函数所使用,所以这会变成一个未定义的情况,即这里的group_id的结果可能会不符合预期。最终构成的 SQL
SQL 1
SQL 2