SQL Data Manipulation Language insert: zeilenweise (definitionsgemäss, freihe Reihenfolge, mit select) update: zeilenmengenweise (mit/ohne where) delete: zeilenmengenweise (mit/ohne where) select: zeilenmengenweise (1) Grundfunktionen: ganze Tabelle Spaltenauswahl Zeilenauswahl sortieren doppelte Zeilen arithmetische Operationen (zur Ausgabe) (2) where Grundform logische Operationen arithmetische Operationen (als Bedingung) (3) Join Tabellenverknüpfung (equi-joins, inner, outer) (4) Subselects in where-Bedingung untergeordnete Wertermittlung (5) Mengenoperationen *, (6) Gruppierung Mengenfunktionen für Zeilengruppen (7) Trigger zusätzliche (automatische) Kommandoausführung count(*), sum, min, max, avg (total oder gruppenweise) create table insertzaehler (zeilenzahl integer) insert into insertzaehler values (0) create trigger t1 on person for insert as update insertzaehler set zeilenzahl = zeilenzahl + 1 (8) Beispiel: cursor Die Datenbank liefert eine Zeilenmenge. Die Programmiersprache bearbeitet nur einzeln. Deshalb wird ein Zwischenspeicher (Cursor) eingerichtet, aus dem mit Cursoroperationen (first, next, prev, last, absolute n, relative n) einzelne Ergebnisse abgerufen werden und in Programmvariablen übertragen werden können. Tabelle artikel (anr, aname, apreis, amaterial, alagermenge) Tabelle 'kunde': kundennr nachname vorname kalter Tabelle 'bestellt': kundennr, artikelnr, menge kunde TFH Berlin/Steyer bestellt artikel Datenmanipulation Datenmanipulation genauer Daten einfügen direktes Einfügen mit und ohne Spaltennamen insert into person (knr,nachname,vorname,konto) values (3395,'Brenner','Karl',-4913.00) insert into person values (3390,'Heigert','Maria',-2.19) Zeilen einfügen aus einer anderen Tabelle insert into person select knr, nachname, vorname, konto from kunde where konto < 0 Daten ändern, löschen Die Sprachkonzepte von SQL kommen in geeigneter Weise in den Änderungskommandos wieder vor. update kunde set plz = 70441, ort = 'Stuttgart' where knr = 3390 delete from kunde Daten lesen: Spaltenauswahl Durch Aufzählen der gewünschten Spalten in der ersten Zeile erhält man die Ergebnistabelle mit den zugehörigen Spalten in derselben Anordnung. select nachname, vorname from kunde select vorname, nachname from kunde select * from kunde Daten lesen: Zeilenauswahl Die Zeilenauswahl geschieht durch eine Wertebedingung in der WHERE-Zeile. select anrede, vorname, nachname, ort from kunde where ort = 'Muenchen' select nachname, ort, konto from kunde where konto = 0.0 select nachname, ort from kunde where konto is null Daten lesen: Sortieren select ort from kunde order by ort desc TFH Berlin/Steyer Datenmanipulation Daten lesen: doppelte Zeilen vermeiden select distinct ort from kunde Daten lesen: logische Verknüpfungen Die Zeilenauswahl kann durch Logik im WHERE-Teil beeinflusst, z.B. verschärft werden. select vorname, nachname, ort, konto from kunde where ort = 'Muenchen' or konto > 0 select vorname, nachname, ort, konto from kunde where ort = 'Muenchen' and konto > 0 = GLEICH < KLEINER ALS <= KLEINER ODER GLEICH > GRÖSSER ALS >= GRÖSSER ODER GLEICH <> UNGLEICH für mehrere Bedingungen AND, OR für Werte in einem Bereich BETWEEN x AND y für Werte in einer Menge IN (x,y,z) für Vergleich mit einem Teilwert LIKE '%abc% oder LIKE '_a_' für verneinte Bedingungen NOT Klammernsetzung ist möglich Daten lesen: Arithmetik Arithmetische Ausdrücke sind an zwei Stellen möglich: In der WHERE-Bedingung dienen sie zur flexibleren Zeilenauswahl: in der Ausgabeliste und in der WHERE-Bedingung select hname, ort, preis from hotel where preis*7 < 500 select hname, ort, preis, preis+preis, preis*7 from hotel Daten lesen: Tabellenverknüpfung Zwei Tabellen kunde bestellt knr nachname knr menge select kunde.nachname, bestellt.menge from kunde, bestellt where kunde.nachname = 'Barth' and kunde.knr=bestellt.knr; Die Verknüpfung der beiden Tabellen erfolgt über zwei identische Spalten im WHERE-Teil, die normale Wertebeschränkung ebenfalls. TFH Berlin/Steyer Datenmanipulation ANSI Syntax: select kunde.nachname, bestellt.menge from kunde join bestellt on kunde.knr=bestellt.knr; where kunde.nachname = 'Barth' Die beiden Tabellen sind durch das Wort „join“ verbunden. Die Tabellenverknüpfung und normale Wertebeschränkung sind getrennt, die Tabellenverknüpfungsbedingung steht nach ON. Weitere Operatoren: = < <= <> > >= (gleich) (kleiner) (kleiner oder gleich) (ungleich) (grösser) (grösser oder gleich) Inner Join: SELECT * FROM mitarbeiter, abteilung WHERE wohnort = stadt m_nr m_name m_vorname abt_nr wohnort abt_nr abt_name stadt ---------------------------------------------------------------------------------------------------------------------------2581 Kaufmann Brigitte a2 München a2 Diagnose München 25348 Keller Hans a3 München a1 Beratung München 2581 Kaufmann Brigitte a2 München a1 Beratung München 25348 Keller Hans a3 München a2 Diagnose München Outer Join: SELECT mitarbeiter.*, abteilung.abt_nr FROM mitarbeiter, abteilung WHERE wohnort *= stadt m_nr m_name m_vorname abt_nr wohnort abt_nr ---------------------------------------------------------------------------------------------25348 Keller Hans a3 München a1 25348 Keller Hans a3 München a2 2581 Kaufmann Brigitte a2 München a1 2581 Kaufmann Brigitte a2 München a2 29346 Probst Andreas a2 Augsburg NULL 9031 Maier Rainer a2 Augsburg NULL 10102 Huber Petra a3 Landshut NULL 28559 Mozer Sybille a1 Ulm NULL 18316 Müller Gabriele a1 Rosenheim NULL Subselects An der Stelle von Werten können (in Klammern) untergeordnete Selects stehen, die diese Werte erst ermitteln. delete from bestellt where kundennr = (select kundennr from kunde where nachname = 'Müller') and artikelnr = (select artikelnr from artikel where artikelname = 'Rahmen'); TFH Berlin/Steyer Datenmanipulation Daten lesen: V ereinigung von Ergebnismengen select hname, ort, preis, 'UEBER 100' from hotel where preis > 100.00 union select hname, ort, preis, 'UNTER 100' from hotel where not preis > 100.00 order by 1, 2 Die Teile müssen vereinigungsverträglich sein. Mengenoperationen für die ganze Tabelle select sum(gehalt) from Person Mengenoperationen gruppenweise select sum(gehalt) from Person group by wohnort Mengenoperationen gruppenweise nur für bestimmte Gruppen select sum(gehalt) from Person group by wohnort having sum(gehalt) < 5000 Trigger Es gibt eine Tabelle person (pnr integer, pname char(12)) pnr pname -------------------------------222 Adam 223 Berta Konstanter Eintrag: create table ereignis (kommentar char(50)) create trigger insertprotokoll on person for insert as insert into ereignis values ('Schon wieder ein Neuer') insert into person ... select * from ereignis kommentar -------------------------------Schon wieder ein Neuer Update-Zähler: create table zähler (anzahl integer) insert into zähler values (0) create trigger updatezähler on person for update as update zähler set anzahl = anzahl + 1 TFH Berlin/Steyer Datenmanipulation Delete-Protokoll: create table delperson (pnr integer, pname char(12)) create trigger deleteprotokoll on person for delete as insert into delperson select * from deleted delete from person ... und select * from delperson und select * from person pnr pname -------------------------------223 Berta pnr pname -------------------------------222 Adam Die Tabelle deleted (mit gleicher Struktur wie person) enthält die durch einen Trigger gelöschten Werte. Die Tabelle inserted (mit gleicher Struktur wie person) enthält die durch einen Trigger eingefügten Werte. Beide Tabellen enthalten die durch einen Trigger geänderten Werte. ausführliches Delete-Protokoll: Neben den gelöschten Daten werden noch User und Datumuhrzeit protokolliert. create table delperson2 (us char(10), ti datetime, pnr int, pname char(12)) create trigger deleteprotokoll2 on person for delete as insert into delperson2 select user_name(), getdate(), * from deleted delete from person where pnr = 222 select * from delperson2 dbo 2007-12-04 11:19:00.497 TFH Berlin/Steyer 222 Adam