Unterabfrage gibt eine Tabelle zurück

Und schließlich besteht die dritte Option darin, dass die Unterabfrage die gesamte Tabelle zurückgibt. Dies ist die häufigste Option.

Sehr oft gibt es Situationen, in denen wir eine bestimmte Tabelle ein wenig optimieren möchten. Und erst dann (mit dem JOIN ON-Operator) die korrigierte Tabelle mit einer anderen verknüpfen.

Beginnen wir mit dem einfachsten Fall, bei dem wir zwei Tabellen mit einem JOIN verbunden haben:

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

Und wie Sie sich wahrscheinlich erinnern, gibt es in der Aufgabentabelle Aufgaben , die niemandem zugewiesen sind: Employee_id ist NULL .

Lassen Sie uns eine korrigierte Tabelle erstellen , in der wir alle hängenden Aufgaben dem Regisseur zuweisen (seine ID = 4).

Dazu verwenden wir die Funktion IFNULL() :

SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task 

Und das Ergebnis dieser Abfrage:

Ausweis Angestellten ID Name Termin
1 1 Beheben Sie einen Fehler im Frontend 01.06.2022
2 2 Beheben Sie einen Fehler im Backend 15.06.2022
3 5 Kaffee kaufen 01.07.2022
4 5 Kaffee kaufen 01.08.2022
5 5 Kaffee kaufen 01.09.2022
6 4 Räumen Sie das Büro auf (NULL)
7 4 Das Leben genießen (NULL)
8 6 Das Leben genießen (NULL)

Die korrigierte Zelle ist rot markiert.

Ersetzen wir nun unsere korrigierte Tabelle in der Abfrage:

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

Anstelle der Aufgabentabelle .

Eine solche Anfrage würde etwa so aussehen:

SELECT * FROM employee e JOIN ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
 	FROM task 
) t ON e.id = t.emploee_id

Anstelle des Wortes task haben wir Klammern geschrieben und den Anforderungstext darin platziert.

Der Alias ​​t (Alias) für die verschachtelte Abfrage war übrigens sehr nützlich. Eine verschachtelte Abfrage hat im Gegensatz zu einer Tabelle keinen eigenen Namen, daher ist der Alias ​​sehr fehl am Platz.

Und hier ist das Ergebnis einer solchen Abfrage:

Ausweis Name Beruf Gehalt Alter Beitrittsdatum Ausweis Angestellten ID Name
1 Iwanow Iwan Programmierer 100000 25 30.06.2012 1 1 Beheben Sie einen Fehler im Frontend
2 Petrov Petr Programmierer 80000 23 12.08.2013 2 2 Beheben Sie einen Fehler im Backend
4 Rabinovich Moisha Direktor 200000 35 12.05.2015 6 4 Räumen Sie das Büro auf
4 Rabinovich Moisha Direktor 200000 35 12.05.2015 7 4 Das Leben genießen
5 Kirienko Anastasia Büroleiter 40000 25 10.10.2015 4 5 Kaffee kaufen
5 Kirienko Anastasia Büroleiter 40000 25 10.10.2015 5 5 Kaffee kaufen
5 Kirienko Anastasia Büroleiter 40000 25 10.10.2015 3 5 Kaffee kaufen
6 Vaska Der Kater 1000 3 11.11.2018 8 6 Das Leben genießen

Unser Direktor hat die Aufgabe, „das Büro aufzuräumen“, ich denke, er wird schnell jemanden finden, an den er es delegieren kann :) Verwendung des WITH-Operators

Übrigens müssen Sie ab Version 8 von MySQL nicht mehr alle Ihre Unterabfragen direkt in die endgültige Abfrage einfügen. Sie können separat durchgeführt werden. Hierzu wird die WITH-Anweisung verwendet .

Sie können damit eine virtuelle Tabelle (benannte Abfrage) erstellen, deren Aussehen durch eine Vorlage vorgegeben wird:

WITH Name AS (request) 

Es kommt häufig vor, dass Ihre Unterabfrage unbenannte Spalten wie COUNT(*) enthält, denen Sie keinen eindeutigen Namen zugewiesen haben. In diesem Fall bietet die WITH-Anweisung die Möglichkeit, neue Spaltennamen für die Unterabfrage anzugeben.

Seine zweite Form ist durch die Vorlage gegeben:

WITH Name(column1, column2, …) AS (request) 

Sie können beliebig viele virtuelle Tabellen (benannte Abfragen) verwenden und darin aufeinander verweisen. Die allgemeine Form Ihrer Anfrage sieht etwa so aus:

WITH name1 AS (request1),  
       	name2 AS (request2), 
       	name3 AS (request3) 
SELECT * FROM name1 JOIN name2 ON

Nehmen wir nun unsere gruselige Frage:

SELECT * FROM employee e JOIN ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline 
 	FROM task 
) t ON e.id = t.emploee_id  

Und schreiben Sie es mit der WITH-Anweisung um:

WITH task2(id, employee_id, name, deadline) 
   AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task) 
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id

Oder Sie können auf Spaltennamen verzichten, müssen dann aber einen Alias ​​für die Funktion IFNULL() angeben:

WITH task2 AS ( 
 	SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task 
) 
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id