除了會排序,你對ORDER BY的用法可能一無所知!
導(dǎo)讀
為什么只有ORDER ?BY后面可以使用列別名 為什么不推薦使用ORDER BY后接數(shù)字來排序 為什么視圖和子查詢里面不能使用ORDER BY
? ? ……
一、ORDER BY返回的是游標(biāo)而不是集合
SQL的理論其實是集合論,常見的類似求數(shù)據(jù)的交集、并集、差集都可以使用集合的思維來求解。
集合中的行之間沒有預(yù)先定義的順序,它只是成員的一種邏輯組合,成員之間的順序無關(guān)緊要。
如下圖,每一個括號里的內(nèi)容就是一條記錄,在沒排序前,他們都是隨機(jī)分布在集合中。


Student對象
這里涉及SQL語句的語法順序和執(zhí)行順序了,我們常見的SQL語法順序如下:
SELECT?DISTINCT??<Top?Num>?<select?list>
FROM?[left_table]
<join_type>?JOIN?<right_table>
ON?<join_condition>
WHERE?<where_condition>
GROUP?BY?<group_by_list>
WITH?<CUBE?|?RollUP>
HAVING?<having_condition>
ORDER?BY?<order_by_list>?
(8)SELECT?(9)DISTINCT??(11)<Top?Num>?<select?list>
(1)FROM?[left_table]
(3)<join_type>?JOIN?<right_table>
(2)????????ON?<join_condition>
(4)WHERE?<where_condition>
(5)GROUP?BY?<group_by_list>
(6)WITH?<CUBE?|?RollUP>
(7)HAVING?<having_condition>
(10)ORDER?BY?<order_by_list>?
示例表Customers結(jié)構(gòu)及數(shù)據(jù)如下:

1、WHERE后面不使用別名的情況
SELECT?
姓名 AS?Name,
地址 AS?Address,
城市 AS?City
FROM?Customers
WHERE?城市='廣州'
SELECT?
姓名 AS?Name,
地址 AS?Address,
城市 AS?City
FROM?Customers
WHERE?City='廣州'
從返回的消息中我們可以看到,重命名后的City并不能被WHERE識別,所以才會報“列名'City'無效”的提示。
SELECT?
城市 AS?City
FROM?Customers
GROUP?BY?City結(jié)果如下:

4、測試HAVING后使用列別名
SELECT?
城市 AS?City
FROM?Customers
GROUP?BY?城市
HAVING?COUNT(City)>1結(jié)果如下:

5、測試ORDER BY后面使用列別名
SELECT?
姓名 AS?Name,
地址 AS?Address,
城市 AS?City
FROM?Customers
ORDER?BY?City結(jié)果如下:

有些小伙伴為了圖省事,喜歡在ORDER BY后面寫數(shù)字,具體示例如下:
SELECT?
姓名 AS?Name,
地址 AS?Address,
城市 AS?City
FROM?Customers
ORDER?BY?1,2,3結(jié)果如下:

例如
SELECT?
客戶ID?AS?ID,
姓名 AS?Name,
地址 AS?Address,
城市 AS?City
FROM?Customers
ORDER?BY?1,2,3
CREATE?VIEW?V_Customers AS
SELECT?
客戶ID?AS?ID,
姓名 AS?Name,
地址 AS?Address,
城市 AS?City
FROM?Customers
ORDER?BY?ID,Name,Address

我們還是先舉個栗子給大家看一下
SELECT?
客戶ID?AS?ID,
姓名 AS?Name,
地址 AS?Address,
城市 AS?City
FROM
(SELECT?TOP 3?*
FROM?Customers
ORDER?BY?城市) Customers
ORDER?BY?ID,Name,Address結(jié)果如下:

SELECT?TOP 3?*
FROM?Customers
ORDER?BY?城市
而不保證結(jié)果集的排列順序,因為表表達(dá)式外面至少還有一層才是我們最終需要的結(jié)果集。
這里的ORDER BY只對當(dāng)前的子查詢生效,到了主查詢是不起作用的。必須在主查詢末尾繼續(xù)添加一個ORDER BY子句才能對結(jié)果集生效,就像我們例子中寫的那樣。
除非邏輯要求,一般情況下并不推薦大家這樣巧妙的避開子查詢中不能使用ORDER BY的限制。
覺得不錯,記得轉(zhuǎn)發(fā)分享給更多人,謝謝啦~
評論
圖片
表情
