SQL 之 排列数据

来源:互联网 发布:日本 常任理事国知乎 编辑:程序博客网 时间:2024/05/18 18:15

关键字:ORDER, ASC, DESC


1.  ORDER BY子句

SELECT columnlist

FROM tablelist

ORDER BY columnlist

 

强调:ORDER BY子句总在FROM子句后面, FROM子句总在关键字SELECT后面。

columnlist可以是任意多的列,包括单个的列,或者复杂的表达式。SELECT后面和ORDER BY后面的列可以完全不同。

 

示例:表Customers

CustomerID      FirstName         LastName

------------------------------------------------------------

1                  William              Smith

2                  Janet                Smith

3                  Natalie              Lopez

4                  Brenda              Harper

 

a. 升序排序:

SELECT

FirstName,LastName

FROM Customers

ORDER BY LastName

 

结果

FirstName        LastName

------------------------------------------

Brenda              Harper

Natalie              Lopez

William              Smith

Janet                Smith

有两个人的LastName相同,所以这种情况下结果谁先谁后是无法预料的。

 

ASC关键字:ascending,表示升序,其实默认升序所以多数没必要

SELECT

FirstName,LastName

FROM Customers

ORDER BY LastName ASC

 

b. 降序排序

 使用关键字DESCdescending

SELECT

FirstName,LastName

FROM Customers

ORDER BY LastName DESC

结果

FirstName        LastName

------------------------------------------

Janet                Smith

William              Smith

Natalie              Lopez

Brenda              Harper

 

c. 根据多列来排序

如示例,有两个人的LastName都是Smith,可以添加一个列来排序:

SELECT

FirstName,LastName

FROM Customers

ORDER BY LastName, FirstName

 

ORDER BY子句的列名先后顺序很重要:先按照LastName排序,遇到LastName相同的,再按照FirstName排序,以此类推。

结果:

FirstName        LastName

------------------------------------------

Brenda              Harper

Natalie              Lopez

Janet                Smith

William              Smith

 

d. 根据计算字段来排序

SELECT

LastName +, + FirstName ASName

FROM Customers

ORDER BY Name

 

结果:

 Name        

--------------------------

Harper, Brenda              

Lopez, Natalie 

Smith,Janet                

Smith, William        

 

连接后 Smith,Janet 的字典序是比Smith, William 要小的。

 

计算字段也可以放在ORDER BY子句中:

SELECT

FirstName,LastName

FROM Customers

ORDER BY LastName + FirstName

结果:

FirstName        LastName      

-------------------------------------------

Harper           Brenda              

Lopez            Natalie 

Smith            Janet                

Smith            William 

 

强调:这些升降序排序都没有考虑大小写,也就是dog可能排在DOG前面,也可能在后面。

e. 排列序列的更多内容

数据库允许用户指定或定制排序规则设置,设置一般遵循3个原则:

(1)升序排序时,NULL值的数据最先出现。NULL ->数字-> 字符;降序时,字符->数字->NULL

(2)字符数据:大小写不区分

(3)字符数据:字典序

        与SQL ServerMySQL不同,OracleNULL值在最后。可以添加关键字NULLS FIRSTNULL在升序中最先出现。用在降序排序中NULL值和通常一样,还是在最后。此外,Oracle不同的是会区分大小写。升序中,大写先于小写。

 

示例:表Customers

TableID      CharacterData         NumericData

------------------------------------------------------------

1                  23                   23

2                  5                     5

3                  Dog                  NULL

4                  NULL                 -6

CharacterData定义为字符列(比如VARCHAR型,可变长度数据类型)NumericData定义为数值列(如INT型,整数),没有数据:NULL

 

SELECT

NumericData

FROM tablename

            ORDER BYNumericData

结果:

NumericData

-------------------

NULL

-6

5

23

 

如果用户希望把代表没有数据的NULL表示为0,那么

SELECT

ISNULL (NumericData, 0)

FROM tablename

ORDER BY ISNULL (NumericData, 0)

注意如果没有用别名,在ORDER BY子句也要用同样的ISNULL转换类型

或者

SELECT

ISNULL (NumericData, 0) ASNumeric

FROM tablename

            ORDER BYISNULL Numeric

结果:

NumericData

-------------------

-6

0

5

23

 

如果使用CharacterData排序:

SELECT

CharacterData

FROM tablename

ORDER BY CharacterData DESC

 

结果

 

NumericData

-------------------

Dog

5

23

NULL

 

PS 5排在23前面是因为它们是字符列,按照字典序(按照单个字符从左到右比较),523“大”,故降序排列在前。

0 0
原创粉丝点击