• 【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

  • 相关阅读:
    树状数组进阶
    洛谷 P2824 [HEOI2016/TJOI2016]排序
    抽象类
    关于getClass()和instanceof的区别与联系
    Java中的强制类型转换
    Java中的内联
    Java关键字之final
    Java中的"is-a"规则
    关于虚方法
    Java中的动态绑定
  • 原文地址:https://www.cnblogs.com/HeiDi-BoKe/p/11763776.html
Copyright © 2020-2023  润新知