mysql自然排序是什麼 MySQL 自然排序

2021-10-19 01:15:36 字數 2557 閱讀 5046

mysql 自然排序

簡介:在本教程中,您將使用order by子句了解mysql中的各種自然排序技術。

讓我們用示例資料開始教程。

假設我們有乙個名為items包含兩列的表:id和item_no。要建立items表,我們使用create table語句,如下所示:

create table if not exists items (

id int auto_increment primary key,

item_no varchar(255) not null

我們使用insert語句將一些資料插入items表中:

insert into items(item_no)

values ('1'),

('1c'),

('10z'),

('2a'),

('2'),

('3c'),

('20d');

當我們選擇item_no資料並對其進行排序時,我們得到以下結果:

select

item_no

from

items

order by item_no;

| item_no |

| 1 |

| 10z |

| 1c |

| 2 |

| 20d |

| 3c |

6 rows in set (0.00 sec)

這不是我們的預期。我們希望看到如下結果:

| item_no |

| 1 |

| 1c |

| 2 |

| 3c |

| 10z |

| 20d |

6 rows in set, 4 warnings (0.00 sec)

這稱為自然分選。不幸的是,mysql沒有提供任何內建的自然排序語法或功能。在order by子句對線性方式,即字串,每次乙個字元,從第乙個字元開始。

為了解決這個問題,首先我們將item_no列拆分為2列:prefix和suffix。prefix列儲存數字部分,而suffix列儲存字母部分。然後,我們可以根據這些列對資料進行排序,如下所示:

select

concat(prefix, suffix)

from

items

order by prefix , suffix;

查詢首先按數字對資料進行排序,然後按字母順序對資料進行排序。我們得到了預期的結果。

這種解決方案的缺點是我們必須item_no在插入或更新之前將其分成兩部分。另外,在選擇資料時,我們必須將兩列合二為一。

如果item_no資料採用相當標準的格式,則可以使用以下查詢執行自然排序,而無需更改表結構。

select

item_no

from

items

order by cast(item_no as unsigned) , item_no;

在此查詢中,首先我們item_no使用型別轉換將資料轉換為無符號整數。其次,我們使用order by子句首先按字母順序對行進行排序,然後按字母順序對行進行排序。

讓我們來看看我們經常要處理的另一組常見資料。

truncate table items;

insert into items(item_no)

values('a-1'),

('a-2'),

('a-3'),

('a-4'),

('a-5'),

('a-10'),

('a-11'),

('a-20'),

('a-30');

排序後的預期結果如下:

| item_no |

| a-1 |

| a-10 |

| a-11 |

| a-2 |

| a-20 |

| a-3 |

| a-30 |

| a-4 |

| a-5 |

9 rows in set, 9 warnings (0.00 sec)

為了達到這個結果,我們可以使用length函式。請注意,length函式返回字串的長度。我們的想法是先按item_no長度排序資料,然後按列值排序,如下面的查詢:

select

item_no

from

items

order by length(item_no) , item_no;

排序的結果為:

| item_no |

| a-1 |

| a-2 |

| a-3 |

| a-4 |

| a-5 |

| a-10 |

| a-11 |

| a-20 |

| a-30 |

9 rows in set (0.01 sec)

如您所見,資料自然排序。

如果以上所有解決方案都不適合您。您需要在應用程式層中執行自然排序。有些語言支援自然排序功能,例如,php提供了natsort() 函式使用自然排序演算法對陣列進行排序。

在本教程中,我們向您展示了在mysql中執行自然排序的各種技術。

mysql是什麼 MySQL是什麼?(一)

在學習mysql之前,首先需要了解資料庫和sql。如果您已經知道資料庫和sql,那麼可以直接跳轉到下一章節的學習。1.資料庫簡介 當您拍攝 並將其上傳到微博,朋友圈等,這樣的社交網路中的帳戶時,您的 庫就有可能儲存在乙個資料庫中。當您瀏覽電子商務 購買鞋子,衣服等時,您使用購物車就是資料庫應用。資料...

mysql db是什麼 MySQL是什麼?

在學習mysql之前,首先需要了解資料庫和sql。如果您已經知道資料庫和sql,那麼可以直接跳轉到下一章節的學習。1.資料庫簡介 當您拍攝 並將其上傳到微博,朋友圈等,這樣的社交網路中的帳戶時,您的 庫就有可能儲存在乙個資料庫中。當您瀏覽電子商務 購買鞋子,衣服等時,您使用購物車就是資料庫應用。資料...

mysql 死鎖是什麼 mysql死鎖是什麼意思

mysql死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈。innodb儲存引擎能檢測到死鎖的迴圈依賴並立即返回乙個錯誤。只有部分或完全回滾其中乙個事務,才能打破死鎖。什麼是死鎖?它是如何產生的?死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資...