在进行数据库查询时,特别是在需要获取唯一记录或者去除重复项的情况下,使用SQL中的DISTINCT关键字是非常有用的。这个关键字能够帮助我们从结果集中筛选出所有不同的值,无论这些值是来自于单个列还是多个联合起来的列。

基本用法

DISTINCT最基本的用法就是在SELECT语句中使用它来消除重复行。在执行查询时,它会返回一个包含唯一值的结果集。如果你想要获取某一列或多个列中独有的值,可以直接在SELECT后面跟上DISTINCT关键字。例如,如果你想找到一个表中每种产品分类下的不同产品,你可以这样写:

SELECT DISTINCT category FROM products;

这段代码将返回products表中所有不同的category。

使用WITH和CTE(Common Table Expressions)

在更复杂的情形下,我们可能需要先通过一些计算得到临时结果集,然后再应用DISTINCT操作。这时候,可以考虑使用WITH语句和CTE(Common Table Expressions)。以下是一个例子,它首先创建了一个名为“unique_sales” 的临时表,然后对该表应用了DISTINCT操作:

WITH unique_sales AS (

SELECT sale_id, product_id, amount,

-- 你的其他计算逻辑...

ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY sale_date DESC) AS row_num

FROM sales_data)

SELECT DISTINCT product_id FROM unique_sales WHERE row_num = 1;

这里我们首先根据product_id分组,并给每组按sale_date降序排列,并标记每组第一个元素的row_num为1。然后,我们只选择那些row_num为1的product_id,这样就得到了按照sale_date最新的一条销售记录对应各自不同product_id。

在GROUP BY子句中结合使用

当你要根据特定的条件对数据进行分组并且只保留第一条或最后一条记录时,结合GROUP BY与ROW_NUMBER函数可以实现这样的需求。但如果你的目的是为了让GROUP BY后的输出更加简洁,不包含任何重复行,那么直接加上DISTINCT即可:

SELECT DISTINCT department_name, AVG(salary) AS avg_salary

FROM employees

GROUP BY department_name;

在JOIN操作中应用DistinctOn和OrderBy

如果你想保持两个表联结后的结果集只有唯一的一行,而不仅仅是基于主键,但同时保持其他字段排序,则可以使用distinct on功能搭配order by来实现。在这种情况下,你必须确保至少有一列被指定为ORDER BY,因为没有排序标准的话无法确定哪些行是不同的。

Distinct On vs Regular Distinct - Performance Considerations

Advanced Use Cases: Row Numbering with Over Clause and Window Functions

总之,SQL中的DISTINCT是一种强大的工具,用以清理我们的查询结果,使其更具可读性、易管理性。而理解如何正确地利用它,以及与其他SQL功能如窗口函数、CTE等结合起来,就是成为高效数据库开发者的秘诀之一。