Database
 sql >> Baza danych >  >> RDS >> Database

Klauzula SQL ORDER BY dla początkujących

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ć.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Treść nieustrukturyzowana:niewykorzystane źródło paliwa dla sztucznej inteligencji i uczenia maszynowego

  2. Aspekty ciągów w .NET

  3. Główne użycie sys.dm_os_wait_stats

  4. Wizualizacja danych za pomocą Apache Zeppelin – samouczek

  5. Łączenie się z bazą danych za pomocą PHP