Weiter zum Inhalt

SQL: Reporting und Analyse

Meistere SQL für Data Reporting und die tägliche Datenanalyse: Lerne, Daten zu selektieren, zu filtern und zu sortieren, Ausgaben anzupassen und aggregierte Daten aus einer Datenbank zu reporten!
Aktualisiert 18. Sept. 2026  · 15 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

In diesem Tutorial konzentrierst du dich auf ANSI (American National Standards Institute) SQL, das auf allen Datenbanken funktioniert – etwa Oracle, MySQL, Microsoft SQL Server und mehr! Starten wir mit einer Einführung in SQL (Structured Query Language) und warum Datenexpertinnen und -experten es brauchen.

SQL und Data Science

In diesem Teil siehst du, warum du als Data Scientist SQL lernen solltest. So hilft dir SQL in deiner Karriere:

  • SQL ist für die meisten Data-Science-Jobs gesetzt: Data Analyst, BI-Entwickler, Programmierer oder Datenbankentwickler. Mit SQL kommunizierst du mit der Datenbank und arbeitest direkt mit deinen Daten.
  • Wenn du Software wie Tableau oder andere Reporting- bzw. Visualisierungstools genutzt hast, kennst du die Verbindung zur Datenbank: Du ziehst Diagramme ins Dashboard, wählst Felder aus – der Rest läuft im Hintergrund. Dort sorgt SQL für die Interaktion mit der Datenbank. Mit SQL kannst du diese Schritte selbst übernehmen.
  • SQL funktioniert mit allen gängigen Programmiersprachen wie PHP oder Java. Du kannst Visualisierungen in Anwendungen integrieren oder Daten aus der Datenbank holen und in XML- oder JSON-Formate für Webservices oder APIs umwandeln.
  • Datenbanken haben sich mit Big Data stark weiterentwickelt. Neben klassischen, strukturierten Systemen gewinnen NoSQL-Datenbanken an Bedeutung. SQL-Kenntnisse bilden eine solide Basis, um zu verstehen, wann du relationale und wann NoSQL-Datenbanken einsetzt – und worin ihre Stärken liegen.

Als Nächstes bekommst du eine kurze Einführung in SQL und zentrale Datenbankbegriffe, damit du schneller produktiv wirst. Wenn du bereits weißt, was eine relationale Datenbank ist und was SQL macht, spring direkt zum Code.

Einführung in SQL und Datenbanken

Eine Datenbank ist eine organisierte Sammlung von Informationen. Zur Verwaltung nutzen wir Datenbankmanagementsysteme (DBMS). Ein DBMS speichert, liest und ändert Daten in Datenbanken auf Anfrage.

Es gibt verschiedene Datenbanktypen: hierarchische, Netzwerk-, relationale und heute auch NoSQL-Datenbanken. Eine relationale Datenbank besteht aus Relationen, also zweidimensionalen Tabellen.

sample relational database

Wichtige Begriffe im RDBMS:

Begriff Beschreibung
Tabelle Die grundlegende Speicherstruktur eines RDBMS. Eine Tabelle hält alle relevanten Daten zu einem Objekt aus der realen Welt. Beispiel: Mitarbeitende.
Zeile oder Tupel Repräsentiert alle Daten zu einer bestimmten Person. Jede Zeile kann über einen Primärschlüssel identifiziert werden, der Duplikate verhindert.
Spalte oder Attribut Bezeichnet typischerweise ein Merkmal einer Entität.
Primärschlüssel Ein Feld, das eine Zeile eindeutig identifiziert.
Fremdschlüssel Eine Spalte, die die Beziehung zwischen Tabellen herstellt. Ein Fremdschlüssel verweist auf einen Primärschlüssel in einer anderen Tabelle.

Mehrere Tabellen lassen sich über Primär- und Fremdschlüssel verknüpfen. Jede Zeile in einer relationalen Datenbank ist über einen Primärschlüssel (PK) eindeutig. Mit einem Fremdschlüssel (FK) verweist du auf eine andere Tabelle. Beispiel:

multiple tables

Auf relationale Datenbanken greifst du mit der Structured Query Language, kurz SQL, zu. Jede Datenbank unterstützt den ANSI-Standard, ergänzt aber oft eigene Syntax-Erweiterungen. In diesem Tutorial lernst du ANSI SQL, damit du mit allen gängigen Systemen arbeiten kannst. ANSI SQL lässt sich in fünf Bereiche gliedern; für uns sind hier vor allem Datenabfrage und DML relevant:

  1. Datenabfrage:
    • SELECT.
  2. Data Manipulation Language (DML):
    • INSERT, UPDATE, DELETE, MERGE
  3. Data Definition Language (DDL):
    • CREATE, ALTER, DROP, RENAME, TRUNCATE.
  4. Data Control Language (DCL):
    • GRANT, REVOKE.
  5. Transaktionskontrolle:
    • COMMIT, ROLLBACK, SAVEPOINT.

Zu den verbreitetsten RDBMS-Anbietern zählen:

  • Oracle (Oracle Corporation)
  • Microsoft SQL Server (Microsoft)
  • MySQL (Oracle Corporation)
  • PostgreSQL (PostgreSQL Global Development Group)
  • SQLite (entwickelt von D. Richard Hipp)

Wo führst du SQL-Abfragen aus? Zum Beispiel:

  • In Reporting-Software, die Daten aus der Datenbank liest und anzeigt (z. B. Tableau, Microsoft BI)
  • In GUIs zur Datenbankadministration (z. B. TOAD, SQL Developer für Oracle, phpMyAdmin für MySQL)
  • In einer Konsolenoberfläche mit Direktzugriff auf die Datenbank (z. B. SQL*Plus für Oracle)

Mit Zugangsdaten kannst du Datenbankobjekte per Abfragen oder GUI deines Anbieters einsehen.

Das war’s mit der Einführung – legen wir los mit SQL!

SQL-Datentypen

Jede Spalte in einer Datenbank hat einen Namen, einen Datentyp und oft auch eine definierte Länge. Datenbankentwicklerinnen und -entwickler entscheiden anhand von Anforderungen und Datenvolumen, welcher Datentyp passt.

Als Data Scientist solltest du Datentypen kennen, um Funktionen korrekt anzuwenden und präzise Abfragen zu schreiben. Es gibt passende Datentypen für Namen, Fließtext, Zahlen, Bilder in der Datenbank und vieles mehr.

Hier siehst du grundlegende Datentypen für Oracle Server, SQL Server und MySQL:

servers

Weiterführende Infos:

SQL und Data Reporting

Für alle SQL-Beispiele in diesem Tutorial nutzen wir folgendes vereinfachtes Schema:

Es gibt zwei Tabellen: emp mit Mitarbeitendendaten und dept mit Informationen zu Abteilungen.

Die emp-Tabelle enthält Mitarbeitendennummer (empno), Name (ename), Gehalt (sal), Provision (comm), Stellenbezeichnung (job), Manager-ID (mgr), Einstellungsdatum (hiredate) und Abteilungsnummer (deptno). Da Manager ebenfalls Mitarbeitende sind, verweist mgr auf eine empno, deren job "MANAGER" ist.

Die dept-Tabelle enthält Abteilungsnummer (deptno), Abteilungsname (dname) und Standort (loc).

tables

Beachte: Unterschiedliche Datenbanken nutzen unterschiedliche Datumsformate. DD-MON-YY ist das Standardformat in Oracle. Microsoft SQL Server und MySQL verwenden standardmäßig YYYY-MM-DD.

Deine Tabellen können abweichen – passe dann lediglich Tabellen- und Spaltennamen an. In diesem Tutorial liest du nur Daten; du schreibst, aktualisierst oder erstellst keine Tabellen oder Objekte. Es gibt also kein Risiko für Datenänderungen.

Info: Ein Schema ist die Sammlung von Objekten wie Tabellen, Funktionen, Prozeduren und Views, die zu einem Benutzer gehören.

In unserem Schema siehst du: emp hat sechs Attribute für die Entität Employee, dept hat drei Attribute für Department.

Daten mit SELECT abfragen

Eine SELECT-Anweisung holt Informationen aus der Datenbank. Damit kannst du:

1. Projektion: Bestimme, welche Spalten eine Abfrage zurückgeben soll – so viele oder wenige, wie du brauchst.

2. Selektion: Lege fest, welche Zeilen aufgrund bestimmter Kriterien zurückgegeben werden.

3. Joins: Führe Daten aus mehreren Tabellen über Verknüpfungen zusammen.

Die Basis-SELECT-Anweisung gibt an, welche Spalten aus welcher Tabelle kommen. Die SELECT-Klausel enthält Spalten und Ausdrücke, FROM bestimmt die Tabelle(n).

Beispiel: Wie heißen alle Mitarbeitenden und welche Jobs haben sie? SELECT ename, job FROM employee; Auf Basis des oben beschriebenen Schemas ergibt sich etwa folgende Ausgabe:

ename job
A Salesman
B Manager
C Manager

Mit dem Sternchen * holst du alle Spalten und alle Zeilen:

SELECT *
FROM employee;
The output will be:

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

Tipps für SQL-Statements:

  • SQL ist nicht case-sensitiv.
  • Schreibe Klauseln in getrennten Zeilen für bessere Lesbarkeit.
  • Statements können ein- oder mehrzeilig sein.

Du kannst Ausdrücke mit +, -, /, * auf Datum und Zahlen bilden. Beispiel: Gefragt sind 20 % des Gehalts aller Mitarbeitenden:

SELECT ename, sal*(20/100)
FROM employee;
Output:

    ENAME      SAL*(20/100)
   ---------- ------------
    SMITH               160
    ALLEN               320
    WARD                250
    JONES               595
    BLAKE               570

Info:

  • Klammern erhöhen die Klarheit.
  • Division und Multiplikation haben Vorrang vor Addition und Subtraktion.
  • Bei gleichem Vorrang gilt Links-nach-Rechts.

NULL-Werte werden speziell behandelt: NULL bedeutet „unbekannt“. Jede Operation mit NULL liefert NULL. Unterschiedliche Datenbanken haben verschiedene Funktionen zum Umgang mit NULL. Eine verbreitete Funktion in MySQL, Microsoft SQL Server und Oracle ist:

SELECT ename, sal+COALESCE(comm,0)
FROM employee;
Output:

    ENAME      SAL+COALESCE(COMM,0)
---------- --------------------
    SMITH                       800
    ALLEN                      1900
    WARD                       1750
    JONES                      2975
    BLAKE                      2850

Spaltenaliase und Verkettung

Wie du oben siehst, entsprechen die Spaltennamen standardmäßig den Feldnamen oder Ausdrücken. Für Reports möchtest du oft eigene Überschriften vergeben – das geht mit Aliasen.

SELECT ename AS "Emp Name", sal*(20/100) as "20% of Salary"
FROM employee;
Output:

    Emp Name      20% of Salary
   ---------- ------------
    SMITH               160
    ALLEN               320
    WARD                250
    JONES               595
    BLAKE               570

Enthält ein Alias Leerzeichen, setze ihn in doppelte Anführungszeichen. Ansonsten sind sie nicht nötig; AS kann auch weggelassen werden.

Du kannst Ausgaben per Verkettung formatieren. Je nach Datenbank nutzt du CONCAT-Funktionen oder Operatoren wie || bzw. +:

  • Oracle unterstützt CONCAT() und ||, wobei CONCAT() nur zwei Argumente akzeptiert (bei Bedarf schachteln).
  • MySQL nutzt CONCAT().
  • Microsoft SQL Server nutzt den Operator + und CONCAT().

Oracle: SELECT '20% of salary of '||ename||' is '||sal*(20/100) as "20% of salary" FROM employee;

SELECT CONCAT(CONCAT('20% of salary of',ename),CONCAT(' is ',sal(20/100))) as "20% of salary" FROM employee; MySQL und Microsoft SQL Server: SELECT CONCAT('20% of salary of ',ename,' is ',sal(20/100)) as "20% of salary" FROM employee; Alle liefern dasselbe Ergebnis:

    20% of salary
-----------------------------------------------------------------------
    20% of salary of SMITH is 160
    20% of salary of ALLEN is 320
    20% of salary of WARD is 250
    20% of salary of JONES is 595
    20% of salary of BLAKE is 570

Doppelte Zeilen mit DISTINCT entfernen

SELECT deptno
FROM employee;
Above query will result in:


    DEPTNO
----------
        20
        30
        30
        20
        30

Hier wiederholen sich die Werte 20 und 30. Mit DISTINCT in der SELECT-Klausel entfernst du Duplikate.

SELECT distinct ename, deptno, job
FROM employee;



    DEPTNO
----------
        30
        20

Daten filtern und sortieren

Mit WHERE filterst du Daten per Bedingung.

Finde alle Mitarbeitenden mit dem Job CLERK:

SELECT ename, job
FROM employee
WHERE job='CLERK';
    ENAME      JOB
---------- ---------
    SMITH      CLERK

Du kannst verschiedene Bedingungen kombinieren – per Operatoren, Vergleichssymbole und Schlüsselwörter:

operators

Die Nutzung von =,<>,!=,>=,<=,>,< ist unkompliziert, wie im Beispiel mit = gezeigt.

AND & OR Syntax: SELECT column1, column2,.. FROM table_name WHERE condition1 AND condition2 AND condition 3...;

SELECT column1, column2,.. FROM table_name WHERE condition1 OR condition2 OR condition 3...; Finde Namen von Mitarbeitenden, deren Job MANAGER ist und die zur Abteilung 30 gehören:

SELECT ename
FROM employee
WHERE job='MANAGER' AND deptno=30;
    ENAME
    ----------
    BLAKE
SELECT ename
FROM employee
WHERE job='MANAGER' OR deptno=30;
    ENAME
    ----------
    ALLEN
    WARD
    JONES
    BLAKE

NOT-Syntax: SELECT column1, column2, ... FROM table_name WHERE NOT condition; Finde alle Mitarbeitenden, deren Job nicht SALESMAN ist:

SELECT ename, job
from employee
WHERE NOT job='SALESMAN';
    ENAME      JOB
    ---------- ---------
    SMITH      CLERK
    JONES      MANAGER
    BLAKE      MANAGER

Du kannst komplexe Bedingungen mit AND, OR und NOT kombinieren. Die Reihenfolge ist:

  1. NOT
  2. AND
  3. OR

Finde alle Mitarbeitenden, deren Job nicht CLERK ist und die zur Abteilung 20 gehören:

SELECT ename, job
from employee
WHERE NOT job='SALESMAN' AND sal>800;
    ENAME      JOB
    ---------- ---------
    JONES      MANAGER
    BLAKE      MANAGER

Hier wurde zuerst NOT, dann AND ausgewertet.

Weitere nützliche Operatoren:

BETWEEN...AND:

SELECT *
FROM employee
WHERE sal BETWEEN 1000 AND 2000;
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

LIKE:

LIKE verwendet zwei Wildcards: Prozentzeichen % und Unterstrich _ für Muster mit variabler Länge.

  1. % bedeutet beliebig viele Zeichen (auch 0)
    • %M%: Enthält irgendwo ein M
    • M%: Beginnt mit M
    • %M: Endet mit M
    • M%A: Beginnt mit M und endet mit A

Muster sind case-sensitiv.

  1. _ steht für die Anzahl unbekannter Zeichen vor/nach einem bekannten Zeichen. Ein Unterstrich = ein Zeichen.
    • _r%: r an zweiter Stelle.

Namen aller Mitarbeitenden, die mit „B“ beginnen:

SELECT *
FROM employee
WHERE ename LIKE 'B%';

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

Namen aller Mitarbeitenden, die mit „A“ beginnen und danach irgendwo ein „E“ enthalten:

SELECT *
FROM employee
WHERE ename LIKE 'A%E%';

        EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

IN(value1,value2, value3,..):

IN() akzeptiert einen oder mehrere Werte und vergleicht eine Spalte mit der Werteliste in Klammern in der WHERE-Klausel:

SELECT ename, job, hiredate
FROM employee
WHERE job IN ('CLERK','SALESMAN');
    ENAME      JOB       HIREDATE
    ---------- --------- ---------
    SMITH      CLERK     17-DEC-80
    ALLEN      SALESMAN  20-FEB-81
    WARD       SALESMAN  22-FEB-81

Du kannst in IN() auch eine SELECT-Anweisung verwenden, die Werte zurückliefert. Beispiel:

SELECT ename, job, hiredate
FROM employee
WHERE deptno IN (select deptno FROM department WHERE loc='CHICAGO');
    ENAME      JOB       HIREDATE
    ---------- --------- ---------
    ALLEN      SALESMAN  20-FEB-81
    WARD       SALESMAN  22-FEB-81
    BLAKE      MANAGER   01-MAY-81

Die SELECT-Anweisung in IN() nennt man auch Unterabfrage (Subquery). Mehr dazu später!

IS NULL:

Mit IS NULL prüfst du auf NULL-Werte in einer Spalte. Beispiel: Mitarbeitende ohne Provision:

SELECT ename, job, sal
FROM employee
WHERE comm IS NULL;
    ENAME      JOB              SAL
    ---------- --------- ----------
    SMITH      CLERK            800
    JONES      MANAGER         2975
    BLAKE      MANAGER         2850

Mit IS NOT NULL findest du Mitarbeitende mit Provision:

SELECT ename, job, sal, comm
FROM employee
WHERE comm IS NOT NULL;
    ENAME      JOB              SAL       COMM
    ---------- --------- ---------- ----------
    ALLEN      SALESMAN        1600        300
    WARD       SALESMAN        1250        500

Für Datumsvergleiche nutze das Standardformat der Datenbank. Für andere Formate brauchst du Datumsfunktionen (später mehr). Finde alle Mitarbeitenden, die nach dem 21. Februar 1981 eingestellt wurden:

(Hier mit Oracle-Standardformat)

SELECT ename, job, sal, comm
FROM employee
WHERE hiredate>'21-FEB-81';
    ENAME      JOB              SAL       COMM
    ---------- --------- ---------- ----------
    WARD       SALESMAN        1250        500
    JONES      MANAGER         2975
    BLAKE      MANAGER         2850

Komplexe Bedingungen sind durch Kombination aller obigen Operatoren möglich – achte dabei auf die Operatorrangfolge. Hier die Regeln nach Datenbank:

Zwei hilfreiche Funktionen für Bedingungen: ANY() und ALL(). Beispiel:

SELECT ename, job, sal, comm
FROM employee
WHERE deptno=ANY(SELECT deptno from dept WHERE loc='NEW YORK');
SELECT ename, job, sal, comm
FROM employee
WHERE deptno=ALL(SELECT deptno from dept WHERE dname='SALES');

Beachte die Nutzung von Subqueries – mehr dazu folgt.

Ergebnisse mit ORDER BY sortieren

Sortiere auf- (ASC) oder absteigend (DESC) nach einer oder mehreren Spalten. Du kannst auch nach Aliasen sortieren:

SELECT ename, job, sal, comm
FROM employee
WHERE hiredate>'21-FEB-81'
ORDER BY sal desc;
    ENAME      JOB              SAL       COMM
    ---------- --------- ---------- ----------
    JONES      MANAGER         2975
    BLAKE      MANAGER         2850
    WARD       SALESMAN        1250        500

Hinweis: Standard ist aufsteigend (ASC); das musst du nicht angeben.

SELECT ename, job, sal, comm
FROM employee
WHERE hiredate>'21-FEB-81'
ORDER BY sal;
    ENAME      JOB              SAL       COMM
    ---------- --------- ---------- ----------
    WARD       SALESMAN        1250        500
    BLAKE      MANAGER         2850
    JONES      MANAGER         2975

Mehrere Spalten in ORDER BY werden in der angegebenen Reihenfolge ausgewertet. Beispiel: zuerst nach deptno aufsteigend, dann nach Namen absteigend:

SELECT ename, job, sal, comm, deptno
FROM employee
WHERE hiredate>'21-FEB-81'
ORDER BY deptno ASC, ename DESC;
    ENAME      JOB              SAL       COMM     DEPTNO
    ---------- --------- ---------- ---------- ----------
    JONES      MANAGER         2975                    20
    WARD       SALESMAN        1250        500         30
    BLAKE      MANAGER         2850                    30

Einzeilige Funktionen zur Ausgabeformatierung

Alle RDBMS bieten zahlreiche Funktionen für Standardaufgaben wie String-Länge, String-Verkettung, Formatierungen, Mathematik usw. Es gibt zwei Arten von Zeilenfunktionen:

  • Einzeilige Funktionen
  • Mehrzeilige Funktionen

Einzeilige Funktionen:

Sie werden pro Zeile angewendet und liefern pro Zeile ein Ergebnis. CONCAT() ist z. B. eine Zeichenkettenfunktion. Du kannst sie in SELECT, WHERE und ORDER BY nutzen. Typische Kategorien in allen RDBMS:

  • Zeichenkettenfunktionen
  • Datums- und Zeitfunktionen
  • Zahlenfunktionen
  • Konvertierungsfunktionen

Die Funktionsnamen variieren je nach Datenbank, die Funktionalität ist ähnlich. Hier sind nützliche, weit verbreitete Funktionen in Microsoft SQL Server, Oracle und MySQL. Einige hast du oben schon gesehen. Am Ende dieses Abschnitts findest du Links zu vollständigen Listen für zusätzliche Übungen.

Gehen wir die Kategorien durch:

Zeichenkettenfunktionen

LOWER(): Wandelt einen String in Kleinbuchstaben.

SELECT lower(ename) as ename
FROM employee;
    ENAME
    ----------
    smith
    allen
    ward
    jones
    blake

UPPER(): Wandelt einen String in Großbuchstaben.

SELECT upper(ename) as ename
FROM employee;
    ENAME
    ----------
    SMITH
    ALLEN
    WARD
    JONES
    BLAKE

SUBSTR()[Oracle, MySQL]: Gibt einen Teilstring zurück: SUBSTR(string, Startposition, Länge)

SUBSTRING()[SQL Server]: Entspricht SUBSTRING(string, Startposition, Länge).

SELECT SUBSTR(ename,2,3) as substr_ename
FROM employee;

Für SQL Server den Funktionsnamen durch SUBSTRING ersetzen.

SUBSTR_ENAME
------------
MIT
LLE
ARD
ONE
LAK

LENGTH()[Oracle, MySQL]: Gibt die Länge des Strings zurück

LEN()[SQL Server]: Gibt die Länge des Strings zurück

SELECT LENGTH(ename) as len_ename
FROM employee;

Für SQL Server LENGTH durch LEN ersetzen.

     LEN_ENAME
    ----------
             5
             5
             4
             5
             5

Funktionen wie Padding links/rechts oder REPLACE unterscheiden sich in der Syntax je nach Datenbank. Listen der Zeichenkettenfunktionen:

Zahlenfunktionen

Funktionsname Funktion
ROUND(m,n): Rundet den Wert m auf n Dezimalstellen.
ABS(m,n): Liefert den Absolutwert einer Zahl.
FLOOR(n): Gibt die größte ganze Zahl ≤ n zurück.
MOD(m,n): Liefert den Rest von m geteilt durch n (in SQL Server stattdessen %: 35 % 6)

Oracle:

    SELECT ROUND(45.926,2),MOD(11,5),FLOOR(34.4),ABS(-24) from dual;

OUTPUT:

    ROUND(45.926,2)  MOD(11,5) FLOOR(34.4)   ABS(-24)
--------------- ---------- ----------- ----------
          45.93          1          34         24

MySQL:

    SELECT ROUND(45.926,2),MOD(11,5),FLOOR(34.4),ABS(-24);

SQL Server:

    SELECT ROUND(45.926,2) as round,11%5 as mod, FLOOR(34.4) as floor,ABS(-24) as abs;

Listen von Zahlenfunktionen:

Konvertierungsfunktionen

Konvertierungsfunktionen ändern Datentypen. Die konkreten Funktionen unterscheiden sich je nach Server. Beispiel für Oracle mit to_char, um die Ausgabe zu formatieren. Das Standarddatumsformat ist dort DD-MON-YY:

SELECT ename, to_char(hiredate,'DD, MONTH YYYY') as Hiredate, to_char(hiredate,'DY') as Day
from employee;
    ENAME      Hiredate                                     DAY
    ---------- -------------------------------------------- ------------
    SMITH      17,DECEMBER  1980                            WED
    ALLEN      20,FEBRUARY  1981                            FRI
    WARD       22,FEBRUARY  1981                            SUN
    JONES      02,APRIL     1981                            THU
    BLAKE      01,MAY       1981                            FRI

Es gibt viele Konvertierungsfunktionen pro Datenbank. Weitere Informationen:

Datums- und Zeitfunktionen

Damit addierst du Tage, berechnest Monate zwischen zwei Daten usw. – sehr nützlich im Reporting. Funktionsnamen variieren je nach System, die Aufgaben sind ähnlich. Hier ein Überblick und weiterführende Links zu Oracle, SQL Server und MySQL:

servers

SQL-Ergebnisse gruppieren

Gruppierungs- oder Mehrzeilenfunktionen arbeiten auf Gruppen und liefern je Gruppe ein Ergebnis. Du brauchst sie z. B. für: Umsatz pro Quartal, durchschnittliche Preise über Zeiträume, höchste Investition im Monat – und vieles mehr.

Aggregierte Daten mit Gruppenfunktionen reporten

Mit GROUP BY gruppierst du Ergebnisse – oft zusammen mit COUNT, MAX, MIN, AVG und SUM. Die Syntax:

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

Wichtige Punkte zu GROUP BY:

  • Aliase kannst du in GROUP BY nicht verwenden.
  • WHERE steht immer vor GROUP BY.
  • HAVING folgt auf GROUP BY und filtert über Gruppenergebnisse.
  • ORDER BY steht immer am Ende.

COUNT zählt Zeilen entsprechend einer Bedingung (oder aller Zeilen). NULL-Werte werden ignoriert.

Zähle alle Mitarbeitenden, deren Name mit „A“ beginnt:

SELECT count(ename)
FROM employee
WHERE ename LIKE 'A%';

Output:

COUNT(ENAME)
------------
           1

Gesamt-, Durchschnitts-, Minimal- und Maximalgehalt in employee:

SELECT sum(sal) as "TOTAL SAL", avg(sal) as "AVG SAL", min(sal) as "MIN SAL", max(sal) as "MAX SAL"
FROM employee;

     TOTAL SAL    AVG SAL    MIN SAL    MAX SAL
    ---------- ---------- ---------- ----------
      9475       1895        800       2975

Gruppiere das nach Abteilung:

SELECT sum(sal) as "TOTAL SAL", avg(sal) as "AVG SAL", min(sal) as "MIN SAL", max(sal) as "MAX SAL", deptno
FROM employee
GROUP BY deptno;
     TOTAL SAL    AVG SAL    MIN SAL    MAX SAL     DEPTNO
    ---------- ---------- ---------- ---------- ----------
      5700       1900       1250       2850         30
      3775     1887.5        800       2975         20

Varianz und Standardabweichung berechnest du mit:

Für Oracle und MySQL MS SQL Server
SELECT STDDEV(column_name) FROM table_name; SELECT STDEV(column_name) FROM table_name;
SELECT VARIANCE(column_name) FROM table_name; SELECT VAR(column_name) FROM table_name;

Du kannst nach mehreren Spalten gruppieren.

Summiere die Gehälter je Job innerhalb jeder Abteilung:

SELECT sum(sal) as "TOTAL SAL", deptno, job
FROM employee
GROUP BY deptno, job;

     TOTAL SAL     DEPTNO   JOB
    ---------- ---------- ---------
       800         20       CLERK
      2850         30       SALESMAN
      2975         20       MANAGER
      2850         30       MANAGER

Gruppenergebnisse schränkst du mit HAVING ein. Das gilt nur für Bedingungen auf Aggregaten.

Hinweis: Verwende für Bedingungen auf Aggregaten nicht WHERE.

SELECT sum(sal) as "TOTAL SAL", deptno, job
FROM employee
GROUP BY deptno, job
HAVING sum(sal)>1000
ORDER BY sum(sal);
    TOTAL SAL     DEPTNO    JOB
    ---------- ---------- ---------
      2850         30       SALESMAN
      2850         30       MANAGER
      2975         20       MANAGER

Daten aus mehreren Tabellen anzeigen

In diesem Abschnitt behandeln wir folgende Joins:

  • Kartesisches Produkt/CROSS JOIN
  • Inner Join/Equijoin
  • Natural Join
  • Outer Joins (Left, Right, Full)
  • Self Join

Für viele Reports brauchst du Daten aus mehreren Tabellen. Beispiel:

tables

Um so einen Report zu bauen, verknüpfst du employee und department. Dafür nutzt du Joins.

Kartesisches Produkt/Cross Join:

Das kartesische Produkt entsteht, wenn jedes Tupel aus Relation R mit jedem Tupel aus Relation S kombiniert wird.

cartesian product

Ein CROSS JOIN multipliziert zwei Tabellen zu allen möglichen Paaren. Hat R i Tupel mit m Attributen und S j Tupel mit n Attributen, hat das Produkt i×j Tupel mit m+n Attributen. Beispiel mit ANSI-konformem CROSS JOIN:

SELECT empno, ename, dname
FROM employee, department;

OR

SELECT empno, ename, dname
FROM employee CROSS JOIN department;
       EMPNO      ENAME      DNAME
    ---------- ---------- --------------
      7369        SMITH      ACCOUNTING
      7499        ALLEN      ACCOUNTING
      7521        WARD       ACCOUNTING
      7566        JONES      ACCOUNTING
      7698        BLAKE      ACCOUNTING
      7369        SMITH      RESEARCH
      7499        ALLEN      RESEARCH
      7521        WARD       RESEARCH
      7566        JONES      RESEARCH
      7698        BLAKE      RESEARCH
      7369        SMITH      SALES

     EMPNO        ENAME      DNAME
    ---------- ---------- --------------
      7499        ALLEN      SALES
      7521        WARD       SALES
      7566        JONES      SALES
      7698        BLAKE      SALES

15 Zeilen ausgewählt.

Da employee 5 und department 3 Zeilen hat, liefert das Produkt 5×3=15 Zeilen. Ein kartesisches Produkt entsteht, wenn:

  • keine Join-Bedingung vorhanden ist
  • die Join-Bedingung ungültig oder falsch formuliert ist

Benötigst du Daten aus mehreren Tabellen, definierst du eine Join-Bedingung über gemeinsame Attribute, meist Primär- und Fremdschlüssel.

Kartesische Produkte eignen sich u. a. zum Simulieren großer Datenmengen für Tests.

Inner Join/Equijoin:

Ein Inner Join (in Oracle oft „Equijoin“) nutzt Primär-/Fremdschlüsselbeziehungen, um Tabellen zu verbinden:

SELECT ename, dname
FROM employee e,department d
WHERE e.deptno=d.deptno;

OR

SELECT ename, dname
FROM employee e
JOIN department d
ON e.deptno=d.deptno;

    ENAME      DNAME
    ---------- --------------
    SMITH      RESEARCH
    ALLEN      SALES
    WARD       SALES
    JONES      RESEARCH
    BLAKE      SALES

Hier ist deptno Primärschlüssel in department und Fremdschlüssel in employee. Zusätzliche Bedingungen kannst du mit logischen Operatoren kombinieren.

Merke bei JOINS:

  • Kommt derselbe Spaltenname in mehreren Tabellen vor, präge ihn mit dem Tabellennamen vor. Das erhöht generell die Klarheit.
  • Zum Verbinden von n Tabellen brauchst du mindestens n−1 Join-Bedingungen. Vier Tabellen erfordern mindestens drei Joins.

Tabellenaliase: In FROM employee e, department d sind e und d Aliase. Sie helfen der Engine bei identischen Spaltennamen und sparen Tipparbeit.

Du kannst auch Nonequi-Joins formulieren, also Joins mit anderen Bedingungen als Gleichheit. Beispiel: salgrade enthält Gehaltsstufenbereiche:

salgrade table

Wir wollen pro Mitarbeiter die Gehaltsstufe ermitteln – die Stufen stehen in salgrade, die Gehälter in employee:

SELECT e.ename, e.sal, s.grade
FROM employee e, salgrade s
WHERE e.sal between s.losal AND s.hisal;
    ENAME             SAL      GRADE
    ---------- ---------- ----------
    JONES            2975          4
    BLAKE            2850          4
    ALLEN            1600          3
    WARD             1250          2
    SMITH             800          1

Beispiel: Gib Namen, Gehalt, Stufe und Abteilungsname aus. Gehalt kommt aus employee, Stufen aus salgrade, Abteilungsname aus department – also drei Tabellen joinen:

SELECT e.ename, e.sal, d.dname, s.grade
FROM employee e, department d, salgrade s
WHERE e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal;

Output:
ENAME             SAL DNAME               GRADE
---------- ---------- -------------- ----------
JONES            2975 RESEARCH                4
BLAKE            2850 SALES                   4
ALLEN            1600 SALES                   3
WARD             1250 SALES                   2
SMITH             800 RESEARCH                1

Hier sind drei Tabellen beteiligt und zwei Join-Bedingungen, eine davon Nonequi.

Natural Join:

Natural Joins verbinden Tabellen automatisch über gleichnamige Spalten. Stimmen Namen, aber nicht die Datentypen, gibt es einen Fehler.

Syntax: SELECT FROM table1 NATURAL JOIN table2; SELECT FROM employee NATURAL JOIN department; Da Natural Join automatisch abgleicht, kann es mehrere gleichnamige Spalten finden, ggf. mit abweichenden Datentypen und damit Fehlern. Mit USING gibst du explizit die Join-Spalten für einen Equijoin an.

Hinweis: NATURAL JOIN und USING sind getrennte Klauseln und schließen sich gegenseitig aus.

SELECT e.ename, d.dname, e.sal
FROM employee e JOIN department d
USING (deptno)
WHERE deptno=20;

output:

ENAME      DNAME                 SAL
---------- -------------- ----------
SMITH      RESEARCH              800
JONES      RESEARCH             2975

Spalten im USING dürfen nirgends mit Tabellennamen oder Präfixen versehen werden. Folgendes ist falsch:

SELECT e.ename, d.dname, e.sal
FROM employee e JOIN department d
USING (d.deptno)
WHERE d.deptno=20;

d.deptno ist falsch – es muss deptno heißen. Outer Joins:

Es gibt drei Outer Joins:

  1. Left Outer Join: Liefert die Ergebnisse des Inner Joins plus nicht passende Zeilen der linken Tabelle.
  2. Right Outer Join: Liefert die Ergebnisse des Inner Joins plus nicht passende Zeilen der rechten Tabelle.
  3. Full Outer Join: Liefert die Ergebnisse des Inner Joins plus nicht passende Zeilen beider Tabellen.

Schauen wir uns das an:

SELECT e.ename, s.grade
FROM salgrade s LEFT OUTER JOIN employee e
ON e.sal BETWEEN s.losal AND s.hisal;

Output:

ENAME          DEPTNO DNAME
---------- ---------- --------------
SMITH              20 RESEARCH
JONES              20 RESEARCH
ALLEN              30 SALES
WARD               30 SALES
BLAKE              30 SALES.sal BETWEEN s.losal AND s.hisal;

Output:

ENAME          DEPTNO DNAME
---------- ---------- --------------
SMITH              20 RESEARCH
JONES              20 RESEARCH
ALLEN              30 SALES
WARD               30 SALES
BLAKE              30 SALESSELECT e.ename, d.deptno, d.dname
FROM employee e RIGHT OUTER JOIN department d
ON e.deptno=d.deptno;

output:

ENAME          DEPTNO DNAME
---------- ---------- --------------
SMITH              20 RESEARCH
ALLEN              30 SALES
WARD               30 SALES
JONES              20 RESEARCH
BLAKE              30 SALES
                   10 ACCOUNTINGSELECT e.ename, d.deptno, d.dname
FROM employee e FULL OUTER JOIN department d
ON e.deptno=d.deptno;

Output:
ENAME          DEPTNO DNAME
---------- ---------- --------------
SMITH              20 RESEARCH
ALLEN              30 SALES
WARD               30 SALES
JONES              20 RESEARCH
BLAKE              30 SALES
                   10 ACCOUNTING

In department gibt es eine nicht passende Zeile für deptno 10; in employee keine. In salgrade ist die Stufe 5 ungematcht.

Self-Join:

Manchmal verknüpfst du eine Tabelle mit sich selbst. In employee stehen auch Manager. Willst du Mitarbeitende und ihre Manager ermitteln, brauchst du einen Self-Join:

SELECT e.ename as Employee, m.ename as Manager
FROM employee e, employee m
WHERE e.mgr=m.empno;
    EMPLOYEE   MANAGER
    ---------- ----------
    ALLEN      BLAKE
    WARD       BLAKE

Subqueries einsetzen

Eine Subquery ist eine Abfrage innerhalb einer Abfrage. Sie hilft, komplexe Probleme zu zerlegen. Du kannst Subqueries schachteln und in folgenden Klauseln einsetzen:

  • WHERE
  • FROM
  • HAVING

Beispiel: Finde Mitarbeitende mit höherem Gehalt als James. Vorgehen:

  • Finde das Gehalt von James
  • Vergleiche dieses Gehalt mit allen Mitarbeitenden

Das löst du mit einer Subquery. Die innere Abfrage läuft einmal vor der äußeren:

SELECT empno, ename
FROM employee
WHERE sal>(SELECT sal from employee where ename='JAMES');

Arten von Subqueries:

  • Einzeilige Subquery: Liefert genau eine Zeile.

  • Mehrzeilige Subquery: Liefert mehrere Zeilen.

Merke:

  • Setze Subqueries in Klammern.
  • Platziere Subqueries rechts vom Vergleichsoperator.
  • Nutze einzeilige Operatoren (>, <, >=, <=, <>) für einzeilige Subqueries.
  • Nutze Mehrzeilen-Operatoren (IN, ANY, ALL) für mehrzeilige Subqueries.

Einzeilige Subquery:

Finde Namen von Mitarbeitenden mit derselben Stellenbezeichnung wie empno 7521:

SELECT ename, job
FROM employee
WHERE job=(SELECT job FROM employee WHERE empno=7521);
    ENAME      JOB
    ---------- ---------
    ALLEN      SALESMAN
    WARD       SALESMAN

Ermittle die Maximalgehälter der Abteilungen, die mindestens so hoch sind wie das Maximum in Abteilung 20:

SELECT deptno, max(sal)
FROM employee
GROUP BY deptno
HAVING max(sal)>=(SELECT max(sal) FROM employee WHERE deptno=20);
    DEPTNO   MAX(SAL)
---------- ----------
        20       2975

Mehrzeilige Subquery:

Finde Mitarbeitende, deren Gehalt einem der Gehälter von MANAGERs entspricht. Die Subquery kann mehrere Zeilen liefern:

SELECT ename, job, sal
FROM employee
WHERE sal IN (SELECT sal FROM employee WHERE job='MANAGER');
    ENAME      JOB              SAL
    ---------- --------- ----------
    JONES      MANAGER         2975
    BLAKE      MANAGER         2850

Steht eine Subquery in FROM, wirkt sie wie eine temporäre Tabelle (View). Beispiel:

SELECT e.ename, e.job, e.sal
FROM employee e, (SELECT deptno FROM department WHERE loc='DALLAS') d
WHERE e.deptno=d.deptno;
    ENAME      JOB              SAL
    ---------- --------- ----------
    SMITH      CLERK            800
    JONES      MANAGER         2975

SET-Operatoren nutzen

Mit SET-Operatoren kombinierst du Ergebnisse mehrerer Abfragen in einem Resultset. Grundlage ist die Mengenlehre: UNION, MINUS, INTERSECT. So optimierst du Abfragen. In diesem Tutorial sehen wir:

Info: Abfragen mit SET-Operatoren heißen zusammengesetzte Anweisungen (compound statements).

  • UNION und UNION ALL
  • INTERSECT
  • EXCEPT (SQL-Standard) und MINUS (Oracle-spezifisch)

UNION

Gegeben zwei Relationen R und S: UNION gibt alle Zeilen aus R und S zurück und entfernt Duplikate. Maximal r+s Zeilen.

Wähle alle Abteilungsnamen, inklusive der Abteilungen von Mitarbeitenden, die vor dem 23-OCT-1999 eingestellt wurden:

SELECT dname
FROM department
UNION
SELECT dname
FROM department, employee
WHERE department.deptno=employee.deptno AND employee.hiredate<to_date('23-OCT-1999');
    DNAME
    --------------
    ACCOUNTING
    OPERATIONS
    RESEARCH
    SALES

Merke zu UNION:

  • Anzahl und Datentypen der ausgewählten Spalten müssen in allen SELECTs übereinstimmen.
  • Spaltennamen müssen nicht identisch sein.
  • Die Ausgabe wird nach der ersten SELECT-Spalte aufsteigend sortiert.
  • NULL wird bei der Duplikatprüfung nicht ignoriert.

UNION ALL kombiniert Ergebnisse, entfernt aber keine Duplikate; DISTINCT ist hier nicht möglich. Angenommen, es gibt eine weitere Tabelle emp mit Mitarbeitenden ab dem Jahr 2000. Hole alle empno, ename und job aus employee und emp:

SELECT empno, ename, job
FROM employee
UNION ALL
SELECT empno, ename, job
FROM emp;
       EMPNO      ENAME      JOB
    ---------- ---------- ---------
      7369        SMITH      CLERK
      7499        ALLEN      SALESMAN
      7521        WARD       SALESMAN
      7566        JONES      MANAGER
      7698        BLAKE      MANAGER
      7369        SMITH      CLERK
      7499        ALLEN      SALESMAN
      7521        WARD       SALESMAN
      7566        JONES      MANAGER
      7654        MARTIN     SALESMAN
      7698        BLAKE      MANAGER

     EMPNO        ENAME      JOB
    ---------- ---------- ---------
      7782        CLARK      MANAGER
      7788        SCOTT      ANALYST
      7839        KING       PRESIDENT
      7844        TURNER     SALESMAN
      7876        ADAMS      CLERK
      7900        JAMES      CLERK

INTERSECT

INTERSECT liefert die Schnittmenge – gemeinsame Zeilen in R und S:

SELECT empno, ename, job
FROM employee
INTERSECT
SELECT empno, ename, job
FROM emp;
     EMPNO ENAME      JOB
---------- ---------- ---------
      7369 SMITH      CLERK
      7499 ALLEN      SALESMAN
      7521 WARD       SALESMAN
      7566 JONES      MANAGER
      7698 BLAKE      MANAGER

Merke zu INTERSECT:

  • Anzahl und Datentypen der Spalten müssen übereinstimmen.
  • Spaltennamen müssen nicht gleich sein.
  • NULL-Werte werden nicht ignoriert.

EXCEPT und MINUS:

EXCEPT (in SQL Server) und MINUS (Oracle) leisten dasselbe: Sie geben alle unterschiedlichen Zeilen aus der ersten Abfrage zurück, die nicht in der zweiten vorkommen. Beispiel mit folgender Produkttabelle:

products

Finde Produkte mit Menge zwischen 1 und 100, aber nicht zwischen 50 und 75. In SQL Server nutzt du EXCEPT, in Oracle MINUS.

SELECT prod_name, qty
FROM products
WHERE qty BETWEEN 1 AND 100
EXCEPT
SELECT prod_name, qty
FROM products
WHERE qty BETWEEN 50 AND 75;

Für Oracle:

SELECT prod_name, qty
FROM products
WHERE qty BETWEEN 1 AND 100
MINUS
SELECT prod_name, qty
FROM products
WHERE qty BETWEEN 50 AND 75;

      PROD_NAME               QTY      
    -------------       ----------
          COLGATE               1
          SENSODYNE             100
          SENSODYNE TOOTHBRUSH  30

Merke zu EXCEPT/MINUS:

  • Anzahl und Datentypen der ausgewählten Spalten müssen in allen SELECTs identisch sein.
  • Spaltennamen müssen nicht gleich sein.
  • Alle Spalten in der WHERE-Klausel müssen in der SELECT-Klausel stehen, damit MINUS funktioniert.

Glückwunsch!

Du hast das Tutorial abgeschlossen. Du hast zentrale SQL-Konzepte gelernt, die dir auf deinem Weg in der Data Science helfen. SQL ist das Rückgrat vieler Reports. Du kennst jetzt die Grundlagen von Datenbanken und SQL, gängige Datentypen, Funktionen für Formatierung, Aggregation und Zusammenfassungen – und wie du Daten aus mehreren Tabellen passend zu deinen Anforderungen zusammenführst. Dieses Tutorial richtet sich speziell an Lernende aus der Data Science und hilft dir nicht nur bei relationalen Systemen, sondern erleichtert auch den Einstieg in NoSQL und den Einsatz von SQL-Skills im Big-Data-Umfeld.

Wenn du noch tiefer einsteigen willst, starte mit DataCamps kostenlosem Kurs Intro to SQL for Data Science.

Referenzen

  1. https://docs.oracle.com/cd/B19306_01/server.102/b14200/operators005.htm
  2. https://en.wikipedia.org/wiki/Set_operations_(SQL)#EXCEPT_operator
  3. https://www.w3schools.com/sql/sql_datatypes.asp
  4. https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT012
Themen
SQL
Datenanalyse

Erfahre mehr über SQL

Kurs

Reporting in SQL

4 Std.
39.7K
In diesem Kurs dreht sich alles um SQL-Berichte und Dashboards und wie du Daten optimal auswertest, bereinigst und validierst.
Details anzeigenRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow
Verwandt

Blog

Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn

Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

4 Min.

Blog

Ein kompletter Leitfaden zu den Gehältern von Business-Analysten im Jahr 2026

Finde raus, wie viel du als Business Analyst verdienen kannst und wie du dein jetziges Gehalt aufbessern kannst.
Matt Crabtree's photo

Matt Crabtree

14 Min.

Tutorial

Python Switch Case Statement: Ein Leitfaden für Anfänger

Erforsche Pythons match-case: eine Anleitung zu seiner Syntax, Anwendungen in Data Science und ML sowie eine vergleichende Analyse mit dem traditionellen switch-case.
Matt Crabtree's photo

Matt Crabtree

5 Min.

Tutorial

Python Datenstrukturen Tutorial

Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Sejal Jaiswal's photo

Sejal Jaiswal

24 Min.

Tutorial

Fibonacci-Folge in Python: Lerne und entdecke Programmiertechniken

Finde raus, wie die Fibonacci-Folge funktioniert. Schau dir die mathematischen Eigenschaften und die Anwendungen in der echten Welt an.
Laiba Siddiqui's photo

Laiba Siddiqui

6 Min.

Tutorial

Python-Anweisungen IF, ELIF und ELSE

In diesem Tutorial lernst du ausschließlich Python if else-Anweisungen kennen.
Sejal Jaiswal's photo

Sejal Jaiswal

9 Min.

Mehr AnzeigenMehr Anzeigen