Fachhochschule Deggendorf IT-Kompaktkurs Einführung in SQL EINSATZ VON ORACLE AM TERMINAL ........................................................................ 3 BESONDERE MERKMALE ........................................................................................................... 3 DATENBANK UND TABELLEN ..................................................................................................... 3 BEISPIEL EINER DATENBANK .................................................................................................... 3 SPALTEN UND ZEILEN ................................................................................................................ 4 FELDER UND WERTE ................................................................................................................. 4 AUSWAHL VON DATEN IN EINER TABELLE ............................................................... 4 BEFEHL SELECT ...................................................................................................................... 4 SELECT* .................................................................................................................................. 4 AUSWÄHLEN EINZELNER SPALTEN UND ZEILEN IN EINER TABELLE ............. 5 AUSWÄHLEN EINZELNER SPALTEN ........................................................................................... 5 FESTLEGEN DER SPALTENFOLGE .............................................................................................. 5 AUSWÄHLEN EINZELNER ZEILEN .............................................................................................. 5 MEHRFACHE SUCHBEDINGUNGEN ............................................................................................ 6 ALTERNATIVE SUCHBEDINGUNGEN .......................................................................................... 6 NEGATIVE SUCHBEDINGUNGEN ................................................................................................ 7 SUCHE NACH EINEM BEREICH ................................................................................................... 7 SUCHE NACH WERTEN IN EINER LISTE .................................................................................... 8 VERGLEICH ZU EINEM ZEICHENMUSTER .................................................................................. 8 REIHENFOLGE DER ZEILEN IN EINEM ABFRAGEERGEBNIS ............................... 9 REIHENFOLGE DER ZEILEN ....................................................................................................... 9 VERHINDERN DER AUSWAHL VON DOPPELZEILEN ............................................. 10 ABFRAGE MEHRERER TABELLEN ............................................................................... 11 JOIN-ABFRAGE ....................................................................................................................... 11 JOIN-BEDINGUNG ................................................................................................................... 12 FORMATIEREN EINER ABFRAGE ZU EINEM BERICHT......................................... 12 BEFEHL COLUMN ................................................................................................................. 13 BEFEHL BREAK ..................................................................................................................... 13 BEFEHL COMPUTE ............................................................................................................... 13 BEFEHL TTITLE UND BTITLE ............................................................................................. 13 FUNKTIONEN FÜR ARITHMETISCHE AUSDRÜCKE UND ZEICHENFOLGEN.. 13 ARITHMETISCHE AUSDRÜCKE ................................................................................................ 13 ZEICHENFOLGEFUNKTIONEN .................................................................................................. 14 FORMATIEREN UND BERECHNEN VON DATUMSANGABEN ............................... 15 FORMATIEREN DES DATUMS ................................................................................................... 15 DATUMSARITHMETIK .............................................................................................................. 16 FUNKTIONEN ZUR BERECHNUNG BEI ZEILENGRUPPEN .................................... 16 GRUPPENFUNKTIONEN ............................................................................................................ 16 KLAUSEL GROUP BY............................................................................................................. 17 PROZEDURAL GEGENÜBER NICHTPROZEDURAL ..................................................................... 18 KLAUSEL HAVING ................................................................................................................. 18 SUBQUERIES ........................................................................................................................ 19 Einführung in SQL Seite 2 von 20 EINSATZ VON ORACLE AM TERMINAL Besondere Merkmale Nachstehend folgt eine weitere Erläuterung der relationalen Konzeption in Verbindung mit einer Reihe von Beispielen, die die Leistungsfähigkeit der relationalen Datensprache SQL veranschaulichen. In diesem Abschnitt lernen Sie, wie Sie SQL zur Lösung folgender Aufgaben einsetzen können: Einzelne Zeilen in einer Tabelle auswählen (SELECT) Eine Tabelle erstellen (CREATE) Zeilen in eine Tabelle einfügen (INSERT). Zunächst etwas mehr über den Aufbau einer Datenbank und ein paar Definitionen. Datenbank und Tabellen Eine ORACLE-Datenbank ist aus Tabellen aufgebaut. Bei der Mehrzahl aller in dieser Broschüre enthaltenen Beispielen wird DEPT als Mustertabelle verwendet, die Angaben über die Abteilungen in einer Firma enthält. Als weiteres Beispiel wird EMP als Mustertabelle herangezogen, die Angaben über die Beschäftigten in dieser Firma enthält. Beispiel einer Datenbank Tabelle DEPT DEPTNO DNAME 10 ACCOUNTING 20 RESEARCH 30 SALES 40 OPERATIONS Tabelle EMP EMPNO ENAME 7369 SMITH 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER Einführung in SQL LOC NEW YORK DALLAS CHICAGO BOSTON JOB CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK MGR 7902 7698 7698 7839 7698 7839 7893 7566 7689 7788 7698 7566 7782 HIREDATE 17-DEC-80 20-FEB-81 22-FEB-81 02-APR-81 28-SEP-81 01-MAY-81 09-JUN-81 09-NOV-81 17-NOV-81 08-SEP-81 23-SEP-81 03-DEC-81 03-DEC-81 23-JAN-82 SAL COMM DEPTNO 800.00 20 1,600.00 300.00 30 1,250.00 500.00 30 2,975.00 20 1,250.00 1,400.00 30 2,850.00 30 2,450.00 10 3,000.00 20 5,000.00 10 1,500.00 0.00 30 1,100.00 20 950.00 30 3,000.00 20 1,300.00 10 Seite 3 von 20 Spalten und Zeilen Jede Tabelle besteht aus (vertikalen) Spalten und (horizontalen) Zeilen bzw. Reihen. Die Tabelle DEPT ist aus drei Spalten (mit der Bezeichnung DEPTNO für die Abteilungsnummer, DNAME für die Abteilungsbezeichnung und LOC für den Standort der Abteilung) und vier Zeilen aufgebaut (jeweils eine Zeile für die Abteilung Nr. 10, 20, 30 und 40). Felder und Werte Eine Zeile baut sich aus Feldern auf. Jedes Feld enthält am Schnittpunkt zwischen einer Zeile und einer Spalte einen Datenwert. Bei dem obigen Beispiel der Tabelle DEPT ist der Wert 10 im Feld DEPTNO abgespeichert, der Wert ACCOUNTING (Rechnungswesen) als Bezeichnung im Feld DNAME, das Feld LOC enthält den Wert NEW YORK für die Standortangabe. (Anmerkung: Soweit nichts anderes angegeben ist, wird hier und in den folgenden Tabellenabbildungen ein SQL-Spaltenformat von 999,999.99 für die Spalte SAL, COMM und BUDGET aus Gründen der leichteren Lesbarkeit angenommen). AUSWAHL VON DATEN IN EINER TABELLE Befehl SELECT Der häufigste Vorgang in SQL ist das Auffinden von Daten in einer Datenbank. Diesen Vorgang bezeichnet man als Abfrage. Zum Absetzen einer Abfrage arbeiten Sie mit dem Befehl SELECT (wählen). Der Befehl SELECT besteht in seiner Grundform aus zwei Teilen, die als Klauseln bezeichnet werden: SELECT FROM einige Daten (Spaltenbezeichnung(en)) [auswählen] [aus] einer oder mehreren Tabellen (Tabellenbezeichnung(en)) Die Klausel SELECT wird immer zuerst eingegeben, die Klausel FROM schließt sich unmittelbar an. Nun ein Blick auf die Daten in den Tabellen DEPT und EMP, wozu ein paar einfache SQLAbfragen abgesetzt werden. Zunächst listen wir alle Spalten und Zeilen in der Tabelle DEPT auf. Folgender SQL-Befehl bringt uns dieses Ergebnis: SELECT FROM DEPTNO, DNAME, LOC DEPT; SELECT* Bei diesem Beispiel einer Abfrage haben wir in der Klausel SELECT die Bezeichnung jeder Spalte in der Tabelle DEPT aufgelistet, also DEPNO, DNAME, LOC. Doch wenn Sie alle Spalten in einer Tabelle ansteuern wollen, verwenden Sie normalerweise ein Sternchen (SELECT*) als Kurzfassung anstelle der Aufzählung der Spaltenbezeichnung wie beim vorhergehenden Beispiel. SELECT FROM Einführung in SQL * EMP; Befehlsabschluß Seite 4 von 20 Bei den Beispielen in dieser Broschüre haben wir die meisten unserer SQL-Befehle auf mehrere Zeilen aufgeteilt und in Großbuchstaben ausgedruckt, damit sie leichter lesbar sind. Sie können aber auch ganze SQL-Befehle in einer Zeile in Groß- oder Kleinbuchstaben eingeben, wenn Ihnen dies lieber ist. Bei den Schreibweisen machen Sie das Ende Ihres SQLBefehls dadurch kenntlich, dass Sie ein Semikolon (;) al letztes Zeichen der letzen Zeile eineben. ORACLE erkennt dieses Semikolon als Befehlsabschluß und führt den Befehl aus. AUSWÄHLEN EINZELNER SPALTEN UND ZEILEN IN EINER TABELLE Auswählen einzelner Spalten Bei den ersten Abfragebeispielen haben wir alle Spalten und alle Zeilen aus der Tabelle ausgewählt. Wenn Sie aber nicht alle Spalten in der Tabelle sehen wollen, so geben Sie in der Klausel SELECT nur die Bezeichnung der Spalten an, die erscheinen sollen. SELECT FROM DNAME, DEPTNO DEPT; DEPTNO -------------10 20 30 40 DNAME -----------------ACCOUNTING RESEARCH SALES OPERATIONS Festlegen der Spaltenfolge Wie Sie bereits gesehen haben, ist das Ergebnis jeder Abfrage selbst wieder eine Tabelle mit Spalten und Zeilen. Die Reihenfolge, in der Sie Ihre Spalten in der Klausel SELECT angeben, legt fest, in welcher Aufeinanderfolge die Spalten von links nach rechts in der Ergebnistabelle erscheinen sollen. Geben Sie SELECT* ein, so enthält die Ergebnistabelle dann die Spalten in der Abfolge von links nach rechts, die Sie im Befehl CREATE TABLE beim Aufbau dieser Tabelle festgelegt haben. Auswählen einzelner Zeilen Aus dem letzten Beispiel konnten Sie entnehmen, wie Sie mit der Klausel SELECT einzelne Spalten in Ihrer Tabelle auswählen können. Wie können Sie aber nun bestimmte Zeilen in der Tabelle auffinden? Hierzu müssen Sie Ihren Befehl SELECT um eine WHERE-Klausel (Suchbedingung) erweitern. SELECT FROM WHERE Einführung in SQL * EMP DEPTNO = 30; WHERE-Klausel Seite 5 von 20 EMPNO 7499 7521 7654 7698 7844 7900 ENAME ALLEN WARD MARTIN BLAKE TURNER JAMES JOB SALESMAN SALESMAN SALESMAN MANAGER SALESMAN CLERK MGR 7698 7698 7698 7839 7689 7698 HIREDATE 20-FEB-81 22-FEB-81 28-SEP-81 01-MAY-81 08-SEP-81 03-DEC-81 SAL COMM DEPTNO 1,600.00 300.00 30 1,250.00 500.00 30 1,250.00 1,400.00 30 2,850.00 30 1,500.00 0.00 30 950.00 30 Mit der Klausel WHERE weisen Sie ORACLE an, die Daten in Ihrer Tabelle abzusuchen und nur die Zeilen herauszugreifen, die Ihrer Suchbedingung entsprechen. Beim obigen Beispiel gab ORACLE nur die Zeilen wieder, in denen die Kennzahl der Abteilung des betreffenden Mitarbeiters gleich 30 war (WHERE DEPNO = 30). Mehrfache Suchbedingungen Gelegentlich müssen Sie mehr als eine Suchbedingung in einer WHERE-Klausel angeben. Nehmen wir beispielsweise an, dass Sie eine Liste der Manager in Ihrer Firma brauchen, die mehr als $ 2,800.00 verdienen. SELECT FROM WHERE AND ENAME, JOB, SAL EMP JOB = 'MANAGER' SAL > 2800; ENAME ------------JONES BLAKE JOB -----------------MANAGER MANAGER AND-Verbindung SAL --------------2,975.00 2,850.00 Mehrere Suchbedingungen werden mit dem Wort AND (JOB = 'MANAGER' AND SAL > 2800) verbunden. AND bedeutet, dass Ihre Daten allen Suchbedingungen entsprechen müssen, bevor ORACLE eine bestimmte Zeile auswählt. Sie können mit AND beliebig viele Suchbedingungen in eine WHERE-Klausel miteinander verknüpfen. Alternative Suchbedingungen Sie können nicht nur Zeilen herausgreifen, die allen von mehreren Suchbedingungen entsprechen, sondern Sie können auch Zeilen ansteuern, die eine von mehreren Suchbedingungen erfüllen. SELECT FROM WHERE OR Einführung in SQL ENAME, JOB, SAL EMP JOB = 'MANAGER' SAL > 2800; OR-Verbindung Seite 6 von 20 ENAME ------------JONES BLAKE CLARK SCOTT KING FORD JOB -----------------MANAGER MANAGER MANAGER ANALYST PRESIDENT ANALYST SAL --------------2,975.00 2,850.00 2,450.00 3,000.00 5,000.00 3,000.00 Bei diesem Beispiel verknüpfen wir unsere Suchkriterien durch das Wort OR (JOB = 'MANAGER' OR SAL > 2800). OR bedeutet, dass bei der Erfüllung einer Ihrer Suchbedingungen ORACLE die entsprechende Zeile herausgreift. Negative Suchbedingungen Sie können auch Zeilen herausgreifen, die bestimmte Suchkriterien nicht erfüllen. Nehmen wir zum Beispiel alle Manager, die nicht in Abteilung 30 arbeiten. SELECT FROM WHERE AND ENAME, JOB, DEPTNO EMP JOB = 'MANAGER' DEPTNO != 30; ENAME -------------JONES CLARK JOB -----------------MANAGER MANAGER != bedeutet 'ungleich' DEPTNO -----------20 10 Sie können in einer einzigen Abfrage mit AND, OR und NOT soviele Suchkriterien miteinander verbinden, wie sie zum Auffinden der von Ihnen gewünschten Zeilen benötigen. Suche nach einem Bereich Mit der Bedingungsangabe BETWEEN (zwischen) können Sie alle Zeilen herausgreifen, die Werte innerhalb eines von Ihnen vorgesehenen Bereichs enthalten. Stellen wir also eine Übersicht über alle Beschäftigten zusammen, deren Gehalt zwischen 1200 und 1400 leigt. SELECT FROM WHERE ENAME ----------------WARD MARTIN MILLER Einführung in SQL ENAME, SAL EMP SAL BETWEEN 1200 AND 1400; Bedingungsangabe BETWEEN SAL ------------1,250.00 1,250.00 1,300.00 Seite 7 von 20 Suche nach Werten IN einer Liste Mit der Bedingungsangabe IN können Sie einzelne Zeilen auswählen, die einen Wert enthalten, der einem Wert in einer Werteliste entspricht, die Sie angeben. Stellen wir also eine Übersicht über alle Abteilungen zusammen, die die Nummer 10 oder 30 tragen. SELECT FROM WHERE * DEPT DEPTNO IN (10,30); DEPTNO ------------10 30 DNAME -------------------ACCOUNTING SALES Bedingungsangabe IN LOC -----------------NEW YORK CHICAGO Bitte beachten Sie, dass wir unsere Werteliste in Klammern (10,30) gesetzt haben. Diese Abfrage hätten wir genauso gut mit OR (WHERE DEPTNO = 10 OR DEPTNO = 30) formulieren können, um das gleiche Ergebnis zu erhalten. Vergleich zu einem Zeichenmuster Es lassen sich auch Zeilen herausgreifen, die einem Muster aus Zeichen oder Zahlen entsprechen, das Sie vorgeben. Nachstehend nun eine Auflistung aller Angestellten, bei denen R der dritte Buchstabe im Namen ist. SELECT FROM WHERE ENAME EMP ENAME LIKE '__R%'; Bedingungsangabe LIKE ENAME -------------WARD MARTIN TURNER FORD Bei diesem Beispiel haben wir als SQL-Bedingungsangabe LIKE (wie) verwendet, damit ORACLE alle die Zeilen in der Tabelle EMP herausgreift, in denen das Feld ENAME einen Wert enthält, der dem vorgegebenen Muster ('__R%') entspricht, also gleich (LIKE) diesem ist. Mit der Unterstreichung wird jeweils eine Zeichenstelle angegeben, und das Prozentzeichen (%) steht für jede Folge von null oder mehr Zeichen. Vor die Bedingungsangaben BETWEEN, IN und LIKE kann die Angabe NOT gesetzt und mit AND und OR so angeschlossen werden, dass sie zusammen genau die WHERE-Klausel bilden, die Sie zum Auswählen der gewünschten Zeilen brauchen. Einführung in SQL Seite 8 von 20 REIHENFOLGE DER ZEILEN IN EINEM ABFRAGEERGEBNIS Reihenfolge der Zeilen Bei allen bisher vorgestellten Beispielen erschienen die Zeilen im Abfrageergebnis in einer von ORACLE vorgegebenen Reihenfolge. Sie können jedoch auch die Reihenfolge vorgeben, in der die angewählten Zeilen auf dem Bildschirm erscheinen. Hierzu fügen Sie an den Befehl SELECT den Zusatz ORDER BY (geordnet nach) an. Angenommen, Sie brauchen eine Aufstellung der Beschäftigten in Abteilung 30, geordnet nach Einkommenshöhe. SELECT SAL, JOB, ENAME FROM EMP WHERE DEPTNO = 30 ORDER BY SAL; SAL -------------------950.00 1,250.00 1,250.00 1,500.00 1,600.00 2,850.00 JOB ----------------CLERK SALESMAN SALESMAN SALESMAN SALESMAN MANAGER Klausel ORDER BY ENAME ---------------------JAMES WARD MARTIN TURNER ALLEN BLAKE Durch die Angabe der Klausel ORDER BY wurde ein Sortierlauf in den Zeilen in aufsteigender Folge (beginnend mit dem kleinsten Einkommen) veranlaßt. Doch kann nicht nur in aufsteigender Folge oder in nur einer einzigen Spalte geordnet werden. Wir können vielmehr auch alle Beschäftigten in der alphabetischen Reihenfolge ihrer Tätigkeit und innerhalb jeder Tätigkeit in absteigender Folge des Einkommens auflisten. SELECT JOB, SAL, ENAME FROM EMP ORDER BY JOB, SAL DESC; JOB -------------------ANALYST ANALYST CLERK CLERK CLERK CLERK MANAGER MANAGER PRESIDENT SALESMAN SALESMAN SALESMAN SALESMAN Einführung in SQL SAL -----------------3,000.00 3,000.00 1,300.00 1,100.00 950.00 800.00 2,850.00 2,450.00 5,000.00 1,600.00 1,500.00 1,250.00 1,250.00 Absteigende Folge (DESC) ENAME -----------------SCOTT FORD MILLER ADAMS JAMES SMITH BLAKE CLARK KING ALLEN TURNER WARD MARTIN Seite 9 von 20 Die Angaben in der Spalte JOB erscheinen in unserer Ergebnistabelle alphabetisch (wird für die gewünschte Spalten nichts angegeben, so erfolgt die Reihenfolge aufsteigend), wobei die Beschäftigten innerhalb jeder Tätigkeitsgruppe in absteigender Folge ihres Gehalts (SAL DESC) aufgeführt sind. VERHINDERN DER AUSWAHL VON DOPPELZEILEN Angenommen, Sie wünschen eine Liste der verschiedenen Tätigkeitsangaben innerhalb der Tabelle EMP. SELECT FROM JOB EMP; JOB -------------------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK Da unsere Abfrage keine WHERE-Klausel enthielt, zeigt ORACLE in der Spalte JOB der Tabelle EMP alle Werte. Daraus ersehen Sie, daß viele Werte in der Spalte doppelt vorkommen (es üben also mehrere Angestellte die gleiche Tätigkeit aus). Diese Doppeltangaben können Sie durch die Vorgabe DISTINCT (verschieden) in der SELECTKlausel vermeiden. Das Schlüsselwort DISTINCT, so wie wir es hier in der folgenden Abfrage verwenden, bedeutet "zeige mir alle verschiedenen (DISTINCT) Arten der Tätigkeit in der Tabelle EMP an.". SELECT FROM DISTINCT JOB EMP; Schlüsselwort DISTINCT JOB ------------------CLERK SALESMAN MANAGER ANALYST PRESIDENT Einführung in SQL Seite 10 von 20 Somit sind nur fünf verschiedene (DISTINCT) Tätigkeitsprofile (JOBS) in der Ergebnistabelle enthalten, auch wenn EMP vierzehn JOBS, nämlich je einen für alle vierzehn Angestellten, enthält. ABFRAGE MEHRERER TABELLEN JOIN-Abfrage Bisher haben wir bei allen Beispielen nur eine Tabelle abgefragt (EMP oder DEPT). Was aber ist zu tun, wenn die gewünschten Informationen gar nicht in der selben Tabelle erfaßt sind? Mit der ORACLE-Funktion Join (verknüpfen) können Sie Daten aus zwei oder mehr Tabellen herausgreifen und die gefundenen Daten in einer einzigen Ergebnistabelle zusammenfassen. Angenommen, es interessiert Sie, wo der Angestellte mit dem Namen ALLEN arbeitet. Schauen Sie sich beide Tabellen in unserer Datenbank an. Sie sehen, daß die Tabelle EMP keine Spalte für den Beschäftigungsort (LOC) enthält, daß aber diese Spalte in Tabelle DEPT vorgesehen ist. Beide Tabellen, EMP und DEPT, haben aber eine gemeinsame Spalte, in der die Abteilungskennzahlen (DEPTNO) angegeben sind. Eben über diese Abteilungskennzahl in beiden Tabellen können Sie eine Beziehung zwischen einzelnen Zeilen in der Tabelle EMP und Zeilen in der Tabelle DEPT herstellen. Durch Abfrage der Tabelle EMP können Sie so die zu ALLEN gehörende Abteilungskennzahl auffinden. SELECT FROM WHERE ENAME, DEPTNO EMP ENAME ='ALLEN' ENAME ------------ALLEN DEPTNO -----------30 Und durch Abfrage der Tabelle DEPT läßt sich auch der Standort der Abteilung 30 feststellen. SELECT FROM WHERE LOC DEPT DEPTNO = 30 LOC --------------CHICAGO Durch Absetzten dieser beiden Anfragen erfahren wir, daß ALLEN in CHICAGO arbeitet. Zu dem gleichen Ergebnis, das Sie mit den beiden vorhergehenden Abfragen erreicht haben, können Sie aber auch durch eine einzige Abfrage mit JOIN gelangen. Bei einer Abfrage JOIN geben Sie in der FROM-Klausel die Bezeichnung der Tabellen an, die Sie abfragen wollen, und in der WHERE-Klausel die Bezeichnung der Spalte, die bei der Zusammenfügung übereinstimmen müssen (also die Spalte, die die Tabellen gemeinsam haben). Einführung in SQL Seite 11 von 20 SELECT FROM WHERE AND ENAME, LOC EMP, DEPT ENAME = 'ALLEN' EMP.DEPTNO = DEPT.DEPTNO; NAME -----------ALLEN LOC --------------CHICAGO JOIN-Bedingung Die Join-Bedingung (die Bedingung zur Verknüpfung) in der WHERE-Klausel legt die Beziehung zwischen der Tabelle EMP und der Tabelle DEPT fest. Bei dem obigen Beispiel sind die Zeilen miteinander zu verbinden, falls ein Eintrag in Spalte DEPTNO in einer Zeile der Tabelle DEPT übereinstimmen (EMP.DEPTNO = DEPT.DEPTNO). Neben der Join-Bedingung enthält die WHERE-Klausel die Suchbedingung ENAME = 'ALLEN'. Daran erkennt ORACLE, daß nur die Zeile für den Angestellten ALLEN herauszugreifen ist. Und so schließt ORACLE einfach die Zeile ALLEN aus der Tabelle EMP, die im Feld DEPTNO den Wert 30 enthält, an die Zeile aus der Tabelle EMP an, die ebenfalls im Feld DEPTNO den Wert 30 aufweist. Die Spalten, die wir in der SELECTKlausel angegeben haben, bedeuten, daß nur das Feld ENAME aus der Tabelle EMP und nur das Feld LOC aus der Tabelle DEPT in der zusammengesetzten Zeile als Ergebnis der Abfrage herauszugreifen sind. FORMATIEREN EINER ABFRAGE ZU EINEM BERICHT Wir können das äußere Bild der Ausgabe auf unsere soeben abgesetzte Anfrage dadurch verbessern, daß wir die Spaltenüberschriften und die Daten in den Spalten leichter lesbar darstellen, oben und unten auf der Seite einen Titel einfügen und bei bestimmten Spalten Zwischensummen bilden. Benutzereingabe COLUMN DNAME HEADING 'DEPARTMENT' COLUMN ENAME HEADING 'EMPLYEE|NAME' COLUMN SAL HEADING 'MONTHLY|SALARY' FORMAT $99,999.99 BREAK ON DNAME SKIP 1 COMPUTE SUM OF SAL ON DNAME TTITLE 'ACME WIDGET||PERSONNEL REPORT' BTITLE '- Company Confidental -' SELECT DNAME, ENAME, JOB, SAL FROM EMP, DEPT WHERE EMP, DEPTNO = DEPT.DEPTNO ORDER BY DNAME, SAL DESC; Einführung in SQL Seite 12 von 20 Befehl COLUMN Mit dem Befehl COLUMN haben wir die Überschrift der Spalte SAL in MONTHLY SALARY (Gehalt pro Monat) geändert, die zweizeilig ausgewiesen wird (HEADING 'MONTHLY|SALARY') (Überschrift 'Gehalt pro Monat') und die Daten mit dem Dollarzeichen, dem Komma und dem Dezimalkomma bzw. -punkt (FORMAT $99,999.99) formatiert. Befehl BREAK Mit dem Befehl BREAK wurde unser Bericht in Zeilengruppen unterteilt, nämlich jeweils eine Gruppe für DNAME (BREAK ON DNAME), während 1 Zeile (SKIP 1) zwischen den Gruppen freigelassen wurde. Befehl COMPUTE Durch den Befehl COMPUTE wurden Zwischensummen bei den Abteilungsgruppen gebildet, die mit dem Befehl BREAK vorher festgelegt wurden (COMPUTE SUM OF SAL ON DNAME - Berechne die Gehaltssumme bei DNAME). Befehl TTITLE und BTITLE Mit den Befehlen TTITLE und BTITLE (Titel oben, Titel unten) werden oben und unten auf der Seite jeweils Titel eingefügt. Für TTITLE werden automatisch Datum und Seitenzahl eingesetzt. Der senkrechte Strich (|) bei der Angabe TTITLE und bei einigen Anweisungen zu den einzelnen Spalten (COLUMN) heißt für das System, daß eine neue Zeile beginnen soll. FUNKTIONEN FÜR ARITHMETISCHE AUSDRÜCKE UND ZEICHENFOLGEN Während SQL von IBM nur mit den vier Grundrechenarten (+, -, *, /) arbeitet, so verfügt ORACLE über einen ganzen Satz verschiedener Rechenfunktionen und Funktionen zur Bearbeitung von Zeichenfolgen. Arithmetische Ausdrücke Zur Bildung eines arithmetischen Ausrucks verknüpfen Sie Spaltenbezeichnungen und numerische Konstanten mit Hilfe eines arithmetischen Operationszeichens. Nun listen wir die Namen, das Gehalt, die Provision und die Summe aus Gehalt plus Provision für alle Verkäufer auf. SELECT FROM WHERE ENAME, SAL, COMM, SAL + COMM EMP JOB = 'SALESMAN'; ENAME ------------------ALLEN WARD MARTIN TURNER Einführung in SQL SAL --------------1,600.00 1,250.00 1,250.00 1,500.00 COM ----------------300.00 500.00 1,400.00 0.00 Ausdruck SAL + COMM SAL + COMM -------------------1,900.00 1,750.00 2,650.00 1,500.00 Seite 13 von 20 Bitte beachten Sie, daß unser arithmetischer Ausdruck (SAL + COMM) als neue Spalte in unserer Ergebnistabelle ausgeworfen wird. Auch wenn eine Spalte wie SAL + COMM keine echte Spalte ist, also nicht in der Datenbank abgespeichert wird, sondern nur als Ergebnis einer Abfrage erscheint, können Sie damit wie mit einer echten Spalte arbeiten. Nachstehend finden Sie eine Übersicht über weitere Rechenoperationen, die sich mit ORACLE ausführen lassen. Zeichenfolgefunktionen Mit den arithmetischen Funktionen können Sie Zahlenangaben bearbeiten; ähnlich einfach ist es mit den Zeichenfolgefunktionen, wie sie beispielsweise im Folgenden gegeben sind, Zeichendaten zu bearbeiten. Zum Beispiel können Sie mit der Funktion SOUNDEX Namen feststellen, die ähnlich oder gleich klingen, aber verschiedene Schreibweise haben. Suchen wir also alle Angestellten, deren Name so ähnlich wie SCHMIDT klingt. SELECT FROM WHERE ENAME EMP SOUNDEX(ENAME) = SOUNDEX('SCHMIDT') ENAME ------------SMITH ORACLE arbeitet mit den folgenden Rechenzeichen, arithmetischen Funktionen und Zeichenfolgefunktionen: ARITHMETISCHE OPERATOREN + Addieren Subtrahieren * Multiplizieren / Dividieren POWER Potenzieren ROUND Runden TRUNC Abstreichen ABS Absolutwert ZEICHENFOLGEFUNKTIONEN | Verkettung DECODE Übersetzen LENGTH Länge der Zeichenfolge SUBSTR Substring INSTR Instring UPPER Großbuchstaben LOWER Kleinbuchstaben SOUNDEX Klangbildabgleich Dies ist nur die Übersicht über einen Teil des sehr umfassenden Vorrats an arithmetischen und Zeichenfolgefunktionen bei ORACLE (zu den Gruppierungsfunktionen von ORACLE, AVG, SUM, COUNT, MIN und MAX wird auf den Abschnitt über GROUP BY verwiesen). Einführung in SQL Seite 14 von 20 FORMATIEREN UND BERECHNEN VON DATUMSANGABEN Formatieren des Datums Erinnern wir uns daran, daß wir bei Erstellung der Tabelle EMP für die Spalte HIREDATE (Einstellungsdatum) den Datentyp Datum festgelegt haben. Wenn Sie nun die Spalte HIREDATE oder jede andere Spalte, die für eine Datumsangabe vorgesehen ist, ansteuern, so erscheint sie im Standardformat DD-MON-YY (Tag, Monat, Jahr, z. B. 03-SEP-84). Sie können Datenfelder in verschiedenen Formaten anzeigen lassen, indem Sie die Formatierfunktion TO_CHAR (Spaltenbezeichnung, 'Darstellungsform') aufrufen. Schauen wir uns die Namen, Tätigkeitsbezeichnungen und Einstelldaten aller Angestellten in Abteilung 20 an und lassen die Einstelldaten in der Form DY DD MON YYYY (Wochentag, Datum, Monat, Jahr) erscheinen SELECT FROM WHRE ENAME, JOB, TO_CHAR(HIREDATE, 'DY DD MON YYYY) HIREDATE EMP DEPTNO = 20; ENAME -----------------SMITH JONES SCOTT ADAMS FORD JOB -----------------CLERK MANAGER ANALYST CLERK ANALYST HIREDATE -----------------------WED 17 DEC 1980 THU 02 APR 1981 THU 09 DEC 1982 WED 12 JAN 1983 THU 03 DEC 1981 Beim Aufrufen der Funktion TO_CHAR zur Veränderung der Bildschirmdarstellung unserer Daten HIREDATE mit TO_CHAR(HIREDATE....) haben wir das gewünschte Darstellungsformat beschrieben (....DY DD MON YYYY), worauf die vollständige Aufgabe dessen folgte, was wir als Überschrift für diese neue Spalte (HIREDATE) vorgesehen hatten. Mit der Datumsfunktion von ORACLE lassen sich viele verschiedene Formate wählen. Hier ein paar Beispiele: FORMAT PICTURE - Standard Default Format DAY MONTH DD, YYYY Dy DD Mon YYYY Day "the" ddth "of" Month YYYY MM/DD/YY HH:MIPM FOMATTED DATE 17-DEC-80 WEDNESDAY DECEMBER 17, 1980 Wed 17 Dec 1980 The Seventeenth of December One Thousand Nine Hundred Eighty 12/17/80 12:00AM Bitte achten Sie auf die Angabe der Uhrzeit beim letzten Datumbsbeispiel. Eine Spalte, die Sie für den Datentyp Datum vorsehen, speichert tatsächlich die Werte für das Jahr, den Monat, den Tag und die Uhrzeit ab. Einführung in SQL Seite 15 von 20 Datumsarithmetik Sie können nicht nur nach Belieben Datumsfelder formatieren, sondern mit diesen auch Rechenoperationen ausführen. Angenommen, Sie überprüfen alle Neueingestellten nach 90 Tagen ab dem Einstellungsdatum. Sie können nun zur Berechnung der Überprüfungsdaten für die Beschäftigten in Abteilung 20 mit der Datumsarithmetik bei ORACLE arbeiten. SELECT FROM WHERE AND ENAME, HIREDATE, SYSDATE, HIREDATE+90 EMP HIREDATE+90 > SYSDATE DEPTNO = 20; ENAME ---------------SCOTT ADAMS HIREDATE -----------------09-DEC-82 12-JAN-83 SYSDATE -----------------04-MAR-83 04-MAR-83 HIREDATE+90 -------------------09-MAR-83 12-APR-83 Mit dem Schlüsselwort SYSDATE erfolgt immer die Angabe des heutigen Datums als Antwort. Der Ausdruck HIREDATE + 90 in der SELECT-Klausel errechnet nun das Überprüfungsdatum, und der Ausdruck HIREDATE + 90 > SYSDATE in der WHEREKlausel veranlaßt ORACLE zur Ergebnisangabe nur der Zeilen, die sich auf diejenigen unter den Beschäftigten beziehen, deren Überprüfungsdaten nach dem heutigen Datum liegen, also einen höheren Zahlenwert haben. ORACLE kann zur Datumsberechnung die folgenden Operationen ausführen: FUNKTION ADD_MONTHS LAST_DAY MONTHS_BETWEEN NEXT_DAY ROUND TRUNC TO_DATE ZWECK Datum durch Addition bzw. Subtraktion von Monaten ändern Datum zu Ultimo des Monats vortragen Subtraktion zweier Datumsangaben zur Ermittlung des Unterschieds in Monaten Datum zum angegebenen Wochentag vortragen Datum mit vorgegebener Genauigkeit runden Datum mit vorgegebener Genauigkeit abstreichen Datumseingabe in anderem als dem vorgegebenen Format möglich Sie können ein Datumsfeld in jeder SQL-Klausel verwenden (z. B. SELECT, WHERE, ORDER BY, etc.), in der Sie eine Spalte für Zahlen oder Zeichen benützen können. FUNKTIONEN ZUR BERECHNUNG BEI ZEILENGRUPPEN Gruppenfunktionen Gruppenfunktionen sind ein weiteres Beispiel für die Leistungsfähigkeit von SQL. Mit Gruppenfunktionen können Sie aus Zeilengruppen zusammenfassende Informationen gezielt abfragen. Beispielsweise angenommen, Sie möchten alle Beschäftigten mit der gleichen Abteilungskennzahl in einer Gruppe zusammenfassen und anschließend das höchste Gehalt in jeder abteilungsbezogenen Gruppe ermitteln. Einführung in SQL Seite 16 von 20 SELECT DEPTNO, MAX(SAL) FROM EMP GROUP BY DEPTNO; DEPTNO ----------10 20 30 MAX-Funktion Klausel GROUP BY MAX(SAL) -------------5,000.00 3,000.00 2,850.00 Klausel GROUP BY Bei einer Abfrage GROUP BY stellt jede Zeile der Abfrage eine Gruppe von Zeilen dar, wie sie in Ihrer Tabelle abgespeichert sind. Die Spalte, die Sie in der Klausel GROUP BY bezeichnen (DEPTNO beim vorliegenden Beispiel) ist die Spalte, nach der die Zeilen in Ihren Tabellen zu gruppieren (GROUP) bzw. in Kategorien aufzuschlüsseln sind. Im obigen Beispiel gibt es für jeden der 3 unterschiedlichen DEPTNO-Werte in der Tabelle EMP eine Zeile in der Ergebnistabelle. ORACLE gruppiert gemäß der SELECT-Klausel alle Zeilen der EMP-Tabelle nach DEPTNO, bildet pro Gruppe MAX(SAL) und gibt das Resultat in der Ergebnistabelle aus. Genauso wie mit den Befehlen ORDER BY können Sie auch mit GROUP BY jede bliebige Anzahl von Spalten in einer einzigen Abfrage erfassen. Verbinden wir nun die Benutzung der Gruppierungsfunktionen mit einer JOIN-Abfrage. Dieses Mal wollen wir nach zwei Spalten (GROUP BY DNAME, JOB) gruppieren und drei neue Funktionen verwenden: SUM zu Aufaddierung der Werte in speziell bezeichneten Feldern, die in die Gruppen fallen, die wir in unserer Klausel GROUP BY festlegen; COUNT(*) zum Zählen der Anzahl von Zeilen, die in jeder der gebildeten Gruppen fallen; und AVG zum Ermitteln des Durchschnitts der Werte in jeder Gruppe. Bei der Vorgabe dieser Abfrage haben wir uns zum Ziel gesetzt, festzustellen, wie viele Angestellte in jeder Position in jeder Abteilung beschäftigt sind - z.B. wie viele als CLERK in der Abteilung RESEARCH arbeiten - und innerhalb der Gruppe die Gesamtsummen und Mittelwerte der Gehälter dieser Beschäftigten zu ermitteln. SELECT DNAME, JOB, SUM(SAL), COUNT(*), AVG(SAL) FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO GROUP BY DNAME, JOB; Einführung in SQL Funktion SUM Funktion COUNT(*) Funktion AVG nach 2 Spalten gruppieren (GROUP BY) Seite 17 von 20 DNAME ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH SALES SALES SALES JOB CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN SUM(SAL) 1,300.00 2,450.00 5,000.00 6,000.00 1,900.00 2,975.00 950.00 2,850.00 5,600.00 COUNT(*) 1 1 1 2 2 1 1 1 4 AVG(SAL) 1,300,00 2,450.00 5,000.00 3,000.00 950.00 9,975.00 950.00 2,850.00 1,400.00 Aus der Ergebnisausgabe auf dem Bildschirm erkennen wir hier zum Beispiel, dass zwei Angestellte als CLERK in der Forschungsabteilung (RESEARCH) beschäftigt sind, und dass die Summe ihrer Gehälter 1,900.00 beträgt, während ihr Gehalt durchschnittlich 950.00 beträgt. Prozedural gegenüber nichtprozedural Betrachten wir einmal die Arbeit, die ein Programmierer zur Erstellung der gleichen Ausgabe bei der Benützung eines prozduralen DBMS-Systems mit Einzelsatzverarbeitung oder mit einem herkömmlichen Dateisystem zu leisten hätte: zunächst muß eine Liste der Angestellten erstellt und nach Abteilungskennzahl und Tätigkeit sortiert werden. Als nächstes müssen die Addition, die Zählung und die Mitteilung des Gehalts durch Berechnung nach Abteilungskennzahl und Tätigkeit durchgeführt werden. Schließlich ist anstelle der Abteilungskennzahl in der Ausgabe die Bezeichnung der Abteilung einzusetzen. Jeder dieser Arbeitsabläufe verlangt vom Programmierer, daß er Einträge liest, Zwischenergebnisse abspeichert, auf Fehler prüft, etc. Bei der nichtpozeduralen SQL-Lösung mit Mehrzeilenverarbeitung können Sie Berichte wie diesen einfach dadurch erstellen, daß Sie angeben, WELCHE Daten Sie brauchen: ORACLE GENERIERT DANN AUTOMATISCH DEN ERFORDERLICHEN Ablauf zur Festlegung, WIE die Daten aus dem Datenbestand zu nehmen sind. Bei anderen Systemen müssen Sie diesen Ablauf dagegen in Ihr Programme einbauen. Klausel HAVING Genauso wie bei der Angabe von Suchkriterien für einzelne Zeilen mit der Klausel WHERE können wir auch die SQL-Klausel HAVING dazu einsetzten, Suchbedingungen für Gruppen von Zeilen vorzugeben. Angenommen, es interessiert Sie ein ähnliches Abfrageergebnis wie das vorstehende, bloß mit dem Unterschied, daß Sie diesmal nur die Gruppe abrufen wollen, die mindestens zwei Angestellte enthalten. SELECT DNAME, JOB, SUM(SAL), COUNT(*), AVG(SAL) FROM EMP, DEPT WHERE EMP, DEPTNO = DEPT-DEPTNO GROUP BY DNAME, JOB HAVING COUNT(*) >= 2; DNAME -------------RESEARCH RESEARCH Einführung in SQL JOB -------------ANALYST CLERK SUM(SAL) -------------6,000.00 1,900.00 COUNT(*) ------------2 2 AVG(SAL) -------------3,000.00 950.00 Seite 18 von 20 SALES SALESMAN 5,600.00 4 1,400.00 Das Suchkriterium in unserer Klausel HAVING schloß aus dem Ergebnis als Antwort auf unsere Anfrage alle Gruppen aus, die nicht mindestens zwei Zeilen pro Gruppe enthielten COUNT(*) >= 2 SUBQUERIES Einer der Gründe für die hohe Leistung von SQL besteht darin, daß sich aus mehreren einfachen Abfragen komplexe Anfragen aufbauen lassen. Zum Beispiel kann eine WHREKlausel in einer Anfrage eine weitere Anfrage enthalten, die dann als Subquery bezeichnet wird. Diese Subqueries werden für den dynamischen Aufbau einer Suchbedingung für die Hauptanfrage verwendet. Angenommen, Sie brauchen eine Liste aller Angestellten mit der gleichen Tätigkeit wie sie JONES ausübt. SELECT FROM WHERE ENAME, JOB Hauptanfrage EMP JOB = (SELECT JOB Subquery FROM EMP WHERE ENAME = 'JONES'); ENAME ----------JONES BLAKE CLARK JOB -----------------MANAGER MANAGER MANAGER ORACLE arbeitet Subqueries vor den Hauptanfragen ab, da das Ergebnis der Unteranfrage zur Ermittlung des Ergebnisses der Hauptanfrage benötigt wird. Der zweite Befehl SELECT bei diesem Beispiel - hier die Subquery - ermittelte den MANAGER als gesuchten Wert; dies können Sie auch aus dem obigen Beispiel mit der Tätigkeit von JONES in der EMP-Tabelle erkennen. ORACLE setzt diesen Wert dann beim dynamischen Aufbau der Suchbedingung WHERE JOB = 'MANAGER' ein, der zur Auffindung der gewünschten Zeilen im ersten Befehl SELECT eingesetzt wird. Als nächstes wollen wir eine Liste aller Angestellten haben, deren Gehalt über dem Durchschnitt der Gehälter aller Beschäftigten liegt. SELECT FROM WHERE Einführung in SQL ENAME, SAL EMP SAL > (SELECT AVG(SAL) FROM EMP); Seite 19 von 20 ENAME ----------JONES BLAKE CLARK SCOTT KING FORD JOB ----------2,975.00 2,850.00 2,450.00 3,000.00 5,000.00 3,000.00 Eine einzelne ORACLE-Anfrage kann aus mehreren Subqueries aufgebaut sein. Subqueries können genauso komplex wie die Hauptanfragen sein, d.h. sie können beispielsweise ihre eigenen Suchkriterien und JOIN-Anfragen enthalten. Und diese Subqueries können auch bei den Befehlen INSERT, UPDATE und DELETE eingesetzt werden, die im nächsten Abschnitt erläutert werden, wie auch bei SELECT-Befehlen. Einführung in SQL Seite 20 von 20