[ 1 ] [ 2 ] [ 3 ] [ 4 ]

Self-Join

Verknüpfung mit „sich selbst“

 SELECT mit.mitarb_id, mit.name, mit.vorname, mit.position as  von_pos,; 
  mit.berichtet, chef.name as chef, chef.position as an_pos  ; 
  from mitarb mit join mitarb chef ; 
  on val(chef.mitarb_id) = val(mit.berichtet) ; 
  order by 5 

Die Quelldatei wird hierbei mehrfach geöffnet, jedesmal unter einem anderen Alias (mit, chef). Dann wird sie wie zwei unabhängige Tabellen behandelt.

Unterabfragen (Subquerys)

In der Where-Klausel darf eine Unterabfrage formuliert werden. Diese kann sich auf die selbe Tabelle oder eine andere, an der eigentlichen Abfrage nicht beteiligte Tabelle beziehen

Korrelierte / Nichtkorrelierte Subquery

Eine korrelierte Unterabfrage wird für jeden Satz der führenden Tabelle erstellt, weil sie sich auf den Inhalt des jeweils ausgewerteten Satzes bezieht.

 SELECT * from kunden ; 
  where EXISTS ;  
 (SELECT plz FROM bestell ; 
    WHERE kunden.kunde_id = bestell.kunde_id and ; 
    kunden.plz = bestell.plz) 

Eine nicht korrelierte Unterabfrage wird nur einmal für die gesamte Abfrage erstellt und dann mit jedem Satz der führenden Tabelle verglichen.

Artikel, die teurer als der Durchschnitt aller Artikel sind:

 SELECT * from artikel ; 
  where artikel.stk_preis ; 
  > (select avg(stk_preis) from artikel) 

Exists() / In()

Alle Mitarbeiter, die (nicht) in München arbeiten:

 SELECT nachname,vorname,pid, aid ; 
  from personal where aid [not] in ; 
  (select aid from abteilung where ort = "München") 

Wieviele Mitarbeiter aus welchen Abteilungen arbeiten in (nicht) München?

 SELECT count(aid), aid from personal ; 
  group by aid where aid in ; 
  (select aid from abteilung where ort = "München") 

Mitarbeiter, die dem Projekt 11 zugeordnet sind:

 SELECT nachname from personal, zuordnung ; 
  where personal.pid = zuordnung.pid ; 
  and projid = 11 

Variante mit subquery IN:

 SELECT nachname from personal ; 
  where pid in ; 
  (select pid from zuordnung where projid = 11) 

Variante mit subquery EXISTS:

 SELECT nachname from personal ; 
  where EXISTS ; 
  (select pid from zuordnung ; 
  where personal.pid = pid ; 
  and projid = 11) 

Abteilungsname und Mitarbeiter mit höchster Personalnummer:

  
 SELECT pid, bezeichng, nachname ; 
  from personal p, abteilung ; 
  where p.pid = ; 
  (select max(pid) from personal ; 
  where p.aid= aid) ; 
  and p.aid = abteilung.aid 

Welche Mitarbeiter sind nicht dem Projekt 11 zugeordnet?

Genügt es, die Suchbedingung einfach zu negieren:

 ‘where projid <> 11’ ??? 
 SELECT personal.pid,nachname from personal, zuordnung ; 
  where personal.pid = zuordnung.pid ; 
  and projid <> 11 

Welche Mitarbeiter sind keinem Projekt zugeordnet?

 SELECT personal.pid,nachname from personal ; 
  where not EXISTS ; 
  (select projid from zuordnung ; 
  where personal.pid = pid ) 

Any(), All()

Update

Der Befehl Update wird benutzt, um Inhalte bestehender Tabellen zu ändern.

 Syntax: 
  
 UPDATE [DatabaseName1!]TableName1 
 SET Column_Name1 = eExpression1 
 [, Column_Name2 = eExpression2  ...] 
 WHERE FilterCondition1 [AND | OR  FilterCondition2 ...]] 

UPDATE - SQL kann nur Datensätze einer einzigen Tabelle aktualisieren.

Insert

Mit dem Insert-Befehl werden neue Datensätze an bestehende Tabellen angehängt.

 INSERT INTO dbf_name [(fname1 [,  fname2, ...])] 
 VALUES (eExpression1 [,  eExpression2, ...]) 

- Oder -

 INSERT INTO dbf_name FROM ARRAY  ArrayName | FROM MEMVAR 

Delete

Der Delete-Befehl markiert Datensätze zum Löschen.

 DELETE FROM [DatabaseName!]TableName 
 [WHERE FilterCondition1 [AND | OR  FilterCondition2 ...]] 

Datenbanken (DDL)

Unter einer Datenbank versteht man die Gesamtheit einer Datenumgebung mit den Elementen

  • Tabellen
  • Relationen
  • Regeln für die Integrität der Daten
  • Stored Procedures (optional)
  • Repository / Data dictionary (optional)

Zum Erstellen von Datenbanken hat VFP kein SQL-Kommando. Bei den „großen“ DBMS ist das Anlegen von Datenbanken Sache eines Administrators.

In VFP gilt der (proprietäre) Befehl :

 Create Database <Name> 

Damit wird ein leerer Datenbankcontainer (DBC) angelegt und geöffnet.

Tabellen

Mit Create Table wird eine neue Tabelle erstellt.

Ist ein DBC geöffnet, so wird die Tabelle in die Datenbank eingefügt, es sei denn, der Create-Befehl enthielte das Argument „Free“.

Ist kein DBC geöffbet, so wird eine freie Tabelle erstellt.

Die Syntax des Befehls ist komplex, da sehr viele Metadaten gesteuert werden können:

 CREATE TABLE | DBF TableName1 [NAME LongTableName] [FREE] 
  (FieldName1 FieldType [(nFieldWidth [, nPrecision])] 
     [NULL | NOT NULL]  
     [CHECK lExpression1 [ERROR cMessageText1]] 
     [DEFAULT eExpression1] 
     [PRIMARY KEY | UNIQUE] 
     [REFERENCES TableName2 [TAG TagName1]] 
     [NOCPTRANS] 
  [, FieldName2 ...] 
     [, PRIMARY KEY eExpression2 TAG TagName2 
     |, UNIQUE eExpression3 TAG TagName3] 
     [, FOREIGN KEY eExpression4 TAG TagName4 [NODUP] 
REFERENCES TableName3 [TAG TagName5]] 
     [, CHECK lExpression2 [ERROR cMessageText2]]) 
 | FROM ARRAY ArrayName 

Der erste Teil beschreibt den Tabellenaufbau, also Spaltennamen, Spaltenbreiten und Datentypen.

Das genügt zunächst, um eine Tabelle einzurichten.

Schlüssel (Keys)

Mit den „Key“-Ausdrücken werden Indizes angelegt und Beziehungen zu übergeordneten Tabellen gestiftet. Diese „Eltern-“ oder „Master“-Tabellen müssen bereits vorhanden sein

......................................... 
     [PRIMARY KEY | UNIQUE] 
     [REFERENCES TableName2 [TAG TagName1]] 
     [NOCPTRANS] 
  [, FieldName2 ...] 
     [, PRIMARY KEY eExpression2 TAG TagName2 
     |, UNIQUE eExpression3 TAG TagName3] 
     [, FOREIGN KEY eExpression4 TAG TagName4 [NODUP] 
REFERENCES TableName3 [TAG TagName5]] 
 ......................................... 
 Defaults NULL 
  (FieldName1 FieldType [(nFieldWidth [, nPrecision])] 
     [NULL | NOT NULL]  
     [DEFAULT eExpression1] 

Mit diesen Argumenten wird bestimmt, ob ein Feld Nullwerte enthalten darf und mit welchem Wert es gefüllt wird, wenn ein neuer Satz leer angelegt wird.

eExpression1 darf auch eine Funktion sein.

Constraints (Check)

  (FieldName1 FieldType [(nFieldWidth [, nPrecision])] 
     [CHECK lExpression1 [ERROR cMessageText1]] 

Mit der Check-Klausel kann man je Feld eine Gültigkeitsregel hinterlegen, die beim Anlegen und Ändern des Feldes überprüft wird. Die Dazu definierte ERROR-Message wird ausgegeben, wenn die Gültigkeitsprüfung fehlschlägt.

Trigger (Insert, Update, Delete)

Trigger sind Programme, die im Datenbankcontainer gespeichert sind und durch Ereignisse ausgelöst werden.

Als Ereignisse wirken das Löschen, Einfügen und Ändern eines Datensatzes.

 CREATE TRIGGER ON TableName 
  FOR DELETE | INSERT | UPDATE AS lExpression 

lExpression kann dabei direkt als logischer Ausdruck formuliert sein (z.B. NOT EMPTY(<Feld7>)) oder als Funktionsaufruf auf eine Stored Procedure verweisen.

Stored procedures

Programme, die für die Funktion der Datenbank wichtig sind, oder häufig benötigte Abfragen werden im DBC gespeichert und können jederzeit aufgerufen werden. Der DBC wirkt hier wie eine globale Prozedurdatei.

Views (virtuelle Tabellen)

In Datenbanken lassen sich virtuelle Tabellen erzeugen, die nicht mit ihren Inhalten sondern lediglich dem erzeugenden SQL-Statement gespeichert werden. Der SQL-Code wird jeweils erst bei Bedarf ausgeführt. Für den Benutzer der Datenbank sehen Views wie normale Tabellen aus.

Views können Daten aus mehreren Tabellen enthalten. Unter bestimmten Bedingungen sind Views durch den Benutzer oder das Anwendungsprogramm änderbar. Die Änderungen werden auch in die Quelltabellen der Views zurückgeschrieben, wenn dies nicht an Integritätsregeln scheitert.

[ 1 ] [ 2 ] [ 3 ] [ 4 ]