Vergleich der Verwendung von EXISTS und IN in MySQL

Vergleich der Verwendung von EXISTS und IN in MySQL

1. Verwendung:

(1) EXISTS-Nutzung

Wählen Sie a.batchName,a.projectId aus ucsc_project_batch a, wo EXISTIERT (wählen Sie b.id aus ucsc_project b, wo a.projectId = b.id) 

Das obige SQL bedeutet: Fragen Sie die Felder batchName und projectId mit ucsc_project_batch als Haupttabelle ab, wobei das Feld projectId in der Tabelle ucsc_project vorhanden ist.

EXISTS führt eine Schleifenabfrageübereinstimmung für die äußere Tabelle ucsc_project_batch aus. Dabei ist es egal, was der Rückgabewert der Unterabfrage der inneren Tabelle ist, sondern nur, ob es einen Rückgabewert gibt. Wenn es einen Rückgabewert gibt, ist die Bedingung erfüllt, die Daten wurden erfolgreich abgeglichen und dem Abfrageergebnissatz hinzugefügt; wenn es keinen Rückgabewert gibt, ist die Bedingung falsch und die Daten werden verworfen.

Wenn wir beispielsweise das Abfragerückgabefeld der ersten Abfrage ändern, hat dies keine Auswirkungen auf das Abfrageergebnis der äußeren Abfrage:

Wählen Sie a.batchName,a.projectId aus ucsc_project_batch a, wo EXISTIERT (wählen Sie b.companyId,b.name aus ucsc_project b, wo a.projectId = b.id) 

(2) IN-Verwendung

Wählen Sie a.batchName,a.projectId aus ucsc_project_batch a, wobei a.projectId in (wählen Sie b.id aus ucsc_project b)

Das Abfrageergebnis des obigen SQL ist dasselbe wie das Ergebnis von EXISTS gerade, und die Bedeutung der Abfrage ist auch dieselbe.

2. Hinweis:

(1) Beim Schreiben von EXISTS muss darauf geachtet werden, dass die Bedingungsanweisung in der Unterabfrage grundsätzlich mit der Tabelle der äußeren Abfrage verknüpft sein muss. Andernfalls kann die Bedingung der Unterabfrage immer wahr oder immer falsch sein. Beim zyklischen Abgleichen der äußeren Abfragetabelle werden entweder alle Ergebnisse gefunden oder keines.

Wählen Sie a.batchName,a.projectId aus ucsc_project_batch a, wo EXISTIERT (wählen Sie b.id aus ucsc_project b)

Da beispielsweise in der obigen Schreibmethode die Tabelle ucsc_project Werte enthält, ist die Bedingung der Unterabfrage immer wahr. Wenn alle Daten von ucsc_project_batch in einer Schleife abgeglichen werden, kann dies erfolgreich erfolgen und das Abfrageergebnis werden zu den Daten der gesamten Tabelle ucsc_project_batch.

Wählen Sie a.batchName,a.projectId aus ucsc_project_batch a, wo EXISTIERT (wählen Sie b.id aus ucsc_project b, wo b.id null ist)

Auf diese Weise findet die Unterabfrage definitiv keine Ergebnisse, sodass die Bedingung der Unterabfrage falsch ist, die einzelnen Daten in der äußeren Abfrage nicht übereinstimmen und das gesamte Abfrageergebnis leer ist.

(2) Für die Anzahl der Parameter in der IN-Anweisung in MySQL gibt es keine Begrenzung. Für SQL-Anweisungen in MySQL gibt es jedoch eine Längenbeschränkung. Die maximale Länge der gesamten Anweisung beträgt 4 MB.

(3) Die Unterabfrageanweisung EXISTS kümmert sich nicht darum, was abgefragt wird, sondern nur darum, ob ein Ergebnissatz vorhanden ist. Wenn dies der Fall ist, kann die gesamte Unterabfrage als Anweisung mit einer wahren Bedingung betrachtet werden, andernfalls handelt es sich um eine Anweisung mit einer falschen Bedingung.

(4) Die IN-Anweisung kann für die Unterabfrage nur ein Feld zurückgeben, sonst wird ein Fehler gemeldet:

Wählen Sie a.batchName,a.projectId aus ucsc_project_batch a, wobei a.projectId in (wählen Sie b.id,b.companyId aus ucsc_project b)

[Err] 1241 - Operand sollte 1 Spalte(n) enthalten

3. Szenenauswahl

Wenn die äußere Abfragetabelle groß und die Unterabfragetabelle klein ist, wählen Sie „IN“ aus. Wenn die äußere Abfragetabelle klein und die Unterabfragetabelle groß ist, wählen Sie „EXISTS“ aus. Wenn die beiden Tabellen eine ähnliche Größe haben, sind sie ähnlich.

(1) Die SQL-Abfrage in IN wird nur einmal abgefragt, dann wird der Ergebnissatz in einer temporären Datei gespeichert und dann mit der SQL der äußeren Abfrage abgeglichen. Sowohl die äußere Abfrage als auch die Unterabfrage können Indizes verwenden.

Wählen Sie a.batchName,a.projectId aus ucsc_project_batch a, wobei a.projectId in (wählen Sie b.id aus ucsc_project b)

ist gleichbedeutend mit:

$ergebnis = [];
$ucsc_project_batch = "Wählen Sie einen Batchnamen und eine Projekt-ID aus ucsc_project_batch a";
$ucsc_project = "wähle b.id aus ucsc_project b";
für($i = 0;$i < $ucsc_project_batch .length;$i++){
 für($j = 0;$j < $ucsc_project.length;$j++){
  wenn($ucsc_project_batch[$i].projectId== $ucsc_project[$j].id){
   $result[] = $ucsc_project_batch[$i];
   brechen;
  }
 }
}

(2) EXISTS führt eine Schleife mit der externen Abfragetabelle ucsc_project_batch aus und führt ucsc_project_batch.length-mal aus. Die Unterabfrage kann den Index verwenden und die externe Abfrage durchsucht die gesamte Tabelle.

Wählen Sie a.batchName,a.projectId aus ucsc_project_batch a, wo EXISTIERT (wählen Sie b.id aus ucsc_project b, wo a.projectId = b.id)

ist gleichbedeutend mit:

$ergebnis = [];
$ucsc_project_batch = "Wählen Sie einen Batchnamen und eine Projekt-ID aus ucsc_project_batch a";
für ($i = 0; $i < $ucsc_project_batch . Länge; $i++) {
 if (exists($ucsc_project_batch [$i] . projectId)) {//Führen Sie select b.id from ucsc_project b aus, wobei a.projectId=b.id        
  $result[] = $ucsc_project_batch[$i];
 }
}

Durch die Analyse der beiden Pseudocodes können wir Folgendes erkennen: Wenn die Unterabfragetabelle groß ist, kann die Verwendung von EXISTS die Gesamtzahl der Schleifen effektiv reduzieren und so die Geschwindigkeit verbessern. Wenn die äußere Abfragetabelle groß ist, kann die Verwendung von IN die Schleifendurchquerung der äußeren Abfragetabelle effektiv reduzieren und so die Geschwindigkeit verbessern.

Zusammenfassen

Dies ist das Ende dieses Artikels über den Vergleich der Verwendung von EXISTS und IN in MySQL. Weitere relevante MySQL EXISTS- und IN-Vergleichsinhalte finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Grundlegende Verwendung von exists, in und any in MySQL
  • Einführung in die Verwendung und den Unterschied zwischen „in“ und „exists“ in MySQL
  • Vergleichende Analyse von IN und Exists in MySQL-Anweisungen
  • MySQL existiert und in detaillierter Erklärung und Unterschied
  • Zusammenfassung der Unterschiede zwischen In-Query und Exist-Query in MySQL
  • MYSQL IN- und EXISTS-Optimierungsbeispiele
  • mysql nicht drin, linker Join, IST NULL, EXISTIERT NICHT Effizienzproblem-Datensatz
  • Detaillierte Erklärung des Unterschieds zwischen in und exists in MySQL

<<:  jQuery verwendet das Canvas-Tag, um den Bestätigungscode zu zeichnen

>>:  Eine Zusammenfassung detaillierter Einblicke in den Import von CSS

Artikel empfehlen

Schritte zum Ändern des MySQL-Datenbankdatendateipfads unter Linux

Nach der Installation der MySQL-Datenbank mit der...

Lösen Sie das Problem der Verwendung des Swiper-Plugins in Vue

Da ich dieses Plugin beim Schreiben einer Demo ve...

Beispielcode zur Implementierung eines gepunkteten Rahmen-Scrolleffekts mit CSS

Wir sehen oft einen coolen Effekt, wenn die Maus ...

JavaScript erklärt die Kapselung und Verwendung von Zeitlupenanimationen

Durchführung von Prozessanalysen (1) Wie rufe ich...

Flex-Layout realisiert linken Textüberlauf und lässt rechte Textanpassung aus

Ich möchte eine Situation erreichen, in der die B...

Tastenkombinationsvorgang für SQL Server-Kommentare

Batchkommentare in SQL Server Batch-Annotation St...

Beschreibung der Standardtransaktionsisolationsebene von MySQL und Oracle

1. Transaktionsmerkmale (ACID) (1) Atomarität. Di...

Implementierung eines laufenden Springboot-Projekts mit Docker

Einführung: Die Konfiguration von Docker, auf dem...

Tutorial zur Installation von MySQL 5.7.9 mit RPM-Paket unter CentOS 7

Aufgezeichnetes MySQL 5.7.9-Installationstutorial...

So implementieren Sie verteilte Transaktionen in MySQL XA

Inhaltsverzeichnis Vorwort XA-Protokoll So implem...

Einfache Analyse von EffectList in React

Inhaltsverzeichnis EffectList-Sammlung Effektlist...