首页 > 试题广场 >

Mysql中表student_table(id,name,b

[单选题]
Mysql中表student_table(id,name,birth,sex),name字段值存在重复,查询name重复的记录明细,比如'张三'、'李四'各重复2次,则结果是4条。如下SQL错误的是()?
  • select t2.* 
    from
    (select name,count(*) as c1 from student_table GROUP BY name having c1 > 1) t1
    left join
    student_table t2
    on t1.name = t2.name;
  • select t2.* 
    from
    (select name,count(*) as c1 from student_table GROUP BY name ) t1
    left join
    student_table t2
    on t1.name = t2.name
    where c1 > 1;
  • select t2.* ,t1.*
    from
    (select name,count(*) as c1 from student_table GROUP BY name ) t1
    left join
    student_table t2
    on t1.name = t2.name
    and c1 > 1;
  • select t2.* 
    from
    (select * from
    (select name,count(*) as c1 from student_table GROUP BY name ) t1
    where c1 > 1
    )t3
    left join
    student_table t2 on t3.name = t2.name;
  • 在left join下on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,即不管在右表中有没有匹配的行,都会返回左表所有的行。c选项左表只是进行了分组,没有查询重复的记录,所以不管on条件是否成立都返回左表所有的记录(未进行重复分组)
发表于 2021-12-16 10:52:53 回复(0)
不知道有多少小伙伴跟我一样没有看懂题目
发表于 2022-07-14 10:28:21 回复(0)
简单来说  C选项使用On只会过滤掉右表不符合情况的记录,会保留左表的所有, B选项是筛选过滤左右表连接之后的记录,  C选项的最终结果比B选项要多
发表于 2021-12-16 11:03:26 回复(0)
c选项,外连接后会出现左表name为null的情况,count(*)统计的是条数,假如为5,那么c1>1就满足条件,那么会出现左表name值为的null条数有5条,这和题目所说的查询重复的name相悖,因为null值不是重复值。此处考察的是多表连接中,on和where的区别,on后面的条件是两表连接后,再过滤,where是先过滤再进行两表的连接。
发表于 2022-07-25 01:49:18 回复(1)
使用多列子查询也可以:
SELECT s1.* from student_table as s1, (SELECT * FROM student GROUP BY name HAVING COUNT(*)>=2) as s2 WHERE s1.name=s2.name
发表于 2022-02-23 17:53:01 回复(1)
真的搞不懂牛客网这些题目怎么出的都模棱两可,稀烂。题目是查询名字重复的记录明细,就是哪个名字重复了几次,结果表应该是名字一列,重复次数一列吧,然后后面又说“结果是4条”,这意思又变成了所有名字重复的次数sum一下输出结果,这就已经两层意思了,最后看答案里面,全都是select t2表的全部,那t2表都不包含重复次数的记录,记录全在t1里,你select它干啥玩意???反正我最后按几个“正确答案”跑出来的表格文不对题,一点意义都没有。如果按所有重复名字的重复次数sum输出结果的话,代码应该这么写,因为count是记录数,记录两次算重复1次,所以count出来还得-1
select sum(num) from
(select name,count(name)-1 as num 
from student_table 
group by name 
having count(name)>1) as t1;
发表于 2022-02-13 19:43:24 回复(4)
简单来说 C选项使用On只会过滤掉右表不符合情况的记录,会保留左表的所有, B选项是筛选过滤左右表连接之后的记录, C选项的最终结果比B选项要多
发表于 2022-12-07 05:50:58 回复(0)
A为什么是错的呢 不理解
发表于 2022-03-09 10:43:06 回复(3)
A答案也不对吧,执行优先级having在select前面,所以having里那个c1根本找不到
编辑于 2023-12-11 13:18:09 回复(0)
D也是对的吗???我不理解。。。。where要在group by的前面好吧  group by后面只能是having
发表于 2023-09-25 12:58:07 回复(0)
题目有说要算出几条吗,不是只要求显示出来正确的行数就好吗
发表于 2023-09-11 11:45:34 回复(0)
题目真的出的稀碎

发表于 2023-08-15 14:47:35 回复(0)
c选项where 不应该在group by之前吗
发表于 2023-08-03 11:01:35 回复(0)
left join 前面的表返回,后面表的on里面写的筛选条件,对前面表无效的
发表于 2023-07-23 19:56:51 回复(0)
谓词下推
发表于 2022-09-07 11:27:53 回复(0)
左连接,左表数据是完全存在的 c1<1,是作为左连接的条件,一般情况下只会影响连接后悔右边的数据情况,对左表不产生影响
发表于 2022-06-03 20:58:41 回复(0)
我的理解是left join左表本来就是在的,查询时再加个左表t1*那不肯定重复,或者多了吗?我这样的理解有道理吗?(我也不确定对不对🤣
发表于 2022-03-16 13:59:00 回复(0)