Mit der MSSQL SELECT-Anweisung liest du Daten aus SQL Server: einzelne Spalten, gefilterte Zeilen oder zusammengefasste Ergebnisse. Die Syntax wirkt zunächst einfach. Entscheidend ist aber, wie WHERE, JOIN, GROUP BY und ORDER BY zusammenspielen. Dieser Leitfaden führt dich mit einem durchgehenden Beispieldatensatz von der ersten Abfrage bis zu typischen Fehlerquellen.
Die Beispiele verwenden Transact-SQL (T-SQL) und lassen sich etwa in SQL Server Management Studio (SSMS) oder Azure Data Studio ausführen. Du benötigst eine Verbindung zu einer SQL-Server-Datenbank, in der du temporäre Tabellen anlegen darfst. Die Übungsdaten bleiben in deiner Sitzung und ändern keine vorhandenen Anwendungstabellen.
MSSQL SELECT-Anweisung: Aufbau und Reihenfolge
Die einfachste Form nennt die gewünschten Spalten und die Datenquelle:
SELECT Vorname, Nachname
FROM #Mitarbeiter;
SELECT bestimmt die ausgegebenen Spalten; FROM bezeichnet die Tabelle oder eine andere Datenquelle. Viele Abfragen ergänzen weitere Klauseln. Ihre Schreibreihenfolge lautet:
SELECT Spalten
FROM Datenquelle
WHERE Bedingung
GROUP BY Gruppenspalten
HAVING Gruppenbedingung
ORDER BY Sortierspalten;
Nicht jede Klausel ist erforderlich. Wichtig: SQL Server verarbeitet die Abfrage logisch nicht in derselben Reihenfolge, in der du sie schreibst. Vereinfacht betrachtet kommen Datenquelle und Verknüpfungen vor WHERE, danach Gruppierung und HAVING, anschließend die ausgewählten Spalten und schließlich die Sortierung. Darum kannst du einen in SELECT vergebenen Spaltenalias normalerweise nicht bereits in WHERE verwenden.
Beispieldaten für alle SELECT-Abfragen vorbereiten
Führe den folgenden Block einmal vollständig in einem Abfragefenster aus. Lasse die Verbindung für die weiteren Beispiele offen: Lokale temporäre Tabellen mit # stehen nur in der betreffenden Sitzung zur Verfügung. Wenn du den Block erneut ausführst, werden lediglich diese beiden Übungstabellen neu erstellt.
IF OBJECT_ID('tempdb..#Mitarbeiter') IS NOT NULL
DROP TABLE #Mitarbeiter;
IF OBJECT_ID('tempdb..#Abteilungen') IS NOT NULL
DROP TABLE #Abteilungen;
CREATE TABLE #Abteilungen (
AbteilungID int PRIMARY KEY,
Abteilungsname nvarchar(50) NOT NULL
);
CREATE TABLE #Mitarbeiter (
MitarbeiterID int PRIMARY KEY,
Vorname nvarchar(50) NOT NULL,
Nachname nvarchar(50) NOT NULL,
AbteilungID int NULL,
Jahresgehalt decimal(10, 2) NOT NULL
);
INSERT INTO #Abteilungen (AbteilungID, Abteilungsname)
VALUES (10, N'IT'), (20, N'Vertrieb'), (30, N'Personal');
INSERT INTO #Mitarbeiter
(MitarbeiterID, Vorname, Nachname, AbteilungID, Jahresgehalt)
VALUES
(1, N'Anna', N'Weber', 10, 48000.00),
(2, N'Ben', N'Meier', 10, 55000.00),
(3, N'Clara', N'Schulz', 20, 62000.00),
(4, N'David', N'Özdemir', 20, 61000.00),
(5, N'Elena', N'Roth', NULL, 45000.00),
(6, N'Farid', N'Yilmaz', 10, 54000.00);
Das vorangestellte N kennzeichnet Unicode-Zeichenfolgen. Es ist hier insbesondere für Namen mit Umlauten sinnvoll. Die Personaltabelle enthält absichtlich einen Eintrag ohne Abteilungszuordnung; daran lässt sich der Umgang mit NULL zeigen.
Spalten auswählen: gezielt statt SELECT *
Für die erste Abfrage reichen zwei Spalten:
SELECT MitarbeiterID, Vorname, Nachname
FROM #Mitarbeiter;
Mit SELECT * erhältst du alle Spalten. Das ist beim Erkunden einer kleinen Übungstabelle praktisch, in Anwendungsabfragen aber oft ungenau: Es überträgt möglicherweise unnötige Daten und macht die Ausgabe anfällig für spätere Schemaänderungen. Gib daher die benötigten Spalten ausdrücklich an.
Ein Alias macht die Ergebnisüberschrift verständlicher, ohne den Spaltennamen in der Tabelle zu ändern:
SELECT Vorname,
Nachname,
Jahresgehalt AS GehaltProJahr
FROM #Mitarbeiter;
Mit WHERE Zeilen filtern
WHERE entscheidet, welche Zeilen vor einer möglichen Gruppierung berücksichtigt werden. Die folgende Abfrage liefert die drei Personen aus der IT-Abteilung:
SELECT Vorname, Nachname, Jahresgehalt
FROM #Mitarbeiter
WHERE AbteilungID = 10;
Bedingungen lassen sich verbinden. Klammern helfen, die beabsichtigte Logik deutlich zu machen:
SELECT Vorname, Nachname, Jahresgehalt
FROM #Mitarbeiter
WHERE AbteilungID = 10
AND Jahresgehalt >= 50000;
Das Ergebnis enthält Ben und Farid. Für Zeichenmuster verwendest du LIKE; % steht dabei für beliebig viele Zeichen:
SELECT Vorname, Nachname
FROM #Mitarbeiter
WHERE Nachname LIKE N'S%';
Hier passt Schulz. Ob Groß- und Kleinschreibung unterschieden werden, hängt von der verwendeten Kollation ab.
NULL richtig prüfen
NULL bedeutet, dass kein Wert vorliegt. Ein Vergleich mit = NULL liefert deshalb nicht die gesuchten Zeilen. Verwende IS NULL oder IS NOT NULL:
SELECT Vorname, Nachname
FROM #Mitarbeiter
WHERE AbteilungID IS NULL;
Die Abfrage findet Elena. Dieser Unterschied ist besonders wichtig, wenn du später Tabellen miteinander verbindest.
MSSQL SELECT-Anweisung mit ORDER BY sortieren
Ohne ORDER BY ist die Reihenfolge der Ergebniszeilen nicht garantiert. ASC sortiert aufsteigend, DESC absteigend. Für ein stabiles Ergebnis ist eine zusätzliche eindeutige Spalte hilfreich:
SELECT MitarbeiterID, Vorname, Nachname
FROM #Mitarbeiter
ORDER BY Nachname ASC, MitarbeiterID ASC;
Die Sortierung erfolgt zuerst nach Nachname und bei gleichen Nachnamen nach MitarbeiterID. Die Microsoft-Dokumentation zu ORDER BY beschreibt auch die Einschränkungen bei Unterabfragen und Views.
TOP und OFFSET/FETCH: Ergebnisse begrenzen
Wenn du nur die drei höchsten Gehälter sehen möchtest, kombiniere TOP mit einer passenden Sortierung:
SELECT TOP (3) MitarbeiterID, Vorname, Nachname, Jahresgehalt