ORDER BY
клаузата обикновено се използва в SQL за сортиране на резултатите от заявка.
Позволява ви да посочите реда, в който се връщат резултатите.
Можете да посочите дали резултатите да се сортират във възходящ или низходящ ред. Можете също да посочите няколко колони за сортиране.
Пример
Ето един пример за демонстрация на ORDER BY
клауза.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId ASC;
Резултат:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | | 1002 | Sledge Hammer | 33.49 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | +------------+---------------------------------+----------------+
ASC
част означава възходящ . Когато използвате ORDER BY
клауза, по подразбиране е възходяща, така че можете да пропуснете ASC
част, ако желаете.
Така че бихме могли да напишем и заявката по следния начин:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId;
Низходящ ред
За да го сортирате в низходящ поръчка, използвайте DESC
.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC;
Резултат:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | +------------+---------------------------------+----------------+
Поръчай по множество колони
Можете да посочите няколко колони, по които да сортирате. Това ви позволява да укажете как трябва да бъдат сортирани редовете, когато има няколко реда с една и съща стойност в първата сортирана колона.
Вероятно е по-лесно да се демонстрира това с пример.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;
Резултат:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------------+---------------------------------+----------------+
Ако се фокусираме върху трите реда с VendorId
от 1001
, можем да видим, че предишният пример върна имената на продуктите във възходящ ред, но в този пример ги върнахме в низходящ ред. Това е така, защото номинирахме ProductName
като втора колона в нашия ORDER BY
клауза и посочихме DESC
за низходящ ред.
Втората колона влиза в сила само ако има дубликати в първата ORDER BY
колона. Ако не, всички следващи колони са без значение, що се отнася до по-нататъшното сортиране.
Ако погледнем ProductPrice
колона, можем да видим, че тази колона няма ефект върху сортирането, въпреки че сме посочили ProductPrice DESC
. Виждаме, че цените са във възходящ ред, въпреки настояването ни да са в низходящ ред. Причината, поради която тази колона няма ефект, е, че няма дубликати в предварително сортираната колона. Следователно подреждането на първите две колони повлия на резултатите, но подреждането на третата колона не.
Това не означава, че третата колона никога няма да има ефект. Ако по-късно поставихме друга Left handed screwdriver
, но на различна цена, след това ProductPrice
подреждането на колоната ще влезе в сила поради факта, че има дублиращи се стойности в ProductName
колона.
Смесване на възходящо с низходящо
Можете да смесвате всяка колона във възходящ и низходящ ред. Не е задължително всички да са еднакви. Например, можем да направим това:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;
Резултат:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | +------------+---------------------------------+----------------+
Подреждане по псевдоними на колони
ORDER BY
клаузата приема псевдоними на колони като колона, по която трябва да бъде подредена.
Например, можем да направим това:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;
Резултат:
+------+---------------------------------+---------+ | ID | Name | Price | |------+---------------------------------+---------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------+---------------------------------+---------+
Подреждане по колони, които не са в списъка SELECT
ORDER BY
клаузата приема колони, които не са посочени в SELECT
списък.
С други думи, не е необходимо да избирате колона, за да сортирате по тази колона.
Пример:
SELECT
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;
Резултат:
+---------------------------------+---------+ | Name | Price | |---------------------------------+---------| | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Straw Dog Box | 55.99 | | Chainsaw | 245.00 | | Sledge Hammer | 33.49 | | Long Weight (green) | 11.99 | | Long Weight (blue) | 14.75 | | Left handed screwdriver | 25.99 | +---------------------------------+---------+
Тук поръчахме по VendorId
колона, въпреки че не я включихме в SELECT
списък.
Подреждане по идентификатор на колона
ORDER BY
клаузата също приема идентификатора на колоната вместо името на колоната.
Например, можем да направим това:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Резултат:
+------+---------------------------------+---------+ | ID | Name | Price | |------+---------------------------------+---------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------+---------------------------------+---------+
Това обаче не се препоръчва.
Първо, това прави заявката по-трудна за четене и разбиране от другите.
Второ, ако някой по-късно промени реда на колоните в SELECT
списък, те също ще трябва да променят реда на ORDER BY
списък. Ще бъде много лесно да забравите да направите това и резултатите от заявката ще се окажат в грешен ред.
Ето пример за това, което имам предвид.
SELECT
ProductName AS Name,
VendorId AS ID,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Резултат:
+---------------------------------+------+---------+ | Name | ID | Price | |---------------------------------+------+---------| | Straw Dog Box | 1003 | 55.99 | | Sledge Hammer | 1002 | 33.49 | | Long Weight (green) | 1001 | 11.99 | | Long Weight (blue) | 1001 | 14.75 | | Left handed screwdriver | 1001 | 25.99 | | Chainsaw | 1003 | 245.00 | | Bottomless Coffee Mugs (4 Pack) | 1004 | 9.99 | +---------------------------------+------+---------+
Всичко, което направих, беше да преместя ProductPrice
позицията на колоната в SELECT
списък и напълно обърка подреждането на резултатите.
Поръчка по подразбиране
В SQL, ако не използвате ORDER BY
клауза, няма гаранция в какъв ред ще бъдат резултатите ви. Въпреки че може да изглежда както вашата база данни сортира резултатите по определена колона, това всъщност може да не е така.
Като цяло, без ORDER BY
клауза, данните ще бъдат сортирани в реда, в който са били заредени в таблицата. Ако обаче редовете са били изтрити или актуализирани, редът ще бъде повлиян от начина, по който СУБД използва повторно възстановено пространство за съхранение.
Следователно, не разчитайте на СУБД да сортира резултатите в някакъв смислен ред. Ако искате резултатите ви да бъдат сортирани, използвайте ORDER BY
клауза.
Поръчка с изключения
Може да срещнете моменти, когато трябва да включите изключение във вашия ORDER BY
клауза.
Например, искате да подредите по азбучен ред по колона с изключение на един ред. Може да искате един ред (или няколко реда) да се появи в горната част, докато всички останали редове са подредени в определен ред.
За щастие има лесен начин да направите това. Вижте Как да напишете клауза ORDER BY с изключения, ако трябва да направите това.