【Oracle命令】sql語句之排序(order by)


通過對數據庫數據進行降序排序來達到顯示最新數據在前面的效果

-- 降序排序(最新的顯示在前面) SELECT * FROM 表名 t ORDER BY t.uploadDatetime DESC;

格式:

ORDER BY { column-Name | ColumnPosition | Expression } [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] [ , column-Name | ColumnPosition | Expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] ] *

PS:默認為升序ASC

知識點:

  • order by 后面可以接列號(數字)、列名、別名、表達式、函數、分組函數
  • order by 對空值的處理,DESC空值在前,ASC空值在后;
  • order by子句中可以不含select中的列;
  • 當使用select distinctgroup by時,order by 不能使用select之外的列;
  • order by 只能放最后,不能放集合操作的中間;
  • 集合操作后,不接order by按第一列進行升序排序(union all除外);
  • 集合操作后的列名為第一個select的內容,order by 只能選第一個select中的內容進行操作
select job, avg(sal) "Average Salary" 
from emp group by job order by "Average Salary" DESC;

補充:

  Union(union all): 指令的目的是將兩個 SQL 語句的結果集合並起來,得到你所需要的查詢結果。

  Union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序;

  Union All:對兩個結果集進行並集操作,包括重復行,不進行排序;

  order by子句必須寫在最后一個結果集里,並且其排序規則將改變操作后的排序結果。對於Union、Union All都有效。

實例:

1)按照名稱排序(默認升序)、按照名稱升序(ASC),按照名稱降序(DESC),如果名稱有相同的按照id降序排序(降序相當於顯示最新的在前面)

-- 默認升序
SELECT * FROM t_test t ORDER BY t.content; -- 按名稱升序
SELECT * FROM t_test t ORDER BY t.content ASC;

-- 按名稱降序
SELECT * FROM t_test t ORDER BY t.content DESC

 

-- 名稱相同的按id降序(將最新的排序)。這里我新添加了一條數據test4
SELECT * FROM t_test t ORDER BY t.content DESC,t.id DESC;

 

 2)缺省處理:oracle在order by時認為null是最大值, 所以如果是asc升序則排在最后, desc降序則排在最前.我們可以使用nulls first或者nulls last來控制null的位置。

-- 升序顯示,默認null值在后面,使用nulls first將null顯示在最前面
SELECT * FROM t_test t ORDER BY t.content ASC NULLS FIRST; -- 降序顯示,默認null值在前面,使用null last將null顯示在最后面
SELECT * FROM t_test t ORDER BY t.content DESC NULLS FIRST;

mysql的如下:

-- null值顯示在最前面
SELECT * FROM t_test t ORDER BY IF(ISNULL(t.content),0,1),t.content ASC; -- null值顯示在最后面
SELECT * FROM t_test t ORDER BY IF(ISNULL(t.content),1,0),t.content DESC;

3)將名稱帶有"test"的先顯示,其余按照名稱升序排序

在這里由於少了別名,出現報錯,不過已解決

可以參考我的另一篇博客文章:https://www.cnblogs.com/HeiDi-BoKe/p/11763494.html

select * from t_test t1 where t1.content like '%test%'
Union all
select * from (select * from t_test t2 where t2.content not like '%test%' order by t2.content asc) d;

上面的方法沒有把null值顯示出來。另一種方法也可實現,並顯示null值

select * from t_test t order by 
case
  when t.content like '%test%' then 0
  else  1
end,t.content asc;

 

 4)按照id為6的排到第一位,其余按照id降序排序

select * from t_test order by decode(id, 6,1), id desc; 

PS:

  DECODE函數的語法:DECODE(value,if1,then1,if2,then2,if3,then3,…,else);
  DECODE函數說明:表示如果value等於if1時,DECODE函數的結果返回then1,…,如果不等於任何一個if值,則返回else。
  sign函數語法:sign(n); 
  sign函數說明:取數字n的符號,大於0返回1,小於0返回-1,等於0返回0(n可以是表達式,(n-200))。 

 

 

參考網址:https://blog.csdn.net/tian_tian2/article/details/80816275

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM