ORDER BY
klauzule se běžně používá v SQL k řazení výsledků dotazu.
Umožňuje určit pořadí, ve kterém se výsledky vrátí.
Můžete určit, zda jsou výsledky seřazeny ve vzestupném nebo sestupném pořadí. Můžete také určit více sloupců pro řazení.
Příklad
Zde je příklad demonstrující ORDER BY
doložka.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId ASC;
Výsledek:
+------------+---------------------------------+----------------+ | 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
část znamená vzestupně . Když použijete ORDER BY
klauzule, výchozí je vzestupná, takže můžete vynechat ASC
část, chcete-li.
Dotaz bychom tedy mohli napsat také takto:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId;
Sestupné pořadí
Chcete-li jej seřadit sestupně při objednávce použijte DESC
.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC;
Výsledek:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Seřadit podle více sloupců
Můžete zadat více sloupců, podle kterých se má třídit. To vám umožňuje určit, jak mají být řádky seřazeny, když je v prvním seřazeném sloupci více řádků se stejnou hodnotou.
Pravděpodobně je jednodušší to demonstrovat na příkladu.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;
Výsledek:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Pokud se zaměříme na tři řádky s VendorId
z 1001
, vidíme, že předchozí příklad vrátil názvy produktů ve vzestupném pořadí, ale v tomto příkladu jsme je vrátili v sestupném pořadí. Je to proto, že jsme nominovali ProductName
jako druhý sloupec v našem ORDER BY
klauzule a zadali jsme DESC
pro sestupné pořadí.
Druhý sloupec se projeví pouze tehdy, pokud jsou v prvním ORDER BY
duplikáty sloupec. Pokud ne, další sloupce jsou irelevantní, pokud jde o další řazení.
Pokud se podíváme na ProductPrice
můžeme vidět, že tento sloupec neměl žádný vliv na řazení, i když jsme zadali ProductPrice DESC
. Vidíme, že ceny jsou všechny ve vzestupném pořadí, navzdory našemu naléhání, že by měly být v sestupném pořadí. Důvod, proč tento sloupec neměl žádný účinek, je ten, že v dříve seřazeném sloupci nebyly žádné duplikáty. Proto pořadí prvních dvou sloupců ovlivnilo výsledky, ale pořadí třetího sloupce nikoli.
To neznamená, že třetí sloupec nebude mít nikdy žádný účinek. Pokud později vložíme další Left handed screwdriver
, ale za jinou cenu než ProductPrice
pořadí sloupce by se projevilo, protože v ProductName
jsou duplicitní hodnoty sloupec.
Míchání vzestupně a sestupně
Každý sloupec můžete smíchat se vzestupným a sestupným pořadím. Nemusí být všechny stejné. Mohli bychom například udělat toto:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;
Výsledek:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Řazení podle aliasů sloupců
ORDER BY
klauzule přijímá aliasy sloupců jako sloupce, podle kterých mají být seřazeny.
Mohli bychom například udělat toto:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;
Výsledek:
+------+---------------------------------+---------+ | 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 | +------+---------------------------------+---------+
Seřadit podle sloupců, které nejsou v seznamu SELECT
ORDER BY
klauzule přijímá sloupce, které nejsou specifikovány v SELECT
seznam.
Jinými slovy, k řazení podle tohoto sloupce nemusíte vybírat sloupec.
Příklad:
SELECT
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;
Výsledek:
+---------------------------------+---------+ | 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 | +---------------------------------+---------+
Zde jsme seřadili podle VendorId
i když jsme jej nezahrnuli do SELECT
seznam.
Řadit podle ID sloupce
ORDER BY
klauzule také přijímá ID sloupce místo názvu sloupce.
Mohli bychom například udělat toto:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Výsledek:
+------+---------------------------------+---------+ | 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 | +------+---------------------------------+---------+
To se však nedoporučuje.
Zaprvé to ztěžuje ostatním čtení a porozumění dotazu.
Za druhé, pokud někdo později změnil pořadí sloupců v SELECT
museli by také změnit pořadí ORDER BY
seznam. Bylo by velmi snadné na to zapomenout a výsledky dotazu by skončily ve špatném pořadí.
Zde je příklad toho, co mám na mysli.
SELECT
ProductName AS Name,
VendorId AS ID,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Výsledek:
+---------------------------------+------+---------+ | 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 | +---------------------------------+------+---------+
Jediné, co jsem udělal, bylo přesunout ProductPrice
pozici sloupce v SELECT
seznamu a úplně to pokazilo pořadí výsledků.
Výchozí řazení
V SQL, pokud nepoužijete ORDER BY
klauzule, neexistuje žádná záruka, v jakém pořadí budou vaše výsledky. I když to může vypadat jako vaše databáze řadí výsledky podle konkrétního sloupce, nemusí tomu tak být.
Obecně platí, že bez ORDER BY
klauzule, budou data seřazeny v pořadí, v jakém byla načtena do tabulky. Pokud však byly řádky smazány nebo aktualizovány, bude pořadí ovlivněno tím, jak systém DBMS znovu využívá uvolněný úložný prostor.
Proto se nespoléhejte na to, že DBMS seřadí výsledky v jakémkoli smysluplném pořadí. Pokud chcete, aby byly vaše výsledky seřazeny, použijte ORDER BY
doložka.
Objednávání s výjimkami
Může se stát, že budete muset do ORDER BY
zahrnout výjimku doložka.
Například chcete seřadit abecedně podle sloupce kromě jednoho řádku. Možná budete chtít, aby se jeden řádek (nebo několik řádků) zobrazil nahoře, zatímco všechny zbývající řádky jsou seřazeny v určitém pořadí.
Naštěstí existuje snadný způsob, jak to udělat. Pokud to potřebujete, přečtěte si část Jak napsat klauzuli ORDER BY s výjimkami.