In MySQL wird „exists“ anstelle von „in“ verwendet. Bei jeder Abfrage wird die bedingte Anweisung von „exists“ auf die Datensatzzeile überprüft und die aktuelle Schleife wird zurückgegeben.
Die Betriebsumgebung dieses Tutorials: Windows7-System, MySQL8-Version, Dell G3-Computer.
exists verwendet eine Schleife, um die externe Tabelle einzeln abzufragen. Bei jeder Abfrage wird die bedingte Anweisung in „exists“ überprüft (unabhängig davon, wie viele Datensatzzeilen vorhanden sind). zurückgegeben), die Bedingung ist wahr und gibt den Datensatz zurück, zu dem derzeit eine Schleife ausgeführt wird. Wenn die bedingte Anweisung in „exits“ die Datensatzzeile nicht zurückgeben kann, wird der Datensatz, zu dem derzeit eine Schleife ausgeführt wird, verworfen ist wahr, wenn die Ergebnismenge zurückgegeben werden kann. Die zurückgegebene Ergebnismenge ist wie folgt falsch:
select * from user where exists (select 1);
entfernt die Datensätze der Benutzertabelle einzeln, da „select 1“ in der Unterbedingung immer einen Datensatz zurückgeben kann Zeilen werden alle Datensätze der Benutzertabelle zum Ergebnissatz hinzugefügt, es ist also dasselbe wie „select * from user“ und wie folgt: „
select * from user where exists (select * from user where userId = 0);
Im Allgemeinen gilt: Wenn Tabelle A n Datensätze enthält, dann existiert sie Die Abfrage besteht darin, diese n Datensätze einzeln herauszunehmen und dann die vorhandene Bedingung n-mal zu beurteilen.
in der Abfrageentspricht der Überlagerung mehrerer oder Bedingungen. Dies ist zum Beispiel die folgende Abfrage
rrreeist äquivalent zu
select * from user where userId in (1, 2, 3);
nicht in ist das Gegenteil von in, wie folgt
select * from user where userId = 1 or userId = 2 or userId = 3;
ist äquivalent zu select * from user where userId not in (1, 2, 3);
select * from user where userId != 1 and userId != 2 and userId != 3;
, aber nicht
select * from user where userId in (select id from B);
und exist hat diese Einschränkung nicht
Betrachten wir die Leistung von „exists“ und „in“
Betrachten Sie die folgende SQL-Anweisung
1: Wählen Sie * aus A aus, wobei existiert ( select * from B where B.id = A.id);
2: select * from A where A.id in (select id from B);
Abfrage 1. Sie können den folgenden Pseudocode zum leichteren Verständnis konvertieren
select * from user where userId in (select id, age from B);
Das ist alles. Das bedeutet tatsächlich, dass Abfrage 1 hauptsächlich den Index von Tabelle B verwendet. Wie Tabelle A wenig Einfluss auf die Effizienz der Abfrage hat
Angenommen, alle IDs von Tabelle B sind 1, 2, 3, Abfrage 2 kann in
for ($i = 0; $i < count(A); $i++) { $a = get_record(A, $i); #从A表逐条获取记录 if (B.id = $a[id]) #如果子条件成立 $result[] = $a; } return $result;
umgewandelt werden. Dies ist leicht zu verstehen. Der Index von A wird hier hauptsächlich verwendet, da Tabelle B nur geringe Auswirkungen auf die Abfrage hat. Schauen wir uns „nicht vorhanden“ und „nicht in“ an . wähle * aus A, wo nicht vorhanden (wähle * aus B, wo B.id = A.id);
2 von B);
Siehe Abfrage 1. Immer noch das Gleiche wie oben, unter Verwendung des Index von B
Und für Abfrage 2 kann es in die folgende Anweisung umgewandelt werden
select * from A where A.id = 1 or A.id = 2 or A.id = 3;
Sie können wissen, dass nicht in ist Eine Bereichsabfrage. Diese Art von != Bereichsabfrage kann keinen Index verwenden, was der Aussage A entspricht. Jeder Datensatz in der Tabelle muss einmal in Tabelle B durchlaufen werden, um zu überprüfen, ob der Datensatz in Tabelle B vorhanden ist. Daher ist nicht vorhanden mehr effizienter als nicht in. Die in-Anweisung in MySQL ist eine Hash-Verbindung zwischen der äußeren Tabelle und der inneren Tabelle, und die exist-Anweisung führt eine Schleife für die externe Tabelle aus und fragt die interne Tabelle jedes Mal ab, wenn die Schleife wiederholt wird. Jeder hat immer geglaubt, dass „existiert“ effizienter ist als die „in“-Anweisung. Diese Aussage ist tatsächlich ungenau. Dies hängt von der Umgebung ab.
Wenn die beiden abgefragten Tabellen eine ähnliche Größe haben, gibt es keinen großen Unterschied zwischen der Verwendung von „in“ und „exists“
.select * from A where not exists (select * from B where B.id = A.id);
2. select * from A where A.id not in (select id from B);
Wenn eine der beiden Tabellen kleiner und die andere eine große Tabelle ist, besteht die Verwendung für die größere Unterabfragetabelle und für die kleinere Unterabfragetabelle:
Zum Beispiel: Tabelle A (kleine Tabelle), Tabelle B (große Tabelle). )
1:
select * from A where cc in (select cc from B) ist ineffizient und verwendet den Index der cc-Spalte in Tabelle A;
select * from A where exist(select cc from B where cc= A. cc) ist hocheffizient und verwendet den Index der cc-Spalte in Tabelle B.
Das Gegenteil
select * from B where cc in (select cc from A) ist hocheffizient und verwendet den Index der cc-Spalte in der B-Tabelle;
select * from B where exist(select cc von A (wobei cc=B.cc) ist ineffizient und verwendet den Index der cc-Spalte in Tabelle A. not in und not exist Wenn die Abfrageanweisung not in verwendet, wird die gesamte Tabelle sowohl auf der inneren als auch auf der äußeren Tabelle gescannt, während die Unterabfrage von not extsts weiterhin den Index auf der Tabelle verwenden kann.Egal, welche Tabelle groß ist, die Verwendung von „not exist“ ist schneller als „not in“
. Der Unterschied zwischen in und = select name from student where name in ('zhang','wang','li','zhao'); und select name from student where name='zhang' oder Die Ergebnisse von name='li' oder name='wang' oder name='zhao' sind die gleichen.Empfohlenes Tutorial: MySQL-Video-Tutorial
Das obige ist der detaillierte Inhalt vonWas anstelle von in in MySQL verwendet werden soll. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!