Wintersemester 2010 Sind Datenbanksysteme auf Basis des Relationenmodells. Enthalten zumeist die Sprache SQL. Stellen dem Anwender verschiede Systemkomponenten zur Verfügung. ZB in Access: Tabellen Abfragen (Erstellung einer externen Sicht) Formular (Masken etc.) Berichte Makros (für automatisierte Arbeitsvorgänge) Modul (Visual Basic zur Erstellung von Applikationen) Ist die sprachliche Fassung des Relationenmodells. Zentrales Element ist die Abfrage. Ist deskriptiv, nicht prozedural und enthält: ◦ DDL (Data Description Language) – Elemente: zB CREATE TABLE,… (Anlage eine Tabelle) ◦ DML (Data Manipulation Language) – Elemente: zB SELECT, UPDATE, DELETE, INSERT INTO, … ◦ DCL (Data Control Language) – Elemente: zB GRANT, … (Vergabe von Zugriffsrechten) Erzeugt Ergebnis-Relationen Auswahl (von bestimmten Zeilen) Projektion (Auswahl bestimmter Attribute) Verbund (Verknüpfung von Relationen) Vereinigung (Vereinigung von Tupeln gleicher Struktur aus verschiedenen Relationen) ◦ Durchschnitt (mengentheoretischer Durchschnitt mehrerer Relationen) ◦ Differenz (mengentheoretische Differenz mehrerer Relationen) ◦ ◦ ◦ ◦ SELECT … FROM … WHERE … GROUP BY … HAVING … UNION … ORDER BY … ; Das Kommando endet mit einem Semikolon, die SQLSchlüsselwörter werden groß geschrieben. MITARBEITER = (MNR, Name, Vorname, QUALI PRARBEIT PROJ ABT Gehalt, AbtNr) = (MNR, LNR, Qualifikation) = (MNR, PNR, LNR, Std) = (PRNR, PrBez) = (AbtNr, AbtName, AbtLeiter) Die angegebenen Attribute gelangen in die Zielrelation SELECT * FROM MITARBEITER; SELECT MNR, Name, Vorname FROM MITARBEITER; SELECT DISTINCT Vorname -> keine doppelten Tupel FROM MITARBEITER Auf Basis eines logischen Ausdrucks gelangt ein Tupel in die Zielrelation. Vergleichsoperatoren (<,>,=,<>, …) logische Operatoren (AND, OR, NOT) IN-Operator BETWEEN-Operator LIKE-Operator NULL-Operator Zur Prioritätssteuerung sind Klammern notwendig SELECT * FROM MITARBEITER WHERE Gehalt > 5000; SELECT * FROM MITARBEITER WHERE (ABTNR = 1) AND (Gehalt < 4000); SELECT * FROM MITARBEITER WHERE ABTNR in (1, 3, 7); -> alle Mitarbeiter der Abteilung 1, 3 und 7. SELECT * FROM MITARBEITER WHERE Gehalt BETWEEN 3000 AND 5000; SELECT * FROM MITARBEITER WHERE (Gehalt >= 3000) AND (Gehalt <= 5000); SELECT * FROM ABT WHERE Abt-Leiter IS NULL; -> alle Abteilungen ohne Abteilungsleiter. Nach LIKE stehen Maskierungsmöglichkeiten zur Verfügung. ◦ ? für ein einzelnes Zeichen ◦ * für beliebig viele Zeichen Beispiel: ◦ SELECT * FROM MITARBEITER WHERE Name LIKE ‘M*‘; ◦ SELECT * FROM MITARBEITER WHERE Name LIKE ‘?e*‘; Bei Selektion und Projektion können neu berechnete Attribute hinzugefügt werden. Zum Beispiel: SELECT MNR, Name, Vorname, 14*Gehalt AS Jahresgehalt FROM MITARBEITER; Mit ASC (Default) und DESC können Tupel nach Attributen sortiert werden. Beispiel: ◦ SELECT * FROM MITARBEITER ORDER BY Name DESC; ◦ SELECT * FROM MITARBEITER ORDER BY ABTNR, Name DESC; SELECT … SELECT … SELECT … Wesentliche Operatoren in Unterabfragen sind: ◦ ◦ ◦ ◦ ein Vergleichsoperator ein IN-Operator ein ANY- bzw. ALL-Operator der EXISTS-Operator Vergleichsoperator kann nur angewandt werden, wenn die Unterabfrage einen einzigen Wert ausgibt. SELECT * FROM MITARBEITER WHERE Gehalt > (SELECT Gehalt FROM MITARBEITER WHERE MNR = 10); SELECT * FROM MITARBEITER WHERE Gehalt > (SELECT Gehalt FROM MITARBEITER WHERE NAME = ‘Meyer‘); Gibt es mehrere Meyer mit verschiedenen Gehältern kann der Vergleich nicht mehr sinnvoll bearbeitet werden. Beispiel: Gesucht sind alle Mitarbeiter die Abteilungsleiter sind. SELECT * FROM MITARBEITER WHERE MNR IS (SELECT AbtLeiter FROM ABT); Bilden prädikatenlogische Quantoren ab ANY entspricht „es existiert“ ALL entspricht „für alle“ SELECT * FROM MITARBEITER WHERE Gehalt < ANY (SELECT Gehalt FROM MITARBEITER); Anm.: Gehalt muss kleiner sein als irgendein Gehalt der Mitarbeiter-Relation. „> ALL“ würde hingegen eine leere Tabelle wiedergeben. Gesucht sind alle Mitarbeiter der Abteilung 1, die mehr verdienen als die Mitarbeiter der Abteilung 2. SELECT * FROM MITARBEITER WHERE (ABTNR = 1) AND (Gehalt > ALL (SELECT Gehalt FROM MITARBEITER WHERE ABTNR = 2)); Tupel werden nach bestimmten Kriterien gruppiert um für jede Gruppe verrechnete Daten zu bestimmen. Beispiel: Pro Abteilungsnummer soll Anzahl der Mitarbeiter und das Durchschnittsgehalt ausgegeben werden. SELECT ABTNR; Name, COUNT (*) As Mitarbeiteranzahl FROM Mitarbeiter GROUP BY ABTNR; Folgende Aggregatfunktionen stehen zur Verfügung: ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ COUNT (*) Anzahl der Tupel in einer Gruppe COUNT (<Attr>) Attributwert nicht Null MIN (<Attr>) Minimum des Attributs in der Gruppe Max (<Attr>) Maximum des Attributs in der Gruppe SUM (<Attr>) Summe des Attributs AVG (<Attr>) Mittelwert des Attributs … Wieviele Std. wurden pro PRNR in PRARBEIT abgerechnet? Welche Abteilungen haben mehr als 5 Mitarbeiter, Ergebnis nach ABTNR: SELECT PRNR, SUM (Std) AS Stundensumme FROM PRARBEIT GROUP BY ABTNR; SELECT ABTNR, COUNT (MNR) AS Mitarbeiteranzahl FROM Mitarbeiter GROUP BY ABTNR HAVING COUNT (MNR) > 5 ORDER BY ABTNR; Wieviele Mitarbeiter gibt es und wie hoch ist ihr Durchschnittsgehalt: SELECT COUNT (*) AS Anzahl, AVG (Gehalt) AS Durchschnittsgehalt FROM Mitarbeiter; Auswahl von Tupelteilen aus mehreren Relationen. Beispiel: Mitarbeiterliste mit Namen des Mitarbeiters (MITARBEITER) und Namen der Abteilung (ABT). SELECT MNR; Name, Vorname, AbtName FROM MITARBEITER, ABT WHERE MITARBEITER.ABTNR = ABT.ABTNR; Relationenname wird vorangestellt um Verwechslungen zu vermeiden. MITARBEITER QUALI PRARBEIT PROJ ABT = (MNR, Name, Vorname, Gehalt, AbtNr) = (MNR, LNR, Qualifikation) = (MNR, PNR, LNR, Std) = (PRNR, PrBez) = (AbtNr, AbtName, AbtLeiter) SELECT M.MNR, M.Name, M.Vorname, A.AbtName FROM MITARBEITER AS M, ABT AS A WHERE M.ABTNR = A.ABTNR; Ein Aliasname wird bestimmt. SELECT M.*, A.AbtName FROM MITARBEITER AS M, ABT AS A WHERE M.ABTNR = A.ABTNR; Unterabfrage hat einen Bezug (Korrelation) zum übergeordneten SQL-Ausdruck. SELECT * FROM MITARBEITER M1 WHERE EXISTS (SELECT Name FROM MITARBEITER M2 WHERE (M1.Name = M2.Name) AND (M2.MNR <> M1.MNR)); Sind strukturvergleichbare Vereinigungen von SQL-Abfragen. MITARBEITER QUALI PRARBEIT PROJ ABT = = = = = (MNR, Name, Vorname, Gehalt, AbtNr) (MNR, LNR, Qualifikation) (MNR, PNR, LNR, Std) (PRNR, PrBez) (AbtNr, AbtName, AbtLeiter) Beispiel: Alle Abteilungsnamen Projektbezeichnungen sollen in einem Attribut ausgegeben werden: SELECT Abtname AS Name FROM ABT UNION SELECT PrBez FROM PROJ; Alle MNR und PRNR sollen mit entsprechender Bezeichnung sortiert nach Nummern ausgegeben werden: SELECT MNR AS Nummer, ‘MNR‘ AS ArtderNummer FROM MITARBEITER UNION SELECT PRNR, ‘Projektnummer‘ FROM PROJ ORDER BY Nummer;