SQL-Einführung Teil 2 Prof. Dr. Waldemar Rohde Dipl.-Ing. Jörg Höppner 19.10.2006 1
Datenmanipulationssprache (DML) Select DML ermöglicht es Daten mit SELECT abzurufen UPDATE zu verändern Delete DML Update INSERT hinzuzufügen DROP zu löschen Insert (19.10.2006) 2
Anweisungselemente : SELECT FROM WHERE GROUP BY HAVING ORDER BY selektiert Spalten definiert die Tabelle/Tabellen selektiert aufgrund einer Suchbedingung bestimmte Zeilen der Tabelle(n) gruppiert Zeilen auf Basis gleicher Spaltenwerte selektiert nur Gruppen, die der HAVING-Bedingung genügen bestimmt die Reihenfolge der Zeilen obligatorisch obligatorisch optional optional optional optional (19.10.2006) 3
Syntax: <SELECT [ALL DISTINCT ] <Spaltenausdruck> [, <Spaltenausdruck>...] FROM Tabellenname [Abkürzung] [, Tabellenname [Abkürzung]]... [WHERE <Suchbedingung>] [GROUP BY Spaltenname [, Spaltenname]...] [HAVING <Suchbedingung > ] [ORDER BY <Sortierung> [, <Sortierung>]... ] (19.10.2006) 4
Spaltenausdrücke : Konstanten (numerisch oder Zeichen) z.b.: 5 oder `Weihnachtsmann` Attribute der beteiligten Tabellen einfache Beschreibung eindeutige Beschreibung z.b.: ename (einfach) oder emp.ename (eindeutig) Verknüpfungen von Konstanten und Attributwerte z.b.: 12*sal, (jahres_brutto-jahres_netto)/12 Funktionen von Attributwerten z.b.: round(sal) oder upper(ename) Gruppenfunktionen z.b.: avg(sal), max(sal), usw. (19.10.2006) 5
FROM Klausel: spezifiziert die Tabellen, aus denen die Attribute berechnet werden Um Tabellen mit einzubeziehen, die in anderen Schemata liegen, ist dem dem Tabellennamen das Schema voranzustellen z.b.: select ename from user_grp1_hbx.emp Zur Vereinfachung können Aliase eingesetzt z.b.: select e.ename from emp e; hier wird z.b. die Tabelle emp mit e abgekürzt. (19.10.2006) 6
FROM Klausel (Beispiel): SELECT * FROM emp; selektiert alle Attribute der Tabelle emp SELECT DISTINCT job FROM emp; alle verschiedenen Berufe werden angezeigt SELECT ename, hiredate, sal, comm FROM emp; die Spalten ename, hiredate, sal, comm werden angezeigt SELECT 10*sal FROM emp; das Attribut sal wird mit 10 faktorisiert angezeigt SELECT Mein Name ist ename und ich verdiene to_char(sal) Euros im Monat FROM emp; das Ergebnis ist eine Zeichenkette in Kombination mit Attributen (19.10.2006) 7
WHERE Klausel: definiert Filtern- oder Suchkriterien mit kleiner bis großer Komplexität mehrere Suchkriterien sind durch (AND, OR, NOT, Klammern) logisch verknüpfbar Vergleichsoperatoren (=,>,<...) Einschränkungen durch Aufzählungen von Werten (z.b. IN) Einschränkungen durch Bereichsfestlegungen (BETWEEN AND ) Zeichenketten-Vergleichsoperatoren mit Schablonen (z.b. LIKE) (19.10.2006) 8
WHERE Klausel (Syntax): WHERE-Komponente := WHERE <Suchbedingung> <Suchbedingung> := { <Ausdruck> <Vergleichsoperator> <Ausdruck> <Ausdruck> [NOT] BETWEEN <Ausdruck> AND <Ausdruck> <alphanumerischer Ausdruck> [NOT] LIKE <Schablone> <Ausdruck> IS [NOT] NULL <Ausdruck> [NOT] IN (Konstante [, Konstante]...) NOT < Kriterium > < Kriterium > AND < Kriterium > < Kriterium > OR < Kriterium > ( < Kriterium >) } Vergleichsoperatoren (<,>,=,>=,<=, etc) Schablonen ( %, _ ) (19.10.2006) 9
WHERE Klausel (Beispiel): SELECT ename,deptno,job FROM emp WHERE deptno<=20; Selekiert Ename, deptno und job, wo deptno gleich oder kleiner 20 ist SELECT empno,ename,hiredate,comm,deptno FROM emp WHERE (job= MANAGER OR job= CLERK ) AND (deptno IN (10,20); Zeigt die gewählten Attribute, wenn job=manager oder CLERK ist und der Mitarbeiter gleichzeitig in der Abteilung (deptno) 10 oder 20 arbeitet. SELECT * FROM emp WHERE sal BETWEEN 2500 AND 3000; Alle Mitarbeiterdaten deren Gehalt (sal) zwischen 2500 und 3000 liegt SELECT * FROM emp WHERE ename LIKE K% ; oder SELECT * FROM emp WHERE ename LIKE KIN_ ; % alle Kombinationen beliebiger Länge _ alle einstelligen Zeichen werden eingesetzt. (19.10.2006) 10
ORDER BY Klausel: Zeilensortierung bei Abfrageergebnissen alphanumerisch (0-9, A-Z) numerisch ([-] unendlich bis [+]unendlich) Sortierreihenfolge aufsteigend ASC(ending) (voreingestellt) absteigend DESC(ending) Sortierung nach Spaltenname Spaltennummer Für die Sortierung können mehrere Spalten hinzugezogen werden Priorität geht von links nach rechts (19.10.2006) 11
ORDER BY Klausel (Beispiel): SELECT deptno,ename,job FROM emp ORDER BY deptno, ename; das Ergebnis der Abfrage wird zunächst nach deptno sortiert. Bei gleicher deptno erfolgt die Sortierung nach ename. SELECT deptno,ename,job FROM emp ORDER BY 1, 2; das Ergebnis der Abfrage wird zunächst nach 1. Attribut aufsteigend sortiert. Bei gleichen Werten der ersten Spalte erfolgt die weitere Sortierung nach dem 2. Attribut. SELECT deptno,ename,job FROM emp ORDER BY deptno ASC, ename DESC; das Ergebnis der Abfrage wird zunächst nach deptno aufsteigend sortiert. Bei gleicher deptno erfolgt die absteigendene Sortierung nach ename. (19.10.2006) 12
GROUP BY Klausel: Gruppiert Abfrageergebnisse nach Attributen Spaltenname Spaltennummer Gruppenfunktionen können auf die Tabellenzeilen angewandt werden Filterkriterien (über Having-Klausel) können Gruppenergebnisse einschränken (19.10.2006) 13
GROUP BY Klausel (Gruppenfunktionen): Funktion COUNT(Ausdruck) SUM(Ausdruck) AVG(Ausdruck) MAX(Ausdruck) MIN(Ausdruck) Bedeutung Anzahl der Werte z.b. in einer Spalte Summe der Werte z.b. in einer Spalte Mittelwert z.b. der Spalte größter Wert z.b. der Spalte kleinster Wert z.b. der Spalte (19.10.2006) 14
GROUP BY Klausel (Beispiel): SELECT deptno AS Abteilungsnummer, COUNT(ename) AS Anzahl FROM emp GROUP BY deptno; Liefert als Ergebnis Abteilungsnummern mit der Anzahl der dort beschäftigten Mitarbeiter Ergebnis: FIRMENNUMMER ANZAHL 10 3 20 5 30 6 SELECT deptno, AVG(sal),MAX(sal),MIN(sal),SUM(sal) Anzahl FROM emp GROUP BY deptno; Liefert als Ergebnis Abteilungsnummern mit berechneten Durchschnitts-, Maximal-, Minimal- und Summenwerten der Mitarbeitereinkünfte (sal) Ergebnis: DEPTNO AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) 10 2916,66667 5000 1300 8750 20 2175 3000 800 10875 30 1566,66667 2850 950 9400 (19.10.2006) 15
HAVING Klausel: Schränkt Gruppenergebnisse ein Weggelassene Having Klausel bewirkt die Anzeige aller Gruppen Der Ausdruck für die Bedingung dar keine Unterabfrage sein Beispiel: SELECT deptno AS Abteilungsnummer, COUNT(ename) AS Anzahl FROM emp GROUP BY deptno HAVING COUNT(ename)>5 ; Liefert als Ergebnis Abteilungsnummern mit der Anzahl der dort beschäftigten Mitarbeiter mit der Einschränkung, dass mehr als 5 Mitarbeiter dort arbeiten. Ergebnis: FIRMENNUMMER ANZAHL 30 6 (19.10.2006) 16
JOIN: Notwendigkeit Informationen sind auf mehreren Tabellen verteilt ist eine regelbasierte Beziehung zwischen einer oder zwei Tabellen) I.d.R. werden Primärschlüssel der Parenttabelle und Fremdschlüssel der Childtabelle herangezogen Mehrere Attribute können für die Beziehungsregel verwendet werden die Attribute, über die die Beziehung definiert wird, müssen vom gleichen Datenyp sein Join über n-tabellen benötigt n-1 Beziehungen Ausprägungen sind: Equi-, Non-Equi-, Self- und Outer-Join jeder Operator (=,<,>,=<,=>, ) ist für das Join-Kriterium erlaubt in einer SELECT-Anweisung können Attribute aus allen verknüpften Tabellen abgerufen werden. Die Eindeutigkeit der Spalten ist Bedingung (19.10.2006) 17
JOIN (Beispiel): Das Datenmodell beinhaltet 2 Entitäten: EMP(Mitarbeiter) und DEPT(Abteilungen) EMP trägt als Fremdschlüssel den Primärschlüssel (DEPTNO) der Tabelle (DEPT) Die Kardialität ist 1 : n 1 Abteilung beschäftigt keinen, einen oder mehrere Mitarbeiter 1 Mitarbeiter gehört aber nur zu einer Abteilung (19.10.2006) 18
JOIN (Beispiel Equi-Join): SELECT ename, job, dname, loc FROM emp, dept WHERE emp.deptno=dept.deptno; Alle Angestellten, die in einer Abteilung arbeiten, werden angezeigt. (emp.deptno hat eine Entsprechung in dept.deptno). Hat eine Abteilung keine Mitarbeiter, so wäre diese Abteilung nicht sichtbar Man spricht auch von einen Inner-Join. ENAME JOB DNAME LOC ---------- --------- -------------- ------------- CLARK MANAGER ACCOUNTING NEW YORK KING PRESIDENT ACCOUNTING NEW YORK MILLER CLERK ACCOUNTING NEW YORK SMITH CLERK RESEARCH DALLAS ADAMS CLERK RESEARCH DALLAS FORD ANALYST RESEARCH DALLAS SCOTT ANALYST RESEARCH DALLAS JONES MANAGER RESEARCH DALLAS ALLEN SALESMAN SALES CHICAGO BLAKE MANAGER SALES CHICAGO MARTIN SALESMAN SALES CHICAGO JAMES CLERK SALES CHICAGO TURNER SALESMAN SALES CHICAGO WARD SALESMAN SALES CHICAGO (19.10.2006) 19
JOIN (Beispiel Outer-Join): SELECT ename, job, dname, loc FROM emp, dept WHERE emp.deptno(+)=dept.deptno; Alle Abteilungen werden zunächst mit Ihren Mitarbeitern aufgelistet. Hier hat beispielsweise die Abteilung Operations keine Mitarbeiter und so werden die Ergebnisspalten mit Nullwerten aufgefüllt, so dass trotzdem die Abteilung sichtbar wird. ENAME JOB DNAME LOC ---------- --------- -------------- ------------- CLARK MANAGER ACCOUNTING NEW YORK KING PRESIDENT ACCOUNTING NEW YORK MILLER CLERK ACCOUNTING NEW YORK SMITH CLERK RESEARCH DALLAS ADAMS CLERK RESEARCH DALLAS FORD ANALYST RESEARCH DALLAS SCOTT ANALYST RESEARCH DALLAS JONES MANAGER RESEARCH DALLAS ALLEN SALESMAN SALES CHICAGO BLAKE MANAGER SALES CHICAGO MARTIN SALESMAN SALES CHICAGO JAMES CLERK SALES CHICAGO TURNER SALESMAN SALES CHICAGO WARD SALESMAN SALES CHICAGO OPERATIONS BOSTON Das (+) kennzeichnet die Tabelle, deren Attribute mit Nullwerten aufgefüllt werden (19.10.2006) 20
JOIN (Beispiel Self-Join): SELECT Mitarbeiter.ename Mitarbeitername, Chef.ename Chefname FROM emp Mitarbeiter, emp Chef WHERE Mitarbeiter.mgr=Chef.empno(+); Die Tabelle emp wird zweimal angesprochen, demnach mit sich selbstverknüpft. Dieses ist realisierbar durch die zwei Alias-Namen Mitarbeiter und Chef. King ist Geschäftsführer und hat keinen Chef Mitarbeitername Chefname ---------- ---------- SCOTT JONES FORD JONES ALLEN BLAKE WARD BLAKE JAMES BLAKE TURNER BLAKE MARTIN BLAKE MILLER CLARK ADAMS SCOTT JONES KING CLARK KING BLAKE KING SMITH FORD KING Mitarbeiter logisches Modell Chef (19.10.2006) 21
Insert Anweisung Syntax: INSERT INTO Tabellenname [(Spaltenname [,Spaltenname] )] {VALUES (Konstante [, Konstante] ) <SELECT-Anweisung> } Die INSERT-Anweisung fügt Daten in eine Tabelle ein. Bedingung Die Anzahl, die Datentypen und die Reihenfolge der zu befüllenden Spalten müssen mit der Konstantenfolge bzw. mit dem Resultat der SELECT-Anweisung übereinstimmen. Fehlen die Spaltennamen, so müssen die Konstanten, der Menge und der Reihenfolge nach, der physikalischen Tabellenstuktur entsprechen. Selbiges gilt für die SQL-Anweisung Es dürfen keine Schlüsselverletzungen vorliegen. (19.10.2006) 22
Insert Anweisung Beispiel: INSERT INTO emp (empno,deptno,ename,job) VALUES (9999,40, Rohde, DOZENT ); 9999 -> empno; 40 -> deptno; Rohde ->ename und DOZENT -> job INSERT INTO emp VALUES (9999,40, Rohde, DOZENT, KING, 01.01.2004,3000,0); die Konstanten werden in die Tabelle überführt, ohne dass die Spaltennamen explizit aufgelistet werden müssen. INSERT INTO emp_sicherung SELECT * FROM emp; die Tabelle emp_sicherung wird mit dem Ergebnis der SELECT-Anweisung befüllt. (19.10.2006) 23
Update Anweisung Syntax: UPDATE Tabellenname SET <Wertzuweisung> [, <Wertzuweisung> )] [WHERE <Suchbedingung>] <Wertzuweisung> := Spaltenname = { <Ausdruck> NULL } Die Update-Anweisung verändert Daten in Tabellen. Bedingung Bei der Wertzuweisung müssen die Datentypen passen Es dürfen sich bei Änderungen keine Schlüsselverletzungen ergeben. Mit der WHERE-Klausel werden die Datensätze festgelegt, die von der Änderung betroffen sind. ACHTUNG!!! Wird die WHERE-Klausel weggelassen, so werden alle Datensätze geändert. Dieses ist nicht immer im Interresse des Anwenders. (19.10.2006) 24
Update Anweisung Beispiel: UPDATE emp SET sal = sal * 1,05; alle Mitarbeiter erhalten eine 5% Gehaltserhöhung UPDATE emp SET sal = sal * 1,05 WHERE deptno = 20; alle Mitarbeiter der Abteilung 20 erhalten eine 5% Gehaltserhöhung UPDATE emp SET deptno = 20 WHERE deptno = 10 AND job = CLERK ; alle Mitarbeiter der Abteilung 10 mit dem Job CLERK müssen nun in die Abteilung 20 umziehen (19.10.2006) 25
Delete Anweisung Syntax: DELETE FROM Tabellenname [WHERE <Suchbedingung>] Die Delete-Anweisung dient dem Löschen von Datensätzen aus Tabellen. Tabellenstrukturen bleiben hiervon unbeeinflusst. Bedingung Es darf kein Fremdschlüssel auf den zu löschenden Datensatz zeigen (19.10.2006) 26
Delete Anweisung Beispiel: DELETE FROM emp; alle Mitarbeiter werden gelöscht DELETE FROM emp WHERE deptno = 20; alle Mitarbeiter der Abteilung 20 werden gelöscht DELETE FROM emp WHERE ename LIKE S% ; alle Mitarbeiter deren Name mit S beginnt werden gelöscht (19.10.2006) 27