Cosa significa selezionare 1 dalla tabella?


146

Ho visto molte domande con qualcosa come segue.

Select 1  
From table

Cosa 1significa, come verrà eseguito e cosa restituirà?

Inoltre, in quale tipo di scenari, può essere utilizzato?


Mostraci la query completa per favore
gbn

Risposte:


107

SELECT 1 FROM TABLE_NAMEsignifica "Ritorna 1 dalla tabella". È abbastanza insignificante da solo, quindi normalmente verrà usato con WHEREe spesso EXISTS(come osserva @gbn, questa non è necessariamente una buona pratica, è, tuttavia, abbastanza comune da essere notato, anche se non è davvero significativo ( detto questo, lo userò perché altri lo usano ed è immediatamente "più ovvio". Naturalmente, potrebbe trattarsi di un problema viscoso tra pollo e uova, ma in genere non mi soffro)).

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

Fondamentalmente, quanto sopra restituirà tutto dalla tabella 1 che ha un ID corrispondente dalla tabella 2. (Questo è un esempio inventato, ovviamente, ma credo che trasmetta l'idea. Personalmente, probabilmente farei quanto sopra SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);come vedo che come Molto più esplicito per il lettore a meno che non ci fosse una ragione convincentemente convincente a non farlo).

MODIFICARE

In realtà c'è un caso di cui mi sono dimenticato fino ad ora. Nel caso in cui si stia tentando di determinare l'esistenza di un valore nel database da una lingua esterna, a volte SELECT 1 FROM TABLE_NAMEverrà utilizzato. Ciò non offre un vantaggio significativo rispetto alla selezione di una singola colonna, ma, a seconda dell'implementazione, può offrire vantaggi sostanziali rispetto all'esecuzione di una SELECT *, semplicemente perché spesso accade che più colonne restituiscono il DB in una lingua, maggiori sono i dati struttura, che a sua volta significa che ci vorrà più tempo.


E perché "normalmente" con EXISTS? Hai prove del perché ?
gbn,

6
E un -1 per propagare il mito di...EXISTS (SELECT 1...
gbn

2
@Gbn Non ho idea del perché l'ho visto molto più spesso di ogni altra cosa. L'ho visto molto più spesso lì.
cwallenpoole,

2
Un pollo viscoso? Non mi piacerebbe mangiarlo! Forse dovrebbe essere un "vizioso problema con pollo e uova"?
No Newam,

2
@Ben: IN ed EXIST di solito si ottimizzano sullo stesso piano
gbn

107

select 1 from tablerestituirà la costante 1 per ogni riga della tabella. È utile quando si desidera determinare in modo economico se il record corrisponde alla propria whereclausola e / o join.


1
Questa risposta per me aveva più senso
Joseph Astrahan,

2
Punto molto importante in effetti: "per OGNI riga nella tabella". Pertanto, la verifica della "disponibilità della tabella" come parte di, ad esempio un controllo dello stato di una tabella con centinaia di milioni di righe, termina con un set di risultati di centinaia di milioni "1". (nota: non che ciò accada MAI ... in produzione;);))
conny

Letteralmente, questa dovrebbe essere la risposta accettata qui!
Fahad Javed

41

Se vuoi dire qualcosa del genere

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

allora è un mito che 1è meglio di

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

Il 1o *nel esiste è ignorato e si può scrivere questo come da pagina 191 del 1992 ANSI SQL standard :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 

1
ho appena verificato che Postgres rispetta questo, exists (select 1/0funziona come un incantesimo
alex

22

fa quello che dice - restituirà sempre il numero intero 1. Viene utilizzato per verificare se esiste un record corrispondente alla clausola where.


22
uhm - la domanda era "che cosa significa", non "è questa buona pratica". Sono d'accordo che non fa alcuna differenza dal punto di vista delle prestazioni, ma è una convenzione che gli sviluppatori usano, presumibilmente perché 1 viene comunemente interpretato come "vero".
Neville Kuyt,

20

select 1 from table viene utilizzato da alcuni database come query per testare una connessione per vedere se è attiva, spesso utilizzata durante il recupero o la restituzione di una connessione a / da un pool di connessioni.


2
Quello era il mio caso, è abbastanza comune tra le applicazioni JBOSS e TOMCAT.
Valter Silva,

13

Il risultato è 1per ogni record nella tabella. __


Non proprio, ho provato a creare una tabella vuota ed eseguire la query, il risultato sono sei 1s.
r0ng,

9

Sebbene non sia ampiamente noto, una query può avere una HAVINGclausola senza una GROUP BYclausola.

In tali circostanze, la HAVINGclausola viene applicata all'intero set. Chiaramente, la SELECTclausola non può fare riferimento a nessuna colonna, altrimenti si otterrebbe (corretto) l'errore "La colonna non è valida nella selezione perché non è contenuta in GROUP BY" ecc.

Pertanto, è necessario utilizzare un valore letterale (perché SQL non consente un gruppo di risultati con zero colonne - perché ?!) e il valore letterale 1 ( INTEGER) è comunemente usato: se la HAVINGclausola viene valutata, TRUEil gruppo di risultati sarà una riga con uno colonna che mostra il valore 1, altrimenti si ottiene il set vuoto.

Esempio: per scoprire se una colonna ha più di un valore distinto:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

"Chiaramente, la clausola SELECT non può fare riferimento a qualsiasi colonna" - Non sarebbe più ragionevole per selezionare un espressione bool: SELECT MIN(colA) < MAX(colA) FROM tableA?
Paul Spiegel,

7

Per essere leggermente più specifico, lo useresti per farlo

SELECT 1 FROM MyUserTable WHERE user_id = 33487

invece di fare

SELECT * FROM MyUserTable WHERE user_id = 33487

perché non ti interessa guardare i risultati. Richiedere il numero 1 è molto semplice per il database (poiché non deve effettuare alcuna ricerca).


Secondo i commenti sopra, sembra che Select 1 non sia migliore in termini di prestazioni rispetto a select *, è così?
eRaisedToX

5

Se non sai che esistono dei dati nella tabella o meno, puoi utilizzare la seguente query:

SELECT cons_value FROM table_name;

Per un esempio:

SELECT 1 FROM employee;
  1. Restituirà una colonna che contiene il numero totale di righe e tutte le righe hanno lo stesso valore costante 1 (per questo tempo restituisce 1 per tutte le righe);
  2. Se non ci sono righe nella tabella, non verrà restituito nulla.

Quindi, usiamo questa query SQL per sapere se ci sono dati nella tabella e il numero di righe indica quante righe esistono in questa tabella.


3

Ciò significa che si desidera un valore " 1 " come output o il più delle volte utilizzato come query interne perché per qualche motivo si desidera calcolare le query esterne in base al risultato delle query interne .. non tutte le volte che si utilizza 1 ma si hanno alcuni valori specifici ...

Ciò fornirà staticamente un output come valore 1.


3

Se si desidera solo verificare un valore vero o falso in base alla clausola WHERE, selezionare 1 dalla tabella in cui condizione è il modo più economico.


2

Vedo che viene sempre utilizzato nell'iniezione SQL, come ad esempio:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

Questi numeri possono essere utilizzati per indovinare dove esiste il database e indovinare il nome della colonna del database specificato e i valori delle tabelle.


0

significa semplicemente che stai recuperando il numero della prima colonna dalla tabella ,,,, significa selezionare Emply_num, Empl_no dai dipendenti; qui stai usando seleziona 1 da Dipendenti; ciò significa che stai recuperando la colonna Emply_num. Grazie


Ricordo questa sintassi, ma è specifica per un database che non riesco a ricordare. PostgreSQL?
Diynevala,

0

Il motivo è un altro, almeno per MySQL. Questo è dal manuale di MySQL

InnoDB calcola i valori di cardinalità dell'indice per una tabella la prima volta che si accede a tale tabella dopo l'avvio, anziché archiviare tali valori nella tabella. Questo passaggio può richiedere molto tempo sui sistemi che suddividono i dati in molte tabelle. Poiché questo sovraccarico si applica solo all'operazione iniziale di apertura della tabella, per "riscaldare" una tabella per un uso successivo, accedervi immediatamente dopo l'avvio emettendo un'istruzione come SELECT 1 FROM tbl_name LIMIT 1


0

Questo è solo usato per comodità con IF EXISTS (). Altrimenti puoi andare con

select * from [table_name]

Immagine Nel caso di "SE ESISTE", dobbiamo solo sapere che esiste una riga con la condizione specificata o meno, indipendentemente dal contenuto della riga.

select 1 from Users

sopra il codice di esempio, restituisce no. di righe è uguale a no. di utenti con 1 in singola colonna

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.