Unterabfragen

Eine Unterabfrage (auch Subquery genannt) ist eine SQL-Abfrage, die innerhalb einer anderen Abfrage eingebettet ist. Unterabfragen können verwendet werden, um Daten zu filtern, berechnete Werte zurückzugeben oder Ergebnisse von einer Tabelle in einer anderen zu verwenden.

Unterabfragen sind ein mächtiges Werkzeug in SQLite, um komplexe Abfragen zu erstellen. Sie können an vielen Stellen (z. B. in WHERE, FROM und SELECT) verwendet werden, um dynamische Berechnungen oder Filter durchzuführen.

Es wird eine SQLite-Datenbank mit zwei Tabellen erstellen, die das Konzept veranschaulichen.

Beispiel-Datenbank: Mitarbeiter und Abteilungen

1. Erstellung der Tabellen

MYSQL/SQLite
-- Tabelle "Abteilungen"
CREATE TABLE Abteilungen (
    AbteilungsID INTEGER PRIMARY KEY,
    Name TEXT NOT NULL
);

-- Tabelle "Mitarbeiter"
CREATE TABLE Mitarbeiter (
    MitarbeiterID INTEGER PRIMARY KEY,
    Name TEXT NOT NULL,
    Gehalt INTEGER NOT NULL,
    AbteilungsID INTEGER,
    FOREIGN KEY (AbteilungsID) REFERENCES Abteilungen (AbteilungsID)
);

2. Einfügen von Daten

MYSQL/SQLite
-- Daten in "Abteilungen"
INSERT INTO Abteilungen (AbteilungsID, Name) VALUES
(1, 'Verkauf'),
(2, 'IT'),
(3, 'Marketing');

-- Daten in "Mitarbeiter"
INSERT INTO Mitarbeiter (MitarbeiterID, Name, Gehalt, AbteilungsID) VALUES
(1, 'Alice', 5000, 1),
(2, 'Bob', 4500, 2),
(3, 'Charlie', 7000, 2),
(4, 'Diana', 6000, 3),
(5, 'Eve', 4000, 1);

Unterabfragen in SQLite

Beispiel 1: Einfache Unterabfrage

Finde die Namen der Mitarbeiter, deren Gehalt über dem Durchschnittsgehalt aller Mitarbeiter liegt.

MYSQL/SQLite
-- Durchschnittsgehalt berechnen und mit dem Gehalt der Mitarbeiter vergleichen
SELECT Name
FROM Mitarbeiter
WHERE Gehalt > (SELECT AVG(Gehalt) FROM Mitarbeiter);

Erklärung:

  1. Die Unterabfrage (SELECT AVG(Gehalt) FROM Mitarbeiter) berechnet das Durchschnittsgehalt.

  2. Die Hauptabfrage verwendet dieses Ergebnis, um Mitarbeiter zu finden, deren Gehalt höher ist.


Beispiel 2: Unterabfrage in der FROM-Klausel

Finde die Abteilungen und die Anzahl der Mitarbeiter in jeder Abteilung.

MYSQL/SQLite
-- Unterabfrage zählt Mitarbeiter pro Abteilung
SELECT A.Name AS Abteilung, M.MitarbeiterAnzahl
FROM Abteilungen A
JOIN (
    SELECT AbteilungsID, COUNT(*) AS MitarbeiterAnzahl
    FROM Mitarbeiter
    GROUP BY AbteilungsID
) M ON A.AbteilungsID = M.AbteilungsID;

Erklärung:

  1. Die Unterabfrage (SELECT AbteilungsID, COUNT(*) AS MitarbeiterAnzahl FROM Mitarbeiter GROUP BY AbteilungsID) zählt die Anzahl der Mitarbeiter in jeder Abteilung.

  2. Die Hauptabfrage verknüpft diese Ergebnisse mit der Tabelle Abteilungen, um den Namen der Abteilung anzuzeigen.


Beispiel 3: Prozentualer Anteil am Gesamten Gehalt

Berechne für jeden Mitarbeiter den prozentualen Anteil seines Gehalts am Gesamten Gehalt der Firma.

MYSQL/SQLite
-- Prozentualer Anteil wird mit einer Unterabfrage berechnet
SELECT Name AS Mitarbeiter,
       Gehalt,
       ROUND((Gehalt * 100.0) / (SELECT SUM(Gehalt) FROM Mitarbeiter), 2) AS ProzentualerAnteil
FROM Mitarbeiter;

Erklärung:

  1. Die Unterabfrage (SELECT SUM(Gehalt) FROM Mitarbeiter) berechnet die Gesamtsumme aller Gehälter in der Tabelle Mitarbeiter.

  2. Die Hauptabfrage teilt das Gehalt jedes Mitarbeiters durch die Gesamtsumme, multipliziert das Ergebnis mit 100, um den prozentualen Anteil zu berechnen.

  3. Mit ROUND(..., 2) wird das Ergebnis auf zwei Nachkommastellen gerundet.