💻
M105 - Datenbanken mit SQL bearbeiten
  • Intro
  • 🗓️Organisatorisches
  • 🛠️Infrastruktur und Tools
  • ❓FAQ
  • Tag 1
    • 🏁Tagesziele
    • 📖💡 Datenbanklehre
    • 📖💡 DDL – Data Definition Language
    • 📖💡 DDL - Constraints
    • 💬Northwind Sample Database
    • 📖DML - Datenmanipulation
    • ❓Hilfsmittel
      • ❓Datentypen
  • Tag 2
    • 🏁Tagesziele
    • 💡DML - Aufgaben
      • ❓Hilfsmittel
    • 📖Transaktionssteuerung
      • 💡Transaktionen - Aufgaben (optional)
    • 📖DQL - Select-Anweisungen
    • 💡DQL - Aufgaben
    • 📖DQL - Join
  • Tag 3
    • 🏁Tagesziele
    • 📖DQL - Komplexere Abfragen
    • 💡DQL - Aufgaben
    • 📖 Views
    • 💡Views - Aufgaben
  • Tag 4
    • 🏁Tagesziele
    • 📖💡 DCL - Data Control Language
    • 📖💡 Funktionen
    • 📖Datenbanksicherung
    • 💡SQL Projektarbeit
      • ❓Hilfsmittel
  • Tag 5
    • 🏁Tagesziele
    • 📖💡 Datenbank-Programmierung
      • 💡Programmierung - Aufgaben (optional)
    • 📖💡 Befehlszeilenanwendung
Powered by GitBook
On this page
  • ⚡️ Ausprobieren
  • SELECT-Anweisung
  • Spalten-Aliasnamen
  • Doppelte Zeilen unterdrücken
  • Ausdrücke und Verkettung
  • Bedingungen in Ausdrücken
  • WHERE-Klausel
  • Vergleichskriterien
  • Mustervergleiche
  • Operator BETWEEN
  • Mengenvergleich mit IN
  • Suchen von NULL-Werten
  • Mehrere Kriterien
  • Sortierung
  • TOP Auswertungen

Was this helpful?

Export as PDF
  1. Tag 2

DQL - Select-Anweisungen

PreviousTransaktionen - Aufgaben (optional)NextDQL - Aufgaben

Last updated 3 years ago

Was this helpful?

⚡️ Ausprobieren

Öffne diese Beispiel-Datenbank in einem neuen Fenster:

Hier kannst du direkt im Browser SQL Statements ausprobieren. Probiere die Beispiele hier mit einem ⚡️-Symbol aus.

SELECT-Anweisung

DQL Anweisungen werden zur Auswahl und Anzeige von Daten aus der Datenbank verwendet. Abfragen erstellen eine temporäre, speicherresidente (nicht persistente) Tabelle mit 0 oder mehreren Datenzeilen. Sie beginnen immer mit SELECT, gefolgt von der FROM-Klausel.

Mit SELECT wird ausgewählt, welche Spalten der Tabelle in welcher Reihenfolge zurückgegeben werden sollen. Mit * werden alle Spalten ausgewählt, entspricht der Spaltenreihenfolge der in der zugrundeliegenden Tabelle.

Nach FROM gibt man den Namen der Tabelle an, welche abgefragt werden soll.

SELECT spalte1, spalte2, spalte3 FROM tabelle;

SELECT * FROM tabelle;

⚡️ Ausprobieren

  1. Lass dir alle Kunden ausgeben.

  2. Zeigt nur den Namen und die Adresse der Kunden an

-- 1. Zeigt alle Eigenschaften der Kunden an
SELECT * FROM Customers;

-- 2. Zeigt nur Name und Adresse der Kunden an
SELECT CustomerName, Address FROM Customers;

Spalten-Aliasnamen

Bei einer Abfrage können mit dem optionalen Schlüsselwort AS den Spalten (oder berechneten Spalten) neue Namen gegeben werden.

SELECT spalte1 AS alias1, ausdr1 AS alias2 FROM tabelle;

Wenn du Spaltennamen mit Leerschlägen geben willst, musst du eckige Klammern darum machen, z.B.: [Zuständiger Ansprechpartner]

⚡️ Ausprobieren

-- Beispiel mit originalem Spaltennamen
SELECT CustomerName, ContactName FROM Customers;
  1. Verändere das Statement so, dass die Spalte ContactName neu Zustaendiger Ansprechpartner heisst.

-- Beispiel mit neuem Namen "Zuständiger Ansprechpartner"
SELECT CustomerName as Kunde, ContactName as [Zustaendiger Ansprechpartner] 
FROM Customers;

2. Probiere auch das aus:

-- Beispiel mit berechnetem Wert
SELECT CustomerID, CustomerID + 100 as [Neue Kundennummer] FROM [Customers];

Doppelte Zeilen unterdrücken

Mit dem Schlüsselwort DISTINCT nach SELECT, werden doppelte Einträge weggelassen. Als doppelter Eintrag gelten nur, wenn die Werte in alle angezeigten Spalten gleich sind.

SELECT DISTINCT spalte1 FROM tabelle;

⚡️ Ausprobieren

-- Beispiel mit doppelten Einträgen
SELECT Country FROM Suppliers;
  1. Verändere das Statement so, dass die Ausgabe keine doppelten Einträge mehr enthält

-- Beispiel ohne doppelte Einträge
SELECT DISTINCT Country FROM Suppliers;

Ausdrücke und Verkettung

Berechnungsausdrücke werden wie Tabellenspalten angegeben.

SELECT spalte1, ausdruck1, ausdruck2 FROM tabelle;

SELECT spalte2, (spalte1 – spalte3) * 5 AS Spaltenname FROM tabelle;

Auch Texte können verkettet werden:

SELECT spalte1 + ' zwischentext ' + spalte2 
FROM tabelle;
SELECT spalte1 || ' zwischentext ' || spalte2 
FROM tabelle;

⚡️ Ausprobieren

  1. Schreibe ein SQL-Statement, welches vom Kunden den Namen und eine berechnete Kundennummer anzeigt. Die Kundennummer ist einfach CustomerID plus 10'000.

  2. Erweitere das Statement um die Spalte "Anschrift", welche eine Verkettung aus Namen, Adresse, PLZ, Ort und Land ist.

-- Beispiel mit berechnetem Wert und Textverkettung
SELECT 
CustomerID, 
CustomerName, 
CustomerID + 10000 AS Kundennummer,
CustomerName + ', ' + Address + ', ' + PostalCode + ' ' + City + ', ' + Country AS Anschrift
FROM Customers;

Bedingungen in Ausdrücken

Mit CASE kann in Ausdrücken nach bestimmten Bedingungen unterschieden werden, wie ein if-else in der Programmierung.

SELECT spalte1, spalte2,
CASE ausdr 
	WHEN bedingungsausdr1 THEN fall1
	WHEN bedingungsausdr2 THEN fall2
	… 
	[ELSE fallx] 
END [AS Spaltenname]
FROM tabelle

⚡️ Ausprobieren

SELECT OrderID, Quantity
FROM OrderDetails;
  1. Erweitere dieses SQL-Statement mit einer neuen Spalte "QuantityText". Ist die Quantität grösser als 10, soll darin stehen "Die Anzahl ist grösser als 10". Ist die Quantität gleich 10, soll darin stehen "Die Anzahl ist 10". Ist die Quantität kleiner als 10, soll stehen "Dia Anzahl ist kleiner als 10".

SELECT OrderID, Quantity,
CASE
    WHEN Quantity > 10 THEN 'Die Anzahl ist groesser als 10'
    WHEN Quantity = 10 THEN 'Die Anzahl ist 10'
    ELSE 'Die Anzahl ist kleiner als 10'
END AS QuantityText
FROM OrderDetails;

WHERE-Klausel

Schränkt die über SELECT zurückgegebenen Zeilen ein. WHERE folgt nach der FROM Klausel und besteht jeweils aus einem linken Vergleichsterm, einem Vergleichsoperator (=, >, <, >=, <=, <>, !=) und einem rechten Vergleichsterm.

...
WHERE spalte = ausdr;

Vergleichskriterien

Zahlenfelder

  • Auswertung nach mathematischen Gesichtspunkten.

Textfelder

  • Texte werden wie Datumswerte von einfachen Hochkommata umschlossen

  • Vergleiche erfolgen von links nach rechts nach dem Alphabet

  • Gross-/Kleinschreibung bei SQL Server in der Regel nicht relevant im Gegensatz zu ORACLE

Datumsfelder

  • Alle Vergleichsoperatoren sind möglich

  • Für gültige Vergleiche muss auf das Datumsformat geachtet werden

  • Unterschiedlich bei verschiedenen Herstellern

  • Numerische Datumsformate

    • '01.01.2015'

    • '01-01-2015'

  • Alphanumerische Datumsformate (sprachenabhängig!)

    • '01 JANUAR 15'

    • 'JAN 1, 15'

⚡️ Ausprobieren

-- Alle Kunden aus Mexiko
SELECT * FROM Customers
WHERE Country = 'Mexico';

Die Vergleichsspalte in der WHERE-Klausel muss nicht in der SELECT-Klausel enthalten sein:

-- Alle Namen der Kunden aus Mexiko
SELECT CustomerName FROM Customers
WHERE Country = 'Mexico';
SELECT CustomerName FROM Customers
  1. Erweitere dieses SQL-Statement, sodass nur noch Kundennamen angezeigt werden, welche einen Anfangsbuchstaben > 'M' haben.

  2. Schreibe ein SQL Statement, welches alle Produkte ausgibt, welche teurer als 50$ sind.

  3. Schreibe ein SQL Statement, welches alle Bestellungen anzeigt, die vor dem 15.07.1996 getätigt wurden.

-- 1. Alle Kundennamen mit Anfangsbuchstaben > 'M'
SELECT * FROM Customers
WHERE CustomerName > 'M';

-- 2. Alle Produkte, die teurer als 50$ sind
SELECT * FROM Products WHERE Price > 50;

-- 3. Alle Bestellungen vor dem 15. Juli 1996
SELECT * FROM Orders WHERE OrderDate < '1996-07-15';

Mustervergleiche

Zusätzlich zu den einfachen Vergleichsoperatoren (=, >, <, >=, <=, <>, !=) gibt es auch noch etwas komplexere Operatoren. Einer davon ist LIKE.

LIKE sucht nach enthaltenem Text in einer Textspalte. Dabei gibt es verschiedene Platzhalter, die Beschreiben:

Platzhalter

Beschreibung

%

Beliebig viele Zeichen

_

Genau ein Zeichen

[]

Genau eines der Zeichen in der Klammer oder im angegebenen Bereich / den angegebenen Bereichen.

Beispiele:

[ace]: Platzhalter für ein a, ein c oder ein e.

[a-m]: Platzhalter für ein Zeichen zwischen a und m.

^

Platzhalter für ein Zeichen ausser der angegebenen Zeichen oder Zeichenbereiche.

Beispiele:

[^ace]: Platzhalter für ein Zeichen, das kein a, c oder eist.

...
WHERE spalte LIKE '[ab]%';

⚡️ Ausprobieren

SELECT * FROM Customers
  1. Erweitere das SQL-Statement, dass nur Kunden angezeigt werden, welche an Orten leben, die mit "ber" anfangen.

  2. Ändere das SQL-Statement, dass nur Kunden angezeigt werden, welche an Orten leben, die mit "li" oder "la" anfangen.

  3. Ändere das SQL-Statement, dass nur Kunden angezeigt werden, in deren Namen als zweiter Buchstabe ein "e" steht.

  4. Ändere das SQL-Statement, dass nur Kunden angezeigt werden, deren Namen nicht mit "A" beginnen.

-- 1. Alle Kunden, die in einer Stadt leben, die mit "ber" beginnt.
SELECT * FROM Customers
WHERE City LIKE 'ber%';

-- 2. Alle Kunden, wleche an einem Ort wohnen, der mit "li" oder "la" beginnt
SELECT * FROM Customers
WHERE City LIKE 'l[ai]%';
-- oder
SELECT * FROM Customers
WHERE City LIKE 'li%' OR City LIKE 'la%';

-- 3. Kunden, welche "e" als zweiten Buchstaben im Namen haben.
SELECT * FROM Customers WHERE CustomerName LIKE '_e%';

-- 4. Kunden, deren Namen nicht mit "A" beginnt.
SELECT * FROM Customers
WHERE CustomerName LIKE '[^a]%';

Operator BETWEEN

  • Für Vergleiche mit Werten in einem bestimmten Bereich

  • Für Zahlen-, Datums- und Textkriterien möglich

    • … WHERE artpreis BETWEEN 10 AND 30;

    • … WHERE gebdat BETWEEN '01.01.2000' AND '30.09.2000'

    • … WHERE artbez BETWEEN 'k' AND 'mz'

  • Grenzwerte sind immer mit dabei

  • Keine zusätzlichen Vergleichsoperatoren nötig (wie z.B. = )

⚡️ Ausprobieren

SELECT * FROM Employees
  1. Erweitere das SQL-Statement, dass nur Mitarbeiter angezeigt werden, die zwischen 1950 und 1959 geboren sind.

SELECT * FROM Products

2. Erweitere das SQL-Statement, dass nur Produkte angezeigt werden, die zwischen 10$ und 20$ kosten.

-- 1. Alle Mitarbeiter, die zwischen 1950 und 1959 geboren sind.
SELECT * FROM Employees
WHERE BirthDate BETWEEN '1950-01-01' AND '1959-12-31';

-- 2. Alle Produkte, die zwischen als 10$ und 20$ kosten.
SELECT * FROM Products WHERE Price BETWEEN 10 AND 20;

Mengenvergleich mit IN

  • Vergleiche mit mehreren, explizit in runden Klammern angegebenen Werten

  • Bei Verwendung von IN wird kein weiterer Operator mehr benötigt

  • Gleichheit mit einem der enthaltenen Werte

  • Entspricht von der Logik einer ODER-Verknüpfung

  • Die Auflistung in IN kann wieder eine SELECT Abfrage sein.

⚡️ Ausprobieren

SELECT * FROM Customers
  1. Erweitere das SQL-Statement, dass nur Kunden angezeigt werden, die in Beron oder Paris leben.

  2. Liste mit einem IN-Vergleich und einer Unterabfrage alle Produkte aus Italien auf.

-- 1. Alle Kunden, die aus Bern oder Paris kommen
SELECT * FROM Customers
WHERE City IN ('Bern', 'Paris');

-- 2. Alle Produkte aus Italien
SELECT * 
FROM Products 
WHERE SupplierID IN (
  SELECT SupplierID 
  FROM Suppliers 
  WHERE Suppliers.Country = 'Italy'
);

Suchen von NULL-Werten

  • Vergleiche mit NULL-Werten

  • Wird auf Wahr / Falsch ausgewertet

  • NULL in Kombination mit IS

SELECT artbez, artkat FROM artikel WHERE artpreis IS NULL;
SELECT artbez, artkat FROM artikel WHERE artpreis IS NOT NULL;

⚡️ Ausprobieren

  1. Suche in einer Nordwind-Datenbank alle Kunden, für welche KEINE Region angegeben ist.

  2. Suche in einer Nordwind-Datenbank alle Kunden, die eine FAX-Nummer haben.

-- 1. Alle ohne Region
SELECT * FROM Customers WHERE Region IS NULL;

-- 2. Alle mit FAX
SELECT * FROM Customers WHERE Fax IS NOT NULL;

Mehrere Kriterien

  • Logische Und-Verknüpfung: AND

  • Logische Oder-Verknüpfung: OR

  • Jede Teilbedingung muss vollständig sein

    • Falsch: WHERE artnr = 1098 OR 1237

    • Richtig: WHERE artnr = 1098 OR artnr = 1237

  • Logische Umkehrung: NOT

    • Falsch: WHERE artnr NOT = 1098

    • Richtig: WHERE NOT (artnr = 1098) WHERE NOT (artnr = 1098) AND NOT (artnr = 1237)

⚡️ Ausprobieren

  • Nimm dir ein paar der vorherigen Beispiele vor und versuche sie mit NOT umzukehren.

  • Nimm dir ein paar der vorherigen Beispiele vor und versuche sie mit AND oder OR zu verknüpfen.

Die Prioritäten halten sich an die natürlichen Prioritäten (von hoch bis gering):

  • Mathematische Operatoren (+, -, *, etc.)

  • Vergleichsoperatoren (=, >, <, etc.)

  • NOT

  • AND

  • OR

Durch das Setzen von Klammern kann in den Ausdrücken eine andere Priorität erzwungen werden.

Sortierung

  • Sortierung über ORDER BY

  • ORDER BY immer letzte Klausel innerhalb der Anweisung

  • Sortiert wird immer am Schluss

  • Sortierung nach ein oder mehreren Spalten

  • Aufsteigende (ASC) und absteigende Sortierung (DESC)

  • Sortierung nach Spalten- oder Aliasnamen oder durch Spaltenposition innerhalb der SELECT-Klausel

SELECT * FROM tabelle ORDER BY spalte [ASC|DESC];

⚡️ Ausprobieren

  1. Schreibe ein SQL-Statement, welches die Mitarbeiter nach Alter sortiert, die Ältesten zuerst.

-- 1. Alle Mitarbeiter sortiert nach Alter (die Aeltesten zuerst)
SELECT * FROM Employees ORDER BY BirthDate ASC;

TOP Auswertungen

  • TOP: Die "obersten" x Zeilen absolut oder in Prozent

  • Reihenfolge wird durch Sortierung bestimmt

SELECT TOP anzahl [PERCENT] [WITH TIES] ...
FROM ... 
ORDER BY spalte [DESC];
SELECT ...
FROM ... 
WHERE ROWNUM <= anzahl;
ORDER BY spalte [DESC];
SELECT ...
FROM ... 
ORDER BY spalte [DESC]
LIMIT anzahl;

⚡️ Ausprobieren

-- Alle Mitarbeiter sortiert nach Alter (die Ältesten zuerst)
SELECT * FROM Employees ORDER BY BirthDate ASC
  1. Erweitere das SQL-Statement so, dass nur die 3 ältesten Mitarbeiter angezeigt werden.

-- 1. Alle Mitarbeiter sortiert nach Alter (die Aeltesten zuerst)
SELECT TOP 3 * FROM Employees ORDER BY BirthDate ASC

📖
https://www.w3schools.com/sql/trysqlserver.asp?filename=trysql_func_sqlserver_concat