之前只用select語句檢索一列,但是沒排序
order by子句
對一列排序
按照產品名字排序(字符串排序,根據ascii碼)
select prod_name
from products
order by prod_name;
也可以不用被選列的名字作爲order by子句的列,即不根據被顯示列本身來排序:
根據價格對產品排序
select prod_name
from products
order by prod_price;
對多個列按照多個標準排序
select prod_id, prod_price, prod_name
from products
order by prod_price, prod_name;
選擇了三列數據,先用價格排序,價格相同的再根據名稱排序。如果所有行的價格都不一樣,則不會用到名稱排序。
這裏還有一種簡單的寫法:
select prod_id, prod_price, prod_name
from products
order by 2, 3;
order by2, 3表示先按顯示的第2列排序,再按照第三列排序,即先按照價格排序再按照名稱排序,因此和上面的代碼的效果一樣。
這樣做的好處是:不用輸入列名
壞處是:
- 容易出錯,列位置給錯了,列很多的時候容易給錯,其次如果清單更改了,列位置可能就不一樣了
- 如果排序規則列不在select清單中,就根本沒法用這個方法。
綜上,還是老實寫列名吧,保險。
指定排序方向(升序 or 降序,DESC關鍵字)
默認都是升序
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關鍵字只作用於它前面的列名。(和distinct不同,distinct作用於後面的所有列名)
即上面代碼和下面的等價:
select prod_id, prod_price, prod_name
from products
order by prod_price desc, prod_name asc;
asc升序指定不指定都行,因爲是默認的
總結
- order by子句必須是select語句的最後一條子句。
- 可以用多個列來排序
關鍵字
- desc
- asc
- order by