SQL-Beispielsdatenbank
SQL-Beispiele aus dem Miro-Board (03 SQL-Grundlagen)
Projektion
/* Selektiere alle Attribute (*) von allen Händlern. */
SELECT * FROM haendler;
SELECT h_id, h_name, h_ortschaft FROM haendler;
/* Selektiere die Namen aller Händler: Maier wird zweimal ausgegeben! */
SELECT h_name FROM haendler;
/* Selektiere die Namen aller Händler und entferne Duplikate:
Maier wird einmal ausgegeben!
*/
SELECT DISTINCT h_name FROM haendler;
/* Selektiere den Namen und die eindeutige Händlernummer aller Händler. */
SELECT h_name, h_id FROM haendler;
/* Nun bewirkt DISTINCT keine Änderung! */
SELECT DISTINCT h_name, h_id FROM haendler;
Projektion mit Umbenennung der Attribute
/* Benenne die Ausgabe-Attribute um. */
SELECT h_name AS h_name, h_id AS haendlernummer FROM haendler;
/* SQL-Befehle sind nicht case-sensitiv. Die Großbuchstaben
der umbenannten Attribute werden nicht beachtet.
*/
SELECT h_name AS h_name, h_id AS Haendlernummer FROM haendler;
/* Wenn man Attributnamen oder Tabellennamen in doppelte Anführungszeichen
schließt, sind alle Sonderzeichen erlaubt.
*/
SELECT h_name AS "h_name", h_id AS "Händlernummer" FROM haendler;
/* Man kann Attribute und Tabellen(!) auch in der
FROM-Klausel umbenennen.
*/
SELECT * FROM haendler AS h(id, h_name, haendlerortschaft);
/* In den restlichen Klauseln (wie z.B. der SELECT-Klausel)
muss man dann die neuen Namen verwenden.
*/
SELECT haendler.* FROM haendler;
SELECT h.* FROM haendler AS h(id, h_name, haendlerortschaft);
/* Die Punkt-Notation (h.id) kann, muss aber nicht verwendet werden,
wenn ein Attributname eindeutig ist.
*/
SELECT h.id, h_name, haendlerortschaft
FROM haendler AS h(id, h_name, haendlerortschaft);
/* Das Schlüsselwort "AS" ist in der FROM-Klausel optional. */
SELECT h.id, h_name, haendlerortschaft
FROM haendler h(id, h_name, haendlerortschaft);
Projektion mit Berechnungen und ROWs
/* Formatieren der Händler-Attribute */
SELECT h_id,
h_name || ' in ' || h_ortschaft AS info
FROM haendler;
SELECT h_id,
CASE
WHEN h_ortschaft IS NOT NULL THEN h_name || ' in ' || h_ortschaft
ELSE h_name
END AS info
FROM haendler;
SELECT h_id,
COALESCE(h_name || ' in ' || h_ortschaft, h_name) AS info
FROM haendler;
SELECT h_id,
CONCAT(h_name, ' in ', h_ortschaft) AS info
-- 'in' wird immer ausgegeben :-(
FROM haendler;
SELECT json_build_object
('id', h_id,
'name', h_name,
'ortschaft', h_ortschaft
) AS info
FROM haendler;
/* Selektiere alle Attribute aller Händler. */
SELECT * FROM haendler;
/* Selektiere alle Attribute aller Händler als ein einziges Tupel. */
SELECT h FROM haendler h;
/* Syntax, bei der die doppelte Bedeutung des Namens ware deutlich wird.
In der FROM-Klausel steht ware für die ganze Tabelle, in der
SELECT-Klausel steht ware für das jeweils aktuelle Tupel.
*/
SELECT haendler FROM haendler;
Selektion
/* Selektiere alle Attribute aller Waren. */
SELECT w_id, w_typ, w_bezeichnung
FROM ware;
/* Selektiere alle CPUs aus der Tabelle ware. */
SELECT w_id, w_typ, w_bezeichnung
FROM ware
WHERE w_typ = 'CPU';
/* Selektiere alle CPUs und RAMs aus der Tabelle ware. */
SELECT w_id, w_typ, w_bezeichnung
FROM ware
WHERE w_typ = 'CPU' OR w_typ = 'RAM';
SELECT w_id, w_typ, w_bezeichnung
FROM ware
WHERE w_typ IN ('CPU', 'RAM');
/* Selektiere alle Waren mit Ausnahme von CPUs. */
SELECT w_id, w_typ, w_bezeichnung
FROM ware
WHERE NOT w_typ <> 'CPU';
SELECT w_id, w_typ, w_bezeichnung
FROM ware
WHERE NOT w_typ = 'CPU';
SELECT w_id, w_typ, w_bezeichnung
FROM ware
WHERE w_typ NOT IN ('CPU');
/* Selektiere alle Waren, deren Bezeichnung mit 'A' beginnt. */
SELECT w_id, w_typ, w_bezeichnung
FROM ware
WHERE w_bezeichnung LIKE 'A%';
Join
/* Was berechnet die folgende Anfrage? */
SELECT *
FROM haendler h, liefert l, ware w;
/* Die folgende Query ist sinnvoller. */
SELECT *
FROM haendler h, liefert l, ware w
WHERE h.h_id = l.h_id AND l.w_id = w.w_id;
Join: Duplikate (durch Projektion)
/* Dasselbe ohne Preis und Lieferzeit. */
SELECT h.*, w.*
FROM haendler h, liefert l, ware w
WHERE h.h_id = l.h_id AND l.w_id = w.w_id;
SELECT h.h_id, h.h_name, h.h_ortschaft,
w.w_id, w.w_typ, w.w_bezeichnung
FROM haendler h, liefert l, ware w
WHERE h.h_id = l.h_id AND l.w_id = w.w_id;
/* Da die Attribute l_preis und l_lieferzeit
nicht ausgegeben werden, können Duplikate
entstehen. So liefert Huber einen Athlon
z.B. für 180 Euro in fünf Tagen und für
199.99 Euro in einem Tag.
Diese Information wird jedoch gar nicht
angezeigt, wenn man die Attribute l_preis
und l_lieferzeit nicht ausgibt.
Die entstehenden Duplikate sollte man mit
DISTINCT entfernen.
*/
SELECT DISTINCT
h.h_id, h.h_name, h.h_ortschaft,
w.w_id, w.w_typ, w.w_bezeichnung
FROM haendler h, liefert l, ware w
WHERE h.h_id = l.h_id AND l.w_id = w.w_id;
SELECT DISTINCT
h.h_id, h.h_name, h.h_ortschaft,
w.w_id, w.w_typ, w.w_bezeichnung
FROM haendler h, liefert l, ware w
WHERE h.h_id = l.h_id AND l.w_id = w.w_id
ORDER BY h.h_name, h.h_ortschaft,
w.w_typ, w.w_bezeichnung;
Select-From-Where-Anfragen
/* Welche Waren liefern die Händler mit
dem Namen 'Maier' zu welchem Preis und
in welcher Zeit.
*/
SELECT h.h_id, h_name, h_ortschaft,
w.w_id, w_typ, w_bezeichnung,
l_preis, l_lieferzeit
FROM haendler h, liefert l, ware w
WHERE h.h_id = l.h_id AND l.w_id = w.w_id
AND h_name = 'Maier'
ORDER BY h_name, h_ortschaft,
w_typ, w_bezeichnung,
l_preis
;
SELECT h.h_id, h_name, h_ortschaft,
w.w_id, w_typ, w_bezeichnung,
l_preis, l_lieferzeit
FROM haendler h JOIN liefert l ON h.h_id = l.h_id
JOIN ware w ON l.w_id = w.w_id
WHERE h_name = 'Maier'
ORDER BY h_name, h_ortschaft,
w_typ, w_bezeichnung,
l_preis
;
/* Welche Waren liefert Händler Maier aus Königsbrunn
zu welchem Preis und in welcher Zeit.
*/
SELECT h.h_id, h_name, h_ortschaft,
w.w_id, w_typ, w_bezeichnung,
l_preis, l_lieferzeit
FROM haendler h JOIN liefert l ON h.h_id = l.h_id
JOIN ware w ON l.w_id = w.w_id
WHERE h_name = 'Maier' AND h_ortschaft = 'Königsbrunn'
ORDER BY h_name, h_ortschaft,
w_typ, w_bezeichnung,
l_preis
;
SELECT h.h_id, h_name, h_ortschaft,
w.w_id, w_typ, w_bezeichnung,
l_preis, l_lieferzeit
FROM haendler h JOIN liefert l ON h.h_id = l.h_id
JOIN ware w ON l.w_id = w.w_id
WHERE h.h_id = 1
ORDER BY h_name, h_ortschaft,
w_typ, w_bezeichnung,
l_preis
;
SELECT h_id, h_name, h_ortschaft,
w_id, w_typ, w_bezeichnung,
l_preis, l_lieferzeit
FROM haendler h JOIN liefert l USING (h_id)
JOIN ware w USING (w_id)
WHERE h_id = 1
ORDER BY h_name, h_ortschaft,
w_typ, w_bezeichnung,
l_preis
;
Nonsens-Anfrage
/* Nonsens-Anfrage (Warum?):
*/
SELECT *
FROM haendler h, liefert l, ware w
WHERE h.h_id = l.w_id AND l.h_id = w.w_id;
/* Nochmal zum besseren Verständnis:
Vergleichen Sie nicht Äpfel mit Birnen!
*/
-- Sinnvolle Anfrage
SELECT name, ortschaft, typ, bezeichnung, preis, lieferzeit,
apfel.apfel_id, liefert.apfel_id, liefert.birne_id, birne.birne_id
FROM haendler AS apfel (apfel_id, name, ortschaft),
liefert AS liefert (apfel_id, birne_id, preis, lieferzeit),
ware AS birne (birne_id, typ, bezeichnung)
WHERE apfel.apfel_id = liefert.apfel_id AND
liefert.birne_id = birne.birne_id;
-- Nonsens-Anfrage
SELECT name, ortschaft, typ, bezeichnung, preis, lieferzeit,
apfel.apfel_id, liefert.birne_id, liefert.apfel_id, birne.birne_id
FROM haendler AS apfel (apfel_id, name, ortschaft),
liefert AS liefert (apfel_id, birne_id, preis, lieferzeit),
ware AS birne (birne_id, typ, bezeichnung)
WHERE apfel.apfel_id = liefert.birne_id AND
liefert.apfel_id = birne.birne_id;