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;