Was bedeutet es, 1 aus der Tabelle auszuwählen?


146

Ich habe viele Anfragen mit folgenden Dingen gesehen.

Select 1  
From table

Was bedeutet das 1, wie wird es ausgeführt und was wird es zurückgeben?

Kann dies auch in welchen Szenarien verwendet werden?


Zeigen Sie uns bitte die vollständige Anfrage
gbn

Antworten:


107

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 WHERE EXISTS (
     SELECT 1 FROM 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.


1
Diese Antwort machte für mich am meisten Sinn
Joseph

2
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!
Fahad Javed

40

Wenn du so etwas meinst

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

dann ist es ein Mythos dass das 1besser ist als

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

Das 1oder *in den EXISTS wird ignoriert und Sie können dies gemäß Seite 191 des ANSI SQL 1992-Standards schreiben :

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

1
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.


22
ä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.


2
Das war mein Fall, es ist ziemlich häufig bei JBOSS- und TOMCAT-Anwendungen.
Valter Silva

13

Das Ergebnis ist 1für jeden Datensatz in der Tabelle. __ __


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:

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

"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

SELECT 1 FROM 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:

SELECT 1 FROM employee;
  1. 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).
  2. 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.


3

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.


3

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.


2

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.


0

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


0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.