Datenbanken SQL Einführung und SQL-DDL SQL Überblick ANSI/ISO standardisierte Datendefinitions (DDL)Datenmanipulations (DML)Anfrage (Query)-Sprache SQL-92 weitgehend von den meisten DBHerstellern implementiert Neuere Standards: SQL-99 und SQL3 (2003) objektrelationale Erweiterung XML teilweise implementiert 2 Der SFW-Block SELECT ... FROM ... WHERE ... Standardform einer SQL-Anfrage 3 FROM Klausel SELECT * FROM Relationenliste SELECT * FROM Bücher Liefert die gesamte Relation Bücher 4 Kartesisches Produkt SELECT * FROM R1, R2 R1 A B C 1 2 4 5 R12 R2 D E F 3 7 8 9 6 10 11 12 A B C D E F 1 2 3 7 8 9 1 2 3 10 11 12 4 5 6 7 8 9 4 5 6 10 11 12 5 INNER JOIN SELECT * FROM R1, R2 WHERE R1.C=R2.D R1 A B C 1 2 4 5 R12 SELECT * FROM R1 INNER JOIN R2 ON R1.C=R2.D R2 D E F 7 7 8 9 6 10 11 12 A B C D E F 1 2 7 7 8 9 6 Natürlicher Verbund SELECT * FROM R1 natural join R2 R1 A B C 1 2 4 5 R12 R2 B E F 7 5 8 9 6 10 11 12 A B C B E F 4 5 6 5 8 9 Jene Zeilen werden verbunden, deren gleich benannte Attribute gleiche Werte haben. 7 Äußere Verbunde Left Outer Join, Right Outer Join, Full Outer Join 8 OUTER JOINS SELECT l.A, l.B, r.C FROM links l LEFT OUTER JOIN rechts r ON l.B=r.B SELECT l.A, r.B, r.C FROM links l RIGHT OUTER JOIN rechts r ON l.B=r.B SELECT l.A, l.B, r.C FROM links l FULL OUTER JOIN rechts r ON l.B=r.B 9 SELECT SELECT [DISTINCT] {attribute | arithmetischer-ausdruck | aggregat-funktion FROM ... Attribute werden festgelegt, die im Anfrageergebnis erscheinen sollen Entspricht Projektion in der relationalen Algebra Beispiel: SELECT Preis FROM Artikel 10 SELECT II Arithmetische Ausdrücke über Attributen und Konstanten Aggregatfunktionen über Attributen SELECT Preis/1.4 FROM Artikel SELECT SUM (Preis) FROM Artikel SELECT COUNT(*) FROM Artikel DISTINCT: Menge statt Multimenge 11 Projektionsergebnis Menge oder Multimenge 12 Tupelvariablen und Relationennamen Angabe der Attributnamen durch Präfix ergänzen: SELECT Bücher.ISBN FROM Bücher Tupelvariable kann benutzt werden: SELECT eins.ISBN, zwei.Titel FROM Bücher eins, Bücher zwei 15 Tupelnamen und Relationennamen II Welches Problem gibt es hier? SELECT ISBN, Titel, Stichwort FROM Bücher, Buch_Stichwort WHERE Bücher.ISBN=Buch_Stichwort.ISBN ISBN im SELECT-Teil ist nicht eindeutig Richtig: SELECT Bücher.ISBN, Titel, Stichwort FROM Bücher, Buch_Stichwort WHERE Bücher.ISBN=Buch_Stichwort.ISBN 16 WHERE Klausel SELECT ... FROM ... WHERE Bedingung Selektion von Tupeln der hinter FROM stehenden Relationen, die der hinter WHERE stehenden Bedingung genügen Entspricht Selektion in der relationalen Algebra Bedingung: Konstantenselektion Attributselektion Verbundbedingung Bereichsselektion Ungewissheitsselektion NULL-Selektion Quantifizierte Bedingungen 17 Verbundbedingung Relation1.attribut=Relation2.attribut Bsp. Natürlicher Verbund: SELECT Bücher.Titel, Bücher_Stichwort.Stichwort FROM Bücher, Buch_Stichwort WHERE Bücher.ISBN = Buch_Stichwort.ISBN 18 Konstanten- und Attributselektion Konstantenselektion Vergleich eines Attributs mit einer Konstante SELECT * FROM Artikel WHERE Preis < 100 Attribut-Selektion Vergleich zweier Attribut mit kompatiblen Wertebereichen SELECT * FROM Artikel WHERE Einkaufspreis = Verkaufspreis 19 Bereichsselektion Attribut BETWEEN konstante1 AND konstante2 Abkürzung für Achtung: eigentlich von/bis [konstante1, konstante2] Attribut ≥ konstante1 and attribut ≤ konstante2 Beispiel: SELECT * FROM Artikel WHERE Preis BETWEEN 100 and 200 20 Ungewissheitsselektion Attribut LIKE Spezialkonstante Spezialkonstante kann beinhalten % kein oder beliebig viele Zeichen _ genau ein Zeichen 21 Ungewissheitsselektion II Beispiel: Selektion von Büchern von Benjamin/Cummings SELECT * FROM Bücher WHERE Verlagsname LIKE `Benj%Cummings%´ Ist Abkürzung für SELECT * FROM Bücher WHERE Verlagsname = `Benjamin Cummings´ OR Verlagsname = `Benjamin/Cummings´ OR Verlagsname = `Benjamin and Cummings´ OR Verlagsname = `BenjFJSLKDJFCummingsJFDLKJ´ usw. 22 Quantifizierte Bedingungen Vergleich eines Attributs mit einer Menge ALL, ANY, SOME Bsp. ALL: SELECT Note FROM Prüft WHERE Matrikelnr = 1234 AND Note ≥ ALL (SELECT Note FROM Prüft WHERE Matrikelnr = 1234) Gibt schlechteste Note des Studenten mit der Matrikelnummer 1234 aus. 23 Quantifizierte Bedingungen II Bsp. ANY SELECT Name FROM Student WHERE Matrikelnr = ANY (SELECT Matrikelnr FROM Prüft) Selektiert Namen aller Studenten, die schon geprüft wurden. Unterschied ANY und SOME? Keiner, sind identisch. Grund: englische Grammatik. 24 Weitere Bedingungen NULL-Selektion Attribut IS NULL Wählt Tupel aus, die bei einem bestimmten Attribut Nullwerte enthalten Verknüpfungen der Bedingungen OR, AND, NOT 25 Relationales Modell: SQL-DDL SQL-DDL umfasst alle Klauseln von SQL, die mit Definition von Typen Wertebereichen Relationenschemata Integritätsbedingungen zu tun haben. SQL Datentypen char(n) varchar(n) numeric(p,s), integer blob oder raw für sehr große binäre Daten clob für sehr große String-Attribute date für Datumsangaben xml für XML-Dokumente ... Achtung: Datentypen sind teilweise Hersteller-spezifisch!!! im DBMS-Manual nachlesen, wie der Datentyp definiert ist SQL als Definitionssprache Externe Ebene create view alter view drop view Konzeptuelle Ebene create table alter table drop table SQL als Definitionssprache II Konzeptuelle Ebene create domain alter domain drop domain Interne Ebene create index alter index drop index CREATE TABLE Beispiele CREATE TABLE Bücher (ISBN char(10) NOT NULL, Titel varchar(200), Verlagsname varchar(30)) CREATE TABLE Bücher (ISBN char(10), Titel varchar(200), Verlagsname varchar(30), PRIMARY KEY (ISBN), FOREIGN KEY (Verlagsname) REFERENCES Verlage (Verlagsname)) Definition eines Wertebereichs CREATE DOMAIN Gebiete varchar(20) DEFAULT `Informatik´ CREATE TABLE Vorlesungen ( Bezeichnung VARCHAR(80) NOT NULL, SWS smallint, Semester smallint, Studiengang Gebiete) CREATE TABLE Mitarbeiter ( PANR integer NOT NULL, Fachbereich Gebiete, Gehalt decimal(10,2), Raum integer, Einstellung date) CHECK Klausel CREATE TABLE Vorlesungen ( Bezeichnung varchar(80) PRIMARY KEY, SWS smallint CHECK(SWS>=0), Semester smallint CHECK (Semester BETWEEN 1 AND 9), Studiengang Gebiete) ALTER TABLE ALTER TABLE relationenname ADD spaltenname wertebereich ALTER TABLE Lehrstühle ADD Budget decimal(8,2) Wirkung: Änderung des Relationenschemas im Data-Dictionary. Erweiterung der existierenden Tupel um ein Attribut, welches mit NULL besetzt wird. Angabe von default-Werten und check-Klausel möglich ADD Budget decimal(8,2) DEFAULT 30000 CHECK (Budget > Anzahl_Planstellen * 3000) ALTER und DROP für Attribute ALTER spaltenname DATENTYP ALTER spaltenname SET DEFAULT wert Änderung des Datentyps In Oracle: MODIFY spaltenname DATENTYP Änderung der Defaultwerte DROP spaltenname {RESTRICT | CASCADE} Erlaubt Löschen von Attributen, falls keine Sichten und Integritätsbedingungen mit Hilfe dieses Attributs definiert wurden (im Fall RESTRICT) Oder mit gleichzeitiger Löschung dieser Sichten und Integritätsbedingungen (im Fall CASCADE) DROP TABLE DROP TABLE relationenname {RESTRICT | CASCADE} Löscht Tabelle (auch das Schema, nicht nur den Inhalt) RESTRICT und CASCADE analog zu DROP bei Attributen SQL Queries Teil 1 Schachtelung von Anfragen WHERE Klausel kann geschachtelt werden SFW Blöcke liefern im Allgemeinen mehrere Werte Vergleiche mit Wertemengen Standardvergleiche in Verbindung mit Quantoren ALL oder ANY Spezielle Prädikate für den Zugriff auf Mengen IN und EXISTS 37 Das IN-Prädikat und geschachtelte Anfragen Syntax Attribut IN (SFW-Block) Beispiel: SELECT Titel FROM Bücher WHERE ISBN IN (SELECT ISBN FROM EMPFIEHLT) Natürlicher Verbund mit nachfolgender Projektion 38 Wie erfolgt die Abarbeitung dieser SQL Abfrage? Ergebnis der inneren SELECT Anweisung hinter IN als Liste von Konstanten einsetzen Dann Auswertung der modifizierten Anfrage: Was liefert dies Abfrage also? SELECT Titel FROM Bücher WHERE ISBN IN (1111, 2222, 3333, 4444) Titel aller empfohlenen Bücher. Liegt hier eine Verzahnung vor? Nein, die innere Abfrage ist unabhängig von der äußeren Abfrage! 39 Wie kann man die Abfrage anders formulieren? SELECT Titel FROM Bücher, Empfiehlt WHERE Bücher.ISBN=Empfiehlt.ISBN Gibt es einen Unterschied zu vorher? Duplikate kommen vor, falls ein Buch mehrmals empfohlen wurde. Falls es keine Bücher mit verschiedener ISBN aber gleichem Titel gibt, liefert SELECT DISTINCT Titel ... das gleiche Ergebnis. 40 Verzahnt geschachtelte Anfragen In der inneren Anfrage Relationen oder TupelvariablenNamen aus dem FROM-Teil der äußeren Anfrage verwenden: SELECT Nachname FROM Personen WHERE 1.0 IN (SELECT Note FROM Prüft WHERE PANr=Personen.PANr) Was liefert diese Anfrage? Nachnamen aller Prüfer, die schon einmal die Note 1.0 gegeben haben. 41 Abarbeitung 1. 2. 3. 4. In der äußeren Anfrage das erste Personen-Tupel untersuchen und das Ergebnis in die innere Anfrage einsetzen. Innere Anfrage SELECT Note FROM Prüft WHERE PANr=4711 auswerten. Liefert Werteliste (2.0, 3.0). Ergebnis der inneren Anfrage in die äußere einsetzen: 1.0 IN (2.0, 3.0) ergibt FALSE, d.h. ersten Prüfer nicht berücksichtigen. In der äußeren Anfrage das zweite Personen-Tupel untersuchen usw. 42 Wie kann man diese Anfrage anders formulieren? SELECT Nachname FROM Personen, Prüft WHERE Personen.PANr=Prüft.PANr AND Prüft.Note=1.0 Unterschied zu vorher? Nachname wird mehrmals ausgegeben, wenn ein Prof. mehrere 1er vergeben hat. 43 Noch eine andere Variante: Umdrehen der Abfragen SELECT Nachname FROM Personen WHERE PANr IN (SELECT PANr FROM Prüft WHERE Note = 1.0) Umdrehen ist generell möglich Vorteil? Nicht mehr verzahnt! 44 Was liefert diese SQL Abfrage? SELECT Matrikelnummer FROM Prüft WHERE PANr IN (SELECT PANr FROM Prüft WHERE Matrikelnummer = 123) Matrikelnummer aller Studenten, die zumindest einen Prüfer mit dem Studenten 123 gemeinsam hatten. Liegt hier eine Verzahnung vor? Nein, der Gültigkeitsbereich der inneren FROM Klausel bindet stärker. 45 Umformulierung mittels Verbund SELECT A.Matrikelnummer FROM Prüft A, Prüft B WHERE B.Matrikelnummer = 123 AND A.PANr = B.PANr 46 Was ergibt folgende Anfrage? SELECT X.PANr FROM Prüft X WHERE X.PANr IN (SELECT Y.PANr FROM Prüft Y WHERE Y.Matrikelnummer <> X.Matrikelnummer) Gibt PANr aller Prüfer aus, die mehr als einen Studenten geprüft haben. 47 Umformulierung mittels Verbund SELECT DISTINCT X.PANr FROM Prüft X, Prüft Y WHERE X.PANr = Y.PANr AND X.Matrikelnummer <> Y.Matrikelnummer 48 Das EXISTS-Prädikat Testet, ob das Ergebnis der inneren Anfrage nicht leer ist. SELECT ISBN FROM BUCH_EXEMPLARE WHERE EXISTS (SELECT * FROM Ausleihe WHERE Inventarnr = Buch_Exemplare.Inventarnr) Was liefert diese Abfrage? Die ISBN der ausgeliehenen Bücher. 49 Umformulierung mittels Verbund SELECT ISBN FROM Buch_Exemplare, Ausleihe WHERE Ausleihe.Inventarnr = Buch_Exemplare.Inventarnr 50 EXISTS: Simulation des Allquantors SELECT Lehrstuhlbezeichnung FROM Professoren WHERE NOT EXISTS (SELECT * FROM Liest WHERE Liest.PANr = Professoren.PANr AND NOT EXISTS (SELECT * FROM Prüft WHERE Prüft.PANr = Professoren.PANr AND Prüft.V_Bezeichnung=Liest.V_Bezeichnung)) Lehrstuhlbezeichnung von Professoren, die alle Vorlesungen geprüft haben, die sie lesen 51 Simulation des Allquantors: Mathematischer Hintergrund Doppelte Negation 52 Professoren, die alle VO geprüft haben, die sie lesen Professoren, die keine VO, die sie lesen, nicht geprüft haben Professoren, sodass keine von diesem gelesene VO existiert, für die von ihm keine Prüfung existiert. SELECT Lehrstuhlbezeichnung FROM Professoren WHERE NOT EXISTS (SELECT * FROM Liest WHERE Liest.PANr = Professoren.PANr AND NOT EXISTS (SELECT * FROM Prüft WHERE Prüft.PANr = Professoren.PANr AND Prüft.V_Bezeichnung=Liest.V_Bezeichnung)) 53 Bsp. zur Vereinigung: Alle Mitarbeiter und Studenten SELECT svnr FROM Mitarbeiter UNION SELECT svnr FROM Studenten Voraussetzungen Gleiche Attribut-Anzahl Attribute müssen positionsweise kompatibel sein Duplikate werden eliminiert UNION ALL verhindert dies 54 Bsp. zur Differenz: Alle Mitarbeiter, die keine Studenten sind. SELECT svnr FROM Mitarbeiter EXCEPT SELECT svnr FROM Studenten Achtung: MINUS in Oracle Wie kann man dies ohne EXCEPT simulieren? SELECT svnr FROM Mitarbeiter WHERE svnr NOT IN (SELECT svnr FROM Studenten) 55 Bsp. zur Schnittmenge: Alle Mitarbeiter, die auch Student sind SELECT svnr FROM Mitarbeiter INTERSECT SELECT svnr FROM Studenten Wie kann man dies ohne INTERSECT simulieren? SELECT svnr FROM Mitarbeiter WHERE svnr IN (SELECT svnr FROM Studenten) 56 Quantoren und Mengenvergleiche Syntax Attribut {all | any | some} (SELECT attribut FROM ... WHERE ...) ALL ... Allquantor ANY, SOME ... Existenzquantoren Beispiel SELECT Matrnr, Immatrikulationsdatum IN FROM Studenten WHERE Matrnr = ANY (SELECT Matrnr FROM Prüft) Ergebnis der Abfrage? Studenten, die bereits geprüft wurden 57 Was macht folgende Abfrage? SELECT Note FROM Prüft WHERE Matrnr = 12 AND Note >= ALL (SELECT Note FROM Prüft WHERE Matrnr=12) Ermittelt schlechteste Note des Studenten 12 Bestimmt Maximalwert ohne Verwendung der Aggregatfunktionen Umformulierung: SELECT MAX(Note) FROM Prüft WHERE Matrnr = 12 58 Geben Sie alle Bücher aus, an denen Vossen und Witt gemeinsam als Autoren beteiligt waren! Buch = {ISBN, Titel, Autor} Was gibt folgendes Statement: SELECT ISBN FROM Buch WHERE Autor=‘Vossen’ and Autor=‘Witt’ leere Ergebnismenge, da tupelweise ausgewertet wird und nicht gleichzeitig ‘Vossen’ und ‘Witt’ in einem Tupel stehen können. 59 Lösung mit Selbstverbund SELECT b1.ISBN FROM Buch b1, Buch b2 WHERE b1.ISBN=b2.ISBN AND b1.Autor=‘Vossen’ AND b2.Autor=‘Witt’ Umformulierung mittels IN Prädikat? SELECT ISBN FROM Buch b1 WHERE Autor= ‘Vossen’ AND ‘Witt’ IN (SELECT Autor FROM Buch WHERE ISBN=b1.ISBN) 60 Weitere Varianten Weitere Umformulierung mittels IN Prädikat? SELECT ISBN FROM Buch WHERE Autor= ‘Vossen’ AND ISBN IN (SELECT ISBN FROM Buch WHERE Autor=‘Witt’) Weitere Umformulierung mittels Gruppierung? SELECT ISBN FROM Buch WHERE Autor= ‘Vossen’ OR Autor=‘Witt’ GROUP BY ISBN HAVING COUNT(*) = 2 61 SQL Queries Teil 2 Die Folien basieren auf: Datenbanken: Konzepte und Sprachen, Andreas Heuer und Gunter Saake, mitp-Verlag, 2. Auflage, 2000 Datenbanken: Konzepte und Sprachen, Gunter Saake, Kai-Uwe Sattler, Andreas Heuer, mitp-Verlag, 3. Auflage, 2008 Datenbanksysteme – Eine Einführung, Alfons Kemper und Andre Eickler, Oldenbourg Verlag, München, 6. Auflage, 2006. SQL Performance Tuning, Peter Gulutzan and Trudy Pelzer, Addison-Wesley 2003. 63 Aggregatfunktionen COUNT SUM Arithmetisches Mittel der Werte einer Spalte MAX bzw. MIN Summe der Werte einer Spalte AVG Anzahl der Werte einer Spalte oder im Falle von COUNT(*) die Anzahl der Tupel einer Relation Größter bzw. kleinster Werte einer Spalte Vor Argument: DISTINCT oder ALL ( default) Nullwerte werden vor der Anwendung (außer bei COUNT(*)) eliminiert 64 Aggregatfunktionen: Beispiele SELECT SUM(Gehalt) FROM Mitarbeiter SELECT COUNT(*) FROM Mitarbeiter SELECT COUNT(DISTINCT Matrnr) FROM PRÜFT SELECT AVG(Note) FROM Prüft WHERE Vorlesung = `Datenbanken´ 65 GROUP BY und HAVING Was macht folgendes Statement? SELECT count(*) as Anzahl, PANr FROM Ausleihe GROUP BY PANr HAVING count(*)>1 Gibt die Anzahl der ausgeliehenen Bücher pro Person aus, vorausgesetzt diese Person hat mehr als 1 Buch ausgeborgt. 66 Gedankliche Abarbeitungsreihenfolge (5) (1) (2) (3) (4) SELECT ... FROM ... [WHERE ...] GROUP BY attributliste HAVING bedingung (optional) 67 GROUP BY Gruppierung von R nach G: Für gleiche G werden die übrigen Attribute R-G in einer geschachtelten Relation gesammelt G = Gruppierungsattribute (d.h. jene, die mit der GROUP BY Klausel ausgewählt werden) R-G = Nicht-Gruppierungsattribute 68 HAVING Selektionsbedingung auf gruppierter Relation darf Bezug nehmen auf Gruppierungsattribute beliebige Aggregatfunktionen (über NichtGruppierungsattributen*) * auch über Gruppierungsattribute möglich, macht aber i.a. keinen Sinn 69 Worauf darf man mit SELECT Bezug nehmen? Direkt auf die Gruppierungsattribute Aggregatfunktionen (auf die Nicht-Gruppierungsattribute*) *auch auf die Gruppierungsattribute möglich, macht aber i.a. keinen Sinn Warum? siehe Beispiel auf der nächsten Folie 70 71 Zählen von Wertemengen Was liefert folgende Abfrage: SELECT DISTINCT X.PANR FROM Prüft X WHERE X.PANr IN (SELECT Y.PANr FROM Prüft Y WHERE X.Matrnr <> Y.Matrnr) Alle Prüfer, die mehr als einen Studenten geprüft haben. 72 Alternative SELECT DISTINCT X.PANr FROM Prüft X, Prüft Y WHERE X.PANr = Y.PANr AND X.Matrnr <> Y.Matrnr 73 Weitere Alternativen Mit <>ANY SELECT DISTINCT X.PANR FROM Prüft X WHERE X.Matrikelnummer <> ANY (SELECT Y.Matrikelnummer FROM Prüft Y WHERE X.PANr = Y.PANr) Mit Gruppierung SELECT PANr FROM Prüft GROUP BY PANr HAVING COUNT (DISTINCT Matrikelnummer) > 1 74 ORDER BY Menge von Tupeln Liste von Tupeln Syntax Beispiel ORDER BY attributliste SELECT Matrnr, Note FROM Prüft WHERE Vorlesung = `DB 1´ ORDER BY Note DESC Aufsteigend (ASC) oder absteigend (DESC) sortieren 75 Behandlung von Nullwerten Arithmetische Operationen: Ergebnis NULL, sobald Nullwert in die Berechnung eingeht. 4 * NULL = NULL Aggregatfunktionen: Nullwerte werden vor der Anwendung der Funktion entfernt, mit Ausnahme von COUNT(*). Fast alle Vergleiche mit NULL ergeben Wahrheitswert UNKNOWN (statt TRUE oder FALSE). 10 + NULL = NULL 10 = NULL ergibt UNKNOWN Ausnahmen: NULL IS NULL TRUE, NULL IS NOT NULL FALSE WHERE Bedingung: es werden nur Tupel weitergereicht, für die die Bedingung TRUE ist. Wenn die Bedingung zu UNKNOWN auswertet, wird sie nicht ins Ergebnis aufgenommen. Boolesche Ausdrücke: dreiwertige Logik 76 Behandlung von Nullwerten II 77 Was ergibt folgende Abfrage? Studenten SVNR Vorname Nachname Semester 1 Max Muster NULL 2 Ilse Muster 4 3 Sebastian Muster 17 SELECT COUNT(*) FROM Studenten WHERE Semester < 13 OR Semester >=13 Ergibt 2, nicht 3 78 Änderungsoperationen INSERT/UPDATE/DELETE Eintupel-Operationen: Einfügen/Ändern/Löschen von Tupeln in Relationen oder Sichten Z.B. Erfassung einer Buchausleihe Mehrtupel-Operationen Z.B. Erhöhe das Gehalt aller Mitarbeiter um 3% 79 INSERT INSERT INTO Relation [(attr1, ..., attrN)] VALUES (konstante_1, ..., konstante_N) INSERT INTO Buch (Invnr, Titel) VALUES (1234, `DB 1´) INSERT INTO Buch VALUES (1234, `DB1´, 2000, mitp) INSERT INTO Relation [(attr1, ..., attrN)] SQL-Anfrage INSERT INTO Kunde (VN, NN, Bestellungen) (SELECT VN, NN, 0 FROM Lieferant) 80 UPDATE Syntax UPDATE relation SET attr1=ausdr1, ..., attrN=ausdrN [WHERE Bedingung] Beispiel UPDATE Angestellte SET Gehalt = Gehalt + 1000 WHERE Gehalt < 5000 81 DELETE DELETE FROM Relation WHERE Bedingung DELETE FROM Ausleihe WHERE Inventarnr = 1234 Löschen aller Tupel einer Relation: DELETE FROM Ausleihe 82 SQL Query Performance Tuning Es gibt eine Vielzahl von Möglichkeiten, Query Performance zu verbessern. Allerdings kann es sein, dass verschieden Varianten auf verschiedenen DBMS unterschiedliche Wirkung zeigen! Testen Sie Ihre Optimierungen immer! Das Test-Environment soll dabei möglichst ähnlich dem Production-Environment sein, d.h. gleiche Datenmenge, Last, etc. 83 Einige Beispiele für Tuning-Tipps JOINS: Verwenden Sie möglichst restriktive Ausdrücke, d.h. eliminieren Sie unnötige Tupel. Attribute, über die ein Join erfolgt, sollen möglichst den gleichen Datentyp haben. Ein Index auf einer der Tabellen ist oft sehr hilfreich. Indizes auf beide Tabellen bringen oft keine weitere Verbesserung mehr. ... Buch-Empfehlung: SQL Performance Tuning, Peter Gulutzan and Trudy Pelzer, Addison-Wesley 2003. 84 Künstliche Schlüssel Häufig benötigt, wäre schwierig in Anwendungen oder von Anwendungen in DB zu realisieren. Sequenzgenerator in SQL: CREATE SEQUENCE SeqName AS Datentyp START WITH Startwert INCREMENT BY Inkrementwert MINVALUE Minimalwert MAXVALUE Maximalwert CYCLE Cycle: Beim Erreichen von MAXVALUE wird wieder mit MINVALUE begonnen 85 Identitätspalte Benutzt Sequenzgenerator, ohne diesen explizit anzulegen CREATE TABLE Weine ( WeinID INT GENERATED ALWAYS AS IDENTITY ( START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 100000 CYCLE), Name VARCHAR(20) NOT NULL, Farbe VARCHAR(10), Jahrgang INT, Weingut VARCHAR(20)) INSERT INTO Weine VALUES (null, ‘Pinot Noir’, ‘Rot’, 1999, ‘Helena’) null wird durch den neuen Wert der Sequenz ersetzt Achtung: etwas andere Notation in ORACLE! 86