成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

五種主流數(shù)據(jù)庫(kù):從無(wú)序到有序

數(shù)據(jù)庫(kù) SQL Server
SQL 查詢不保證返回結(jié)果的順序。如果我們想要按照某種規(guī)則對(duì)結(jié)果進(jìn)行排序顯示,例如按照工資從高到低進(jìn)行排序,需要使用 ORDER BY 子句。

SQL 查詢不保證返回結(jié)果的順序。如果我們想要按照某種規(guī)則對(duì)結(jié)果進(jìn)行排序顯示,例如按照工資從高到低進(jìn)行排序,需要使用 ORDER BY 子句。

本文比較五種主流數(shù)據(jù)庫(kù)對(duì)查詢結(jié)果排序的實(shí)現(xiàn)和差異,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。

ORDER BY

MySQL

Oracle

SQL Server

PostgreSQL

SQLite

單個(gè)字段排序

??

??

??

??

??

多個(gè)字段排序

??

??

??

??

??

表達(dá)式排序

??

??

??

??

??

空值排序

默認(rèn)最小

默認(rèn)最大

默認(rèn)最小

默認(rèn)最大

默認(rèn)最小

中文排序

偏旁部首、拼音

偏旁部首、拼音、筆畫

偏旁部首、拼音、筆畫

偏旁部首、拼音

偏旁部首

基于單個(gè)字段排序

基于單個(gè)字段值的排序操作被稱為單列排序。單列排序的語(yǔ)法如下:

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

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

以下語(yǔ)句查找公司的女性員工,并且按照月薪從高到低排序顯示:

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

查詢返回的結(jié)果如下:

emp_name|salary 
--------|--------
孫尚香  |12000.00
趙氏    | 6600.00
孫丫鬟  | 6000.00

提示:對(duì)于升序排序,數(shù)字按照從小到大的順序排列,字符按照編碼的順序排列,日期和時(shí)間按照從早到晚的順序排列;對(duì)于降序排序則正好相反。

基于多個(gè)字段排序

如果排序字段中存在相同的數(shù)據(jù),那么它們的排序順序是隨機(jī)的。為了進(jìn)一步明確這些數(shù)據(jù)的排序順序,可以使用多列排序。

多列排序指的是基于多個(gè)字段值的排序,多個(gè)字段間使用逗號(hào)進(jìn)行分隔。多列排序的語(yǔ)法如下:

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

首先,查詢基于第一個(gè)字段進(jìn)行排序,對(duì)于第一個(gè)字段排序相同的數(shù)據(jù),再基于第二個(gè)字段進(jìn)行排序,并且依此類推。

以下語(yǔ)句查找銷售部(dept_id=5)的員工信息,并且按照月薪從高到低排序,如果其月薪相同,則按照入職先后進(jìn)行排序:

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

查詢返回的結(jié)果如下:

emp_name|salary |hire_date 
--------|--------|----------
法正    |10000.00|2017-04-09
簡(jiǎn)雍    | 4800.00|2019-05-11
...
蔣琬    | 4000.00|2018-01-28
鄧芝    | 4000.00|2018-11-11

其中,“蔣琬”和“鄧芝”的月薪相同,但是“蔣琬”排在了“鄧芝”之前,因?yàn)樗娜肼毴掌诟纭?/p>

基于表達(dá)式排序

除了基于字段的值進(jìn)行排序外,我們也可以基于表達(dá)式的值進(jìn)行排序。例如,以下語(yǔ)句查找行政管理部(dept_id=1)的員工,并且按照全年總收入進(jìn)行排序:

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

員工的全年總收入等于年薪(salary*12)加獎(jiǎng)金(bonus),查詢返回的結(jié)果如下:

emp_name|salary * 12 + bonus
--------|-------------------
張飛    | 298000.00
關(guān)羽    | 322000.00
劉備    | 370000.00

另外,我們也可以使用字段或者表達(dá)式在 SELECT 列表中出現(xiàn)的位置來(lái)指定數(shù)據(jù)的排序。

例如,上面的查詢語(yǔ)句可以改寫如下:

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

表達(dá)式 salary * 12 + bonus 是查詢返回的第 2 列,因此 ORDER BY 2 也表示按照全年總收入進(jìn)行排序。

空值的排序位置

空值(NULL)在數(shù)據(jù)庫(kù)中表示未知或者缺失的數(shù)據(jù)。如果排序的字段中存在空值時(shí),應(yīng)該如何處理呢?以下語(yǔ)句查找人力資源部(dept_id=2)中的員工,并且按照獎(jiǎng)金從低到高進(jìn)行排序顯示:

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

不同數(shù)據(jù)庫(kù)系統(tǒng)對(duì)于空值的排序位置采用了不同的處理方式。MySQL、Microsoft SQL Server 以及 SQLite 中的空值排在了最前,查詢返回的結(jié)果如下:

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

Oracle 和 PostgreSQL 中的空值排在了最后,查詢返回的結(jié)果如下:

-- Oracle 以及 PostgreSQL
emp_name|bonus 
--------|-------
諸葛亮  |8000.00
黃忠    | 
魏延    |

另外,Oracle、PostgreSQL 以及 SQLite 支持使用 NULLS FIRST 關(guān)鍵字,將空值排在最前;或者使用 NULLS LAST 關(guān)鍵字,將空值排在最后。以下查詢語(yǔ)句返回的結(jié)果與上面的 MySQL 和 Microsoft SQL Server 一致:

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

總而言之,對(duì)于空值的排序:

  • MySQL、Microsoft SQL Server 以及 SQLite 認(rèn)為排序時(shí)空值最小,升序排序時(shí)空值排在最前,降序排序時(shí)空值排在最后。
  • Oracle 和 PostgreSQL 認(rèn)為排序時(shí)空值最大,升序排序時(shí)空值排在最后,降序排序時(shí)空值排在最前。
  • Oracle、PostgreSQL 以及 SQLite 支持使用 NULLS FIRST 和 NULLS LAST 指定空值的排序位置。

中文的排序方式

在創(chuàng)建數(shù)據(jù)庫(kù)或者表時(shí),我們通常會(huì)指定一個(gè)字符集和排序規(guī)則。字符集(Charset)決定了數(shù)據(jù)庫(kù)能夠存儲(chǔ)哪些字符,比如 ASCII 字符集只能存儲(chǔ)簡(jiǎn)單的英文、數(shù)字和一些控制字符,GB2312 字符集可以存儲(chǔ)中文,Unicode 字符集能夠支持世界上的各種文字。

排序規(guī)則(Collation)定義了字符集中字符的排序順序,包括是否區(qū)分大小寫、是否區(qū)分重音等。對(duì)于中文而言,排序方式與英文有所不同,中文通常需要按照拼音、偏旁部首或者筆畫進(jìn)行排序。

如果想要支持中文排序,最簡(jiǎn)單的方式就是使用支持中文排序的字符集和排序規(guī)則。如果使用的字符集和排序規(guī)則不滿足我們的排序需求,可以通過其他方法實(shí)現(xiàn)。

Oracle 默認(rèn)使用 AL32UTF8 字符編碼,中文按照偏旁部首進(jìn)行排序。我們可以通過一個(gè)轉(zhuǎn)換函數(shù)實(shí)現(xiàn)其他方式的中文排序,以下查詢按照員工姓名的拼音進(jìn)行排序:

-- Oracle 實(shí)現(xiàn)中文拼音排序
SELECT emp_name
FROM employee
WHERE dept_id = 4
ORDER BY NLSSORT(emp_name,'NLS_SORT = SCHINESE_PINYIN_M');

其中,NLSSORT()是 Oracle 提供的一個(gè)系統(tǒng)函數(shù),用于返回按照指定排序規(guī)則編碼的字符序列,SCHINESE_PINYIN_M 表示中文的拼音排序規(guī)則。查詢返回的結(jié)果如下:

EMP_NAME
--------
關(guān)平 
關(guān)興 
廖化 
馬岱 
張苞 
趙氏 
趙統(tǒng) 
趙云 
周倉(cāng)

除按照拼音排序外,Oracle 還支持按照偏旁部首(SCHINESE_RADICAL_M)以及筆畫(SCHINESE_STROKE_M)進(jìn)行中文排序。

MySQL 8.0 默認(rèn)使用 utf8mb4 字符編碼,中文按照偏旁部首進(jìn)行排序。我們可以通過一個(gè)轉(zhuǎn)換函數(shù)實(shí)現(xiàn)其他方式的中文排序,以下查詢按照員工姓名的拼音進(jìn)行排序:

-- MySQL 實(shí)現(xiàn)中文拼音排序
SELECT emp_name
FROM employee
WHERE dept_id = 4
ORDER BY CONVERT(emp_name USING GBK);

其中,CONVERT()是一個(gè) MySQL 系統(tǒng)函數(shù),用于轉(zhuǎn)換數(shù)據(jù)的字符集編碼,中文 GBK 字符集默認(rèn)使用拼音進(jìn)行排序。查詢返回的結(jié)果和上面的 Oracle 示例相同。

Microsoft SQL Server 中的字符集和排序規(guī)則是同一個(gè)概念,安裝數(shù)據(jù)庫(kù)時(shí)默認(rèn)根據(jù)操作系統(tǒng)所在的區(qū)域進(jìn)行設(shè)置,中國(guó)地區(qū)默認(rèn)使用 Chinese_PRC_CI_AS 排序規(guī)則,中文按照偏旁部首進(jìn)行排序。我們可以通過 COLLATE 關(guān)鍵字實(shí)現(xiàn)其他方式的中文排序,以下查詢按照員工姓名的拼音進(jìn)行排序:

-- SQL Server 實(shí)現(xiàn)中文拼音排序
SELECT emp_name
FROM employee
WHERE dept_id = 4
ORDER BY emp_name COLLATE Chinese_PRC_CI_AI_KS_WS;

其中,COLLATE 表示按照某種排序規(guī)則進(jìn)行排序,Chinese_PRC_CI_AI_KS_WS 表示中文拼音排序規(guī)則。查詢返回的結(jié)果和上面的 Oracle 示例一樣。

Microsoft SQL Server 也支持中文按照筆畫進(jìn)行排序(Chinese_PRC_Stroke_CI_AS)。

PostgreSQL 默認(rèn)使用 UTF-8 編碼字符集,中文按照偏旁部首進(jìn)行排序。我們可以通過 COLLATE 關(guān)鍵字實(shí)現(xiàn)其他方式的中文排序,以下查詢按照員工姓名的拼音進(jìn)行排序:

-- PostgreSQL 實(shí)現(xiàn)中文拼音排序
SELECT emp_name
FROM employee
WHERE dept_id = 4
ORDER BY emp_name COLLATE "zh_CN";

其中,COLLATE 表示按照某種排序規(guī)則進(jìn)行排序,zh_CN 表示中文拼音排序規(guī)則。查詢返回的結(jié)果和上面的 Oracle 示例一樣。

SQLite 默認(rèn)使用 UTF-8 字符編碼,中文按照偏旁部首進(jìn)行排序,不支持其他的排序方式。


責(zé)任編輯:華軒 來(lái)源: SQL編程思想
相關(guān)推薦

2024-05-07 14:18:18

數(shù)據(jù)庫(kù)SQLMySQL

2024-03-05 15:26:03

日期函數(shù)數(shù)據(jù)庫(kù)MySQL

2024-02-22 15:24:11

SQL數(shù)據(jù)庫(kù)

2011-09-21 11:21:00

NoSQL

2011-03-01 09:10:19

開源數(shù)據(jù)庫(kù)

2011-05-16 10:29:44

HandlerSockNoSQL

2011-07-13 09:58:15

HBase

2025-03-19 08:00:00

CIOAI

2018-07-30 09:06:46

大數(shù)據(jù)Hadoop數(shù)據(jù)架構(gòu)

2021-01-26 05:21:29

無(wú)序鏈表HashSet

2011-07-06 16:36:40

Redis

2011-05-30 09:27:35

NoSQL評(píng)測(cè)

2023-11-13 15:36:24

開源數(shù)據(jù)庫(kù)

2018-09-02 16:03:43

自動(dòng)化與響應(yīng)SOAR事件響應(yīng)

2022-06-10 09:00:00

數(shù)據(jù)庫(kù)分布式數(shù)據(jù)庫(kù)集群

2011-05-13 13:38:49

數(shù)據(jù)庫(kù)對(duì)象

2019-11-21 11:23:34

ListSet集合

2011-06-14 09:09:13

NoSQLMongoDB

2023-10-31 07:45:02

云原生數(shù)據(jù)庫(kù)

2020-03-27 10:54:14

數(shù)據(jù)庫(kù)工具技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区三区高清 | 亚洲精品18 | 天天躁日日躁狠狠很躁 | 国产精品美女久久久av超清 | 国产成人精品一区二区三区四区 | 久久精品二区 | 国产在线精品区 | 国产一级视频免费播放 | 精品久久久久久久久久久久 | 婷婷综合网 | 农夫在线精品视频免费观看 | 黄a免费网络 | 国产男女视频 | 欧美二级 | 日韩在线中文字幕 | 欧美三区视频 | 国产内谢 | 日本欧美黄色片 | 日韩在线欧美 | 黄色毛片黄色毛片 | 日韩精品久久久久 | 国产精品无码久久久久 | 亚洲精品视频免费看 | 91精品国产综合久久久久 | 国产jizz女人多喷水99 | 国产成人99av超碰超爽 | 国产福利视频 | 日本激情视频在线播放 | 精品一区二区视频 | 一区二区三区四区视频 | 亚洲视频中文字幕 | 9999精品视频 | 羞视频在线观看 | 国产精品久久久久久久久久久新郎 | 日韩在线三级 | 久久国产精品无码网站 | 日韩国产三区 | 农村黄性色生活片 | 免费视频二区 | 美国一级毛片a | 二区精品 |