SQLite - UNIONS Klausel

Hallo, zukünftige Datenbank-Zauberer! Heute begeben wir uns auf eine aufregende Reise in die Welt von SQLite und erkunden die magische UNIONS Klausel. Als dein freundlicher Nachbarschafts-Computerlehrer werde ich dich Schritt für Schritt durch dieses Abenteuer führen. Also, hol dir deine virtuellen Zauberstäbe (Tastaturen) und los geht's!

SQLite - UNIONS Clause

Was ist ein UNION?

Stell dir vor, du hast zwei separate Listen deiner Lieblings-Eiscreme-Sorten - eine vom letzten Sommer und eine vom aktuellen Sommer. Was wäre, wenn du diese Listen zu einer super Liste aller deiner Lieblings-Sorten kombinieren möchtest? Das ist im Wesentlichen, was eine UNION in SQLite macht, aber mit Datenbanktabellen anstelle von Eiscreme-Sorten!

Eine UNION Klausel in SQLite ermöglicht es dir, die Resultatsätze von zwei oder mehr SELECT Anweisungen zu kombinieren. Es ist, als ob man eine große Party veranstaltet, bei der verschiedene Datengruppen miteinander vermischt und eine neue, größere Gruppe bilden.

Grundlegende Syntax

Die grundlegende Syntax einer UNION sieht so aus:

SELECT spalte1, spalte2, ... FROM tabelle1
UNION
SELECT spalte1, spalte2, ... FROM tabelle2;

Lassen wir das einmal auseinanderbrechen:

  1. Wir haben zwei SELECT Anweisungen.
  2. Jede SELECT Anweisung kann verschiedene Tabellen abfragen.
  3. Das UNION Schlüsselwort sitzt zwischen diesen Anweisungen und fungiert als Brücke.

Wichtige Regeln

Bevor wir uns Beispielen zuwenden, hier sind einige wichtige Regeln für die Verwendung von UNION:

  1. Die Anzahl und Reihenfolge der Spalten in allen SELECT Anweisungen müssen gleich sein.
  2. Die Datentypen der entsprechenden Spalten sollten kompatibel sein.
  3. Standardmäßig entfernt UNION doppelte Zeilen (wir werden später sehen, wie man das ändert).

UNION in Aktion

Lassen wir einige Beispieltabellen erstellen und die UNION in Aktion sehen!

-- Erstellen und füllen der 'employees' Tabelle
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
);

INSERT INTO employees (name, department) VALUES
('Alice', 'HR'),
('Bob', 'IT'),
('Charlie', 'Finance');

-- Erstellen und füllen der 'contractors' Tabelle
CREATE TABLE contractors (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
);

INSERT INTO contractors (name, department) VALUES
('David', 'Marketing'),
('Eve', 'IT'),
('Frank', 'HR');

Nun verwenden wir UNION, um diese Tabellen zu kombinieren:

SELECT name, department FROM employees
UNION
SELECT name, department FROM contractors;

Diese Abfrage wird folgendes zurückgeben:

Alice    HR
Bob      IT
Charlie  Finance
David    Marketing
Eve      IT
Frank    HR

Was ist hier passiert? Die UNION Klausel hat die Ergebnisse aus beiden Tabellen kombiniert und gibt uns eine vollständige Liste aller Mitarbeiter (Angestellte und Auftragnehmer) ohne Duplikate.

Die Magie der Deduplizierung

Hast du etwas Interessantes bemerkt? Obwohl wir zwei Personen im HR-Bereich (Alice und Frank) haben, erscheinen sie beide in unserem Ergebnis. Dies liegt daran, dass UNION automatisch doppelte Zeilen basierend auf allen Spaltenwerten entfernt.

Wenn wir jemanden mit exakt dem gleichen Namen und Departement in beiden Tabellen hätten, würde UNION sie nur einmal anzeigen. Zum Beispiel:

INSERT INTO contractors (name, department) VALUES ('Alice', 'HR');

SELECT name, department FROM employees
UNION
SELECT name, department FROM contractors;

Dies würde uns das gleiche Ergebnis wie zuvor geben, ohne eine zusätzliche 'Alice' im HR-Bereich.

Die UNION ALL Klausel

Manchmal möchte man alle Zeilen behalten, auch wenn sie Duplikate sind. Hier kommt UNION ALL ins Spiel. Es ist, als würde man dem Datenbank sagen: "Ich will jeden auf dieser Party, auch wenn sie ein Double haben!"

Lassen wir unsere vorherige Abfrage ändern:

SELECT name, department FROM employees
UNION ALL
SELECT name, department FROM contractors;

Jetzt erhalten wir:

Alice    HR
Bob      IT
Charlie  Finance
David    Marketing
Eve      IT
Frank    HR
Alice    HR

Siehst du, wie wir jetzt zwei Einträge für Alice im HR-Bereich haben? UNION ALL behält alle Zeilen bei, unabhängig von Dopplungen.

Praktische Anwendungen

UNION und UNION ALL sind nicht nur zum Spaß da - sie haben auch realweltliche Anwendungen! Hier sind einige Szenarien, in denen du sie verwenden könntest:

  1. Kombination von Daten aus mehreren Tabellen mit ähnlichen Strukturen (wie我们的 employees und contractors Beispiel).
  2. Erstellung von Berichten, die verschiedene Zeiträume oder Kategorien umfassen.
  3. Zusammenführen von Daten aus verschiedenen Datenbanken oder Datenquellen.

Schauen wir uns ein komplexeres Beispiel an. Stellen wir uns vor, wir betreiben ein Buchgeschäft und möchten alle Transaktionen sehen, sei es Käufe oder Rücksendungen:

-- Erstellen und füllen der 'purchases' Tabelle
CREATE TABLE purchases (
id INTEGER PRIMARY KEY,
book_title TEXT,
amount DECIMAL(10, 2),
transaction_date DATE
);

INSERT INTO purchases (book_title, amount, transaction_date) VALUES
('The Great Gatsby', 15.99, '2023-06-01'),
('To Kill a Mockingbird', 12.50, '2023-06-02'),
('1984', 10.99, '2023-06-03');

-- Erstellen und füllen der 'returns' Tabelle
CREATE TABLE returns (
id INTEGER PRIMARY KEY,
book_title TEXT,
amount DECIMAL(10, 2),
transaction_date DATE
);

INSERT INTO returns (book_title, amount, transaction_date) VALUES
('The Great Gatsby', -15.99, '2023-06-05'),
('Pride and Prejudice', -14.99, '2023-06-06');

-- Kombination von Käufen und Rücksendungen
SELECT book_title, amount, transaction_date, 'Purchase' as transaction_type
FROM purchases
UNION ALL
SELECT book_title, amount, transaction_date, 'Return' as transaction_type
FROM returns
ORDER BY transaction_date;

Diese Abfrage gibt uns:

The Great Gatsby       15.99   2023-06-01  Purchase
To Kill a Mockingbird  12.50   2023-06-02  Purchase
1984                   10.99   2023-06-03  Purchase
The Great Gatsby      -15.99   2023-06-05  Return
Pride and Prejudice   -14.99   2023-06-06  Return

Hier haben wir UNION ALL verwendet, um Käufe und Rücksendungen zu kombinieren, eine Spalte hinzugefügt, um zwischen Transaktionstypen zu unterscheiden, und die Ergebnisse nach Datum sortiert.

Tipps und Tricks

  1. Sortieren von Ergebnissen: Du kannst eine ORDER BY Klausel am Ende deiner UNION Abfrage hinzufügen, um die kombinierten Ergebnisse zu sortieren.

  2. Filtern von kombinierten Ergebnissen: Verwende eine WHERE Klausel in jeder SELECT Anweisung, um individuelle Tabellen zu filtern, oder wrappe deine UNION Abfrage in eine Unterabfrage und wende eine WHERE Klausel auf die kombinierten Ergebnisse an.

  3. Spaltenalias: Wenn deine Spalten in verschiedenen Tabellen unterschiedliche Namen haben, kannst du Aliase verwenden, um sie anzugleichen:

SELECT name AS person, department FROM employees
UNION
SELECT contractor_name AS person, dept AS department FROM contractors;
  1. Zusammenführen mehrerer Tabellen: Du bist nicht auf nur zwei Tabellen beschränkt - du kannst mehrere UNION oder UNION ALL Klauseln hintereinander ketten, um viele Tabellen zu kombinieren.

Häufige Methoden

Hier ist eine Tabelle, die die häufigen Methoden im Zusammenhang mit UNION in SQLite zusammenfasst:

Methode Beschreibung Beispiel
UNION Kombiniert die Ergebnisse von zwei oder mehr SELECT Anweisungen und entfernt Duplikate SELECT * FROM tabelle1 UNION SELECT * FROM tabelle2
UNION ALL Kombiniert die Ergebnisse von zwei oder mehr SELECT Anweisungen und behält alle Zeilen bei, einschließlich Duplikate SELECT * FROM tabelle1 UNION ALL SELECT * FROM tabelle2
ORDER BY Wird mit UNION verwendet, um die kombinierten Ergebnisse zu sortieren (SELECT * FROM tabelle1 UNION SELECT * FROM tabelle2) ORDER BY spalten_name
WHERE Wird in einzelnen SELECT Anweisungen verwendet, um Ergebnisse vor dem Zusammenführen zu filtern SELECT * FROM tabelle1 WHERE bedingung UNION SELECT * FROM tabelle2 WHERE bedingung

Und da hast du es, Leute! Du hast deine SQLite-Fähigkeiten durch das Beherrschen der UNION Klausel aufgestockt. Denke daran, Übung macht den Meister, also fürchte dich nicht, diese Abfragen mit deinen eigenen Datensätzen zu experimentieren. Viel Spaß beim Abfragen und möge deine UNIONs stets erfolgreich sein!

Credits: Image by storyset