【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

原文地址:https://www.cnblogs.com/HeiDi-BoKe/p/11763776.html

时间: 2024-10-08 11:35:47

【Oracle命令】sql语句之排序(order by)的相关文章

oracle常用SQL语句(汇总版)

Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字段名2, ……) SELECT (字段名1, 字段名2, ……) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’ 如果字段值里包含单引号’ 需要

Oracle之sql语句优化

项目中虽然使用了orm映射,但Oracle系统的优化还是很有价值的,这里从sql语句的角度对常用的语句做下总结. 1.from字段中的优化: Oracle安照从右到左的顺序加载表数据,应该把可以排除数据最多的表放到后面(基础表). 比如,在关联查询中,把课程表放到后面,成绩表放到前面,因为课程表数据一般比较少,关联的时候可以快速的过滤掉一些成绩数据. 2.where中的优化: 对可以过滤数据最多的,放到后面,原理也是Oracle执行从下到上(从右到左)的顺序. 3.使用列名替代*: 省去从字典表

Oracle 动态SQL语句

Oracle 动态SQL语句 (2012-06-18 16:36:12) 转载▼ 标签: oracle it   EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包. 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTEIMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTEIMMEDIATE,因为它获的收益在包

LINQ to SQL语句(5)之Order By

Order By操作 适用场景:对查询出的语句进行排序,比如按时间排序 等等. 说明:按指定表达式对集合排序:延迟,:按指定表达式对集合 排序:延迟,默认是升序,加上descending表示降序,对应的扩展方法是 OrderBy和OrderByDescending 1.简单形式 这个例子使用 orderby 按雇用日期对雇员进行排序: var q = from e in db.Employees orderby e.HireDate select e; 说明:默认为升序 2.带条件形式 注意:W

ORACLE基本SQL语句-查询篇

一.普通查询 /*查询表数据*/select * from STU /*取出前3行数据*/select * from stu where ROWNUM<=3 /*模糊查询*/select * from stu where stu_id like 'stu001%' 说明:通配符“%”代表一个或者多个字符,通配符“_”代表一个字符. /*别名*/select STU_ID as 学号 from stu 二.联合查询/*普通联合查询*/SELECT STU.STU_NAME, STU.STU_AGE

ORACLE基本SQL语句-用户及建表篇

一.用户相关SQL语句 /*新建用户*/create user SA identified by 2013; 说明:SA用户名,2013密码 /*授权connect,resource给用户sa*/grant connect,resource to sa; 说明:CONNECT角色: --是授予最终用户的典型权利,最基本的 . ESOURCE 角色: --是授予开发人员的 /*查询所有的用户*/select * from all_users; /*将表STU查询权限授予SA*/GRANT SELE

ORACLE基本SQL语句-添加更新数据函数篇

一.添加数据 /*添加数据*/insert into STU values('stu0004','赵一',18,1,"kc0004");insert into STU(STU_ID,STU_NAME,STU_AGE,STU_SET ) values('stu0013','储十一',19,1); 说明:如果不指定将数据添加到那个字段,那么此时必须列出全部数据,如果列出字段,则一一对应,必须列出约束不为空的所有字段,否则报错. 二.更新数据 /*更新数据*/update STU SET S

ORACLE 中 SQL语句优化

(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.    (2) WHERE子句中的连接顺序.:  ORACLE采用自下而上的顺序解

ORACLE数据库SQL语句的执行过程

首先是最简单链接数据库的过程,JDBC标准的链接的过程: 1. 载入JDBC驱动程序,一般来说载入驱动程序,采用的都是利用Class.forName()反射来加载驱动 Oracle: Class.forName("oracle.jdbc.driver.OracleDriver"); SQLServer: Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); MySql: Class.forNam