ORDER BY
klauzula jest powszechnie używana w SQL do sortowania wyników zapytania.
Pozwala określić kolejność zwracania wyników.
Możesz określić, czy wyniki są sortowane w kolejności rosnącej czy malejącej. Możesz także określić wiele kolumn do sortowania.
Przykład
Oto przykład demonstrujący ORDER BY
klauzula.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId ASC;
Wynik:
+------------+---------------------------------+----------------+ | 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
część oznacza w górę . Kiedy używasz ORDER BY
klauzula, domyślnie jest rosnąco, więc możesz pominąć ASC
część, jeśli chcesz.
Możemy więc napisać zapytanie w ten sposób:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId;
Kolejność malejąca
Aby posortować malejąco zamów, użyj DESC
.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC;
Wynik:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Uporządkuj według wielu kolumn
Możesz określić wiele kolumn, według których chcesz sortować. Umożliwia to określenie sposobu sortowania wierszy, gdy w pierwszej posortowanej kolumnie znajduje się wiele wierszy o tej samej wartości.
Prawdopodobnie łatwiej to zademonstrować na przykładzie.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;
Wynik:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Jeśli skupimy się na trzech wierszach z VendorId
z 1001
, widzimy, że poprzedni przykład zwrócił nazwy produktów w kolejności rosnącej, ale w tym przykładzie zwróciliśmy je w kolejności malejącej. Dzieje się tak, ponieważ nominowaliśmy ProductName
jako druga kolumna w naszym ORDER BY
klauzula i określiliśmy DESC
dla porządku malejącego.
Druga kolumna obowiązuje tylko wtedy, gdy w pierwszym ORDER BY
występują duplikaty kolumna. Jeśli nie, kolejne kolumny są nieistotne, jeśli chodzi o dalsze sortowanie.
Jeśli spojrzymy na ProductPrice
kolumna, widzimy, że ta kolumna nie miała wpływu na sortowanie, mimo że określiliśmy ProductPrice DESC
. Widzimy, że wszystkie ceny są w porządku rosnącym, pomimo naszego nalegania, aby były w porządku malejącym. Powodem, dla którego ta kolumna nie zadziałała, jest brak duplikatów w poprzednio posortowanej kolumnie. Dlatego kolejność pierwszych dwóch kolumn wpłynęła na wyniki, ale kolejność trzeciej kolumny nie.
Nie oznacza to, że trzecia kolumna nigdy nie przyniesie żadnego efektu. Jeśli później włożymy inny Left handed screwdriver
, ale w innej cenie, to ProductPrice
kolejność kolumn zostałaby zastosowana ze względu na to, że w ProductName
występują zduplikowane wartości kolumna.
Miksowanie rosnąco i malejąco
Możesz mieszać każdą kolumnę w kolejności rosnącej i malejącej. Nie wszystkie muszą być takie same. Na przykład możemy to zrobić:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;
Wynik:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Uporządkuj według aliasów kolumn
ORDER BY
klauzula akceptuje aliasy kolumn jako kolumny, według których mają być uporządkowane.
Na przykład możemy to zrobić:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;
Wynik:
+------+---------------------------------+---------+ | 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 | +------+---------------------------------+---------+
Uporządkuj według kolumn, których nie ma na liście SELECT
ORDER BY
klauzula akceptuje kolumny, które nie są określone w SELECT
lista.
Innymi słowy, nie musisz wybierać kolumny, aby sortować według tej kolumny.
Przykład:
SELECT
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;
Wynik:
+---------------------------------+---------+ | 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 | +---------------------------------+---------+
Tutaj zamówiliśmy według VendorId
kolumna, mimo że nie uwzględniliśmy jej w SELECT
lista.
Uporządkuj według identyfikatora kolumny
ORDER BY
klauzula akceptuje również identyfikator kolumny zamiast nazwy kolumny.
Na przykład możemy to zrobić:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Wynik:
+------+---------------------------------+---------+ | 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 | +------+---------------------------------+---------+
Nie jest to jednak zalecane.
Po pierwsze, utrudnia to innym odczytanie i zrozumienie zapytania.
Po drugie, jeśli ktoś później zmienił kolejność kolumn w SELECT
listy, musieliby również zmienić kolejność ORDER BY
lista. Bardzo łatwo byłoby o tym zapomnieć, a wyniki zapytania znajdą się w złej kolejności.
Oto przykład tego, co mam na myśli.
SELECT
ProductName AS Name,
VendorId AS ID,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Wynik:
+---------------------------------+------+---------+ | 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 | +---------------------------------+------+---------+
Wszystko, co zrobiłem, to przeniesienie ProductPrice
pozycja kolumny w SELECT
listę i całkowicie zepsuło kolejność wyników.
Domyślne zamawianie
W SQL, jeśli nie używasz ORDER BY
klauzuli, nie ma gwarancji, w jakiej kolejności będą wyglądać Twoje wyniki. Chociaż może to wyglądać tak jak twoja baza danych sortuje wyniki według określonej kolumny, może tak nie być.
Ogólnie bez ORDER BY
klauzula, dane zostaną posortowane w kolejności, w jakiej zostały załadowane do tabeli. Jeśli jednak wiersze zostały usunięte lub zaktualizowane, na kolejność będzie miało wpływ sposób, w jaki DBMS ponownie wykorzystuje odzyskaną przestrzeń dyskową.
Dlatego nie należy polegać na DBMS, aby posortować wyniki w jakiejkolwiek znaczącej kolejności. Jeśli chcesz, aby Twoje wyniki były posortowane, użyj ORDER BY
klauzula.
Zamawianie z wyjątkami
Możesz napotkać sytuacje, w których musisz uwzględnić wyjątek w swoim ORDER BY
klauzula.
Na przykład chcesz uporządkować alfabetycznie według kolumny z wyjątkiem jednego wiersza. Możesz chcieć, aby jeden wiersz (lub kilka wierszy) pojawił się na górze, podczas gdy wszystkie pozostałe wiersze są uporządkowane w określonej kolejności.
Na szczęście jest na to prosty sposób. Zobacz Jak napisać klauzulę ORDER BY z wyjątkami, jeśli musisz to zrobić.