Qual é o objetivo de Order By 1 na instrução SQL select?

154

Estou lendo alguns códigos antigos no trabalho e notei que existem várias visualizações com uma order by 1cláusula. O que isso faz?

Exemplo:

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;
eco
fonte
5
Para sua informação: Geralmente, é considerado uma prática ruim ter um ORDER BY em visualizações, a menos que você possa garantir que a visualização será usada apenas para apresentação. É um desperdício porque ORDER BY ocorrerá 2x se você usar a visualização em outra consulta com um ORDER BY.
OMG Ponies
3
Pôneis @ OMG: geralmente é considerado ilegal ter um ORDER BYem VIEW. SQL padrão não permite isso. O SQL Server a proíbe desde 2005. Para a implementação do SQL que permite, o comportamento é amplamente indocumentado e contra-intuitivo. Em outras palavras, definitivamente deve ser evitado.
precisa saber é o seguinte
@onedaywhen: Você está pregando para o coral, mas o MySQL permite ORDER BY em visualizações , assim como o Oracle IME. O SQL Server permite um ORDER BY se TOPestiver presente e o SSMS adora adicionar TOP 100 PERCENT.
OMG Ponies
@OMG Ponies @ "O MySQL permite ORDER BY em visualizações" - O MySQL permite uma CHECKrestrição em um arquivo, CREATE TABLEmas na verdade não o honra - ele nunca é verificado! A questão é: esses produtos SQL sempre respeitam as ORDER BYvisualizações, por exemplo, quando usados ​​em uma consulta que também possui um ORDER BY, são classificados duas vezes? Eles documentam o comportamento ou você precisa procurar os planos de execução para resolvê-lo? Eu acho que sabemos as respostas;)
onedaywhen
Para sua informação, descobri outro uso para ORDER BY 1... usando um truque de aplicação cruzada, onde você deseja um alias em branco. Infelizmente, o código, por exemplo, é muito grande para um comentário, então eu o publiquei como resposta abaixo para sua informação.
AndrewD 01/09/16

Respostas:

208

Este:

ORDER BY 1

... é conhecido como "Ordinal" - o número representa a coluna com base no número de colunas definido na cláusula SELECT. Na consulta que você forneceu, isso significa:

ORDER BY A.PAYMENT_DATE

Não é uma prática recomendada, porque:

  1. Não é óbvio / explícito
  2. Se a ordem da coluna for alterada, a consulta ainda será válida, assim você corre o risco de solicitar algo que não pretendia
Pôneis OMG
fonte
1
A minha pergunta perguntando se havia um lado positivo para usando ordinais: stackoverflow.com/questions/2253040/...
OMG Pôneis
Isso tem apenas a sqltag. No SQL padrão, apenas os nomes de correlação de coluna são permitidos na OREDER BYcláusula porque, em teoria, os nomes de correlação de tabela estão fora do escopo, ou seja, deveriam estar ORDER BY PAYMENT_DATE;. Obviamente, nem todas as implementações de SQL estão em conformidade com os Padrões.
precisa saber é o seguinte
Testado e trabalhando no 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 27/08
@OMG Ponies, você mencionou que não é uma prática recomendada, então qual será o próximo melhor substituto? perguntando porque estou curioso .. obrigado!
dian jin 14/07
40

Isso é útil quando você usa operadores baseados em conjuntos, por exemplo, união

select cola
  from tablea
union
select colb
  from tableb
order by 1;
daven11
fonte
4
Ah, isso faz sentido. Esta é a primeira boa razão que eu vi até agora.
echo
4
@Lazer Eu não acredito nisso, para realizar uma união, provavelmente faz uma classificação internamente, mas esta é uma questão de implementação em oposição a uma questão de saída lógica e, no espírito do SQL, não há necessidade de exibir as linhas em ordem. Além disso, e se você deseja classificar em ordem decrescente? Então você volta ao problema original.
David11
3
ainda ... Eu preferiria usarorder by tablea.cola
Shahar Shokrani
1
@ ShaharShokrani que não funcionaria. mas você pode dizer, eu prefiro selecionar cola como x da tabela tablea union selecionar colb como x da tabelab ordenar por x;
Ozgur Ozturk
select * from (selecione cola col da tablea union selecione colb col da tabelab) classifique por col
hareluya86
8

significa simplesmente classificar a visualização ou tabela pela 1ª coluna do resultado da consulta.

kshitij
fonte
7

Acredito na Oracle, significa ordem pela coluna # 1

Christoph
fonte
7

Isso classificará seus resultados pela primeira coluna retornada. No exemplo, ele classificará por data de pagamento.

CTKeane
fonte
4

Conforme mencionado em outras respostas, ORDER BY 1solicite pela primeira coluna.

Me deparei com outro exemplo de onde você pode usá-lo. Temos certas consultas que precisam ser solicitadas e selecione a mesma coluna. Você receberia um erro de SQL ao fazer o pedido Nameabaixo.

SELECT Name, Name FROM Segment ORDER BY 1
nicV
fonte
Por que você faria isso? por que não apelidá-los. [comentário tarde demais]
abdul qayyum 21/01
1
@abdulqayyum é apenas outra maneira de fazer as coisas realmente. O exemplo acima é muito simplificado. Às vezes, a coluna 'Nome' é na verdade colunas diferentes de tabelas diferentes que você está inserindo em outra tabela. Adicionar vários nomes alternativos pode dificultar a leitura. Outro exemplo de onde é usado é ao selecionar muitos cálculos diferentes e deseja ordenar por um - sem a necessidade de criar um alias. (Embora aqui eu pessoalmente prefiro um alias para dizer o que o cálculo é)
nicV
-1

Veja também:

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

Para uma descrição da ordem de. Eu aprendi alguma coisa! :)

Eu também usei isso no passado quando queria adicionar um número indeterminado de filtros a uma instrução sql. Desleixado, eu sei, mas funcionou. : P

kdmurray
fonte
-1

Um exemplo aqui de um banco de dados de servidor WAMP de teste de amostra: -

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)

E quando é dado adicional order by PRIVILEGE_TYPEou pode ser dado order by 3. Observe a terceira coluna ( PRIVILEGE_TYPE) sendo classificada em ordem alfabética.

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)

Definitivamente, uma resposta longa e muita rolagem. Também lutei muito para passar a saída das consultas para um arquivo de texto. Aqui está como fazer isso sem usar a into outfilecoisa chata :

tee E: /sqllogfile.txt;

E quando terminar, pare o registro

enfurecer;

Espero que adicione mais clareza.

kriss
fonte