题解 | #查找山东大学男生的GPA#

查找山东大学男生的GPA

http://www.nowcoder.com/practice/979b1a5a16d44afaba5191b22152f64a

题意明确:

分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据,结果不去重


问题分解:

  • 限定条件:学校为山东大学或者性别为男性的用户:university='山东大学', gender='male'
  • 分别查看&结果不去重:所以直接使用两个条件的or是不行的,直接用union也不行,要用union all,分别去查满足条件1的和满足条件2的,然后合在一起不去重

细节问题:

  • 不去重:union all

完整代码:

select 
    device_id, gender, age, gpa
from user_profile
where university='山东大学'

union all

select 
    device_id, gender, age, gpa
from user_profile
where gender='male'
全部评论
第一or去重,二,实际应尽量避免在where子句中使用or来连接条件。使用or可能会使索引失效,从而全表扫描。mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引可能失效
19 回复 分享
发布于 2022-05-19 09:07
where+or 会去重
9 回复 分享
发布于 2022-02-24 05:49
请问此题为什么使用 or 不行,必须要使用union all呢???是因为 or 也会跟union一样去重吗??
6 回复 分享
发布于 2021-11-11 22:22
user_profile 表中存在同时满足 university = '山东大学' 和 gender = 'male' 的记录,在使用 OR 时,这些记录只会在结果集中出现一次;而使用 UNION ALL 时,这些记录会分别在两个子查询的结果中出现,最终合并到结果集里会出现两次。
5 回复 分享
发布于 03-28 09:46 江西
为什么先筛选性别,在union all 连接山东大学会失败呀
3 回复 分享
发布于 2023-05-06 11:29 江西
我觉得or不行,应该是因为它是按照行筛选再输出,并不能按照题目的要求:“分别查看”、“首先输出山东大学的结果再输出男性的结果”去执行,也就是顺序没法保证。不知道这样理解对不对呢?
3 回复 分享
发布于 2022-03-14 15:30
请问为什么用union all之后就不需要排序了呢,union all 不能保证先输出的一定是university吧
点赞 回复 分享
发布于 01-08 13:56 黑龙江
我用DBeaver24.3.1直接复制上面的代码,和直接用OR一样,也是去重的效果
点赞 回复 分享
发布于 2024-12-26 11:05 河南
题目要求①不去重②先输出山东大学后输出性别为男的数据,这就不是一个大筛选了,or是一个大筛选里121022这样筛(0表示既是1又是2的数据),应该采用上下连接union all不去重,这样一部分先筛110,另一部分后筛2022,合起来得出1102022,而且里面会多出有重复信息的情况
点赞 回复 分享
发布于 2024-02-19 17:57 重庆
其实正常数据中 本来就是要去重的 但你练习的话 那就按照标准来搞吧
点赞 回复 分享
发布于 2023-09-06 11:48 河南
为什么 select 里面不能选university
点赞 回复 分享
发布于 2023-05-30 18:25 广东
学到了
点赞 回复 分享
发布于 2022-05-11 10:45
请问此题为什么使用 or 不行,必须要使用union all呢???是因为 or 也会跟union一样去重吗?? 这也是我想问的 求大佬解答
点赞 回复 分享
发布于 2021-11-20 18:03

相关推荐

溱元:前端每年固定死几次,看两集广告就复活了
点赞 评论 收藏
分享
评论
378
86
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务