通過對數據庫數據進行降序排序來達到顯示最新數據在前面的效果
-- 降序排序(最新的顯示在前面) 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 distinct
或group 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