資料庫查詢排序問題

2021-08-16 07:43:45 字數 755 閱讀 3778

資料庫分頁是後台經常要使用的技術手段,有時候進行資料庫查詢會根據業務需要對某一欄位排序,那麼當待排序字段值相同時,我們得到的查詢結果會是什麼呢?

資料分頁時需要根據資料記錄建立時間create_time欄位倒序,即使用order by create_time desc,但是我們會發現,前端進行請求時獲取的資料並不正確,分頁中出現了一定的重複資料。

由於大量資料是併發建立的,所以create_time字段值是相同的。這裡會有乙個很有趣的問題,當order by的字段相同的時候 系統對資料的排序可能變得隨機,即一會兒這條資料在前面,一會兒這條資料在後面了 ,所以當翻頁的時候我們很容易便看到了重複的資料。

查閱了goole和相關資料,大概總結了這種情況的原因。其實發生這種現象是「故意」設計的。

如果沒有指定order by語句,則sql server(或任何rdbms)不保證以特定順序返回結果。 有些人認為,如果沒有指定order by子句,行總是以聚簇索引順序或物理磁碟順序返回。 然而,這是不正確的,因為在查詢處理期間可以改變行順序的許多因素,例如並行的hash連線是更改行順序的操作符的乙個很好的例子。

如果指定order by語句,sql server將對行進行排序,並按請求的順序返回。 但是,如果該順序不是確定性的,即可能有重複的值,則在每個具有相同值的組中,由於與上述相同的原因,該順序是「隨機的」。

確保確定性順序的唯一方法是在order by子句中包含保證的唯一列或列組(例如主鍵)。

為了避免類似的問題,我們可以將主鍵(或者具有唯一性的字段)排序引入需要排序的業務欄位後。

資料庫查詢 IN 自動排序問題

在進行資料查詢的時候加上in的話是會自動進行排序的,現整理一些 備忘 sqlserver in的引數為int select from mytabs where idin 1,2,3,4 order by charindex ltrim id 1,2,3,4,背景標紅的兩個逗號不能省略 in的引數為v...

資料庫查詢 排序

為了方便檢視資料,可以對資料進行排序 語法 select from 表名 order by 列1 asc desc 列2 asc desc,說明 例1 查詢未刪除男生資訊,按學號降序 select from students where gender 1 and is delete 0 order ...

MySQL資料庫 排序查詢

高階3 排序查詢 引入 select from employees 語法 select 查詢列表 from 表 where 篩選條件 order by 排序列表 asc desc 特點 1.asc是公升序,desc是降序 如果不寫,預設是公升序 2.order by子句中可以支援單個字段 多個字段 ...