简单的SQL问题

时间:2013-12-03 18:47:52

标签: sql

我正在尝试学习SQL,我正在回答书中的一些问题,但我找不到答案,有人可以帮我解决这个问题

问题是

鉴于数据库表'names'由两列'id'和'name'组成,哪个查询会找到重复的名称?

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;

6 个答案:

答案 0 :(得分:2)

这将显示所有名称不止一次出现:

SELECT COUNT(1), Name FROM names GROUP BY name HAVING COUNT(1) > 1

数字1不是有效查询。 GROUP BY需要一些聚合函数在查询中,而您不希望聚合的所有其他列必须在GROUP BY中列出。 WHERE ID > 1部分只会以id 1取消记录,但只会更多。

2号也不起作用。它只是生成一个列表,其中所有帐户在同一行中列出两次。

第4号会给你一些与cross join几乎完全相同的东西。

3号实际上可以做到这一点,尽管效率不高。它基本上将表连接到自身,使用名称作为JOIN运算符,然后使用WHERE n1.id != n2.id子句确保如果名称不止一次存在,它将不会连接该行本身。因此,它为您提供了所有重复名称的列表。

它效率不高的原因是,如果你有1个名字存在数十次,你的结果中仍会有很多行,你现在仍然可以轻松看到存在多次的名称。在百万行表中,运行查询也可能需要相当长的时间,因为您基本上使用JOIN的字符字段(效率不高)。

答案 1 :(得分:1)

VARCHAR

这句话是你的答案。因为: 想象一下,你有一个表名:名字 它有两列Id和名称。首先,这个查询从名称表中选择所有数据然后比较它自己的名称=名称和id!= id。最后它返回所需的结果..

答案 2 :(得分:0)

这是你的答案。

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

答案 3 :(得分:0)

第三个是你的回答

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

它说,从表names中选择所有,如果与自身相比,名称是相同的,但不是。

使用下表:

1 Bob 
2 Bob
3 George 

它会显示:

1 Bob 2 Bob
2 Bob 1 Bob

答案 4 :(得分:0)

Select names, Count(names) as Duplicate_count 
from names
group by names
having count(names) > 1**

与下表:

id  names

1   Sample1

2   Sample2

3   Sample1

4   Sample2

5   Sample3

它将显示:

names    Duplicate_count

Sample1  2

Sample2  2

答案 5 :(得分:-1)

Select name 
from names 
group by 1 
having count(name) > 1;

这会将名称列分组,其计数大于1将被提取为重复