Heim > Datenbank > MySQL-Tutorial > Hauptteil

Was anstelle von in in MySQL verwendet werden soll

青灯夜游
Freigeben: 2022-06-16 17:03:57
Original
9081 Leute haben es durchsucht

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.

Was anstelle von in in MySQL verwendet werden soll

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);
Nach dem Login kopieren

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);
Nach dem Login kopieren
“ Sie können das beim Durchlaufen der Benutzertabelle überprüfen Bedingungsanweisung (wählen Sie * aus Benutzer aus, wobei Benutzer-ID = 0 ist), die Bedingungsanweisung gibt immer einen leeren Satz zurück, die Bedingung ist immer falsch, dann werden alle Datensätze in der Benutzertabelle verworfen Das Gegenteil von „existiert“, das heißt, wenn die Existiert-Bedingung eine Ergebnismenge zurückgibt, werden die Schleifendatensätze verworfen, andernfalls werden die Schleifendatensätze zur Ergebnismenge hinzugefügt

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 Abfrage

entspricht der Überlagerung mehrerer oder Bedingungen. Dies ist zum Beispiel die folgende Abfrage

rrree

ist äquivalent zu

select * from user where userId in (1, 2, 3);
Nach dem Login kopieren

nicht in ist das Gegenteil von in, wie folgt

select * from user where userId = 1 or userId = 2 or userId = 3;
Nach dem Login kopieren

ist äquivalent zu

select * from user where userId not in (1, 2, 3);
Nach dem Login kopieren
Im Allgemeinen besteht die Abfrage darin, zuerst die Datensätze der Unterabfragebedingungen aufzuzeichnen und sie alle zu finden Die Menge ist B mit insgesamt m Datensätzen. Dann wird die Ergebnismenge der Unterabfragebedingung in m zerlegt und dann werden m Abfragen ausgeführt. Es ist erwähnenswert, dass das von der Unterbedingung der Abfrage zurückgegebene Ergebnis vorhanden sein muss ist nur ein Feld, zum Beispiel

select * from user where userId != 1 and userId != 2 and userId != 3;
Nach dem Login kopieren

, aber nicht

select * from user where userId in (select id from B);
Nach dem Login kopieren

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);
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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

2:

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage