问题:
给定一个students表格,字段包括【身份证号(主键),姓名,性别】
现在需要查询出男女姓名一样的名字,最后名字不得有重复,怎么进行查询?
当时我其实没想太多,分别distinct查询性别为男的子表和性别为女的子表,然后进行inner join再取一次distinct。
但是面试官说还有没有更好的优化方法,本菜鸡一时没想起来,面试后和朋友一起讨论,发现还有一个更优的,并分别验证了一下运行时间,具体如下:
第一种:inner join版
SELECT name FROM
((SELECT DISTINCT name FROM students where sex = "女") as female
INNER JOIN
(SELECT DISTINCT name FROM students where sex = "男") as male
ON female.name = male.name)
第二种:union all版
SELECT name FROM
((SELECT DISTINCT name FROM students where sex = "女") UNION ALL
(SELECT DISTINCT name FROM students where sex = "男")) as Z
GROUP BY Z.name
HAVING COUNT(Z.name) >= 2
需要补充一点,union是去重的,但是union all不去重,直接拼接
运行时间对比:

分享一下个人理解,如果有更好的方法,欢迎一起讨论~
157

被折叠的 条评论
为什么被折叠?



