在SQL中,DISTINCT关键字用于返回结果集中的唯一值,即去除重复的行。它可以应用于SELECT语句的列或子查询的结果。在实际操作中,DISTINCT用法非常灵活,可以帮助我们快速地获取数据集中独特的记录。

实例1:查找唯一客户

假设我们有一个名为customers的表,其中包含了多个客户信息。如果我们想要找出所有不同的客户,我们可以使用以下SQL语句:

SELECT DISTINCT customer_name FROM customers;

这条语句会返回每个不同名字的客户,不管他们出现多少次。

实例2:过滤重复订单

如果我们需要从orders表中筛选出所有不同的订单号(以确保没有重复),可以这样做:

SELECT DISTINCT order_id FROM orders;

这个查询将只显示每个订单号出现一次,即使同一个订单号可能被多次引用。

实例3:计算独特城市数量

对于一个包含国家和城市信息的表来说,如果你想知道总共有多少种不同的城市,你可以这样写:

SELECT COUNT(DISTINCT city) AS unique_cities_count FROM cities;

这里,COUNT函数配合DISTINCT关键字,将统计出city列中的不同城市数量,并将其命名为unique_cities_count。

实例4:处理子查询结果中的重复项

有时,我们需要对子查询得到的结果进行去重操作。这通常是通过在主查询中使用DISTINCT来实现。例如,如果要找到那些购买了至少两种不同商品的人员,我们首先需要创建一个子查询来找到每个人购买过哪些商品,然后再从这个列表中移除任何不止一次出现的事务ID,以便只剩下那些不曾买到相同事务ID产品的事务ID。最终,我们通过主查询结合这些清洗后的事务ID和原来的购买列表来确定这些人是否买到了至少两种不同商品。

WITH purchase_list AS (

SELECT transaction_id, product_id, ROW_NUMBER() OVER (PARTITION BY transaction_id ORDER BY product_id) as row_num

FROM purchases)

SELECT p1.transaction_id, p1.product_id

FROM purchase_list p1 JOIN purchase_list p2 ON (p1.transaction_id = p2.transaction_id AND p1.row_num < 2 AND p2.row_num > 2)

WHERE NOT EXISTS (SELECT 1 FROM purchase_list WHERE transaction_id = p1.transaction_id AND product_ID IN (p2.product_ID));

上述示例展示了如何处理具有大量数据和潜在重复项的问题,而不会影响程序性能,因为它们利用了窗口函数,这样就避免了生成完整列表然后进行排序并删除行,从而大幅提升效率。