Ich habe viele Fragen mit etwas wie folgt gesehen.
Select 1
From table
Was bedeutet dieser 1
, wie wird er ausgeführt und was wird er zurückgeben?
Kann dies auch in welchen Szenarien verwendet werden?
SELECT 1 FROM TABLE_NAME
bedeutet "1 aus der Tabelle zurückgeben". Es ist für sich alleine ziemlich unauffällig, daher wird es normalerweise mit WHERE
und oft EXISTS
verwendet (wie @gbn feststellt, ist dies nicht unbedingt die beste Praxis, es ist jedoch häufig genug, um bemerkt zu werden, selbst wenn es nicht wirklich ist bedeutungsvoll (das heißt, ich werde es verwenden, weil andere es verwenden und es "augenfälliger" sofort ist. Natürlich könnte dies ein zähflüssiges Huhn vs. Ei-Problem sein, aber ich bleibe im Allgemeinen nicht bei mir)).
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 offensichtlich ein erfundenes Beispiel, aber ich glaube, es vermittelt die Idee. Persönlich würde ich das Obige wahrscheinlich als SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);
tun, wenn ich das sehe alsWEITexpliziter für den Leser, es sei denn, es gibt einen 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 von einer Fremdsprache zu ermitteln, wird manchmal SELECT 1 FROM TABLE_NAME
verwendet. Dies bietet keinen erheblichen Vorteil gegenüber der Auswahl einer einzelnen Spalte, kann jedoch abhängig von der Implementierung erhebliche Vorteile gegenüber dem Ausführen von SELECT *
bieten. Dies liegt daran, dass der DB in der Regel umso mehr Spalten enthält, je mehr Spalten der DB enthält Datenstruktur, was wiederum bedeutet, dass mehr Zeit benötigt wird.
select 1 from table
gibt die Konstante 1 für jede Zeile der Tabelle zurück. Dies ist nützlich, wenn Sie kostengünstig ermitteln möchten, ob der Datensatz mit Ihrer where
-Klausel und/oder join
übereinstimmt.
Wenn du so etwas meinst
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT 1 FROM table WHERE...)
dann ist es ein myth, dass der 1
besser ist als
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT * FROM table WHERE...)
Der 1
oder *
in den EXISTS wird ignoriert und Sie können dies gemäß Seite 191 des ANSI SQL 1992 Standard schreiben:
SELECT * FROM AnotherTable
WHERE EXISTS (SELECT 1/0 FROM table WHERE...)
es tut, was es sagt - es wird immer die ganze Zahl 1 zurückgegeben. Es wird verwendet, um zu prüfen, ob ein Datensatz vorhanden ist, der Ihrer where-Klausel entspricht.
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/aus einem Verbindungspool verwendet.
Obwohl es nicht allgemein bekannt ist, kann eine Abfrage eine HAVING
-Klausel ohne eine GROUP BY
-Klausel enthalten.
In diesem Fall wird die HAVING
-Klausel auf den gesamten Satz angewendet. Die SELECT
-Klausel kann sich natürlich nicht auf eine Spalte beziehen, andernfalls würden Sie (korrigieren) den Fehler erhalten, "Spalte ist in select ungültig, da sie nicht in GROUP BY enthalten ist" usw.
Daher muss ein Literalwert muss verwendet werden (da SQL keine Ergebnismenge mit Nullspalten zulässt - warum ?!) und der Literalwert 1 (INTEGER
) häufig verwendet wird: Wenn die HAVING
-Klausel TRUE
auswertet, wird der Das Resultset besteht aus einer Zeile mit einer Spalte, die den Wert 1 anzeigt. Andernfalls erhalten Sie das leere Set.
Beispiel: Um herauszufinden, ob eine Spalte mehr als einen bestimmten Wert hat:
SELECT 1
FROM tableA
HAVING MIN(colA) < MAX(colA);
Wenn Sie nicht wissen, ob Daten Ihrer Tabelle vorhanden sind oder nicht, können Sie folgende Abfrage verwenden:
SELECT cons_value FROM table_name;
Zum Beispiel:
SELECT 1 FROM employee;
Wir verwenden diese SQL-Abfrage, um zu ermitteln, ob Daten in der Tabelle vorhanden sind. Die Anzahl der Zeilen gibt an, wie viele Zeilen in dieser Tabelle vorhanden sind.
Um etwas genauer zu sein, würden Sie dies verwenden
SELECT 1 FROM MyUserTable WHERE user_id = 33487
anstatt zu tun
SELECT * FROM MyUserTable WHERE user_id = 33487
weil es Ihnen egal ist, auf die Ergebnisse zu schauen. Nach der Nummer 1 zu fragen, ist für die Datenbank sehr einfach (da sie nicht nachschlagen muss).
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 der inneren Abfragen berechnen möchten. Nicht immer Verwenden Sie 1 aber Sie haben bestimmte Werte ...
Dadurch werden Sie statisch als Wert 1 ausgegeben.
Wenn Sie nur anhand der WHERE-Klausel ein wahr oder falsch prüfen möchten, wählen Sie 1 aus der Tabelle aus, wobei die Bedingung die günstigste ist.
Ich sehe es wird immer in SQL-Injection verwendet, wie:
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 den Spaltennamen der von Ihnen angegebenen Datenbank zu erraten.
Dies wird nur zur Vereinfachung bei IF EXISTS () verwendet. Ansonsten kannst du mitgehen
select * from [table_name]
Image Im Fall von 'IF EXISTS' müssen wir nur wissen, dass jede Zeile mit einer bestimmten Bedingung existiert oder nicht, egal was der Inhalt der Zeile ist.
select 1 from Users
über dem Beispielcode wird "no" zurückgegeben. Zeilenanzahl gleich Nr. von Benutzern mit 1 in einer Spalte
es bedeutet einfach, dass Sie die erste Spalte der Nummer aus der Tabelle , bedeutet, auswählen. Das heißt, Sie rufen die Spalte von Emply_num ab Danke
Der Grund ist ein anderer, zumindest für MySQL. Dies ist aus dem MySQL-Handbuch
InnoDB berechnet Index-Kardinalitätswerte für eine Tabelle beim ersten Zugriff auf diese Tabelle nach dem Start, anstatt diese Werte in der Tabelle zu speichern. Dieser Schritt kann auf Systemen, die die Daten in viele Tabellen unterteilen, sehr lange dauern. Da dieser Aufwand nur für den anfänglichen Tabellenöffnungsvorgang gilt, können Sie eine Tabelle für die spätere Verwendung "aufwärmen", indem Sie unmittelbar nach dem Start darauf zugreifen, indem Sie eine Anweisung wie SELECT 1 FROM Tabellenname LIMIT 1 ausgeben