Heim  >  Artikel  >  Datenbank  >  Ausführliche Erläuterung der Anwendungsbeispiele von Exists in SQL

Ausführliche Erläuterung der Anwendungsbeispiele von Exists in SQL

零下一度
零下一度Original
2018-05-15 17:48:573051Durchsuche

Dieser Artikel stellt hauptsächlich die Verwendung von Exists in SQL vor. Er ist sehr gut und hat Referenzwert.

Zum Beispiel gibt es eine Abfrage in der Northwind-Datenbank als

SELECT c.CustomerId,CompanyName FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)

Wie funktioniert EXISTS hier? Die Unterabfrage gibt das Feld OrderId zurück, aber die externe Abfrage sucht nach den Feldern CustomerID und CompanyName. Diese beiden Felder sind definitiv nicht in der OrderID enthalten.

EXISTS wird verwendet, um zu prüfen, ob die Unterabfrage mindestens eine Datenzeile zurückgibt. Die Unterabfrage gibt eigentlich keine Daten zurück, sondern einen Wert von True oder False.

EXISTS gibt eine Unterabfrage an um die Existenz der Linie zu erkennen.

Syntax: EXISTS-Unterabfrage

Parameter: Unterabfrage ist eine eingeschränkte SELECT-Anweisung (COMPUTE-Klausel und INTO-Schlüsselwort sind nicht zulässig).

Ergebnistyp: Boolean Gibt TRUE zurück, wenn die Unterabfrage Zeilen enthält, andernfalls FLASE.

Beispieltabelle A: TableIn Beispieltabelle B: TableEx

(1) Die Verwendung von NULL in der Unterabfrage gibt weiterhin Ergebnisse zurück set

select * from TableIn where exists(select null)

entspricht: select * from TableIn


(2) Vergleichen Sie Abfragen mit EXISTS und IN. Beachten Sie, dass beide Abfragen die gleichen Ergebnisse zurückgeben.

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)

(3) Vergleichen Sie Abfragen mit EXISTS und = ANY. Beachten Sie, dass beide Abfragen die gleichen Ergebnisse zurückgeben.

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME=ANY(select BNAME from TableEx)

NOT EXISTS bewirkt das genaue Gegenteil von EXISTS. Wenn die Unterabfrage keine Zeilen zurückgibt, ist die WHERE-Klausel in NOT EXISTS erfüllt.

Fazit:

Der Rückgabewert der EXISTS-Klausel (einschließlich NOT EXISTS) ist ein BOOL-Wert. Innerhalb von EXISTS gibt es eine Unterabfrageanweisung (SELECT ... FROM...), die ich die innere Abfrageanweisung von EXIST nenne. Die darin enthaltene Abfrageanweisung gibt eine Ergebnismenge zurück. Die EXISTS-Klausel gibt einen booleschen Wert zurück, basierend darauf, ob die Ergebnismenge der darin enthaltenen Abfrageanweisung leer oder nicht leer ist.

Eine beliebte Möglichkeit, dies zu verstehen, ist: Ersetzen Sie jede Zeile der äußeren Abfragetabelle als Test in die innere Abfrage. Wenn das von der inneren Abfrage zurückgegebene Ergebnis ein Nicht-Null-Wert ist, gibt die EXISTS-Klausel TRUE zurück . Diese Zeile kann als Ergebniszeile der äußeren Abfrage verwendet werden, andernfalls kann sie nicht als Ergebnis verwendet werden.

Der Analysator prüft zunächst das erste Wort der Anweisung. Wenn er feststellt, dass das erste Wort das Schlüsselwort SELECT ist, springt er zum Schlüsselwort FROM, sucht dann den Tabellennamen über das Schlüsselwort FROM und gibt ihn ein Die Tabelle wird in den Speicher geladen. Der nächste Schritt besteht darin, nach dem Schlüsselwort WHERE zu suchen. Wenn es nicht gefunden wird, kehrt es zu SELECT zurück, um die Feldanalyse zu finden Analysieren Sie das Feld. Abschließend wird eine virtuelle Tabelle gebildet.

Was auf das Schlüsselwort WHERE folgt, ist ein bedingter Ausdruck. Nachdem der bedingte Ausdruck berechnet wurde, gibt es einen Rückgabewert, der ungleich Null oder 0 ist. Ungleich Null bedeutet wahr (wahr) und 0 bedeutet falsch (falsch). Auf die gleiche Weise hat auch die Bedingung nach WHERE einen Rückgabewert, wahr oder falsch, um zu bestimmen, ob als nächstes SELECT ausgeführt werden soll.

Der Analysator findet zuerst das Schlüsselwort SELECT, springt dann zum Schlüsselwort FROM, um die STUDENT-Tabelle in den Speicher zu importieren, findet den ersten Datensatz über den Zeiger und findet dann das Schlüsselwort WHERE, um seinen bedingten Ausdruck zu berechnen. Wenn es wahr ist, laden Sie diesen Datensatz dann in eine virtuelle Tabelle und der Zeiger zeigt auf den nächsten Datensatz. Bei „false“ zeigt der Zeiger direkt auf den nächsten Datensatz, ohne dass andere Vorgänge ausgeführt werden. Rufen Sie immer die gesamte Tabelle ab und geben Sie die abgerufene virtuelle Tabelle an den Benutzer zurück. EXISTS ist Teil eines bedingten Ausdrucks, der auch einen Rückgabewert (wahr oder falsch) hat.

Bevor Sie einen Datensatz einfügen, müssen Sie prüfen, ob der Datensatz bereits vorhanden ist. Der Einfügevorgang wird nur ausgeführt, wenn der Datensatz nicht vorhanden ist. Sie können das Einfügen doppelter Datensätze verhindern, indem Sie die bedingte Anweisung EXISTS verwenden.

INSERT INTO TableIn (ANAME,ASEX) 
SELECT top 1 '张三', '男' FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7)

In Bezug auf die Nutzungseffizienz von EXISTS und IN ist die Verwendung von exist in der Regel effizienter als in, da IN keine Indizierung verwendet, die spezifische Verwendung jedoch von der tatsächlichen Situation abhängt:

IN Es eignet sich für Situationen, in denen die Außenfläche groß und die Innenfläche klein ist; EXISTS ist für Situationen geeignet, in denen die Außenfläche klein, aber die Innenfläche groß ist.

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Anwendungsbeispiele von Exists in SQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn