SELECT 1 FROM TABLE_NAMEbedeutet "1 von der Tabelle zurückgeben". Es ist für sich genommen ziemlich unauffällig, daher wird es normalerweise WHEREhäufig verwendet EXISTS(wie @gbn feststellt, ist dies nicht unbedingt eine bewährte Methode, es ist jedoch häufig genug, um bemerkt zu werden, auch wenn es nicht wirklich aussagekräftig ist ( Das heißt, ich werde es verwenden, weil andere es verwenden und es sofort "offensichtlicher" ist. Natürlich könnte das ein viskoses Problem zwischen Huhn und Ei sein, aber ich verweile im Allgemeinen nicht)).
SELECT*FROM TABLE1 T1 WHEREEXISTS(SELECT1FROM TABLE2 T2 WHERE T1.ID= T2.ID
);
Grundsätzlich wird das Obige alles aus Tabelle 1 zurückgeben, das eine entsprechende ID aus Tabelle 2 hat. (Dies ist natürlich ein erfundenes Beispiel, aber ich glaube, es vermittelt die Idee. Persönlich würde ich das Obige wahrscheinlich so machen, SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);wie ich es sehe FAR deutlicher an den Leser , es sei denn es gab ein umständlicher zwingenden Grund , nicht zu).
BEARBEITEN
Es gibt tatsächlich einen Fall, den ich bis jetzt vergessen habe. In dem Fall, in dem Sie versuchen, das Vorhandensein eines Werts in der Datenbank aus einer externen Sprache heraus zu bestimmen, SELECT 1 FROM TABLE_NAMEwird dies manchmal verwendet. Dies bietet keinen signifikanten Vorteil gegenüber der Auswahl einer einzelnen Spalte, kann jedoch je nach Implementierung erhebliche Vorteile gegenüber der Ausführung von a bieten SELECT *, einfach weil häufig die Daten umso größer sind, je mehr Spalten die Datenbank in eine Sprache zurückgibt Struktur, was wiederum bedeutet, dass mehr Zeit benötigt wird.
Und warum "normal" mit EXISTS? Haben Sie Beweise dafür, warum ?
Gbn
6
Und ein -1 für die Verbreitung des Mythos von...EXISTS (SELECT 1...
gbn
2
@Gbn Keine Ahnung, warum ich es dort viel öfter gesehen habe als alles andere. Ich habe es dort gerade viel öfter gesehen.
Cwallenpoole
2
Ein zähflüssiges Huhn? Möchte das nicht essen! Vielleicht sollte es ein "bösartiges Henne-Ei-Problem" sein?
No'am Newman
2
@ Ben: IN und EXISTs werden normalerweise nach dem gleichen Plan optimiert
gbn
106
select 1 from tablegibt die Konstante 1 für jede Zeile der Tabelle zurück. Dies ist nützlich, wenn Sie kostengünstig feststellen möchten, ob der Datensatz mit Ihrer whereKlausel und / oder übereinstimmt join.
Sehr wichtiger Punkt in der Tat: "für jede Zeile in der Tabelle". Die Überprüfung der "Tabellenverfügbarkeit" als Teil einer beispielsweise Integritätsprüfung einer Tabelle mit hundert Millionen Zeilen führt zu einer Ergebnismenge von hundert Millionen "1". (Anmerkung: nicht, dass dies jemals passieren würde ... in der Produktion;);))
conny
Wörtlich sollte dies hier die akzeptierte Antwort sein!
nur bestätigt , dass Postgres respektieren diese, exists (select 1/0wie ein Zauber funktioniert
alex
22
Es macht das, was es sagt - es gibt immer die Ganzzahl 1 zurück. Es wird verwendet, um zu überprüfen, ob ein Datensatz vorhanden ist, der mit Ihrer where-Klausel übereinstimmt.
ähm - die Frage war "was bedeutet das", nicht "ist das eine gute Praxis". Ich bin damit einverstanden, dass es aus Sicht der Leistung keinen Unterschied macht - aber es ist eine Konvention, die Entwickler verwenden, vermutlich weil 1 allgemein als "wahr" interpretiert wird.
Neville Kuyt
20
select 1 from table wird von einigen Datenbanken als Abfrage verwendet, um eine Verbindung zu testen, um festzustellen, ob sie aktiv ist. Dies wird häufig beim Abrufen oder Zurückgeben einer Verbindung zu / von einem Verbindungspool verwendet.
Nicht wirklich, ich habe versucht, eine leere Tabelle zu erstellen und die Abfrage auszuführen. Das Ergebnis sind sechs Einsen.
10.
9
Obwohl es nicht allgemein bekannt ist, kann eine Abfrage eine HAVINGKlausel ohne GROUP BYKlausel enthalten.
Unter diesen Umständen wird die HAVINGKlausel auf den gesamten Satz angewendet. Klar, dieSELECT Klausel nicht auf eine Spalte verweisen kann, da sonst (korrekt) der Fehler "Spalte ist in Auswahl ungültig, da sie nicht in GROUP BY enthalten ist" usw. angezeigt wird.
Daher muss ein Literalwert verwendet werden (da SQL keine Ergebnismenge mit Nullspalten zulässt - warum?!) Und der Literalwert 1 ( INTEGER) wird häufig verwendet: Wenn die HAVINGKlausel ausgewertet TRUEwird, besteht die Ergebnismenge aus einer Zeile mit einer Spalte mit dem Wert 1, andernfalls erhalten Sie den leeren Satz.
Beispiel: Um herauszufinden, ob eine Spalte mehr als einen bestimmten Wert hat:
"Natürlich kann die SELECT-Klausel nicht auf eine Spalte verweisen" - Wäre es nicht sinnvoller, einen Bool-Ausdruck auszuwählen : SELECT MIN(colA) < MAX(colA) FROM tableA?
Paul Spiegel
7
Um etwas genauer zu sein, würden Sie dies verwenden, um dies zu tun
SELECT1FROM MyUserTable WHERE user_id =33487
anstatt zu tun
SELECT*FROM MyUserTable WHERE user_id =33487
weil es Ihnen egal ist, die Ergebnisse zu betrachten. Nach der Nummer 1 zu fragen ist für die Datenbank sehr einfach (da sie nicht nachschlagen muss).
Wie aus den obigen Kommentaren hervorgeht, ist Select 1 nicht leistungsfähiger als Select *, oder?
eRaisedToX
5
Wenn Sie nicht wissen, dass Daten in Ihrer Tabelle vorhanden sind oder nicht, können Sie die folgende Abfrage verwenden:
SELECT cons_value FROM table_name;
Zum Beispiel:
SELECT1FROM employee;
Es wird eine Spalte zurückgegeben, die die Gesamtzahl der Zeilen enthält und alle Zeilen haben den gleichen konstanten Wert 1 (für diese Zeit wird 1 für alle Zeilen zurückgegeben).
Wenn Ihre Tabelle keine Zeile enthält, wird nichts zurückgegeben.
Daher verwenden wir diese SQL-Abfrage, um festzustellen, ob die Tabelle Daten enthält und die Anzahl der Zeilen angibt, wie viele Zeilen in dieser Tabelle vorhanden sind.
Dies bedeutet, dass Sie einen Wert " 1 " als Ausgabe oder die meiste Zeit als innere Abfragen verwenden möchten, da Sie aus irgendeinem Grund die äußeren Abfragen basierend auf dem Ergebnis innerer Abfragen berechnen möchten. Nicht immer verwenden Sie 1, sondern Sie habe einige spezifische Werte ...
Wenn Sie nur ein Richtig oder Falsch basierend auf der WHERE-Klausel überprüfen möchten, wählen Sie 1 aus der Tabelle aus, wobei die Bedingung der billigste Weg ist.
Ich sehe, dass es immer in der SQL-Injection verwendet wird, wie zum Beispiel:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
Diese Zahlen können verwendet werden, um zu erraten, wo die Datenbank vorhanden ist, und um den Spaltennamen der von Ihnen angegebenen Datenbank zu erraten. Und die Werte der Tabellen.
es bedeutet einfach, dass Sie die erste Spalte der Nummer aus der Tabelle abrufen ,,,, bedeutet, wählen Sie Emply_num, Empl_no From Employees; Hier verwenden Sie Auswahl 1 unter Mitarbeiter. Das heißt, Sie rufen die Spalte Emply_num ab. Vielen Dank
Ich erinnere mich an eine solche Syntax, aber sie ist spezifisch für eine Datenbank, an die ich mich nicht erinnern kann. Postgresql?
Diynevala
0
Der Grund ist ein anderer, zumindest für MySQL. Dies ist aus dem MySQL-Handbuch
InnoDB berechnet Indexkardinalitätswerte für eine Tabelle, wenn nach dem Start zum ersten Mal auf diese Tabelle zugegriffen wird, anstatt solche Werte in der Tabelle zu speichern. Dieser Schritt kann auf Systemen, die die Daten in viele Tabellen partitionieren, viel Zeit in Anspruch nehmen. Da dieser Overhead nur für die anfängliche Operation zum Öffnen von Tabellen gilt, können Sie zum Aufwärmen einer Tabelle für die spätere Verwendung unmittelbar nach dem Start darauf zugreifen, indem Sie eine Anweisung wie SELECT 1 FROM tbl_name LIMIT 1 ausgeben
Dies wird nur zur Vereinfachung mit IF EXISTS () verwendet. Ansonsten kannst du mit gehen
select * from [table_name]
Bild Im Fall von 'IF EXISTS' müssen wir nur wissen, dass eine Zeile mit einer bestimmten Bedingung vorhanden ist oder nicht, unabhängig davon, was der Inhalt der Zeile ist.
select 1 from Users
Der obige Beispielcode gibt no zurück. Anzahl der Zeilen entspricht Nr. von Benutzern mit 1 in einer Spalte
Antworten:
SELECT 1 FROM TABLE_NAME
bedeutet "1 von der Tabelle zurückgeben". Es ist für sich genommen ziemlich unauffällig, daher wird es normalerweiseWHERE
häufig verwendetEXISTS
(wie @gbn feststellt, ist dies nicht unbedingt eine bewährte Methode, es ist jedoch häufig genug, um bemerkt zu werden, auch wenn es nicht wirklich aussagekräftig ist ( Das heißt, ich werde es verwenden, weil andere es verwenden und es sofort "offensichtlicher" ist. Natürlich könnte das ein viskoses Problem zwischen Huhn und Ei sein, aber ich verweile im Allgemeinen nicht)).Grundsätzlich wird das Obige alles aus Tabelle 1 zurückgeben, das eine entsprechende ID aus Tabelle 2 hat. (Dies ist natürlich ein erfundenes Beispiel, aber ich glaube, es vermittelt die Idee. Persönlich würde ich das Obige wahrscheinlich so machen,
SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);
wie ich es sehe FAR deutlicher an den Leser , es sei denn es gab ein umständlicher zwingenden Grund , nicht zu).BEARBEITEN
Es gibt tatsächlich einen Fall, den ich bis jetzt vergessen habe. In dem Fall, in dem Sie versuchen, das Vorhandensein eines Werts in der Datenbank aus einer externen Sprache heraus zu bestimmen,
SELECT 1 FROM TABLE_NAME
wird dies manchmal verwendet. Dies bietet keinen signifikanten Vorteil gegenüber der Auswahl einer einzelnen Spalte, kann jedoch je nach Implementierung erhebliche Vorteile gegenüber der Ausführung von a bietenSELECT *
, einfach weil häufig die Daten umso größer sind, je mehr Spalten die Datenbank in eine Sprache zurückgibt Struktur, was wiederum bedeutet, dass mehr Zeit benötigt wird.quelle
...EXISTS (SELECT 1...
select 1 from table
gibt die Konstante 1 für jede Zeile der Tabelle zurück. Dies ist nützlich, wenn Sie kostengünstig feststellen möchten, ob der Datensatz mit Ihrerwhere
Klausel und / oder übereinstimmtjoin
.quelle
Wenn du so etwas meinst
dann ist es ein Mythos dass das
1
besser ist alsDas
1
oder*
in den EXISTS wird ignoriert und Sie können dies gemäß Seite 191 des ANSI SQL 1992-Standards schreiben :quelle
exists (select 1/0
wie ein Zauber funktioniertEs macht das, was es sagt - es gibt immer die Ganzzahl 1 zurück. Es wird verwendet, um zu überprüfen, ob ein Datensatz vorhanden ist, der mit Ihrer where-Klausel übereinstimmt.
quelle
select 1 from table
wird von einigen Datenbanken als Abfrage verwendet, um eine Verbindung zu testen, um festzustellen, ob sie aktiv ist. Dies wird häufig beim Abrufen oder Zurückgeben einer Verbindung zu / von einem Verbindungspool verwendet.quelle
Das Ergebnis ist
1
für jeden Datensatz in der Tabelle.quelle
Obwohl es nicht allgemein bekannt ist, kann eine Abfrage eine
HAVING
Klausel ohneGROUP BY
Klausel enthalten.Unter diesen Umständen wird die
HAVING
Klausel auf den gesamten Satz angewendet. Klar, dieSELECT
Klausel nicht auf eine Spalte verweisen kann, da sonst (korrekt) der Fehler "Spalte ist in Auswahl ungültig, da sie nicht in GROUP BY enthalten ist" usw. angezeigt wird.Daher muss ein Literalwert verwendet werden (da SQL keine Ergebnismenge mit Nullspalten zulässt - warum?!) Und der Literalwert 1 (
INTEGER
) wird häufig verwendet: Wenn dieHAVING
Klausel ausgewertetTRUE
wird, besteht die Ergebnismenge aus einer Zeile mit einer Spalte mit dem Wert 1, andernfalls erhalten Sie den leeren Satz.Beispiel: Um herauszufinden, ob eine Spalte mehr als einen bestimmten Wert hat:
quelle
SELECT MIN(colA) < MAX(colA) FROM tableA
?Um etwas genauer zu sein, würden Sie dies verwenden, um dies zu tun
anstatt zu tun
weil es Ihnen egal ist, die Ergebnisse zu betrachten. Nach der Nummer 1 zu fragen ist für die Datenbank sehr einfach (da sie nicht nachschlagen muss).
quelle
Wenn Sie nicht wissen, dass Daten in Ihrer Tabelle vorhanden sind oder nicht, können Sie die folgende Abfrage verwenden:
Zum Beispiel:
Daher verwenden wir diese SQL-Abfrage, um festzustellen, ob die Tabelle Daten enthält und die Anzahl der Zeilen angibt, wie viele Zeilen in dieser Tabelle vorhanden sind.
quelle
Dies bedeutet, dass Sie einen Wert " 1 " als Ausgabe oder die meiste Zeit als innere Abfragen verwenden möchten, da Sie aus irgendeinem Grund die äußeren Abfragen basierend auf dem Ergebnis innerer Abfragen berechnen möchten. Nicht immer verwenden Sie 1, sondern Sie habe einige spezifische Werte ...
Dies gibt Ihnen statisch die Ausgabe als Wert 1.
quelle
Wenn Sie nur ein Richtig oder Falsch basierend auf der WHERE-Klausel überprüfen möchten, wählen Sie 1 aus der Tabelle aus, wobei die Bedingung der billigste Weg ist.
quelle
Ich sehe, dass es immer in der SQL-Injection verwendet wird, wie zum Beispiel:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
Diese Zahlen können verwendet werden, um zu erraten, wo die Datenbank vorhanden ist, und um den Spaltennamen der von Ihnen angegebenen Datenbank zu erraten. Und die Werte der Tabellen.
quelle
es bedeutet einfach, dass Sie die erste Spalte der Nummer aus der Tabelle abrufen ,,,, bedeutet, wählen Sie Emply_num, Empl_no From Employees; Hier verwenden Sie Auswahl 1 unter Mitarbeiter. Das heißt, Sie rufen die Spalte Emply_num ab. Vielen Dank
quelle
Der Grund ist ein anderer, zumindest für MySQL. Dies ist aus dem MySQL-Handbuch
quelle
Dies wird nur zur Vereinfachung mit IF EXISTS () verwendet. Ansonsten kannst du mit gehen
select * from [table_name]
Bild Im Fall von 'IF EXISTS' müssen wir nur wissen, dass eine Zeile mit einer bestimmten Bedingung vorhanden ist oder nicht, unabhängig davon, was der Inhalt der Zeile ist.
select 1 from Users
Der obige Beispielcode gibt no zurück. Anzahl der Zeilen entspricht Nr. von Benutzern mit 1 in einer Spalte
quelle