Ihre Tabelle kann doppelte Werte in einer Spalte enthalten und in bestimmten Szenarien müssen Sie nur eindeutige Datensätze aus der Tabelle abrufen.
Um die doppelten Datensätze für die mit der SELECT-Anweisung abgerufenen Daten zu entfernen, können Sie die DISTINCT-Klausel verwenden, wie in den folgenden Beispielen gezeigt.
Ein Beispiel für einfaches SELECT – DISTINCT
Im ersten Beispiel habe ich die DISTINCT-Klausel mit der SELECT-Anweisung verwendet, um nur eindeutige Namen aus unserer Demo-Tabelle sto_emp_salary_paid abzurufen. In dieser Tabelle werden die Gehälter der Mitarbeiter zusammen mit ihren Namen gespeichert. Es kommt also zu einem doppelten Vorkommen von Mitarbeiternamen in der Tabelle.
Durch Verwendung der DISTINCT-Klausel erhalten wir nur eindeutige Mitarbeiternamen:
Abfrage:
SELECT DISTINCT(emp_name) FROM sto_emp_salary_paid;
(Gilt für SQL Server und MySQL-Datenbanken)
Verwendung der WHERE-Klausel mit DISTINCT
In diesem Beispiel, habe ich die WHERE-Klausel mit der SELECT/DISTINCT-Anweisung verwendet, um nur die eindeutigen Mitarbeiter abzurufen, deren gezahltes Gehalt größer oder gleich 4500 ist. Siehe die Abfrage und die Ergebnismenge:
Abfrage:
1
2
3
|
SELECT DISTINCT(emp_name) FROM sto_emp_salary_paid
WHERE emp_sal_paid >= 4500;
|
Beispiel für die Funktion COUNT mit DISTINCT
Sie können auch die SQL-Funktion COUNT verwenden, um die Anzahl der Datensätze zu erhalten, wie mit der Klausel DISTINCT. Die Funktion gibt nur die Anzahl der Zeilen zurück, die nach der DISTINCT-Klausel zurückgegeben werden.
Für die Demo verwende ich die Tabelle employee, in der die Informationen über die Mitarbeiter gespeichert sind. In der Demo werden drei Abfragen wie folgt verwendet:
- Die erste Abfrage gibt den vollständigen Datensatz aus der Tabelle zurück
- Die zweite Abfrage ermittelt die Anzahl der Mitarbeiter mithilfe der ID (COUNT und DISTINCT)
- Während die dritte die eindeutigen Mitarbeiternamen mithilfe der Spalte emp_name zurückgibt.
Die drei Abfragen sind:
1
2
3
4
5
6
7
|
SELECT * FROM sto_employees;
SELECT COUNT(DISTINCT id) AS „Mitarbeiter insgesamt“ FROM sto_employees
SELECT COUNT(DISTINCT emp_name) AS „Eindeutige Mitarbeiternamen“ FROM sto_employees
|
Die DISTINCT-Klausel mit GROUP BY Beispiel
Die folgende Abfrage holt die Datensätze aus der gleichen Tabelle wie in den obigen Beispielen und gruppiert die Gehälter der Mitarbeiter. Dazu werden die GROUP BY- und DISTINCT-Klauseln wie folgt verwendet:
Die Abfrage:
1
2
3
|
SELECT DISTINCT(emp_name),emp_id, SUM(emp_sal_paid) As „Total Paid“ FROM sto_emp_salary_paid
GROUP BY emp_name,emp_id;
|
Der Datensatz für „Jimmy“ erscheint doppelt, da er zwei verschiedene IDs hat.
Verwendung der HAVING-Klausel mit DISTINCT
Wie bei der Verwendung der GROUP BY-Klausel mit DISTINCT können Sie auch die HAVING-Klausel zum Abrufen von Datensätzen hinzufügen. In der folgenden Abfrage wird die HAVING-Klausel im obigen Beispiel hinzugefügt und wir holen die Datensätze ab, deren SUMME größer als 5000 ist.
Die Abfrage:
1
2
3
4
5
|
SELECT DISTINCT(emp_name),emp_id, SUM(emp_sal_paid) As „Total Paid“ FROM sto_emp_salary_paid
GROUP BY emp_name,emp_id
HAVING SUM(emp_sal_paid) > 5000;
|
Die DISTINCT-Klausel mit ORDER BY Beispiel
Die SQL ORDER BY-Klausel kann mit der DISTINCT-Klausel zum Sortieren der Ergebnisse nach dem Entfernen doppelter Werte verwendet werden. Sehen Sie sich die Abfrage und die Ausgabe unten an:
1
2
3
|
SELECT DISTINCT(emp_name) FROM sto_emp_salary_paid
ORDER BY emp_name;
|
Das Ergebnis:
Verwendung mehrerer Spalten in der DISTINCT-Klausel
Sie können auch zwei oder mehr Spalten mit der SELECT – DISTINCT-Klausel angeben. Da unsere Beispieltabelle doppelte Werte für Mitarbeiter und deren IDs enthält, ist es gut zu sehen, wie die DISTINCT-Klausel die Datensätze unter Verwendung dieser beiden Spalten in einer einzigen Abfrage zurückgibt.
Um den Unterschied zu sehen, habe ich zunächst eine Abfrage mit DISTINCT (emp_name) geschrieben, die anschließend beide Spalten verwendet:
Die Abfrage:
1
2
3
4
5
6
7
8
9
|
SELECT DISTINCT emp_name FROM sto_emp_salary_paid
ORDER BY emp_name;
SELECT DISTINCT emp_name,emp_id FROM sto_emp_salary_paid
ORDER BY emp_name;
|
Die Ergebnisse für die vollständige Tabelle, die Abfragen DISTINCT emp_name und DISTINCT emp_name,emp_id: