数据库 \ SQL Server \ SQL 排序检索数据

SQL 排序检索数据

总点击80
简介:排序数据 下面的SQL语句返回某个数据库表的单个列。但请看其输出,并没有特定的顺序。

排序数据


下面的SQL语句返回某个数据库表的单个列。但请看其输出,并没有特定的顺序。


SELECT prod_name

FROM Products;输出:


prod_name

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

Fish bean bag toy

Bird bean bag toy

Rabbit bean bag toy

8 inch teddy bear

12 inch teddy bear

18 inch teddy bear

Raggedy Ann

King doll

Queen doll      其实,检索出的数据并不是随机显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是,如果数据随后进行过更新或删除,那么这个顺序将会受到DBMS重用回收存储空间的方式的影响。因此,如果不明确控制的话,则最终的结果不能(也不应该)依赖该排序顺序。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有任何意


义。


      为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。请看下面的例子:


SELECT prod_name

FROM Products

ORDER BY prod_name;除了指示DBMS软件对prod_name列以字母顺序排序数据的ORDER BY子句外,这条语句与前面的语句相同。结果如下。


prod_name

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

12 inch teddy bear

18 inch teddy bear

8 inch teddy bear

Bird bean bag toy

Fish bean bag toy

King doll

Queen doll

Rabbit bean bag toy

Raggedy Ann       在指定一条ORDER BY子句时,应该保证它是SELECT语句中最后一条子句。如果它不是最后的子句,将会出现错误消息。通常,ORDER BY子句中使用的列将是为显示而选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。



按多个列排序

       经常需要按不止一个列进行数据排序。例如,如果要显示雇员名单,可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序)。如果多个雇员有相同的姓,这样做很有用。要按多个列排序,简单指定列名,列名之间用逗号分开即可(就像选择多个列时那样)。


       下面的代码检索3个列,并按其中两个列对结果进行排序——首先按价格,然后按名称排序。


SELECT prod_id,prod_price,prod_name

FROM Products

ORDER BY prod_price,prod_name;输出:


prod_id prod_price prod_name

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

BNBG02 3.4900 Bird bean bag toy

BNBG01 3.4900 Fish bean bag toy

BNBG03 3.4900 Rabbit bean bag toy

RGAN01 4.9900 Raggedy Ann

BR01 5.9900 8 inch teddy bear

BR02 8.9900 12 inch teddy bear

RYL01 9.4900 King doll

RYL02 9.4900 Queen doll

BR03 11.9900 18 inch teddy bear       重要的是理解在按多个列排序时,排序的顺序完全按规定进行。换句话说,对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。



按列位置排序

       除了能用列名指出排序顺序外,ORDER BY还支持按相对列位置进行排序。为理解这一内容,我们来看个例子:


SELECT prod_id,prod_name

FROM Products

ORDER BY 2,3;输出:


prod_id prod_price prod_name

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

BNBG02 3.4900 Bird bean bag toy

BNBG01 3.4900 Fish bean bag toy

BNBG03 3.4900 Rabbit bean bag toy

RGAN01 4.9900 Raggedy Ann

BR01 5.9900 8 inch teddy bear

BR02 8.9900 12 inch teddy bear

RYL01 9.4900 King doll

RYL02 9.4900 Queen doll

BR03 11.9900 18 inch teddy bear       可以看到,这里的输出与上面的查询相同,不同之处在于ORDER BY子句。SELECT清单中指定的是选择列的相对位置而不是列名。ORDER BY2表示按SELECT清单中的第二个列prod_name进行排序。ORDER BY 2,3表示先按prod_price,再按prod_name进行排序。


       这一技术的主要好处在于不用重新输入列名。但它也有缺点。首先,不明确给出列名有可能造成错用列名排序。其次,在对SELECT清单进行更改时容易错误地对数据进行排序(忘记对ORDER BY子句做相应的改动)。最后,如果进行排序的列不在SELECT清单中,显然不能使用这项技术。



指定排序方向

      数据排序不限于升序排序(从A到Z),这只是默认的排序顺序。还可以使用ORDER BY子句进行降序(从Z到A)排序。为了进行降序排序,必须指定DESC关键字。


      下面的例子以价格降序来排序产品(最贵的排在最前面):


SELECT prod_id,prod_name

FROM Products

ORDER BY prod_price DESC;输出:


prod_id prod_price prod_name

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

BR03 11.9900 18 inch teddy bear

RYL01 9.4900 King doll

RYL02 9.4900 Queen doll

BR02 8.9900 12 inch teddy bear

BR01 5.9900 8 inch teddy bear

RGAN01 4.9900 Raggedy Ann

BNBG01 3.4900 Fish bean bag toy

BNBG02 3.4900 Bird bean bag toy

BNBG03 3.4900 Rabbit bean bag toy如果打算用多个列排序,该怎么办?下面的例子以降序排序产品(最贵的在最前面),再加上产品名:


SELECT prod_id,prod_name

FROM Products

ORDER BY prod_price DESC,prod_name;输出:


prod_id prod_price prod_name

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

BR03 11.9900 18 inch teddy bear

RYL01 9.4900 King doll

RYL02 9.4900 Queen doll

BR02 8.9900 12 inch teddy bear

BR01 5.9900 8 inch teddy bear

RGAN01 4.9900 Raggedy Ann

BNBG02 3.4900 Bird bean bag toy

BNBG01 3.4900 Fish bean bag toy

BNBG03 3.4900 Rabbit bean bag toy       DESC关键字只应用到直接位于其前面的列名。在上例中,只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序。如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。,DESC是DESCENDING的缩写,这两个关键字都可以使用。与DESC相对的是A SC(或A SCENDING),在升序排序时可以指定它。但实际上,A SC没有多大用处,因为升序是默认的(如果既不指定A SC也不指定DESC,则假定为A SC)。

0人推荐

推荐文章

热门标签

意见反馈 常见问题 官方微信 返回顶部