Händler-Datenbank (SQL-Beispiel): Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Zeile 159: Zeile 159:


=SQL-Beispiele=
=SQL-Beispiele=
* [[Händler-Datenbank (SQL-Beispiel, PostgreSQL)/Identität|Identität]]
* [[Händler-Datenbank (SQL-Beispiel)/Identität|Identität]]
* [[Händler-Datenbank (SQL-Beispiel, PostgreSQL)/Projektion|Projektion]]
* [[Händler-Datenbank (SQL-Beispiel)/Projektion|Projektion]]
* [[Händler-Datenbank (SQL-Beispiel, PostgreSQL)/Selektion|Selektion]]
* [[Händler-Datenbank (SQL-Beispiel)/Selektion|Selektion]]
* [[Händler-Datenbank (SQL-Beispiel, PostgreSQL)/Join|Join]]
* [[Händler-Datenbank (SQL-Beispiel)/Join|Join]]
* [[Händler-Datenbank (SQL-Beispiel, PostgreSQL)/Unteranfragen|Unteranfragen]]
* [[Händler-Datenbank (SQL-Beispiel)/Unteranfragen|Unteranfragen]]


=Quellen=
=Quellen=

Version vom 8. Juli 2012, 14:01 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen:

Korrektheit: 5
(vollständig überprüft)
Umfang: 5
(wesentliche Fakten vorhanden)
Quellenangaben: 5
(vollständig vorhanden)
Quellenarten: 5
(ausgezeichnet)
Konformität: 5
(ausgezeichnet)

Das Händler-liefert-Ware-Beispiel ist das klassische Beispiel, um viele Konzepte von Datenbanksystemen und SQL zu demonstieren. Daher wird dieses Beispiel auch in der Vorlesung Multimedia-Datenbanksysteme verwendet.

Datenmodell/ER-Diagramm (in UML-Notation)

Medium:Haendler_Modell.jpg

Eine Händler, der durch die Händlernummer hnr eindeutig identifiziert werden kann und weitere Attribute, wie Name, Adresse etc. hat, liefert bestimmte Waren. Die zugehörigen Entities (Objekte) werden durch den Entity-Typ (die Klasse) haendler definiert.

Welche Waren es gibt, ist durch einen weiteren Entity-Typ festgelegt: ware. Eine Ware ist durch die Warennummer wnr eindeutig festgelgt. Weitere Attribute, wie Typ (Gemüse, Fleisch, Wurst etc.) und genaue Bezeichnung (Kohlrabi, Rinderlende, Crevelat etc.), beschreiben die jeweilige Ware näher.

Zwischen den Entity-Typen haendler und ware besteht eine Beziehung: liefert. Diese legt fest, welcher Händler welche Ware zu welchen Konditionen liefert. Ein Lieferant liefert eine Ware normalerweise zu einem bestimmten Preis. Zusätzlich kann eine gewisse Lieferzeit (in Tagen) angegeben werden. Es ist auch erlaubt, dass ein Händler ein und dieselbe Ware zu mit unterschiedlichen Preisen unterschiedlich schnell liefert. Um dies zu ermöglichen, muss das Attribut preis zum orginären Primärschlüssel (hnr, wnr) der Beziehung liefert hinzugefügt werden.

Datenbankschema

Medium:Haendler_Schema.png

Dieses Schema wurde nach dem in Kowarschick (2012) beschriebenen Verfahren aus dem obigen ER-Diargramm erzeugt.

Datenbankschema (SQL)

/***********************************************************************
 * Alte Tabellen (in der richtigen Reihenfolge) löschen 
 ***********************************************************************/

DROP TABLE IF EXISTS liefert  CASCADE;
DROP TABLE IF EXISTS ware     CASCADE;
DROP TABLE IF EXISTS haendler CASCADE;

/***********************************************************************
 * Tabellen gemäß relationalem Schema erzeugen
 ***********************************************************************/

CREATE TABLE haendler
  (hnr       INTEGER     NOT NULL,
   name      VARCHAR(30) NOT NULL,
   adresse   VARCHAR(50),

   CONSTRAINT pk_haendler
     PRIMARY KEY (hnr),

   CONSTRAINT unique_name_adresse
     UNIQUE (name, adresse)
  );

CREATE TABLE ware
  (wnr          INTEGER     NOT NULL,
   typ          VARCHAR(30) NOT NULL DEFAULT 'Sonstiges',
   bezeichnung  VARCHAR(50) NOT NULL,

   CONSTRAINT pk_ware
     PRIMARY KEY (wnr),

   CONSTRAINT unique_typ_bezeichnung
     UNIQUE (typ, bezeichnung)
  );
                
CREATE TABLE liefert
  (hnr         INTEGER       NOT NULL,
   wnr         INTEGER       NOT NULL,
   preis       NUMERIC(8,2)  NOT NULL,
   lieferzeit  SMALLINT,     /* Tage */

   CONSTRAINT pk_liefert
     PRIMARY KEY (hnr,wnr,preis),

   CONSTRAINT fk_liefert_haendler
     FOREIGN KEY (hnr) REFERENCES haendler (hnr),

   CONSTRAINT fk_liefert_ware
     FOREIGN KEY (wnr) REFERENCES ware (wnr),

   CONSTRAINT check_lieferzeit
     CHECK (lieferzeit >= 0)
  );

/***********************************************************************
 * Dummy-Tabelle. Diese Tabelle kann für Abfragen eingesetzt 
 * werden, für deren Beantwortung eigentlich gar keine Tabelle
 * benötigt wird. Laut SQL-Standard muss immer eine Tabelle
 * in der FROM-Klausel einer SELECT-Anweisung angegeben werden.
 *
 * In PostgreSQL ist es auch möglich, Select-Anweisungen ohne 
 * From-Klausel anzugeben. Dies ist allerdings nicht standard-konform.
 ***********************************************************************/

CREATE TABLE dummy
(
 id INTEGER NOT NULL,
 CONSTRAINT p_dummy
   PRIMARY KEY (id)
);

Beispiels-Daten

INSERT INTO haendler(hnr, name, adresse)
VALUES 
  (1, 'Maier',   'Königsbrunn'),
  (2, 'Müller',  'Königsbrunn'),
  (3, 'Maier',   'Augsburg'),
  (4, 'Huber',   NULL),
  (5, 'Schmidt', 'Hamburg')
;

INSERT INTO ware(wnr, typ, bezeichnung)
VALUES
  (1, 'CPU',       'Pentium IV 3,8'),
  (2, 'CPU',       'Celeron 2,6'),
  (3, 'CPU',       'Athlon XP 3000+'),
  (4, 'RAM',       'SDRAM 1GB'),
  (5, 'Sonstiges', 'Eieruhr')
;

INSERT INTO liefert(hnr, wnr, preis, lieferzeit)
VALUES 
  (1, 1, 200.00, 1),
  (1, 1, 194.00, 6),
  (1, 2, 100.00, NULL),
  (1, 3, 150.00, 7),
  (1, 4,  10.00, 1),
  (1, 5,   5.00, 1),
  (2, 1, 190.00, NULL),
  (2, 3, 170.00, 4),
  (2, 1, 160.00, 1),
  (2, 2, 180.00, NULL),
  (3, 1, 195.00, 2),
  (3, 2, 190.00, 1),
  (4, 1, 150.00, 3),
  (4, 3, 180.00, 5),
  (4, 3, 199.99, 1)
;

/***********************************************************************
 * Die Dummy-Tabelle enthält stets genau ein Tupel.
 ***********************************************************************/

INSERT INTO dummy(id)
VALUES
(1);

SQL-Beispiele

Quellen

  1. Kowarschick (MMDB): Wolfgang Kowarschick; Vorlesung „Multimedia-Datenbanksysteme“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2016; Quellengüte: 3 (Vorlesung)

Siehe auch