五种主流数据库:从无序到有序

SQL 查询不保证返回结果的顺序。如果我们想要按照某种规则对结果进行排序显示,例如按照工资从高到低进行排序,需要使用 ORDER BY 子句。

本文比较五种主流数据库对查询结果排序的实现和差异,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。

ORDER BYMySQLOracleSQL ServerPostgreSQLSQLite
单个字段排序✔️✔️✔️✔️✔️
多个字段排序✔️✔️✔️✔️✔️
表达式排序✔️✔️✔️✔️✔️
空值排序默认最小默认最大默认最小默认最大默认最小
中文排序偏旁部首、拼音偏旁部首、拼音、笔画偏旁部首、拼音、笔画偏旁部首、拼音偏旁部首

基于单个字段排序

基于单个字段值的排序操作被称为单列排序。单列排序的语法如下:

SELECT col1, col2, ...
FROM t
[WHERE ...]
ORDER BY col1 [ASC | DESC];

其中,ORDER BY 子句用于指定排序,ASC 表示按照升序排序(Ascending),DESC 表示按照降序排序(Descending),默认按照升序排序。

以下语句查找公司的女性员工,并且按照月薪从高到低排序显示:

SELECT emp_name, salary
FROM employee
WHERE sex = '女'
ORDER BY salary DESC;

查询返回的结果如下:

emp_name|salary 
--------|--------
孙尚香  |12000.00
赵氏    | 6600.00
孙丫鬟  | 6000.00

提示:对于升序排序,数字按照从小到大的顺序排列,字符按照编码的顺序排列,日期和时间按照从早到晚的顺序排列;对于降序排序则正好相反。

基于多个字段排序

如果排序字段中存在相同的数据,那么它们的排序顺序是随机的。为了进一步明确这些数据的排序顺序,可以使用多列排序。

多列排序指的是基于多个字段值的排序,多个字段间使用逗号进行分隔。多列排序的语法如下:

SELECT col1, col2, ...
FROM t
[WHERE ...]
ORDER BY col1 [ASC | DESC], col2 [ASC | DESC], ...;

首先,查询基于第一个字段进行排序,对于第一个字段排序相同的数据,再基于第二个字段进行排序,并且依此类推。

以下语句查找销售部(dept_id=5)的员工信息,并且按照月薪从高到低排序,如果其月薪相同,则按照入职先后进行排序:

SELECT emp_name, salary, hire_date
FROM employee
WHERE dept_id = 5
ORDER BY salary DESC, hire_date;

查询返回的结果如下:

emp_name|salary |hire_date 
--------|--------|----------
法正    |10000.00|2017-04-09
简雍    | 4800.00|2019-05-11
...
蒋琬    | 4000.00|2018-01-28
邓芝    | 4000.00|2018-11-11

其中,“蒋琬”和“邓芝”的月薪相同,但是“蒋琬”排在了“邓芝”之前,因为他的入职日期更早。

基于表达式排序

除了基于字段的值进行排序外,我们也可以基于表达式的值进行排序。例如,以下语句查找行政管理部(dept_id=1)的员工,并且按照全年总收入进行排序:

SELECT emp_name, salary * 12 + bonus
FROM employee
WHERE dept_id = 1
ORDER BY salary * 12 + bonus;

员工的全年总收入等于年薪(salary*12)加奖金(bonus),查询返回的结果如下:

emp_name|salary * 12 + bonus
--------|-------------------
张飞    | 298000.00
关羽    | 322000.00
刘备    | 370000.00

另外,我们也可以使用字段或者表达式在 SELECT 列表中出现的位置来指定数据的排序。

例如,上面的查询语句可以改写如下:

SELECT emp_name, salary * 12 + bonus
FROM employee
WHERE dept_id = 1
ORDER BY 2;

表达式 salary * 12 + bonus 是查询返回的第 2 列,因此 ORDER BY 2 也表示按照全年总收入进行排序。

空值的排序位置

空值(NULL)在数据库中表示未知或者缺失的数据。如果排序的字段中存在空值时,应该如何处理呢?以下语句查找人力资源部(dept_id=2)中的员工,并且按照奖金从低到高进行排序显示:

SELECT emp_name, bonus
FROM employee
WHERE dept_id = 2
ORDER by bonus;

不同数据库系统对于空值的排序位置采用了不同的处理方式。MySQL、Microsoft SQL Server 以及 SQLite 中的空值排在了最前,查询返回的结果如下:

-- MySQL、Microsoft SQL Server 以及 SQLite
emp_name|bonus 
--------|-------
黄忠    | 
魏延    | 
诸葛亮  |8000.00

Oracle 和 PostgreSQL 中的空值排在了最后,查询返回的结果如下:

-- Oracle 以及 PostgreSQL
emp_name|bonus 
--------|-------
诸葛亮  |8000.00
黄忠    | 
魏延    | 

另外,Oracle、PostgreSQL 以及 SQLite 支持使用 NULLS FIRST 关键字,将空值排在最前;或者使用 NULLS LAST 关键字,将空值排在最后。以下查询语句返回的结果与上面的 MySQL 和 Microsoft SQL Server 一致:

-- Oracle、PostgreSQL 以及 SQLite
SELECT emp_name, bonus
FROM employee
WHERE dept_id = 2
ORDER by bonus NULLS FIRST;

总而言之,对于空值的排序:

  • MySQL、Microsoft SQL Server 以及 SQLite 认为排序时空值最小,升序排序时空值排在最前,降序排序时空值排在最后。
  • Oracle 和 PostgreSQL 认为排序时空值最大,升序排序时空值排在最后,降序排序时空值排在最前。
  • Oracle、PostgreSQL 以及 SQLite 支持使用 NULLS FIRST 和 NULLS LAST 指定空值的排序位置。

中文的排序方式

在创建数据库或者表时,我们通常会指定一个字符集和排序规则。字符集(Charset)决定了数据库能够存储哪些字符,比如 ASCII 字符集只能存储简单的英文、数字和一些控制字符,GB2312 字符集可以存储中文,Unicode 字符集能够支持世界上的各种文字。

排序规则(Collation)定义了字符集中字符的排序顺序,包括是否区分大小写、是否区分重音等。对于中文而言,排序方式与英文有所不同,中文通常需要按照拼音、偏旁部首或者笔画进行排序。

如果想要支持中文排序,最简单的方式就是使用支持中文排序的字符集和排序规则。如果使用的字符集和排序规则不满足我们的排序需求,可以通过其他方法实现。

Oracle 默认使用 AL32UTF8 字符编码,中文按照偏旁部首进行排序。我们可以通过一个转换函数实现其他方式的中文排序,以下查询按照员工姓名的拼音进行排序:

-- Oracle 实现中文拼音排序
SELECT emp_name
FROM employee
WHERE dept_id = 4
ORDER BY NLSSORT(emp_name,'NLS_SORT = SCHINESE_PINYIN_M');

其中,NLSSORT()是 Oracle 提供的一个系统函数,用于返回按照指定排序规则编码的字符序列,SCHINESE_PINYIN_M 表示中文的拼音排序规则。查询返回的结果如下:

EMP_NAME
--------
关平 
关兴 
廖化 
马岱 
张苞 
赵氏 
赵统 
赵云 
周仓 

除按照拼音排序外,Oracle 还支持按照偏旁部首(SCHINESE_RADICAL_M)以及笔画(SCHINESE_STROKE_M)进行中文排序。

MySQL 8.0 默认使用 utf8mb4 字符编码,中文按照偏旁部首进行排序。我们可以通过一个转换函数实现其他方式的中文排序,以下查询按照员工姓名的拼音进行排序:

-- MySQL 实现中文拼音排序
SELECT emp_name
FROM employee
WHERE dept_id = 4
ORDER BY CONVERT(emp_name USING GBK);

其中,CONVERT()是一个 MySQL 系统函数,用于转换数据的字符集编码,中文 GBK 字符集默认使用拼音进行排序。查询返回的结果和上面的 Oracle 示例相同。

Microsoft SQL Server 中的字符集和排序规则是同一个概念,安装数据库时默认根据操作系统所在的区域进行设置,中国地区默认使用 Chinese_PRC_CI_AS 排序规则,中文按照偏旁部首进行排序。我们可以通过 COLLATE 关键字实现其他方式的中文排序,以下查询按照员工姓名的拼音进行排序:

-- SQL Server 实现中文拼音排序
SELECT emp_name
FROM employee
WHERE dept_id = 4
ORDER BY emp_name COLLATE Chinese_PRC_CI_AI_KS_WS;

其中,COLLATE 表示按照某种排序规则进行排序,Chinese_PRC_CI_AI_KS_WS 表示中文拼音排序规则。查询返回的结果和上面的 Oracle 示例一样。

Microsoft SQL Server 也支持中文按照笔画进行排序(Chinese_PRC_Stroke_CI_AS)。

PostgreSQL 默认使用 UTF-8 编码字符集,中文按照偏旁部首进行排序。我们可以通过 COLLATE 关键字实现其他方式的中文排序,以下查询按照员工姓名的拼音进行排序:

-- PostgreSQL 实现中文拼音排序
SELECT emp_name
FROM employee
WHERE dept_id = 4
ORDER BY emp_name COLLATE "zh_CN";

其中,COLLATE 表示按照某种排序规则进行排序,zh_CN 表示中文拼音排序规则。查询返回的结果和上面的 Oracle 示例一样。

SQLite 默认使用 UTF-8 字符编码,中文按照偏旁部首进行排序,不支持其他的排序方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/658872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分查找下界(c++题解)

题目描述 在一个N个元素的不递减数列中,查找大于或等于X的第一个位置,如果找不到则输出n1。下标范围从1~N。 输入格式 共3行 第一行一个n (1 ≤ n ≤ 1000000) 第二行n个不递减的整数 第三行查找目标数x 数据都在int范围内 输出格式 第一个大于…

【免费分享】概率神经网络的分类预测--基于PNN的变压器故障诊断

主要内容 ​《MATLAB神经网络43个案例分析》共有43章,内容涵盖常见的神经网络(BP、RBF、SOM、Hopfield、Elman、LVQ、Kohonen、GRNN、NARX等)以及相关智能算法(SVM、决策树、随机森林、极限学习机等)。同时&#x…

Java 对部分接口返回数据进行加密,或其他处理

业务场景:后端项目中分为PC端和移动端接口,移动端为例如 mobile 开头的URl,需求为调用移动端接口时,对返回数据进行加密,PC端不加密 import cn.hutool.core.date.DatePattern; import cn.hutool.json.JSONConfig; impo…

系统架构设计师-22年-下午题目

系统架构设计师-22年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答,二、三、四、五题中任选两题作答 试题一 (25分) 说明 某电子商务公司拟升级其会员与促销管理系统,向用户提供个性化服务,提高用户的粘性。…

全流程机器视觉工程开发(三)任务前瞻 - 从opencv的安装编译说起,到图像增强和分割

前言 最近开始做这个裂缝识别的任务了,大大小小的问题我已经摸得差不多了,然后关于识别任务和分割任务我现在也弄的差不多了。 现在开始做正式的业务,也就是我们说的裂缝识别的任务。作为前言,先来说说场景: 现在相…

0131-2-关于事件捕获和冒泡

关于事件捕获和冒泡 DOM事件流分为三个阶段:捕获阶段、目标阶段、冒泡阶段 点击目标元素后,不会马上触发目标元素,而是先执行事件捕获,从顶部逐步到目标元素;处于目标阶段的时候触发目标元素;最后冒泡阶段…

如何在Raspberry Pi上启用SSH并结合cpolar内网穿透实现公网远程访问本地树莓派

文章目录 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地址4.5 ssh公网…

我的创作纪念日和前端碎碎念

机缘 作为一个前端开发者,我一直热衷于将设计和技术相结合,尽可能提升用户体验。我最初成为创作者的初心源于学习记录,把创作当作一个笔记,希望把自己遇到的问题,以及学习到的实用技巧记录下来,方便学习回…

Qt Excel读写 - QXlsx的安装配置以及测试

Qt Excel读写 - QXlsx的安装配置以及测试 引言一、安装配置二、简单测试 引言 Qt无自带的库处理Excel 文件,但可通过QAxObject 借助COM接口进行Excel的读写1。亦可使用免费的开源第三方库:QXlsx,一个基于Qt库开发的用于读写Microsoft Excel文…

SpringSecurity框架

1、概述 ​ Spring Security是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富; ​ Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spri…

CUDA下载安装教程,新手详细

目录 一、下载二、安装三、 设置环境变量四、补丁安装 由于项目需要安装特定版本的CUDA,现记录安装过程。 一、下载 进入官方下载地址:https://developer.nvidia.com/cuda-toolkit-archive 选择自己需要的版本。如果没有明确要求版本号,那么…

安卓视图基础

目录 设置视图的宽高 设置视图的间隔 设置视图的对齐方式 设置视图的宽高 设置视图的间隔 设置视图的对齐方式 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"a…

聊聊java中的Eureka和Nacos

本文主要来自于黑马课程中 1.提供者与消费者 在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务中&#xff0…

消息

在Java中使用消息机制通常需要依赖于消息中间件&#xff0c;比如常用的ActiveMQ、RabbitMQ、Kafka等。下面我以使用ActiveMQ为例&#xff0c;简单介绍如何在Java中编写消息生产者和消费者的代码。 首先&#xff0c;你需要下载并安装ActiveMQ消息中间件&#xff0c;并启动Activ…

Elasticsearch:入门(二)

九. Elasticsearch的映射和分析 Elasticsearch的强大搜索引擎功能不仅源于其高效的分布式架构&#xff0c;还在于对数据的映射和分析的深度支持。通过合理的字段类型定义和灵活的分析器配置&#xff0c;可以使搜索更加精准、快速&#xff0c;并满足不同业务场景的需求。 9.1 …

javaweb项目,springboot幼儿园健康管理系统,界面美观,增删改查。

javaweb项目&#xff0c;幼儿园健康管理系统&#xff0c;界面美观&#xff0c;增删改查。 管理员&#xff0c;老师&#xff0c;学生三个角色。 功能&#xff1a;权限管理&#xff0c;咨询列表&#xff0c;教师列表&#xff0c;班级列表&#xff0c;健康档案列表&#xff0c;评…

python数据类型-列表

1 python中列表的定义 python中列表是一种有序和可更改的集合&#xff0c;允许重复的成员&#xff0c;列表中的元素之间数据类型可以不同&#xff08;元素之间数据类型可以不相同&#xff0c;这一点和其它的面向对象的开发语言有很大的不同&#xff0c;如C#、Java&#xff09;…

5GNR解调分析手持式频谱分析仪

2024年已经是5G网络全面普及的一年&#xff0c;手机也基本都升级了5G版本&#xff0c;那么同样的&#xff0c;5G的网络运行也是需要维护的。 我们知道&#xff0c;5G是新型的网络传输技术&#xff0c;如果一般的频谱分析仪是没有办法单独针对5G NR进行解析的。这个时候你就需要…

【Django自学】Django入门:如何使用django开发一个web项目(非常详细)

测试机器&#xff1a;windows11 x64 python版本&#xff1a;3.11 一、安装Django 安装步骤非常简单&#xff0c;使用pip安装就行 pip install django安装完成之后&#xff0c;python的 Scripts 文件夹下&#xff0c;会多一个 django-admin.exe (管理创建django项目的工具)。…

【kafka-01数据保留时间设置】

kafka正确设置过期时间 背景如何正确配置数据过期时间 背景 某天突然发现我的kafka中group_id消费记录不见了&#xff0c;特地查了下咋回事。众所周知新版本的kafka group_id消费的offset记录已经不存储在zookeeper上了&#xff0c;而是存储在__consumer_offsets 这个kafka内部…