SQL语句DISTINCT

本文介绍了SQL中DISTINCT关键字的使用方法,通过示例展示了如何去除查询结果中的重复记录,适用于初学者掌握基本的SQL查询技巧。

DISTINCT用法

在表中可能会包含重复值。在查询的时候我们希望能查询到值不不一样的结果集,可以利用DISTINCT来实现这一点,学习来源SQL教程

语法:

SELECT DISTINCT 列名称 FROM 表名称
IDNAMEAGEADDRESSEMAILPHONENUMBER
1Henry25ShenZhen ChinaHENRY@163.COM15815881449
2Vasiliki24GuiYang ChinaVasiliki@163.com15514731589
3Hutchins24ChengDuHutchins@163.com18888888888

从PERSON表中查询AGE列:

SELECT AGE FROM PERSON
AGE
25
24
25

查询结果有两列相同的值

SELECT DISTINCT AGE FROM PERSON
AGE
25
24

这样查询就过滤掉相同的值

SQL中,`DISTINCT ON` 是 PostgreSQL 特有的扩展功能,用于在查询中根据指定列进行去重,并结合 `ORDER BY` 条件返回每组中的第一条记录。这种语法在处理需要去重但同时希望保留某些特定字段值的场景时非常有用。 ### 语法结构 ```sql SELECT DISTINCT ON (expression) columns FROM table_name ORDER BY order_expressions; ``` 其中,`expression` 用于指定去重的列,而 `ORDER BY` 子句决定了每组中哪一条记录将被保留。`DISTINCT ON` 的表达式必须与 `ORDER BY` 子句的第一部分保持一致。 ### 示例 假设有一个名为 `employees` 的表,包含以下数据: | name | department | salary | |---------|------------|--------| | Alice | HR | 5000 | | Bob | HR | 5500 | | Carol | IT | 6000 | | Dave | IT | 6500 | 如果希望从每个部门中选择薪资最高的员工,可以使用如下查询: ```sql SELECT DISTINCT ON (department) name, department, salary FROM employees ORDER BY department, salary DESC; ``` 此查询的结果如下: | name | department | salary | |---------|------------|--------| | Bob | HR | 5500 | | Dave | IT | 6500 | 在此查询中,`DISTINCT ON (department)` 确保每个部门仅返回一条记录,而 `ORDER BY department, salary DESC` 确保每个部门薪资最高的员工被选中 [^3]。 ### 与其他去重方式的对比 与 `DISTINCT` 关键字不同,`DISTINCT ON` 不仅能去除重复值,还能保留额外的字段信息。相比之下,标准的 `SELECT DISTINCT` 只能对查询的所有字段进行整体去重,而无法保留额外的字段或控制哪一行被保留 [^2]。 例如,如果仅使用 `DISTINCT`,查询可能如下: ```sql SELECT department, salary FROM employees ORDER BY department, salary DESC; ``` 这种方式无法确保每个部门只返回一个记录,除非所有字段的组合是唯一的。 ### 注意事项 - `DISTINCT ON` 是 PostgreSQL 的专有特性,不适用于 MySQLSQL Server 或 Oracle 等数据库。 - 在使用 `DISTINCT ON` 时,必须确保 `ORDER BY` 子句的第一项与 `DISTINCT ON` 的表达式一致,否则会引发语法错误。 - `DISTINCT ON` 通常用于复杂的数据筛选和结果集优化,特别是在处理大数据集时,合理使用 `DISTINCT ON` 可以显著提高查询效率 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值