掌握 SQL DISTINCT:删除重复项变得简单

2 02 2 年,我在某个城市的公司里,有一次遇到了一个数据库查询问题。
当时我正在用SQL写一个查询,需要从employees表中提取出所有的唯一部门。
我就在那里写啊写,写了一个SELECT语句,然后加上了DISTINCT关键字。
我写的是:
sql SELECT DISTINCT department FROM employees;
我当时心里还想着,这个DISTINCT应该是用来去除重复的部门的吧。
然后我执行了这个查询,结果发现,它确实只返回了唯一部门列表,比如hr、it、sales,那些重复的部门名字都没了。

后来我再用DISTINCT在orders表里找唯一的CustomerID和ProductID组合,我又写了一个类似的语句:
sql SELECT DISTINCT CustomerID, ProductID FROM Orders;
执行之后,果然它就只显示了那些组合,没有重复的。

我当时还挺高兴的,因为这个DISTINCT确实解决了我的问题。
不过,我也开始思考它的局限性。
比如,我知道它在大型数据集上可能会影响性能,因为要扫描所有行,比较指定列的值。
而且,它不能根据条件去重,如果我想只保留每组中时间最新的行,那就得用其他方法了。

所以我开始学习其他的去重方法,比如用GROUP BY或者ROW_NUMBER()。
我觉得这样更灵活,更适合复杂场景。
不过,DISTINCT这东西,用得好的话,确实挺有用的。
记得在使用的时候要小心,别因为用得不当,影响了查询效率。

sql中如何去重

上周,我那个朋友遇到个问题,说他的数据库表里有些重复数据,他想删掉。
我给他讲了几个方法。

第一种,他用DISTINCT关键字。
这适用于查询时,比如他想查不重复的name,他会写这样的SQL:SELECT DISTINCT name FROM table_name; 注意啊,这只能查询出来不重复的,不能直接删掉。

然后,他用GROUP BY子句。
这个可以用来统计重复次数,比如他查重复的name和出现次数:SELECT name, COUNT() AS count FROM table_name GROUP BY name HAVING COUNT() > 1 ; 然后删掉不是最小id的记录:DELETE FROM table_name WHERE id NOT IN (SELECT MIN(id) FROM table_name GROUP BY name);
再来说ROW_NUMBER()函数,这更灵活一些。
比如他想按name分组,然后按id排序,标记重复行:WITH ranked_data AS (SELECT , ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS row_num FROM table_name) DELETE FROM table_name WHERE id IN (SELECT id FROM ranked_data WHERE row_num > 1 );
集运算符像UNION、INTERSECT、EXCEPT,这通常用于查询两个表的重复或唯一值,不直接修改原表。

最后,他可以创建新表去重。
比如先创建个新表,把去重后的数据插入进去,然后删除原表,把新表重命名。
这步骤有点复杂,得写:CREATE TABLE new_table AS SELECT DISTINCT FROM table_name; DROP TABLE table_name; ALTER TABLE new_table RENAME TO table_name;
这几种方法各有各的适用场景,得根据他具体的数据量和业务需求来选。
你看着办吧。