我正在尝试学习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;
答案 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将被提取为重复