sql >> Databáze >  >> RDS >> Database

SQL ORDER BY Klauzule pro začátečníky

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.


  1. Jak nainstalovat SQL Server na SUSE 12

  2. Jak opravit konflikt řazení v dotazu SQL Server?

  3. Používejte MySQL relační databáze na CentOS 5

  4. Jak povolím php pracovat s postgresql?