Oracle的order by 中文

本文探讨了SQL中使用orderby排序时,汉字排序的实际机制,澄清了拼音排序的常见误解,并提供了通过NLS_SORT函数实现拼音排序的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用order by排序的时候,出现如下情况:


印象中中文排序应该默认是按照拼音排序的,为何“鑫”会排在“中”的后面呢?猜想order by是不是根据对应字符的ASCII码排的呢,因此列出了对应的ASCII,如下:


由此基本可以断定,确实是通过ASCII的大小来排序的,这也解释了为什么数字会排在字母之前,字母为什么会排在汉字之前的现象。但是为什么会出现汉字默认是通过拼音排序的错觉呢,于是查了一下汉字的编码规则,有提到如下一句:

    “一级汉字,是最常用的汉字,按汉语拼音字母顺序排列,共3755个;二级汉字,属于次常用汉字,按偏旁部首的笔划顺序排列,共3008个”

可知,如果排序的汉字都是一级汉字的话,确实是按照拼音顺序排列的,如果涉及到二级汉字,就不一定了。

    但是,如果就是要让汉字通过拼音顺序排序呢,可以通过如下方式:


  1. 按照拼音顺序

    ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_PINYIN_M')

  2. 按照部首顺序

    ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_RADICAL_M')

  3. 按照笔画顺序

    ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_STROKE_M')

### 在 Oracle 数据库中结合 ORDER BY 和 DISTINCT 实现去重 在 Oracle 数据库中,`DISTINCT` 关键字用于删除查询结果中的重复行。当需要对数据进行排序时,可以通过 `ORDER BY` 子句来指定排序依据。然而,在实际应用中需要注意一些细节。 #### 使用 DISTINCT 和 ORDER BY 的基本语法 以下是使用 `DISTINCT` 和 `ORDER BY` 结合的一个简单例子: ```sql SELECT DISTINCT column_name FROM table_name ORDER BY column_name; ``` 此语句会返回表中某一列的所有唯一值,并按照该列的升序排列[^1]。 如果需要按降序排列,则可以在 `ORDER BY` 后加上 `DESC` 关键字: ```sql SELECT DISTINCT column_name FROM table_name ORDER BY column_name DESC; ``` #### 多字段场景下的注意事项 当涉及多字段查询时,需注意以下几点: 1. **字段一致性** 如果希望对某些特定字段的结果集进行排序,那么这些字段必须包含在 `SELECT` 列表中。例如: ```sql SELECT DISTINCT field1, field2 FROM table_name ORDER BY field1 ASC, field2 DESC; ``` 此处,`field1` 和 `field2` 都被选入到最终结果集中,因此它们也可以作为排序条件的一部分[^5]。 2. **冗余字段处理** 若存在不必要的字段参与排序操作(如日期之外还附加了其他无意义的 ID 排序),则可能增加复杂度而并无实质帮助。此时应考虑简化逻辑或移除非必要部分[^3]。 3. **单字段去重需求** 对于仅针对某单一字段执行去重的情况,单纯依靠 `DISTINCT` 可能无法满足业务要求。这时可以改用聚合函数或者 `GROUP BY` 来达成目标[^4]。比如下面这个案例展示了如何基于某个具体字段完成分组后再做进一步筛选: ```sql SELECT field_to_distinct, MAX(other_field) FROM table_name GROUP BY field_to_distinct ORDER BY field_to_distinct; ``` #### 示例代码展示 假设有一张名为 `employees` 的员工信息表格,其中包含了姓名 (`name`)、部门编号(`department_id`)以及薪资水平(`salary`)三项基本信息。现在我们想要获取各部门唯一的部门ID及其对应最高工资数额列表如下所示: ```sql -- 查询各部们最大薪水情况 SELECT department_id, MAX(salary) AS max_salary FROM employees GROUP BY department_id ORDER BY department_id; -- 或者如果我们只需要知道有哪些不同的部门号即可这样写: SELECT DISTINCT department_id FROM employees ORDER BY department_id; ``` 以上两种方式分别适用于不同场合下对于数据提取的需求分析过程之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值