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
GO TO FULL VERSION