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?
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?
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 normalerweise WHERE
hä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).
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 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.
...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 Ihrer where
Klausel und / oder übereinstimmt join
.
Wenn du so etwas meinst
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT 1 FROM table WHERE...)
dann ist es ein Mythos dass das 1
besser ist als
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT * FROM table WHERE...)
Das 1
oder *
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...)
exists (select 1/0
wie ein Zauber funktioniert
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.
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.
Obwohl es nicht allgemein bekannt ist, kann eine Abfrage eine HAVING
Klausel ohne GROUP 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 die HAVING
Klausel ausgewertet TRUE
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:
SELECT 1
FROM tableA
HAVING MIN(colA) < MAX(colA);
SELECT MIN(colA) < MAX(colA) FROM tableA
?
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).
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;
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 ...
Dies gibt Ihnen statisch die Ausgabe als Wert 1.
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
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