暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle中ORDER BY的四种简单排序用法

SQL数据库运维 2022-11-30
5972

点击蓝色字关注“SQL数据库运维”,回复“SQL”获取2TB学习资源!

Oracle ORDER BY子句语法简单介绍

在Oracle中,表中是以非指定顺序存储行数据记录的,它不管行插入数据库的顺序如何。要按列以升序或降序查询行记录,必须明确指示Oracle数据库要如何去排序。

要对数据进行排序,可以按如下方式将ORDER BY子句添加到SELECT语句中,参考以下语法:

    SELECT
    column_1,
    column_2,
    column_3,
    ...
    FROM
    table_name
    ORDER BY
    column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
    column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
    要按列排序结果集,可以在ORDER BY子句之后列出该列。
    按照列名是一个排序顺序,可以是:
    • ASC表示按升序排序

    • DESC表示按降序排序

    个人助记口诀:三升四降(三、四代指英文字母数量)

    默认情况下,无论是否指定ASCORDER BY子句都按升序对行进行排序。如果要按降序对行进行排序,则需要明确使用DESC

    NULLS FIRST在非NULL值之前放置NULL值,NULLS LAST在非NULL值之后放置NULL值。

    ORDER BY子句也可以按多列对数据进行排序,每列可能有不同的排序顺序。

    请注意,ORDER BY子句总是SELECT语句中的最后一个子句。


    实际举例:Oracle ORDER BY子句的例子(原始例表)

    新建测试表stuinfo脚本如下

      --实例建表stuinfo
      create table JT_CS.stuinfo
      (
      stuid varchar2(11) not null,--学号:'S'+班号(7位数)+学生序号(3位数)(不能为空)SC200101001
      stuname varchar2(50) not null,--学生姓名(不能为空)
      sex char(1) not null,--性别(不能为空)1(男)、2(女)
      age number(2) not null,--年龄(不能为空)
      classno varchar2(7) not null,--班号:'C'+年级(4位数)+班级序号(2位数)(不能为空)C200101
      stuaddress varchar2(100) default '地址未录入',--地址 (不填或为空时默认填入‘地址未录入‘)
      grade char(4) not null,--年级(不能为空)
      enroldate date,--入学时间
      idnumber varchar2(18) default '身份证未采集' not null--身份证(不能为空)
      )
      --插入测试数据
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101001','路飞','1','19','C200101','东海哥亚王国风车村','2001','2001/09/01','411428199602569201');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101002','索隆','1','21','C200101','东海霜月村','2001','2001/09/01','411428199602569202');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101003','娜美','2','20','C200101','可可西亚村','2001','2001/09/01','411428199602569203');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101004','乌索普','1','19','C200101','东海西罗布村','2001','2001/09/01','411428199602569204');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101005','山治','1','21','C200101','北海杰尔玛王国','2001','2001/09/01','411428199602569205');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101006','乔巴','1','15','C200101','磁鼓岛','2001','2001/09/01','411428199602569206');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101007','罗宾','2','30','C200101','奥哈拉','2001','2001/09/01','411428199602569207');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101008','弗兰奇','1','34','C200101','南海','2001','2001/09/01','411428199602569208');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101009','布鲁克','1','63','C200101','西海','2001','2001/09/01','411428199602569209');
      INSERT INTO JT_CS.STUINFO VALUES ('SC200101010','甚平','1','46','C200101','鱼人岛','2001','2001/09/01','411428199602569210');

      查询stuinfo数据

        SELECT * FROM JT_CS.STUINFO ;

        查询结果如下:


        一. 按某列排序行示例

        要按照字母顺序按升序排列stuname列的数据,可以使用以下语句:

          --升序排序
          SELECT * FROM JT_CS.STUINFO ORDER BY STUNAME ;
          --或
          SELECT * FROM JT_CS.STUINFO ORDER BY STUNAME ASC;

          执行上面示例代码,得到以下结果:

          ASC表示Oracle按升序对行进行排序。但是ASC是可选的,如果省略,则在默认情况下,ORDER BY 子句按指定的列按升序对行进行排序,因此ORDER BY STUNAME 等同于 ORDER BY STUNAME ASC;反之如果按降序对行STUNAME进行排序则需要使用如下语句,且DESC不可以进行省略。

            --降序排序
            SELECT * FROM JT_CS.STUINFO ORDER BY STUNAME DESC;

            二. 按多个列排序行示例

            要对多列进行排序,可以用逗号分隔ORDER BY子句中的每列。

              --将STUADDRESS行数据升序排序,STUNAME行数据降序排序
              SELECT STUID,STUNAME,STUADDRESS FROM JT_CS.STUINFO ORDER BY STUADDRESS ASC,STUNAME DESC;

              执行上面示例代码,得到以下结果:

              从上面截图中可以看到,STUID为10和11这两条记录的STUADDRESS的值相同,STUNAME的值是以降序来排列的。

              因此,在这个例子中,Oracle首先按STUADDRESS升序对行进行排序,以创建初始结果集。然后Oracle按降序对STUNAME排序初始结果集。

              . 按列位置排序行示例

              不需要指定用于排序数据的列名称。可以使用ORDER BY子句中列的位置,使用这些列位置来指示Oracle对行进行排序。

              例如以下语句:

                --将STUADDRESS行数据升序排序,STUNAME行数据降序排序
                SELECT STUID,STUNAME,STUADDRESS FROM JT_CS.STUINFO ORDER BY 3 ASC,2 DESC;

                在上边的语句中,STUADDRESS列的位置是3,STUNAME列的位置是2。相当于以下查询语句:

                  SELECT STUID,STUNAME,STUADDRESS FROM JT_CS.STUINFO ORDER BY STUADDRESS ASC,STUNAME DESC;


                  . 按函数或表达式排序数据(不常用)

                  ORDER BY子句可在一列上应用一个函数,例如字符串函数,数学函数等,并按函数的结果对数据进行排序。

                    SELECT * FROM JT_CS.STUINFO ORDER BY CHR(AGE);

                    点击关注“SQL数据库运维”,后台或浏览至公众号文章底部点击“发消息”回复关键字:进群,带你进入高手如云的技术交流群。后台回复关键字:SQL,获取学习资料。


                    动动小手点击加关注呦☟☟☟

                    文章转载自SQL数据库运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论