Heim >Datenbank >MySQL-Tutorial >Fallanalyse von MySQL-Mehrtabellenabfragen
Verständnis des kartesischen Produkts
select id,department_name from employees,departments;#错的 select id,department_id,department_name from employees CROSS JOIN departments;#错的
Jeder Mitarbeiter und jede Abteilung wurden einmal abgeglichen (Anzahl der gefundenen Einträge = Anzahl der IDs * Anzahl der Abteilungen)
Fehlerursache: fehlende Verbindungsbedingungen
Schreiben Sie die Verbindungsbedingungen: Tabelle 1. Spalte = Tabelle 2. Spalte (wenn mehrere Tabellen verbunden sind, müssen mindestens n-1 Verbindungsbedingungen verwendet werden)
select id,employees.name,department_name from employees,departments WHERE employees.name = departments.name;
Hinweis: Wenn die Spalte angezeigt werden soll ist in Wenn die Namen in den abzufragenden Tabellen gleich sind, müssen Sie angeben, aus welcher Tabelle sie stammen, z. B.: Mitarbeiter.Name
Es wird empfohlen, anzugeben, welche Tabelleninformationen angezeigt werden, wenn mehrere Tabellen abgefragt werden (Optimierung)
Optimierung: Sie können es nach FROM einfügen. Verwenden Sie den Alias der Tabelle, aber sobald Sie den Alias verwenden, müssen Sie ihn in Zukunft verwenden.
Non-Equijoin:
select t1.id,t1.name,t2.grade from employees t1,departments t2 WHERE ti.salary BETWEEN t2.lowest_salary AND t2.highest_salary ;#非等值
ohne = Self-Join und Non-Self-Join
Selbstverknüpfung: Tabelle 1 verbindet sich selbst.
#显示员工(t1)和其管理者(t2)的基本信息 select t1.id,t1.name,t2.id,t2.name from employees t1,employees t2#一个表看作两个表 WHERE t1.manage_id = t2.id ;#自连接
Inner Join und Outer Join
Äußerer Join: Tabellen zusammenführen, die dieselbe Spalte enthalten, das Ergebnis Zusätzlich zu den Ergebnissen von inneren Verknüpfungen werden auch nicht übereinstimmende Zeilen abgefragt
Kategorien von äußeren Verknüpfungen: linke äußere Verknüpfung (mehr in der linken Tabelle, füllen rechts), rechter äußerer Join (mehr in der rechten Tabelle, links ausfüllen), vollständiger äußerer Join
Innere Verbindung: Siehe oben.
WHERE t1.department_id = t2.department_id(+)#左连接
SQL99: So verwenden Sie JOIN...ON
Innerer Join
select t1.id,t1.name,t2.department_name,t3.environment from employees t1 JOIN departments t2 ON t1.department_id = t2.department_id JOIN locations t3#加入第二个人表 ON t2.department_location = t3.department_location;
Linker äußerer Join: LEFT OUTER JOIN
Rechter äußerer Join: RIGHT OUTER JOIN
Vollständiger OUTER JOIN (nicht unterstützt von MySQL)
select t1.name,t2.department_name#左外连接 from employees t1 LEFT OUTER(可省略) JOIN departments t2 ON t1.department_id = t2.department_id;
Verwendung von UMION
SELECT colum... FROM table1 UNION (ALL) SELECT colum... FROM table2
UNION-Operator
Verwendung von zwei Abfrageergebnissen Union, Deduplizierung (geringe Effizienz)
UNION ALL-Operator ( empfohlen)
Vereinigung von zwei Abfrageergebnissen, ohne Deduplizierung (hohe Effizienz)
select t1.name,t2.department_name from employees t1 JOIN departments t2 ON t1.department_id = t2.department_id;Oben linkes Bild (linker äußerer Join):
select t1.name,t2.department_name from employees t1 LEFT JOIN departments t2 ON t1.department_id = t2.department_id;
Bild oben rechts (rechter äußerer Join):
select t1.name,t2.department_name from employees t1 RIGHT JOIN departments t2 ON t1.department_id = t2.department_id;
Bild Mitte links:
select t1.name,t2.department_name from employees t1 LEFT JOIN departments t2 ON t1.department_id = t2.department_id WHERE t2.department_id IS NULL;
Bild Mitte rechts:
select t1.name,t2.department_name from employees t1 RIGHT JOIN departments t2 ON t1.department_id = t2.department_id WHERE t1.department_id IS NULL;
Bild unten links (vollständiger Fremd-Join):
#方式一:左上图 UNION ALL 右中图 select t1.name,t2.department_name from employees t1 LEFT JOIN departments t2 ON t1.department_id = t2.department_id UNION ALL select t1.name,t2.department_name from employees t1 RIGHT JOIN departments t2 ON t1.department_id = t2.department_id WHERE t1.department_id IS NULL; #方式二:左中图 UNION ALL 右上图 select t1.name,t2.department_name from employees t1 LEFT JOIN departments t2 ON t1.department_id = t2.department_id WHERE t2.department_id IS NULL UNION ALL select t1.name,t2.department_name from employees t1 RIGHT JOIN departments t2 ON t1.department_id = t2.department_id;
Bild unten rechts:
#左中图 UNION ALL 右中图 select t1.name,t2.department_name from employees t1 LEFT JOIN departments t2 ON t1.department_id = t2.department_id WHERE t2.department_id IS NULL UNION ALL select t1.name,t2.department_name from employees t1 RIGHT JOIN departments t2 ON t1.department_id = t2.department_id WHERE t1.department_id IS NULL;
Neue Funktionen von SQL Syntax: Natürlicher Join USING (Feld mit demselben Namen), um Felder mit demselben Namen in der Tabelle automatisch zu verbinden
select t1.name,t2.department_name from employees t1 JOIN departments t2 ON t1.department_id = t2.department_id; 等价于 select t1.name,t2.department_name from employees t1 JOIN departments t2 USING(department_id);
Das obige ist der detaillierte Inhalt vonFallanalyse von MySQL-Mehrtabellenabfragen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!