HOWTO · MySQL
Mit EXISTS und IF() prüfen, ob eine Zeile in MySQL existiert
Prüfen Sie mit EXISTS, ob eine Zeile in MySQL einer Bedingung entspricht, und verwenden Sie dann IF(), um ein gut lesbares Ergebnis zurückzugeben.
Auf dieser Seite
Um zu prüfen, ob eine Zeile in MySQL existiert, verwenden Sie das Prädikat EXISTS mit einer Unterabfrage. Es ist wahr, wenn die Unterabfrage mindestens eine Zeile zurückgibt. Setzen Sie es in die MySQL-Funktion IF() ein, um einen Wert wie Yes, exists oder No, does not exist auszuwählen. Dieser Leitfaden behandelt das Prädikat EXISTS und die Funktion IF(); IF EXISTS in einer DDL-Anweisung ist eine separate Syntax.
Die MySQL-Beispiele verwenden eine kleine Tabelle student_details. Führen Sie diese Einrichtungsanweisungen in einer MySQL-Sitzung aus, bevor Sie die Abfragen ausprobieren:
CREATE TABLE student_details (stu_id INT PRIMARY KEY, stu_firstName VARCHAR(255), stu_lastName VARCHAR(255));
INSERT INTO student_details (stu_id, stu_firstName, stu_lastName) VALUES (1, 'Preet', 'Sanghavi'), (2, 'Rich', 'John'), (3, 'Veron', 'Brow'), (4, 'Geo', 'Jos'), (5, 'Hash', 'Shah'), (6, 'Sachin', 'Parker'), (7, 'David', 'Miller');
Dieses in sich geschlossene Python-Beispiel verwendet die eingebaute SQLite-Bibliothek, um die ID 4 zu prüfen. Die beobachtete Ausgabe ist unten dargestellt; die MySQL-Abfragen in diesem Leitfaden sollten in MySQL ausgeführt werden.
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute("CREATE TABLE student_details (stu_id INTEGER PRIMARY KEY)")
connection.executemany(
"INSERT INTO student_details (stu_id) VALUES (?)",
[(1,), (2,), (3,), (4,)],
)
result = connection.execute(
"SELECT EXISTS (SELECT 1 FROM student_details WHERE stu_id = ?)", (4,)
).fetchone()[0]
print(result)
connection.close()
1
Grundlegende Verwendung des Operators EXISTS in MySQL
EXISTS prüft, ob seine Unterabfrage eine Zeile zurückgibt. Die in der Unterabfrage ausgewählten Werte werden nicht zum Ergebnis; SELECT 1 macht diesen Zweck deutlich. Prüfen Sie in MySQL die ID 4 mit:
SELECT EXISTS (SELECT 1 FROM student_details WHERE stu_id = 4) AS RESULT;
Das Ergebnis ist 1, weil die Beispieltabelle stu_id = 4 enthält. Ändern Sie die Bedingung in stu_id = 11, und es wird 0 zurückgegeben. Diese erwarteten MySQL-Ergebnisse folgen aus den Einrichtungsdaten; das obige Python-Beispiel demonstriert das Prädikat in SQLite, nicht in MySQL.
Die Bedingung prüft stu_id, unabhängig vom Wert des Vornamens. Dasselbe Prädikat kann in einer größeren Anweisung SELECT, UPDATE, DELETE oder INSERT verwendet werden, wenn ein Existenztest zur Operation passt. Für ein Ja-oder-Nein-Abfrageergebnis gibt SELECT EXISTS (...) den numerischen Wahr- oder Falschwert von MySQL zurück.
SELECT EXISTS (...) gibt eine Zeile mit 1 oder 0 zurück, was nützlich ist, wenn die Anwendung einen einzelnen Ja-oder-Nein-Wert benötigt. Um nur Zeilen aus einer anderen Tabelle zurückzugeben, die eine zugehörige Übereinstimmung haben, setzen Sie EXISTS in die Klausel WHERE der äußeren Abfrage. Zum Beispiel gibt SELECT c.customer_id FROM customers AS c WHERE EXISTS (SELECT 1 FROM orders AS o WHERE o.customer_id = c.customer_id); Kunden mit mindestens einer übereinstimmenden Bestellung zurück. Der Verweis auf c.customer_id macht die Unterabfrage mit jeder Kandidaten-Kundenzeile korreliert. Verwenden Sie Tabellen- und Schlüsselnamen aus Ihrem eigenen Schema.
Verwendung von IF() mit EXISTS in MySQL
IF(condition, value_if_true, value_if_false) von MySQL wählt einen von zwei Werten. Verwenden Sie EXISTS als seine Bedingung, um ein lesbares Ergebnis für die ID 4 zurückzugeben: IF() ist nützlich, wenn eine Abfrage direkt eine Bezeichnung oder einen anderen Wert zurückgeben soll; es ändert nicht, welche Zeilen ausgewählt werden, es sei denn, sein Ergebnis wird in einer Filterbedingung verwendet. Die beiden Ergebnisargumente können Zeichenketten, Zahlen oder andere kompatible Ausdrücke sein.
SELECT IF(EXISTS (SELECT 1 FROM student_details WHERE stu_id = 4), 'Yes, exists', 'No, does not exist') AS RESULT;
Mit der Beispielzeile für die ID 4 ist RESULT gleich Yes, exists. Ändern Sie für eine fehlende ID wie 11 die Bedingung in stu_id = 11; RESULT ist dann No, does not exist. Diese erwarteten Werte folgen aus den Beispielzeilen und der Ausdruckssemantik von MySQL; die SQLite-Demonstration führt die Funktion IF() von MySQL nicht aus.
RESULT ist ein Spaltenalias, der den zurückgegebenen Wert kennzeichnet. Ändern Sie die Bedingung WHERE der Unterabfrage, um eine andere ID oder ein anderes Kriterium zu prüfen, und verwenden Sie Spaltennamen, die zu Ihrer Tabelle passen. Untersuchen Sie bei einer größeren Abfrage ihren Ausführungsplan und messen Sie sie mit Ihren Daten und Indizes. Die Kosten hängen von der Abfrage und dem Schema ab, daher gibt es keine allgemeine Regel, dass EXISTS immer langsam ist oder für jede äußere Zeile auf eine feste Weise erneut ausgeführt werden muss.