SELEZIONA * DA tablename DOVE 1


129

Sono stato curioso Quali sono le differenze tra queste rispettive query:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1


9
c'è un flag "troppo stretto" per i tag? perché questo vale per molti, se non tutti, dialetti SQL. Lo vedo spesso anche in MSSQL e Oracle. tra l'altro quali sono gli apostrofi? il backtick non è usato per citare i nomi degli oggetti mysql?
Cee McSharpface,

3
@dlatikay puoi modificare i tag ...
Braiam

2
hm. perché non semplicemente ... WHERE TRUE? Sono consapevole che (nella maggior parte di SQL, incluso MySQL) TRUE è solo una macro elaborata per 1- ma ancora, non è un po 'più ovvio per il lettore?

2
2 non è valido nella maggior parte dei dialetti SQL
edc65

Risposte:


177

2 e 3 sono uguali in MySQL, funzionalmente anche 1 è uguale.

where 1 non è standard quindi, come altri hanno sottolineato, non funzionerà in altri dialetti.

Persone aggiungere where 1o where 1 = 1così wherecondizioni possono essere facilmente aggiunti o rimossi da / per una query con l'aggiunta in / commentando alcune " and..." componenti.

vale a dire

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

11
E anche quando stai programmando una query in una stringa per eseguirla in un secondo momento, se aggiungi WHERE 1=1, non dovrai preoccuparti se la condizione che stai provando ad aggiungere alla stringa è la prima (quindi avrà bisogno di un WHEREfronte ) o no.
Vincent Olivert Riera,

45
Programmo da 6 anni e non ho mai pensato di farlo - grazie!
SimonGates,

6
ORDER BY 1È richiesta la sintassi di @dlatikay (invece dei nomi di colonna) se si sta eseguendo un'unione di due o più istruzioni SELECT.
Mark Stewart,

5
@SimonGates Sto programmando da 6 anni e non ho mai pensato di fare altro lol
WernerCD

4
@WernerCD Penso che sia molto più sensato costruire un elenco di clausole di filtro in un elenco di qualche tipo, e quindi unirle a loro " AND "come delimitatore.
Zev Spitz

76

Come sapete, tutti e tre producono gli stessi risultati. (In un contesto booleano, MySQL considera l'intero "1" come vero - in effetti, qualsiasi numero che non sia "0" viene trattato come vero).

L'ottimizzatore MySQL è esplicitamente documentato per rimuovere condizioni costanti nella WHEREclausola:

  • Rimozione costante delle condizioni. . .:

    (B> = ​​5 AND B = 5) OR (B = 6 AND 5 = 5) OR (B = 7 AND 5 = 6) -> B = 5 OR B = 6

Quindi, tutti e tre saranno compilati esattamente nello stesso codice.

Sono tutti funzionalmente equivalenti e dovrebbero avere le stesse caratteristiche prestazionali.

Detto questo, il primo e il terzo sono SQL standard. Il secondo causerà una sorta di errore di espressione booleana in molti database. Quindi, ti consiglio di evitarlo (non sono sicuro che funzioni o meno nella rigorosa modalità SQL di MySQL).

Spesso il terzo viene utilizzato durante la costruzione di WHEREclausole dinamiche . Rende facile aggiungere ulteriori condizioni, AND <condition>senza preoccuparsi di indugiare AND.


6
Questa è una risposta superiore per dire tutto ciò che fa l'altra risposta, ma sottolineando in modo decisivo la differenza che il n. 2 non è conforme ANSI.
underscore_d

16

Se stai chiedendo delle differenze nelle prestazioni e nei risultati, non ce ne sono, 2 e 3 sono uguali WHERE TRUEe risulteranno uguali al primo.

1 - SELECT * FROM table_name

Risultati in tutti i dati da table_name(nessun filtro)

2 - SELECT * FROM table_name WHERE 1

1 verrà valutato come TRUE, quindi - nessun filtro - verrà restituito ogni record.

3 - SELECT * FROM table_name where 1=1

Come l'ultimo, 1 = 1 è a TRUE un'espressione, quindi - nessun filtro - verrà selezionato ogni record.


14

Sono tutti uguali ma 2 e 3 vengono utilizzati per gestire facilmente AND/ORcondizioni come:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8

In 1, MySQL non ha bisogno di valutare alcuna condizione WHERE.

In 2 e 3, la condizione where è statica e non basata sui valori delle righe. Sarà valutato con logica booleana e sarà sempre vero.

Funzionalmente, non c'è differenza. Dovresti scegliere 1 per chiarezza del codice.


7

Sono tutti uguali ma 2 e 3 vengono utilizzati per creare query dinamiche per condizioni AND / OR

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

usiamo i formati 2 e 3 per effettuare query dinamiche, quindi sappiamo già "dove" viene aggiunta la parola chiave e continuiamo ad aggiungere altri filtri. Piace

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

dopo poche righe se abbiamo nuovi filtri aggiungiamo "AND coulmnb = b" e così via

Non è necessario controllare la query sql per la parola chiave come posizionata nella prima o nella query iniziale

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

Altrimenti possiamo scrivere sqlquery = "SELECT * FROM tablename"

poi

se non vi è alcuna clausola 'where' in sqlquery allora

sqlquery  = sqlquery + "where columna =a"

altro

sqlquery  = sqlquery + "and columna =a"

4 spazi iniziali indicano un blocco di codice. Si prega di modificare la risposta di formattarlo correttamente, e vedere la modifica di aiuto per tutta la formattazione Markdown Bibbia.
Mathieu Guindon,

4

Tutti producono la stessa risposta. Tuttavia, il modo in cui vengono scritti 2 e 3 è principalmente per avere il controllo dell'istruzione "Where", in modo da rendere più semplice aggiungerlo o rimuoverlo in un secondo momento.

Penso che il primo e il terzo modo siano il modo corretto di scriverlo. Se hai bisogno di un'istruzione where che ti piace nel numero 3, altrimenti il ​​numero 1 sarebbe abbastanza buono.


3

In MS SQL 1 e 3 sono uguali, tuttavia, l'opzione 2 non funzionerà, l'opzione 2 è un'istruzione non valida come in MS SQL, DOVE viene utilizzata per confrontare alcuni valori. Per esempio:

  1. Seleziona * da 'myTable dove ID = 3 (valido)
  2. Seleziona * da 'myTable dove 1 = 1 è uguale a Select * da' myTable dove 2 = 2 è uguale a Select * da 'myTable dove 3 = 3 ottieni l'idea (valida) è uguale a Seleziona * Da' myTable '

2
  1. SELEZIONA * FROM nome_tabella : ti darà tutti i record della tabella con l'esecuzione dell'istruzione where.
  2. SELEZIONA * DA table_name DOVE 1 : qui dove la condizione è sempre vera, viene utilizzata principalmente dagli hacker per accedere a qualsiasi sistema. Se hai sentito parlare di iniezioni sql di 2 e 3 sono scenari che sono costretti a costruire dagli hacker per ottenere tutti i record della tabella.
  3. SELEZIONA * FROM table_name dove 1 = 1 : questo ti darà tutti i record della tabella ma confronterà l'istruzione where e poi andrà avanti, in pratica viene aggiunto per aggiungere o rimuovere più istruzioni dopo.

1

Risultato : fornisce tutti i record nella tabella specificata anziché il nome tabl per tutte e tre le query

SELECT * FROM tablename WHERE 1- Controlla questa risposta

SELECT * FROM tablename WHERE 1=1- Controlla questa risposta

Per ulteriori informazioni sulle ottimizzazioni della clausola WHERE, controllare questi: MYSQL , SQLite , SQL

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.