Hessischer Bildungsserver / Arbeitsplattformen

Datenbank-Theorie

 

Die erfolgreiche Arbeit mit einem Datenbanksystem setzt konzeptionelle theoretische Grundlagen voraus. Dazu zählen z.B. der Datenbankentwurf mit dem Entity-Relationship-Modell, Komplexitäten (1:1, 1:n, n:m), Abbildung eines ER-Diagramms auf Tabellen, relationale Operatoren (Selektion, Projektion, Join), Structured Query Language (SQL) und Normalisierungsverfahren. Eine schüleradäquate Darstellung dieser Inhalte finden Sie im Heft 3, Datenbanken, der Reihe Materialien zum Unterricht, Informatik, Sekundarstufe II.

 

Datenbank-Praxis

Für die Datenbank-Praxis reicht nicht nur ein vernünftiger Datenbankentwurf, man braucht natürlich auch Daten, und das ist das größere Problem. Wir greifen daher auf die Nordwind-Datenbank zurück, welche ausreichend viele Daten enthält. Im Dialogfenster Beziehungen zeigt Access die Struktur dieser Datenbank an:

Als Entitytypen kommen vor: Lieferanten, Artikel, Kategorien, Bestellungen, Kunden, Versandfirmen und Personal. Lieferanten liefern Artikel, welche bestimmten Produktgruppen, den Kategorien zugeordnet sind. Kunden können Bestellungen aufgeben, welche vom Personal bearbeitet und von Versandfirmen ausgeliefert werden. Aus den analysierten Tabellen und Beziehungen lässt sich auf das zugehörige ER-Diagramm zurückschließen:

 

Die Abfragesprachen SQL - Structured Query Language

Mit Query by Example (QBE) können nur manuell Abfragen erstellt werden. Die Mächtigkeit von Informatiksystemen beruht aber inhärent auf der Verwendung von Verfahren, die automatisiert von einer Maschine ausgeführt werden können, z.B. Makros oder Algorithmen. Grundlage dieser Verfahren sind Sprachen, in denen die gewünschten Prozesse, Aktionen und Abläufe beschrieben werden. Mit der Abfragesprache SQL können relationale Datenbanken bearbeitet werden. In Datenbanksystemen steht SQL zur Verfügung, wobei herstellerspezifische Erweiterungen bzw. Einschränkungen sowie syntaktische Besonderheiten beim eingesetzten System zu beachten sind.

Die Grundform einer SQL-Anweisung ist aus drei Teilen aufgebaut:

SELECT Attribut1, Attribut2, Attribut3, ....
FROM Tabelle1, Tabelle2,...
WHERE Bedingung

SELECT projiziert auf die gewünschten Spalten, FROM gibt an auf welchen Tabellen die Projektion ausgeführt werden soll (Kreuzprodukt) und WHERE spezifiziert eine Selektionsbedingung. Den Join kann man über eine entsprechende Kombination aus Projektion, Selektion und Kreuzprodukt erhalten.

Beispiel:

SELECT [Artikel-Nr], Artikelname, Firma
FROM Artikel, Lieferanten
WHERE Artikel.[Lieferanten-Nr] = Lieferanten.[Lieferanten-Nr];

oder durch die INNER JOIN Erweiterung der FROM-Klausel:

SELECT [Artikel-Nr], Artikelname, Firma
FROM Artikel INNER JOIN Lieferanten ON Artikel.[Lieferanten-Nr]=Lieferanten.[Lieferanten-Nr];

 

SQL-Tutorial und HLP-Datei

Als Einführung in SQL eignet sich das Interaktive SQL-Tutorial.

Delphis SQL ist in LOCALSQL.HLP dokumentiert.

 

Aufgaben

Die Lösung der Aufgaben kann mit dem nachfolgend entwickelten SQL-Explorer überprüft werden:

  1. Projiziere die Artikel-Tabelle auf die Attribute Artikel-Nr, Artikelname und Lieferanten-Nr.
  2. Sortiere die Tabelle aus 1. mit ORDER BY nach dem Artikelnamen.
    Selektiere alle Artikel, deren Einzelpreis mindestens 50,- DM beträgt.
  3. Selektiere alle Artikel, deren Namen zwischen L und P liegen.
  4. Erstelle eine Tabelle mit den Attributen Artikel-Nr, Artikelname und Firma.
  5. Erstelle eine Tabelle mit Artikel-Nr, Artikelname und zugehörigem Kategorienname.
  6. Welche Artikel gehören zur Bestellnummer 10266?

 

SQL-Trainer

Mit dem SQL-Trainer von Otto Wehrheim soll die Nordwind-Datenbank bearbeitet werden. Neben einer Edit- und Memo-Komponente kommen im Formular eine DBGrid- und eine DBNavigator-Komponente vor. Desweiteren als unsichtbare Komponenten eine Query- und Datasource-Komponente.

Zum Ausführen einer SQL-SELECT-Anweisung übernehmen wir die Zeilen der Memo-Komponente in die SQL-Eigenschaft der Query-Komponente und führen die SQL-Anweisung mit Open aus:

procedure TForm1.BSelectClick(Sender: TObject);
var t1, t2: DWord;
begin
Screen.Cursor:=crHourGlass;
Query1.Close;
Query1.DatabaseName:=Edit1.Text;
Query1.SQL:=MSQLText.Lines;
t1:= getTickCount;
try
Query1.Open;
t2:= getTickCount;
Screen.Cursor:=crDefault;
PAnzeige.Caption:= IntToStr(Query1.Recordcount) + ' Records '+
IntToStr(t2-t1) + ' ms';
except
Screen.Cursor:=crDefault;
ShowMessage('Es ist ein SQL-Fehler aufgetreten!')
end;
Screen.Cursor:=crDefault;
end;

Damit auch alle Komponenten zusammen arbeiten sind folgende Einstellungen erforderlich:

Query1.Databasename Nordwind (ein gültiger Datenbankalias)
DataSource1.DataSet Query1
DBGrid.DataSource DataSource1
DBNavigator.DataSource DataSource1

Zum Aufbewahren von SQL-Anweisungen stehen Dateiauswahldialoge zur Verfügung, über die SQL-Abfragen gespeichert und geladen werden können.

Die Query-Komponente verfügt über jede Menge eigene Eigenschaften und Methoden. Weitere Funktionalität bieten die von TDataSet, TBDEDataSet und TDBDataSet geerbten Eigenschaften und Methoden. Beispielsweise lässt sich mit dem von TDBEDataSet geerbten RecordCount die Anzahl der gefundenen Datensätze und mit dem von TDataSet geerbten FieldCount die Anzahl der Felder pro Datensatz ermitteln und im Formular des Explorers anzeigen.

Für INSERT-, UPDATE- und DELETE-Anweisungen ist statt der Open-Methode die ExecSQL-Methode zu benutzen. Sie wird über den Schalter DML/DLL (Data Manipulation Language/Data Definition Language) aufgerufen.