Database
 sql >> база данни >  >> RDS >> Database

SQL ORDER BY Клауза за начинаещи

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 с изключения, ако трябва да направите това.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Сравняване на слоеве за абстракция на база данни на PHP и CRUD плъгини

  2. SQL кръстосано присъединяване

  3. Когато DISTINCT <> GROUP BY

  4. Ако използвате индексирани изгледи и MERGE, моля, прочетете това!

  5. 9-те най-често срещани грешки в дизайна на база данни