子查询多嵌套一层有什么不一样?

比如我有如下两张表

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

/* select#1 */ select `test`.`tb_group`.`id` AS `id`, `test`.`tb_group`.`name` AS `name`
               from `test`.`tb_group` semi
                        join (`test`.`tb_user`)
               where (`test`.`tb_user`.`group_id` = `test`.`tb_group`.`id`)

SQL 2

/* select#1 */ select `test`.`tb_group`.`id` AS `id`, `test`.`tb_group`.`name` AS `name`
               from `test`.`tb_group` semi
                        join ((/* select#3 */ select `test`.`tb_user`.`group_id` AS `group_id`
                                              from `test`.`tb_user`
                                              group by `test`.`tb_user`.`age`) `a`)
               where (`a`.`group_id` = `test`.`tb_group`.`id`)
2周前 评论
renxiaotu (楼主) 2周前
renxiaotu (楼主) 2周前
Rache1 (作者) 2周前
renxiaotu (楼主) 2周前
Rache1 (作者) 2周前
renxiaotu (楼主) 2周前
讨论数量: 9

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

最终构成的 SQL

SQL 1

/* select#1 */ select `test`.`tb_group`.`id` AS `id`, `test`.`tb_group`.`name` AS `name`
               from `test`.`tb_group` semi
                        join (`test`.`tb_user`)
               where (`test`.`tb_user`.`group_id` = `test`.`tb_group`.`id`)

SQL 2

/* select#1 */ select `test`.`tb_group`.`id` AS `id`, `test`.`tb_group`.`name` AS `name`
               from `test`.`tb_group` semi
                        join ((/* select#3 */ select `test`.`tb_user`.`group_id` AS `group_id`
                                              from `test`.`tb_user`
                                              group by `test`.`tb_user`.`age`) `a`)
               where (`a`.`group_id` = `test`.`tb_group`.`id`)
2周前 评论
renxiaotu (楼主) 2周前
renxiaotu (楼主) 2周前
Rache1 (作者) 2周前
renxiaotu (楼主) 2周前
Rache1 (作者) 2周前
renxiaotu (楼主) 2周前

我的就可以成功
file
file

1周前 评论
renxiaotu (楼主) 1周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!