Detaillierte Erläuterung von MySQL-Abfragebeispielen für mehrere Tabellen [Linkabfrage, Unterabfrage usw.]

Detaillierte Erläuterung von MySQL-Abfragebeispielen für mehrere Tabellen [Linkabfrage, Unterabfrage usw.]

Dieser Artikel beschreibt MySQL-Mehrtabellenabfragen anhand von Beispielen. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Vorbereitung: Bereiten Sie zwei Tabellen vor, Abteilungstabelle (Abteilung) und Mitarbeitertabelle (Mitarbeiter)

Tabelle Abteilung erstellen(
Ich würde int,
Name varchar(20)
);
Tabelle „Mitarbeiter“ erstellen (
ID int Primärschlüssel auto_increment,
Name varchar(20),
Geschlecht enum('männlich','weiblich') nicht null Standard 'männlich',
Alter int,
dep_id int
);

#Daten in Abteilungswerte einfügen
(200,'Technologie'),
(201, „Humanressourcen“),
(202, „Verkäufe“),
(203,'Betrieb');
in Mitarbeiterwerte (Name, Geschlecht, Alter, Dep_ID) einfügen
('egon','männlich',18,200),
('alex','weiblich',48,201),
('wupeiqi','männlich',38,201),
('yuanhao','weiblich',28,202),
('nvshen','männlich',18,200),
('xiaomage','weiblich',18,204)
;

# Tabellenstruktur und Daten anzeigen mysql> desc department;
+----------+----------+------+-----+---------+---------+-----------+
| Feld | Typ | Null | Schlüssel | Standard | Extra |
+----------+----------+------+-----+---------+---------+-----------+
| Ich würde | int(11) | JA | | NULL | |
| Name | varchar(20) | JA | | NULL | |
+----------+----------+------+-----+---------+---------+-----------+
2 Reihen im Satz (0,19 Sek.)

mysql> desc Mitarbeiter;
+--------+-----------------------+------+-----+---------+----------------+
| Feld | Typ | Null | Schlüssel | Standard | Extra |
+--------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NEIN | PRI | NULL | auto_increment |
| Name | varchar(20) | JA | | NULL | |
| Geschlecht | enum('männlich','weiblich') | NEIN | | männlich | |
| Alter | int(11) | JA | | NULL | |
| dep_id | int(11) | JA | | NULL | |
+--------+-----------------------+------+-----+---------+----------------+
5 Zeilen im Satz (0,01 Sek.)

mysql> select * aus Abteilung;
+------+--------------+
| Ich würde | Name |
+------+--------------+
| 200 | Technologie |
| 201 | Personalwesen |
| 202 | Verkauf |
| 203 | Betrieb |
+------+--------------+
4 Reihen im Satz (0,02 Sek.)

mysql> wähle * vom Mitarbeiter aus;
+----+----------+--------+------+--------+
| ID | Name | Geschlecht | Alter | dep_id |
+----+----------+--------+------+--------+
| 1 | egon | männlich | 18 | 200 |
| 2 | Alex | weiblich | 48 | 201 |
| 3 | wupeiqi | männlich | 38 | 201 |
| 4 | yuanhao | weiblich | 28 | 202 |
| 5 | nvshen | männlich | 18 | 200 |
| 6 | xiaomage | weiblich | 18 | 204 |
+----+----------+--------+------+--------+
6 Zeilen im Satz (0,00 Sek.)

PS: Durch Beobachtung der beiden Tabellen wird festgestellt, dass die Abteilung mit der ID = 203 in der Abteilungstabelle keinen entsprechenden Mitarbeiter im Mitarbeiter hat, und es wird festgestellt, dass der Mitarbeiter mit der ID = 6 im Mitarbeiter keine entsprechende Beziehung in der Abteilungstabelle hat.

Eins-zu-viele-Tabellenverknüpfungsabfrage

SELECT-Feldliste
VON Tabelle1 INNER|LEFT|RIGHT JOIN Tabelle2
EIN Tabelle1.Feld = Tabelle2.Feld;

(1) Betrachten wir zunächst den ersten Fall einer Querverbindung : Es liegen keine Übereinstimmungsbedingungen vor. Erzeugt ein kartesisches Produkt. ---> Maximale Anzahl von Wiederholungen

mysql> wähle * von Mitarbeiter, Abteilung;
+----+----------+--------+------+--------+------+--------------+
| ID | Name | Geschlecht | Alter | dep_id | ID | Name |
+----+----------+--------+------+--------+------+--------------+
| 1 | egon | männlich | 18 | 200 | 200 | Technologie |
| 1 | egon | männlich | 18 | 200 | 201 | Personalwesen |
| 1 | egon | männlich | 18 | 200 | 202 | zu verkaufen |
| 1 | egon | männlich | 18 | 200 | 203 | Operationen |
| 2 | Alex | weiblich | 48 | 201 | 200 | Technologie |
| 2 | Alex | weiblich | 48 | 201 | 201 | Personalwesen |
| 2 | Alex | weiblich | 48 | 201 | 202 | Verkauf |
| 2 | Alex | weiblich | 48 | 201 | 203 | Operationen |
| 3 | wupeiqi | männlich | 38 | 201 | 200 | Technologie |
| 3 | wupeiqi | männlich | 38 | 201 | 201 | Personalwesen |
| 3 | wupeiqi | männlich | 38 | 201 | 202 | Verkauf |
| 3 | wupeiqi | männlich | 38 | 201 | 203 | Operationen |
| 4 | yuanhao | weiblich | 28 | 202 | 200 | Technologie |
| 4 | yuanhao | weiblich | 28 | 202 | 201 | Personalwesen |
| 4 | yuanhao | weiblich | 28 | 202 | 202 | Verkauf |
| 4 | yuanhao | weiblich | 28 | 202 | 203 | Operationen |
| 5 | nvshen | männlich | 18 | 200 | 200 | Technologie |
| 5 | nvshen | männlich | 18 | 200 | 201 | Personalwesen |
| 5 | nvshen | männlich | 18 | 200 | 202 | Verkauf |
| 5 | nvshen | männlich | 18 | 200 | 203 | Operationen |
| 6 | xiaomage | weiblich | 18 | 204 | 200 | Technologie |
| 6 | xiaomage | weiblich | 18 | 204 | 201 | Personalwesen |
| 6 | xiaomage | weiblich | 18 | 204 | 202 | Verkauf |
| 6 | xiaomage | weiblich | 18 | 204 | 203 | Operationen |

(2) Inner Join : Verbinde nur passende Zeilen, basierend auf beiden Seiten

#Suchen Sie die gemeinsamen Teile der beiden Tabellen, was dem Verwenden der Bedingungen zum Herausfiltern der übereinstimmenden Ergebnisse aus den kartesischen Produktergebnissen entspricht. #Abteilung hat nicht Abteilung 204, daher stimmen die Mitarbeiterinformationen zu Mitarbeiter 204 in der Mitarbeitertabelle nicht überein.mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;
+----+---------+------+--------+-----------+
| ID | Name | Alter | Geschlecht | Name |
+----+---------+------+--------+-----------+
| 1 | Egon | 18 | männlich | Technologie |
| 2 | Alex | 48 | weiblich | Personalwesen |
| 3 | wupeiqi | 38 | männlich | Personalwesen |
| 4 | yuanhao | 28 | weiblich | Verkauf |
| 5 | nvshen | 18 | männlich | Technologie |
+----+---------+------+--------+-----------+
5 Zeilen im Satz (0,00 Sek.)

#Das obige SQL entspricht MySQL> select employee.id,employee.name,employee.age,employee.sex,department.name from employee,department where employee.dep_id=department.id;

(3) Left Join des externen Links : Alle Datensätze in der linken Tabelle werden zuerst angezeigt

#Nehmen Sie die linke Tabelle als Standard, d. h. finden Sie alle Mitarbeiterinformationen, einschließlich der Mitarbeiter ohne Abteilungen. #Das Wesentliche ist: Addieren Sie die Ergebnisse links, aber nicht rechts, basierend auf dem inneren joinmysql> select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;
+----+----------+--------------+
| ID | Name | Abfahrtsname |
+----+----------+--------------+
| 1 | Egon | Technologie |
| 5 | nvshen | Technologie |
| 2 | Alex | Personalwesen |
| 3 | wupeiqi | Personalwesen |
| 4 | yuanhao | Verkauf |
| 6 | xiaomage | NULL |
+----+----------+--------------+
6 Zeilen im Satz (0,00 Sek.)

(4) Rechtsklick auf externen Link : Alle Datensätze der rechten Tabelle werden zuerst angezeigt.

#Suchen Sie basierend auf der rechten Tabelle alle Abteilungsinformationen, einschließlich der Abteilungen ohne Mitarbeiter. #Das Wesentliche ist: Addieren Sie die Ergebnisse auf der rechten Seite, aber nicht auf der linken Seite, basierend auf dem inneren joinmysql> select employee.id,employee.name,department.name as depart_name from employee right join department on employee.dep_id=department.id;
+------+---------+--------------+
| ID | Name | Abfahrtsname |
+------+---------+--------------+
| 1 | Egon | Technologie |
| 2 | Alex | Personalwesen |
| 3 | wupeiqi | Personalwesen |
| 4 | yuanhao | Verkauf |
| 5 | nvshen | Technologie |
| NULL | NULL | Operationen |
+------+---------+--------------+
6 Zeilen im Satz (0,00 Sek.)

(5) Vollständiger äußerer Join : Alle Datensätze der linken und rechten Tabelle anzeigen (Verständnis)

#Äußerer Join: Ergebnisse hinzufügen, die etwas auf der linken Seite, aber nicht auf der rechten Seite haben, und etwas auf der rechten Seite, aber nicht auf der linken Seite, basierend auf dem inneren Join.
#Hinweis: MySQL unterstützt keine vollständigen äußeren Verknüpfungen
#Hervorhebung: MySQL kann diese Methode verwenden, um indirekt einen vollständigen äußeren Join zu implementieren

Syntax: select * from employee left join department on employee.dep_id = department.id
Vereinigung alle
Wählen Sie * aus dem Mitarbeiterrecht „Abteilung beitreten“ auf employee.dep_id = department.id;

 mysql> select * from employee left join department on employee.dep_id = department.id
     Union
    Wählen Sie * aus dem Mitarbeiterrecht „Abteilung beitreten“ auf employee.dep_id = department.id
      ;
+------+----------+--------+------+--------+------+----------+--------------+
| ID | Name | Geschlecht | Alter | dep_id | ID | Name |
+------+----------+--------+------+--------+------+----------+--------------+
| 1 | egon | männlich | 18 | 200 | 200 | Technologie |
| 5 | nvshen | männlich | 18 | 200 | 200 | Technologie |
| 2 | Alex | weiblich | 48 | 201 | 201 | Personalwesen |
| 3 | wupeiqi | männlich | 38 | 201 | 201 | Personalwesen |
| 4 | yuanhao | weiblich | 28 | 202 | 202 | Verkauf |
| 6 | xiaomage | weiblich | 18 | 204 | NULL | NULL |
| NULL | NULL | NULL | NULL | NULL | 203 | Operationen |
+------+----------+--------+------+--------+------+----------+--------------+
7 Zeilen im Satz (0,01 Sek.)

#Beachten Sie den Unterschied zwischen Union und Union All: Union entfernt identische Datensätze

2. Fragen Sie die Verbindung ab, die die Bedingungen erfüllt

Fragen Sie die Mitarbeiter- und Abteilungstabellen mithilfe eines Inner Join ab. Der Wert des Altersfelds in der Mitarbeitertabelle muss größer als 25 sein, d. h. suchen Sie nach Mitarbeitern, die älter als 25 sind, und den Abteilungen, zu denen sie gehören.

Wählen Sie employee.name, department.name aus der inneren Mitarbeiter-Joinabteilung aus.
  auf employee.dep_id = department.id
  wenn Alter > 25;

3. Unterabfrage

#1: Eine Unterabfrage ist eine Abfrageanweisung, die in einer anderen Abfrageanweisung verschachtelt ist.
#2: Die Abfrageergebnisse der inneren Abfrageanweisung können Abfragebedingungen für die äußere Abfrageanweisung bereitstellen.
#3: Unterabfragen können Schlüsselwörter wie IN, NOT IN, ANY, ALL, EXISTS und NOT EXISTS enthalten
#4: Sie können auch Vergleichsoperatoren einschließen: =, !=, >, < usw.

(1) Unterabfrage mit dem Schlüsselwort in

#Fragen Sie die Abteilungsnamen mit einem Durchschnittsalter von über 25 Jahren ab. Wählen Sie ID und Name aus der Abteilung aus.
  wo id in
    (Wählen Sie dep_id aus der Mitarbeitergruppe nach dep_id mit einem Durchschnittsalter > 25);
# Zeigen Sie die Namen der Mitarbeiter der technischen Abteilung an. Wählen Sie den Namen des Mitarbeiters aus.
  wobei dep_id in
    (Wählen Sie die ID aus der Abteilung, deren Name „Technologie“ lautet);
#Sehen Sie sich die Abteilungsnamen mit weniger als 1 Person an. Wählen Sie den Namen aus der Abteilung aus.
  wo ich nicht drin bin
    (wählen Sie dep_id aus der Mitarbeitergruppe nach dep_id aus);

(2) Unterabfragen mit Vergleichsoperatoren

#Vergleichsoperatoren: =, !=, >, >=, <, <=, <>
#Fragen Sie den Namen und das Alter von Mitarbeitern ab, die älter sind als das Durchschnittsalter aller Mitarbeitermysql> select name,age from employee where age > (select avg(age) from employee);
+---------+------+
| Name | Alter |
+---------+------+
| Alex | 48 |
| 38 |
+---------+------+
#Fragen Sie den Namen und das Alter der Mitarbeiter ab, die älter sind als das Durchschnittsalter in der Abteilung

Ideen:

(1) Gruppieren Sie zunächst die Mitarbeiter in der Mitarbeitertabelle (employee) und fragen Sie die dep_id und das Durchschnittsalter ab.
(2) Verwenden Sie die Suchergebnisse als temporäre Tabelle und verwenden Sie dann die Dep_ID der temporären Tabelle und die Dep_ID des Mitarbeiters als Filterbedingungen, um einen inneren Join zwischen der Mitarbeitertabelle und der temporären Tabelle durchzuführen.
(3) Filtern Sie abschließend die Namen und das Alter der Mitarbeiter heraus, deren Alter über dem Durchschnittsalter liegt.

mysql> wähle t1.name,t1.age aus Mitarbeiter als t1
       innerer Join
      (wählen Sie dep_id,avg(age) als avg_age aus der Mitarbeitergruppe nach dep_id) als t2
      auf t1.dep_id = t2.dep_id
      wobei t1.Alter > t2.Durchschnittsalter;
+------+------+
| Name | Alter |
+------+------+
| Alex | 48 |

(3) Unterabfrage mit dem Schlüsselwort EXISTS

Das Schlüsselwort #EXISTS zeigt die Existenz an. Wenn das Schlüsselwort EXISTS verwendet wird, gibt die innere Abfrageanweisung die abgefragten Datensätze nicht zurück. Stattdessen wird ein wahrer oder falscher Wert zurückgegeben. Richtig oder falsch
#Wenn True zurückgegeben wird, führt die äußere Abfrageanweisung eine Abfrage aus. Wenn False zurückgegeben wird, führt die äußere Abfrageanweisung keine Abfrage aus. #Die Abteilungstabelle hat dept_id=203, True
mysql> select * from employee, wo vorhanden (select id from department, wo id=200);
+----+----------+--------+------+--------+
| ID | Name | Geschlecht | Alter | dep_id |
+----+----------+--------+------+--------+
| 1 | egon | männlich | 18 | 200 |
| 2 | Alex | weiblich | 48 | 201 |
| 3 | wupeiqi | männlich | 38 | 201 |
| 4 | yuanhao | weiblich | 28 | 202 |
| 5 | nvshen | männlich | 18 | 200 |
| 6 | xiaomage | weiblich | 18 | 204 |
+----+----------+--------+------+--------+
#Abteilungstabelle enthält dept_id=205, False
mysql> select * from employee, wo vorhanden (select id from department, wo id=204);
Leerer Satz (0,00 Sek.)

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „MySQL-Abfragekenntnisse“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „MySQL-Protokolloperationskenntnisse“, „Zusammenfassung der MySQL-Transaktionsoperationskenntnisse“, „MySQL-gespeicherte Prozedurkenntnisse“ und „Zusammenfassung der MySQL-Datenbanksperrenkenntnisse“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

Das könnte Sie auch interessieren:
  • Probleme und Lösungen bei Fehler 08001 bei der Verknüpfung mit MySQL in IDEA und keiner Tabellenanzeige nach erfolgreicher Verbindung
  • Nach der Installation von Navicat in MySQL wird 2059 angezeigt: Authentifizierungs-Plugin und Docker für lokale virtuelle Maschinen sowie Remote-Link-Server
  • Python pymysql Link Datenbankabfrageergebnisse in Dataframe-Instanz konvertiert
  • Beispieloperation MySQL Kurzlink
  • Zusammenfassung des Installationsprozesses von MySql 8.0.11 und der beim Verknüpfen mit Navicat aufgetretenen Probleme
  • Detaillierte Erklärung zur Verwendung von MySQL-Gruppenlinks
  • MySql verwendet Skip-Name-Resolve, um das Problem langsamer externer Netzwerkverbindungen des Clients zu lösen
  • So verwenden Sie einen SSH-Tunnel, um eine Verbindung zum MySQL-Server herzustellen
  • So zeigen Sie MySQL-Links an und löschen abnormale Links

<<:  Detailliertes Tutorial zum Kompilieren und Installieren von mysql8.0.29 in der LNMP-Umgebung von CentOS8

>>:  Detaillierte Erklärung der Kapselung und Verwendung der Vue-Bildvergrößerungskomponente

Artikel empfehlen

Zusammenfassung der 10 am häufigsten gestellten Fragen in Linux-Interviews

Vorwort Wenn Sie sich auf die Stelle eines Betrie...

Vue implementiert das Hinzufügen, Anzeigen und Löschen mehrerer Bilder

In diesem Artikel wird der spezifische Code für V...

So verwenden Sie den Linux-Befehl nl

1. Befehlseinführung nl (Anzahl der Zeilen) fügt ...

Detaillierte Erklärung der Destrukturierungszuweisungssyntax in Javascript

Vorwort Die erstmals in ES6 eingeführte „Destruct...

So deaktivieren Sie die Eslint-Erkennung in Vue (mehrere Methoden)

Inhaltsverzeichnis 1. Problembeschreibung 2. Prob...

CentOS 7.x-Bereitstellung von Master- und Slave-DNS-Servern

1. Vorbereitung Beispiel: Zwei Maschinen: 192.168...

Zusammenfassung der Linux-Befehle zur Dateiverzeichnisverwaltung

Befehl „touch“ Es hat zwei Funktionen: Eine beste...

Analyse des Consul-Konfigurationsprozesses für die Docker-Bereitstellung

Befehl ausführen docker run -d --name consul -p 8...

Natives JS zum Erzielen eines Puzzle-Effekts

In diesem Artikel wird der spezifische Code von n...