Яка мета порядку до 1 в операторі вибору SQL?


154

Я читаю якийсь старий код на роботі, і помітив, що є кілька поглядів із order by 1пропозицією. Що це досягає?

Приклад:

Create view v_payment_summary AS
SELECT A.PAYMENT_DATE,
       (SELECT SUM(paymentamount)
          FROM payment B
         WHERE PAYMENT_DATE = B.PAYMENT_DATE
           and SOME CONDITION) AS SUM_X,
       (SELECT SUM(paymentamount)
          FROM payment B
         WHERE PAYMENT_DATE = B.PAYMENT_DATE
           and SOME OTHER CONDITION) AS SUM_Y    
FROM payment A    
ORDER BY 1;

5
FYI: Загалом вважається поганою практикою мати ЗАМОВЛЕННЯ В переглядах, якщо ви не зможете гарантувати, що подання буде використано лише для презентації. Це марно, тому що ЗАМОВЛЕННЯ відбудеться 2 рази, якщо ви використовуєте подання в іншому запиті із ЗАМОВЛЕННЯМ.
OMG Ponies

3
@OMG Ponies: звичайно вважати незаконним існування ORDER BYа VIEW. Стандартний SQL не дозволяє. SQL Server забороняє це з 2005 року. Для реалізації SQL, які дозволяють йому, поведінка є значною мірою недокументованою та протидіє інтуїтивно зрозумілим. Іншими словами, цього обов'язково слід уникати.
одного дня, коли

@onedaywhen: Ви пропонуєте хор, але MySQL дозволяє ORDER BY у видах , як це робить Oracle IME. SQL Server дозволяє ORDER BY, якщо TOPвін присутній, а SSMS любить додавати TOP 100 PERCENT.
OMG Ponies

@OMG Ponies @ "MySQL дозволяє ЗАМОВИТИ В переглядах" - MySQL допускає CHECKобмеження у, CREATE TABLEале насправді це не шанує - він ніколи насправді не перевіряється! Питання полягає в тому, цей SQL продукти завжди шануватиORDER BY в уявленнях наприклад , при використанні в запиті , який також має ORDER BYвін отримати відсортовані двічі? Вони навіть документують поведінку чи вам потрібно шукати плани виконання, щоб це розробити? Я думаю, що ми знаємо відповіді;)
одного дня, коли

FYI Щойно виявив ще одне використання для ORDER BY 1... використання трюку із застосуванням перехресного застосування, де ви хочете отримати порожній псевдонім. На жаль, код, наприклад, занадто великий для коментаря, тому я розмістив його як відповідь нижче FYI.
AndrewD

Відповіді:


208

Це:

ORDER BY 1

... відомий як "Звичайний" - число стоїть для стовпця на основі кількості стовпців, визначених у пункті SELECT. У наданому вами запиті це означає:

ORDER BY A.PAYMENT_DATE

Це не рекомендована практика, оскільки:

  1. Це не очевидно / явно
  2. Якщо порядок стовпців змінюється, запит залишається дійсним, тому ви ризикуєте замовити щось, чого ви не мали наміру

1
Моє питання з проханням , якщо там було Гідність з допомогою ордіналов: stackoverflow.com/questions/2253040 / ...
OMG Ponies

Це лише sqlтег. У стандартному SQL в іменні дозволені лише імена кореляції стовпців, OREDER BYоскільки, теоретично, імена кореляцій таблиці не виходять за рамки, тобто повинні бути ORDER BY PAYMENT_DATE;. Звичайно, не всі реалізації SQL відповідають стандартам.
день, коли

Випробуваний і працює в SQL Server;WITH cte AS( SELECT 1 AS Col1, 'z' AS Col2 UNION SELECT 2 AS Col1, 'y' AS Col2 UNION SELECT 3 AS Col1, 'x' AS Col2 ) SELECT Col2, Col1 FROM cte ORDER BY 1
Ivanzinho

@OMG Ponies, ви згадали, що це не рекомендована практика, тож що буде наступною найкращою заміною? питаю, бо мені цікаво .. дякую!
dian jin

40

Це корисно, коли ви використовуєте встановлені оператори, наприклад об'єднання

select cola
  from tablea
union
select colb
  from tableb
order by 1;

4
Ага, це має сенс. Це перша вагома причина, яку я бачив досі.
ехо

4
@Lazer Я не вірю в це, для виконання об'єднання, ймовірно, це робиться свого роду всередині, але це питання про реалізацію на відміну від питання логічного виводу, і в дусі SQL немає необхідності виводити рядки в порядку. Також що робити, якщо ви хочете сортувати за спаданням? Потім ви повернетесь до початкової проблеми.
daven11

3
все-таки ... Я б скоріше скориставсяorder by tablea.cola
Шахар Шокрані

1
@ShaharShokrani, що не працює. але ви можете сказати, я віддаю перевагу вибору кола як x з tablea union select colb як x з порядку tableb за x;
Ozgur Ozturk

select * from (виберіть cola col з tablea Union виберіть colb col з tableb) замовити col
hareluya86

8

це просто означає сортування представлення даних або таблиці за першим стовпцем результату запиту.



7

Це буде сортувати ваші результати за першим повернутим стовпцем. У прикладі він буде сортувати за Payment_date.


4

Як зазначено в інших відповідях на ORDER BY 1замовлення першого стовпця.

Я натрапив на інший приклад того, де ти можеш це використати. У нас є певні запити, які потрібно замовити, виберіть той самий стовпець. Ви отримаєте помилку SQL при замовленні, Nameнаведеному нижче.

SELECT Name, Name FROM Segment ORDER BY 1

чому б ти це робив? чому б не псевдоніми їх. [Хоча занадто пізній коментар]
abdul qayyum

1
@abdulqayyum - це просто ще один спосіб робити справді речі. Наведений вище приклад дуже спрощений. Іноді стовпець "Ім'я" - це фактично різні стовпці з різних таблиць, які ви вставляєте в іншу таблицю. Додавання купки псевдонімів може ускладнити читання. Інший приклад того, де він використовується, - це підбір багатьох різних обчислень, які ви хочете замовити за одним - не вимагаючи псевдоніму. (Хоча тут я особисто вважаю за краще псевдонім, щоб сказати, що таке обчислення)
nicV

-1

Також дивіться:

http://www.techonthenet.com/sql/order_by.php

Для опису замовлення за. Я чомусь навчився! :)

Я також використовував це в минулому, коли я хотів додати невизначене число фільтрів до оператора sql. Неслухняний я знаю, але це спрацювало. : P


-1

Приклад з прикладної тестової бази даних WAMP-сервера: -

mysql> select * from user_privileges;

| GRANTEE            | TABLE_CATALOG | PRIVILEGE_TYPE          | IS_GRANTABLE |
   +--------------------+---------------+-------------------------+--------------+
| 'root'@'localhost' | def           | SELECT                  | YES          |
| 'root'@'localhost' | def           | INSERT                  | YES          |
| 'root'@'localhost' | def           | UPDATE                  | YES          |
| 'root'@'localhost' | def           | DELETE                  | YES          |
| 'root'@'localhost' | def           | CREATE                  | YES          |
| 'root'@'localhost' | def           | DROP                    | YES          |
| 'root'@'localhost' | def           | RELOAD                  | YES          |
| 'root'@'localhost' | def           | SHUTDOWN                | YES          |
| 'root'@'localhost' | def           | PROCESS                 | YES          |
| 'root'@'localhost' | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | REFERENCES              | YES          |
| 'root'@'localhost' | def           | INDEX                   | YES          |
| 'root'@'localhost' | def           | ALTER                   | YES          |
| 'root'@'localhost' | def           | SHOW DATABASES          | YES          |
| 'root'@'localhost' | def           | SUPER                   | YES          |
| 'root'@'localhost' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | LOCK TABLES             | YES          |
| 'root'@'localhost' | def           | EXECUTE                 | YES          |
| 'root'@'localhost' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'localhost' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'localhost' | def           | CREATE VIEW             | YES          |
| 'root'@'localhost' | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | CREATE ROUTINE          | YES          |
| 'root'@'localhost' | def           | ALTER ROUTINE           | YES          |
| 'root'@'localhost' | def           | CREATE USER             | YES          |
| 'root'@'localhost' | def           | EVENT                   | YES          |
| 'root'@'localhost' | def           | TRIGGER                 | YES          |
| 'root'@'localhost' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'127.0.0.1' | def           | SELECT                  | YES          |
| 'root'@'127.0.0.1' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | UPDATE                  | YES          |
| 'root'@'127.0.0.1' | def           | DELETE                  | YES          |
| 'root'@'127.0.0.1' | def           | CREATE                  | YES          |
| 'root'@'127.0.0.1' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | RELOAD                  | YES          |
| 'root'@'127.0.0.1' | def           | SHUTDOWN                | YES          |
| 'root'@'127.0.0.1' | def           | PROCESS                 | YES          |
| 'root'@'127.0.0.1' | def           | FILE                    | YES          |
| 'root'@'127.0.0.1' | def           | REFERENCES              | YES          |
| 'root'@'127.0.0.1' | def           | INDEX                   | YES          |
| 'root'@'127.0.0.1' | def           | ALTER                   | YES          |
| 'root'@'127.0.0.1' | def           | SHOW DATABASES          | YES          |
| 'root'@'127.0.0.1' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'127.0.0.1' | def           | LOCK TABLES             | YES          |
| 'root'@'127.0.0.1' | def           | EXECUTE                 | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'127.0.0.1' | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | SHOW VIEW               | YES          |
| 'root'@'127.0.0.1' | def           | CREATE ROUTINE          | YES          |
| 'root'@'127.0.0.1' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | CREATE USER             | YES          |
| 'root'@'127.0.0.1' | def           | EVENT                   | YES          |
| 'root'@'127.0.0.1' | def           | TRIGGER                 | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'::1'       | def           | SELECT                  | YES          |
| 'root'@'::1'       | def           | INSERT                  | YES          |
| 'root'@'::1'       | def           | UPDATE                  | YES          |
| 'root'@'::1'       | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | DROP                    | YES          |
| 'root'@'::1'       | def           | RELOAD                  | YES          |
| 'root'@'::1'       | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | FILE                    | YES          |
| 'root'@'::1'       | def           | REFERENCES              | YES          |
| 'root'@'::1'       | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | SHOW DATABASES          | YES          |
| 'root'@'::1'       | def           | SUPER                   | YES          |
| 'root'@'::1'       | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'::1'       | def           | LOCK TABLES             | YES          |
| 'root'@'::1'       | def           | EXECUTE                 | YES          |
| 'root'@'::1'       | def           | REPLICATION SLAVE       | YES          |
| 'root'@'::1'       | def           | REPLICATION CLIENT      | YES          |
| 'root'@'::1'       | def           | CREATE VIEW             | YES          |
| 'root'@'::1'       | def           | SHOW VIEW               | YES          |
| 'root'@'::1'       | def           | CREATE ROUTINE          | YES          |
| 'root'@'::1'       | def           | ALTER ROUTINE           | YES          |
| 'root'@'::1'       | def           | CREATE USER             | YES          |
| 'root'@'::1'       | def           | EVENT                   | YES          |
| 'root'@'::1'       | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | CREATE TABLESPACE       | YES          |
| ''@'localhost'     | def           | USAGE                   | NO           |
+--------------------+---------------+-------------------------+--------------+
85 rows in set (0.00 sec)

І коли це дається додатково order by PRIVILEGE_TYPEабо можна дати order by 3. Зауважте, що третій стовпець ( PRIVILEGE_TYPE) сортується за алфавітом.

mysql> select * from user_privileges order by PRIVILEGE_TYPE;
+--------------------+---------------+-------------------------+--------------+
| GRANTEE            | TABLE_CATALOG | PRIVILEGE_TYPE          | IS_GRANTABLE |
+--------------------+---------------+-------------------------+--------------+
| 'root'@'127.0.0.1' | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | ALTER                   | YES          |
| 'root'@'localhost' | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | ALTER ROUTINE           | YES          |
| 'root'@'localhost' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | CREATE                  | YES          |
| 'root'@'localhost' | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | CREATE ROUTINE          | YES          |
| 'root'@'localhost' | def           | CREATE ROUTINE          | YES          |
| 'root'@'127.0.0.1' | def           | CREATE ROUTINE          | YES          |
| 'root'@'::1'       | def           | CREATE TABLESPACE       | YES          |
| 'root'@'localhost' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'::1'       | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | CREATE USER             | YES          |
| 'root'@'127.0.0.1' | def           | CREATE USER             | YES          |
| 'root'@'::1'       | def           | CREATE USER             | YES          |
| 'root'@'localhost' | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | CREATE VIEW             | YES          |
| 'root'@'::1'       | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | DELETE                  | YES          |
| 'root'@'localhost' | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | DROP                    | YES          |
| 'root'@'localhost' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | EVENT                   | YES          |
| 'root'@'::1'       | def           | EVENT                   | YES          |
| 'root'@'localhost' | def           | EVENT                   | YES          |
| 'root'@'127.0.0.1' | def           | EXECUTE                 | YES          |
| 'root'@'::1'       | def           | EXECUTE                 | YES          |
| 'root'@'localhost' | def           | EXECUTE                 | YES          |
| 'root'@'127.0.0.1' | def           | FILE                    | YES          |
| 'root'@'::1'       | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | INDEX                   | YES          |
| 'root'@'127.0.0.1' | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | INSERT                  | YES          |
| 'root'@'localhost' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | LOCK TABLES             | YES          |
| 'root'@'::1'       | def           | LOCK TABLES             | YES          |
| 'root'@'localhost' | def           | LOCK TABLES             | YES          |
| 'root'@'127.0.0.1' | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | PROCESS                 | YES          |
| 'root'@'localhost' | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | REFERENCES              | YES          |
| 'root'@'localhost' | def           | REFERENCES              | YES          |
| 'root'@'127.0.0.1' | def           | REFERENCES              | YES          |
| 'root'@'::1'       | def           | RELOAD                  | YES          |
| 'root'@'localhost' | def           | RELOAD                  | YES          |
| 'root'@'127.0.0.1' | def           | RELOAD                  | YES          |
| 'root'@'::1'       | def           | REPLICATION CLIENT      | YES          |
| 'root'@'localhost' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'::1'       | def           | REPLICATION SLAVE       | YES          |
| 'root'@'localhost' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | SELECT                  | YES          |
| 'root'@'::1'       | def           | SELECT                  | YES          |
| 'root'@'localhost' | def           | SELECT                  | YES          |
| 'root'@'127.0.0.1' | def           | SHOW DATABASES          |  YES          |
| 'root'@'::1'       | def           | SHOW DATABASES          | YES          |
| 'root'@'localhost' | def           | SHOW DATABASES          | YES          |
| 'root'@'127.0.0.1' | def           | SHOW VIEW               | YES          |
| 'root'@'::1'       | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | SHUTDOWN                | YES          |
| 'root'@'127.0.0.1' | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | SUPER                   | YES          |
| 'root'@'localhost' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | TRIGGER                 | YES          |
| 'root'@'localhost' | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | UPDATE                  | YES          |
| 'root'@'localhost' | def           | UPDATE                  | YES          |
| 'root'@'127.0.0.1' | def           | UPDATE                  | YES          |
| ''@'localhost'     | def           | USAGE                   | NO           |     +--------------------+---------------+-------------------------+--------------+
85 rows in set (0.00 sec)

ВИЗНАЧЕНО, довга відповідь і багато прокрутки. Також я важко намагався передати вихідні запити текстовому файлу. Ось як це зробити, не використовуючи дратівливої into outfileречі-

tee E: /sqllogfile.txt;

І коли ви закінчите, припиніть реєстрацію-

трійник відключений;

Сподіваюсь, це додасть більше ясності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.