检索数据 中,主要讲了 SELECT 的基本检索功能
排序数据
使用 SELECT 检索的数据返回时,并没有特定的顺序
如果不排序,数据一般将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的数据
但是如果数据之后进行过更新或删除,那么这个顺序就会收到 DBMS 重用回收存储空间的方式的影响
子句(clause)
SQL 语句由子句构成,有些子句是必需的,有些则是可选的
一个子句通常由一个关键字加上所提供的数据组成
为了明确地排序用 SELECT
语句检索出的数据,可以使用 ORDER BY
子句
ORDER BY
子句取一个或多个列的名字,据此对输出进行排序
可以看如下两个语句的比较
SELECT prod_name FROM Products;
SELECT prod_name FROM Products ORDER BY prod_name;
ORDER BY
子句指示 DBMS 对 prod_name 列以字母顺序排序
在指定一条
ORDER BY
子句时,应该保证它是SELECT
语句中的最后一条子句;如果不是,将会出现错误
通常,
ORDER BY
子句中使用的列是为显示而选择的列,但是也可以使用非检索的列排序数据
按多个列排序
经常需要按不止一个列进行数据排序。例如,如果要显示雇员名单,可能希望按照姓和名排序(首先需要按照姓排序,然后在每个姓中,再按照名排序)。如果雇员具有相同的姓,这样做就很有用
要按照多个列排序,简单指定列名,列名之间用逗号分开即可(就想选择多个列时那样)
SELECT prod_id, prod_price, prod_name
FROM Products ORDER BY prod_price, prod_name;
如上代码,检索三个列,并按照其中两个列对结果进行排序——先按照价格,再按照名称
仅在多行具有相同价格时,才按照产品名排序;如果价格唯一,则不会按照产品名排序
按列位置排序
ORDER BY
还支持按相对列位置进行排序
SELECT prod_id, prod_price, prod_name
FROM Products ORDER BY 2,3;
这个输出与上一个输出相同的,不同之处在于 ORDER BY
子句
SELECT
清单中指定的是选择列的相对位置而不是列名
ORDER BY 2
表示按照 SELECT
清单中的第二个列 prod_price 进行排序
而 ORDER BY 2, 3
则表示先按照 prod_price ,再按照 prod_name 进行排序
好处是:
不用重新输入列名
缺点是:
1、不明确给出列名,可能导致错用列名排序
2、在对 SELECT
清单进行更改时,容易错误地对数据进行排序(忘记对ORDER BY 子句做相应地改动)
3、如果进行排序的列不在清单内,则不能使用这个用法
如果有必要,实际中可以混用两种方式
指定排序方向
数据排序不限于升序排序(从A 到 Z),这只是默认的排序顺序
还可以使用 ORDER BY
子句进行降序(从Z 到 A)排序,需要指定 DESC
关键字
仍然可以用多个列进行排序,但是
DESC
关键字只会应用到直接位于其前面的列名
如果想要在多个列上进行降序排序,则必须对每一列指定
DESC
关键字
如下面第二个语句中,prod_price 列以降序排序
而 prod_name 列(每个价格内)仍然按照标准的升序排序
SELECT prod_id, prod_price, prod_name
FROM Products ORDER BY prod_price DESC;
SELECT prod_id, prod_price, prod_name
FROM Products ORDER BY prod_price DESC, prod_name;
DESC
是 DESCENDING
的缩写,这两个关键字都可以使用
与 DESC
相对的是 ASC(ASCENDING)
,在升序排序时可以指定
不过默认排序时升序,所以通常不需要使用 ASC
在字典排序顺序中,A被认为与a相同,这也是大多数数据库管理系统的默认行为,如果需要改变,需要借助数据库管理的帮助,而不能只通过ORDER BY 子句实现
使用 ORDER BY
和 LIMIT
的组合,能够找到一个列中最高或者最低的值
mysql> SELECT prod_price FROM products
-> ORDER BY prod_price DESC
-> LIMIT 1;
使用
LIMIT
,必须位于ORDER BY
之后