简单的SQL问题

简单的SQL问题,sql,Sql,我正在尝试学习SQL,我正在回答书中的一些问题,但我找不到答案。有人能帮我吗 问题是 给定由两列“id”和“name”组成的数据库表“names”,什么查询会找到重复的名称 SELECT * FROM names GROUP BY name WHERE id > 1; SELECT * FROM names n1 LEFT JOIN names n2 ON n1.name = n2.name; SELECT * FROM names n1 JOIN names n2 ON n1.name

我正在尝试学习SQL,我正在回答书中的一些问题,但我找不到答案。有人能帮我吗

问题是

给定由两列“id”和“name”组成的数据库表“names”,什么查询会找到重复的名称

SELECT * FROM names GROUP BY name WHERE id > 1;
SELECT * FROM names n1 LEFT JOIN names n2 ON n1.name = n2.name;
SELECT * FROM names n1 JOIN names n2 ON n1.name = n2.name AND n1.id != n2.id;
SELECT * FROM names n1 LEFT JOIN names n2 ON n1.id != n2.id;

这将向您显示多次出现的所有名称:

SELECT COUNT(1), Name FROM names GROUP BY name HAVING COUNT(1) > 1
数字1不是有效的查询。GROUP BY要求某些聚合函数位于查询中,并且不希望聚合的所有其他列必须在GROUP BY中列出。whereid>1部分只会删除ID为1的记录,但仅此而已

第二个也不行。它只需生成一个列表,其中所有帐户在同一行中列出两次

数字4将为您提供与交叉连接几乎相同的内容

数字3实际上会起作用,尽管效率不高。它基本上在自身上联接表,使用名称作为联接运算符,然后使用WHERE n1.id!=n2.id子句,以确保如果名称存在不止一次,它将不会加入自身的行。因此,它将为您提供所有重复名称的列表


它效率不高的原因是,如果有一个名称存在几十次,那么结果中仍然会有很多行,现在仍然可以很容易地只看到存在多次的名称。在一个百万行的表上,运行查询也可能需要相当长的时间,因为基本上使用字符字段进行连接,这不是很有效

这是你的答案

SELECT * FROM names n1 JOIN names n2 ON n1.name = n2.name AND n1.id != n2.id;

第三个是你的答案

SELECT * FROM names n1 JOIN names n2 ON n1.name = n2.name AND n1.id != n2.id;
它说,从表名中选择all,如果与表名相比,表名相同,但ID不同

下表所示:

1 Bob 
2 Bob
3 George 
id  names

1   Sample1

2   Sample2

3   Sample1

4   Sample2

5   Sample3
它将表明:

1 Bob 2 Bob
2 Bob 1 Bob
names    Duplicate_count

Sample1  2

Sample2  2
这句话就是你的答案,因为: 假设您有一个表名:names Its有两个列Id和名称。首先,该查询从名称表中选择所有数据,然后比较自身名称=名称和if id=最后返回所需的结果

Select name 
from names 
group by 1 
having count(name) > 1;
这将对名称列进行分组,并且其计数大于1的列将被提取为重复列

Select names, Count(names) as Duplicate_count 
from names
group by names
having count(names) > 1**
下表所示:

1 Bob 
2 Bob
3 George 
id  names

1   Sample1

2   Sample2

3   Sample1

4   Sample2

5   Sample3
它将表明:

1 Bob 2 Bob
2 Bob 1 Bob
names    Duplicate_count

Sample1  2

Sample2  2

为什么您不能创建一个临时表并自己测试它呢?您可以使用动态创建数据库并测试它。或者您可能应该阅读教程。否则,两种解决方案都不是完美的。。。显示重复项的唯一解决方案是将重复项乘以重复次数。海报所寻找的答案是在他们提供的一个select语句中。@Linger我刚刚编辑了各个查询及其答案。“我仍然认为,即使3可以做到这一点,但它不是一种有效的方法。”施密茨说,虽然有几种方法可以获得结果,但OP只希望在预定义的列表中找到正确的答案。仅仅说选项3会起作用并不能解释为什么它会起作用。如果您详细说明为什么选项3是正确答案,并提供示例和解释,说明每个查询的实际含义,这将比仅仅说它会起作用更能帮助用户。@玲儿-感谢:+1帮助我成为一个更好的贡献者。实际上,这在sql中对我很有效。或者,即使这样也可以:按countname>1的名称从名称组中选择名称;