Heim  >  Artikel  >  Datenbank  >  Fallanalyse von MySQL-Mehrtabellenabfragen

Fallanalyse von MySQL-Mehrtabellenabfragen

WBOY
WBOYnach vorne
2023-05-27 10:52:061542Durchsuche

Mehrtabellenabfrage

Fallbeschreibung

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

Lösung zum kartesischen Produkt

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.

Klassifizierung von Abfragen mit mehreren Tabellen

Äquivalenter Join: der oben genannte mit =

  • 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

Non-Self-Link: Tabelle 1 und Tabelle 2 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

Inner Join: Tabellen zusammenführen, die dieselbe Spalte enthalten. Das Ergebnis enthält keine Zeilen, die nicht mit einer Tabelle mit einer anderen Tabelle übereinstimmen

  • Ä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

  • SQL92: Verwenden Sie (+), um eine Verbindung zu erstellen.

Innere Verbindung: Siehe oben.

Äußere Verbindung: Wenn die Daten in der linken Tabelle stimmen nicht überein, fügen Sie (+) zur rechten Tabelle hinzu; fügen Sie umgekehrt (+) zur linken Tabelle hinzu, aber MySQL unterstützt es nicht

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;

Äußerer Join

Verwenden Sie OUTER JOIN...ON...

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

  • Abfrageergebnisse zusammenführen
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)

  • 7 Arten von SQL JOINS-Implementierungen

Mittleres Bild (innerer Join):

select t1.name,t2.department_name
from employees t1 JOIN departments t2
ON t1.department_id = t2.department_id;
Fallanalyse von MySQL-MehrtabellenabfragenOben 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen