/* Selektiere alle Attribute (*) von allen Händlern. */
SELECT * FROM haendler;

/* Selektiere die Namen aller Händler: Maier wird zweimal ausgegeben! */
SELECT name FROM haendler;

/* Selektiere die Namen aller Händler und entferne Duplikate: 
   Maier wird einmal ausgegeben!
 */
SELECT DISTINCT name FROM haendler;

/* Selektiere den Namen und die eindeutige Händlernummer aller Händler. */
SELECT name, hnr FROM haendler;

/* Nun bewirkt DISTINCT keine Änderung! */
SELECT DISTINCT name, hnr FROM haendler;

/* Bennenne die Ausgabe-Attribute um. */
SELECT name AS name, hnr AS haendlernummer FROM haendler;

/* SQL-Befehle sind nicht case-sensiv. Die Großbuchstaben
   der umbenannten Attribute werden nicht beachtet.i
 */
SELECT name AS Name, hnr AS Haendlernummer FROM haendler;

/* Wenn man Attributenamen oder Tabellennamen in doppelte Anführungszeichen schließt,
   sind alle Sonderzeichen erlaubt.
 */
SELECT name AS "Name", hnr AS "Händlernummer" FROM haendler;

/* Man kann Attribute und Tabellen(!) auch in der
   FROM-Klausel umbenennen.
 */
SELECT * FROM haendler AS h(id, name, haendleradresse);

/* 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, name, haendleradresse);

/* Die Punkt-Notation (h.id) kann, muss aber nicht verwendet werden,
   wenn ein Attributname eindeutich ist.
 */
SELECT h.id, name, haendleradresse 
FROM   haendler AS h(id, name, haendleradresse);

/* Das Schlüsselwort "AS" ist in der FROM-Klausel optional. */
SELECT h.id, name, haendleradresse 
FROM   haendler h(id, name, haendleradresse);

/* Selektiere alle Attribute aller Waren. */
SELECT * FROM ware;

/* Nicht-standard SQL:
   Selektiere alle Attribute aller Waren als ein einziges Tupel.
 */
SELECT w FROM ware w;

/* 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 ware FROM ware;


/* Selektiere alle CPUs aus der Tabelle ware. */
SELECT * FROM ware
WHERE typ = 'CPU';

/* Was berechnet die folgende Anfrage? 
   Antwort: Das kartesische Produkt der Tupel aller Tabellen,
   d.h. das Ergebnis enthält jede mögliche Tupel-Kombination.
 */
SELECT *
FROM   haendler h, liefert l, ware w;

/* Diese Anfrage ist sinnvoller:
   Welche Waren werden von welchen Händlern geliefert?
 */
SELECT *
FROM   haendler h, liefert l, ware w
WHERE  h.hnr = l.hnr AND l.wnr = w.wnr;

/* Welche Waren werden von welchen Händlern geliefert (ohne Preis und Lieferzeit)? */
SELECT h.*, w.*
FROM   haendler h, liefert l, ware w
WHERE  h.hnr = l.hnr AND l.wnr = w.wnr;

/* In Prgrammen sollte man auf die *-Noation besser verzichten,
   da Attribute, die später in eine Tabelle eingefügt werden,
   die Ergenisse von Anfragen mit *-Notation unbeabsichtigt
   veändern können.
 */
SELECT h.hnr, h.name, h.adresse, w.wnr, w.typ, w.bezeichnung
FROM   haendler h, liefert l, ware w
WHERE  h.hnr = l.hnr AND l.wnr = w.wnr;

/* Da die Attribute preis und lieferzeit nicht ausgegeben werden,
   können Duplikate entstehen. So liefert Huber einen Athlon XP 3000+
   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 preis und lieferzeit nicht ausgibt.
   
   Die entstehenden Duplikate sollte man mit DISTINCT entfernen.
 */
SELECT DISTINCT
       h.hnr, h.name, h.adresse, w.wnr, w.typ, w.bezeichnung
FROM   haendler h, liefert l, ware w
WHERE  h.hnr = l.hnr AND l.wnr = w.wnr;

/* Und die Ausgabe sollte ii. Allg. auch noch sortiert erfolgen. */
SELECT DISTINCT
         h.hnr, h.name, h.adresse, w.wnr, w.typ, w.bezeichnung
FROM     haendler h, liefert l, ware w
WHERE    h.hnr = l.hnr AND l.wnr = w.wnr
ORDER BY h.name, h.adresse, w.typ, w.bezeichnung;

/* Nonsense-Anfrage (Warum?) 
   Antwort: Die Anfrage liefert zwar ein Ergebnis, dieses macht jedoch 
   überhaupt keinen Sinn, da in der liefert-Tabelle die Warennummer mit
   der Händlernummer verglichen wird und umgekehrt. Warennummer und
   Händlernummer haben jedoch nichts miteinander zu tun.   
 */
SELECT *
FROM   haendler h, liefert l, ware w
WHERE  h.hnr = l.wnr AND l.hnr = w.wnr;

