点击蓝色字关注“SQL数据库运维”,回复“SQL”获取2TB学习资源!
在Oracle中,表中是以非指定顺序存储行数据记录的,它不管行插入数据库的顺序如何。要按列以升序或降序查询行记录,必须明确指示Oracle数据库要如何去排序。
要对数据进行排序,可以按如下方式将ORDER BY子句添加到SELECT语句中,参考以下语法:
SELECTcolumn_1,column_2,column_3,...FROMtable_nameORDER BYcolumn_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
ASC表示按升序排序
DESC表示按降序排序
个人助记口诀:三升四降(三、四代指英文字母数量)
默认情况下,无论是否指定ASC,ORDER BY子句都按升序对行进行排序。如果要按降序对行进行排序,则需要明确使用DESC。
NULLS FIRST在非NULL值之前放置NULL值,NULLS LAST在非NULL值之后放置NULL值。
ORDER BY子句也可以按多列对数据进行排序,每列可能有不同的排序顺序。
请注意,ORDER BY子句总是SELECT语句中的最后一个子句。
实际举例:Oracle ORDER BY子句的例子(原始例表)
新建测试表stuinfo,脚本如下
--实例建表stuinfocreate table JT_CS.stuinfo(stuid varchar2(11) not null,--学号:'S'+班号(7位数)+学生序号(3位数)(不能为空)SC200101001stuname varchar2(50) not null,--学生姓名(不能为空)sex char(1) not null,--性别(不能为空)1(男)、2(女)age number(2) not null,--年龄(不能为空)classno varchar2(7) not null,--班号:'C'+年级(4位数)+班级序号(2位数)(不能为空)C200101stuaddress 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的值是以降序来排列的。
三. 按列位置排序行示例
不需要指定用于排序数据的列名称。可以使用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,获取学习资料。
动动小手点击加关注呦☟☟☟




