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
(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)
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) 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. 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:
|
>>: Detaillierte Erklärung der Kapselung und Verwendung der Vue-Bildvergrößerungskomponente
Vorwort Wenn Sie sich auf die Stelle eines Betrie...
In diesem Artikel wird der spezifische Code für V...
Bei der Installation der komprimierten Version vo...
Wir gehen davon aus, dass Sie ein linuxer sind, a...
1. Befehlseinführung nl (Anzahl der Zeilen) fügt ...
Inhaltsverzeichnis Vorwort 1. Weniger 2. Importie...
Vorwort Die erstmals in ES6 eingeführte „Destruct...
Bei Verwendung eines Cloud-Servers stellen wir ma...
Inhaltsverzeichnis 1. Problembeschreibung 2. Prob...
1. Vorbereitung Beispiel: Zwei Maschinen: 192.168...
Nginx ist ein leistungsstarker Website-Server und...
【Vorwort】 Die SMS-Funktion unseres Projekts beste...
Befehl „touch“ Es hat zwei Funktionen: Eine beste...
Befehl ausführen docker run -d --name consul -p 8...
In diesem Artikel wird der spezifische Code von n...