Cosa significa la clausola SQL "GROUP BY 1"?


203

Qualcuno mi ha inviato una query SQL in cui la GROUP BYclausola consisteva nell'istruzione:GROUP BY 1 .

Questo deve essere un errore di battitura giusto? Nessuna colonna è data l'alias 1. Cosa potrebbe significare questo? Ho ragione a supporre che questo debba essere un errore di battitura?


6
Non è un refuso, è la prima colonna del tuo set di risultati
Lamak,

9
Si noti che questa sintassi non è portatile. Si comporterà diversamente su database diversi da mysql. In Oracle, ad esempio, viene trattato come una costante.
Russell Reed,

2
@RussellReed Sì. sfortunatamente (poiché l'uso di un alias è talvolta molto utile) ansi sql non consente il raggruppamento per colonna ordinale. Il motivo è che il gruppo accade prima della proiezione. Ma poi .. cosa succede quando abbiamo espressioni di raggruppamento con decine di righe .. finiamo con .. mutiples di decine di righe nell'istruzione sql finale.
javadba,

Risposte:


233

Significa raggruppare per la prima colonna indipendentemente da come si chiama. Puoi fare lo stesso con ORDER BY.


74
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

Nella query precedente si GROUP BY 1riferisce a first column in select statementquale è account_id .

Puoi anche specificare in ORDER BY.

Nota: il numero in ORDER BY e GROUP BY inizia sempre con 1 non con 0.


25

Oltre al raggruppamento per nome del campo, puoi anche raggruppare per ordinale o posizione del campo all'interno della tabella. 1 corrisponde al primo campo (indipendentemente dal nome), 2 è il secondo e così via.

Questo è generalmente sconsigliato se stai raggruppando qualcosa di specifico, poiché la struttura della tabella / vista potrebbe cambiare. Inoltre, potrebbe essere difficile comprendere rapidamente cosa sta facendo la tua query SQL se non hai memorizzato i campi della tabella.

Se stai restituendo un set univoco o esegui rapidamente una ricerca temporanea, questa è una bella sintassi abbreviata per ridurre la digitazione. Se si prevede di eseguire nuovamente la query a un certo punto, si consiglia di sostituirli per evitare confusioni future e complicazioni impreviste (a causa di modifiche dello schema).


10
+1 per "non farlo" e aggiungerei che il miglior motivo per evitarlo è che non è leggibile.
Yuck,


5

Ciò significa che il gruppo sql per la prima colonna nella clausola select, lo usiamo sempre GROUP BY 1insieme ORDER BY 1, inoltre puoi anche usarlo in questo modo GROUP BY 1,2,3.., ovviamente è conveniente per noi ma devi prestare attenzione a quella condizione il risultato potrebbe non essere quello che se qualcuno ha modificato le colonne selezionate e non viene visualizzato


4

Raggrupperà per la posizione della colonna che hai inserito dopo la clausola group by.

ad esempio, se esegui " SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1" verrà raggruppato perSALESMAN_NAME .

Un rischio nel farlo è se esegui ' Select *' e per qualche motivo ricrea la tabella con colonne in un ordine diverso, ti darà un risultato diverso da quello che ti aspetteresti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.