SQL I - Basiswissen Christine Apfel, DESY, Juni 2011 SQL Schulung Übersicht I Relationale Datenbanken Einführung Terminologie Eigenschaften SQL-Anweisungen Select Klausel From Klausel Where Klausel Vergleichsoperatoren Logische Operatoren Single Row- Funktionen (teilweise Oracle spezifisch) Aggregatfunktionen SQL Schulung Übersicht II Datengruppen GROUP BY-Klausel HAVING-Klausel Joins Natural Joins Inner Joins und Outer Joins Left Outer Joins Right Outer Joins Full Outer Joins Kartesische Produkte Cross Joins SQL Schulung Übersicht III Subselects (Unterabfragen) Single Row Unterabfragen Gruppenfunktionen Multiple Row Unterabfragen Mengenoperatoren UNION / UNION ALL INTERSECT MINUS Richtlinien SQL Schulung Übersicht IV DDL-Anweisungen Datenbankobjekte Tabellen erstellen (CREATE TABLE-Anweisung) Datentypen und Constraints Tabellendefinition ändern (ALTER TABLE-Anweisung) Tabellen löschen (DROP TABLE-Anweisung) DML-Anweisungen INSERT-Anweisung UPDATE-Anweisung DELETE-Anweisung TRUNCATE-Anweisung COMMIT- u. ROLLBACK-Anweisung SQL Schulung Übersicht V weitere Schemaobjekte Views Sequences Pseudospalten Indizes Synonyme Data Dictionary Einführung SQL Schulung: Kapitel 1 Relationale Datenbanken - Konzept Dr. E.F. Codd entwickelte das relationale Modell für Datenbank-Systeme 1970 Relation ist Grundlage für das relationale Datenbank-Management-System (RDBMS) Komponenten des relationalen Modells sind: Relationen (Zusammenstellung von Objekten) Menge von Operatoren, mit denen die Relationen bearbeitet werden Datenintegrität für Korrektheit und Konsistenz Datenbanksysteme DBMS organisiert intern die strukturierte Speicherung der Daten gemäß Datenmodell kontrolliert alle lesenden u. schreibenden Zugriffe stellt DB-Anfragesprache (SQL) Datenbank die Daten die Datenbeschreibung (Data Dictionary) Relationale Datenbanken - Definition Eine relationale Datenbank ist eine Zusammenstellung von Relationen oder zweidimensionalen Tabellen Relation / Tabelle Relationenname Attribute / Felder / Spalten Tabelle 1 A1 Wert 1 A2 Wert 2 Wert 2 Wert 3 Wert 3 Wert 3 Wert 4 Wert 4 … An Relationenschema Tupel/ Zeilen Entity-Relationship-Modell beschreibt Ausschnitt der „realen“ Welt Daten werden in Entitys unterteilt Zwischen verschiedenen Entitys gibt es Beziehungen (Relationship) keine Abbildung von ausgeführten Aktivitäten (siehe UML) ER-Grundlagen I Entität (Entity) Objekt der „realen“ Welt Entitätstyp Typisierung gleichartiger Entitäten Beziehung (Relationship) semantische Beziehung zwischen Entitäten Beziehungstyp Typisierung gleichartiger Beziehungen Kardinalität mögliche Anzahl der an einer Beziehung beteiligten Entitäten ER-Grundlagen II Attribut / identifizierende Attribute Eigenschaft eines Entitätstyps identifizierende Attribute Attribut o. Attributkombination eines Entitättyps Beziehungstyp mit Attributen (m:n-Beziehungen) ER-Modelle Rel. Datenbanken - Terminologie Zeile (Tupel; Schlüssel-Wert-Paar) ← Entität Spalte ← Attribut Primärschlüssel Fremdschlüssel sonstige Feld Relationale DBMS Eigenschaften Kann durch Ausführen von SQL- Anweisungen gelesen und bearbeitet werden Enthält eine Zusammenstellung von Tabellen ohne physische Zeiger Verwendet eine Menge von Operatoren Sicherheitsfunktionen (Zugriff auf Daten und deren Benutzung) Das DB-Mangement System SGA (System Global Area) Benutzertabellen und Data Dictionary SQL Structured Query Language: Datenmanipulationssprache (DML) SELECT, INSERT, UPDATE, DELETE, MERGE Datendefinitionssprache (DDL) CREATE, ALTER, DROP, RENAME, TRUNCATE, COMMENT Transaktionssteuerung COMMIT, ROLLBACK, SAVEPOINT Datenkontrollsprache (DCL) GRANT, REVOKE SELECT-Klausel SQL Schulung: Kapitel 2 SELECT - Anweisung Abruf von Informationen aus der Datenbank Projektion SELECT-Klausel Join FROM-Klausel Selektion WHERE-Klausel SELECT-Basis-Syntax SELECT * | { [DISTINCT] column|expression [alias] }* FROM table; SELECT Beispiele SELECT * FROM departments; DEPARTMENT_ID ---------------------10 20 30 40 50 DEPARTMENT_NAME -----------------------------Administration Marketing Purchasing Human Resources Shipping MANAGER_ID ---------------------200 201 114 203 121 LOCATION_ID ---------------------1700 1800 1700 2400 1500 60 IT 103 1400 SELECT Beispiele II SELECT department_id, location_id FROM departments; DEPARTMENT_ID ---------------------10 20 30 40 LOCATION_ID ---------------------1700 1800 1700 2400 SELECT Beispiele III SELECT department_id “Dep-id“, location_id “Loc-id“ FROM departments; Dep-id ---------------------10 20 30 40 Loc-id ---------------------1700 1800 1700 2400 SQL Beispiele IV (Alias) select d.department_id "Dep-id", d.location_id "Loc-id" from departments d; Dep-id ---------------------10 20 30 40 Loc-id ---------------------1700 1800 1700 2400 Hinweis: Bei Oracle kann in der „SELECT-Klausel“ auch AS verwendet werden. SELECT department_is AS Department, location_id AS Location SQL-Anweisungen erstellen in SQL Anweisungen wird nicht zwischen Gross- und Kleinschreibung unterschieden SQL-Anweisungen können aus einer oder mehrerer Zeilen bestehen Schlüsselwörter dürfen nicht abgekürzt oder auf mehrere Zeilen verteilt werden Einrückungen verbessern die Lesbarkeit ! Semikolon (;) am Ende der Anweisung ! Wo ? Exkurs SQL Developer Arithmetische Ausdrücke Arithmetische Operatoren +, -, *, / Datentypen: NUMBER u. DATE in jeder Klausel einer SQL-Anweisung verwendbar, ausgenommen FROM Punkt-Rechnung vor Strichrechnung Auswertunsrichtung: von links nach rechts bei gleicher Priorität Klammern für Umgehung der Prioritätsregeln Arithmetische Operatoren Beispiele SELECT last_name, salary, salary + 300 FROM employees; SELECT last_name, salary, 12*salary+100 FROM employees; SELECT last_name, salary, 12*(salary+100) FROM employees; Nullwerte definieren ein Nullwert steht für einen nicht verfügbaren, nicht zugewiesenen, unbekannten oder nicht anwendbaren Wert. nicht zu verwechseln mit der Zahl Null (0) nicht zu verwechseln mit einem Leerzeichen Nullwert für alle Spalten und Datentypen möglich bestimmte Constraints verbieten Nullwerte Nullwerte Beispiel SELECT last_name, job_id, commission_pct FROM employees; LAST_NAME ------------------------OConnell Grant Vargas Russell Partners JOB_ID ---------SH_CLERK SH_CLERK ST_CLERK SA_MAN SA_MAN SALARY ---------------------2600 2600 2500 14000 13500 COMMISSION_PCT ---------------------- 0,4 0,3 Nullwerte in arithm. Ausdrücken arithmetische Ausdrücke, die einen Nullwert benutzen, liefern einen Nullwert SELECT last_name, 12*salary*commission_pct FROM employees; LAST_NAME ------------------------OConnell Grant Vargas Russell Partners Errazuriz JOB_ID ---------SH_CLERK SH_CLERK ST_CLERK SA_MAN SA_MAN SA_MAN 12*SALARY*COMMISSION_PCT ------------------------ 67200 48600 43200 Verkettungsoperatoren verknüpfen Spalten oder Zeichenfolgen mit anderen Spalten oder Zeichenfolgen wird durch 2 senkrechte Striche (||) dargestellt erstellt eine Ergebnisspalte Nullwerte werden ignoriert z.B.: LAST_NAME || NULL ergibt LAST_NAME Literale Zeichenfolgen Ein Literal ist ein Zeichen, eine Zahl oder ein Datum in einer SELECT-Klausel Literale Datums- und Zeichenwerte müssen in Hochkommata (' ') gesetzt werden Jede Zeichenfolge wird für jede zurückgegebene Zeile einmal ausgegeben keine Spalten !!! Verkettungsoperatoren u. Literale Beispiel SELECT '[' || employee_id || ']' || first_name || ' ' || last_name "Employee" FROM employees; Employee -------------------------------------------------------------[198] Donald OConnell [199] Douglas Grant [200] Jennifer Whalen … DISTINCT zum Ausblenden von mehrfach vorhandenen Zeilen gültig für alle Spalten der Projektion SELECT department_id FROM employees; vs. SELECT DISTINCT department_id FROM employees; Tabellenstruktur Welche Spalten gibt es in der Tabelle? Welche Datentypen wurden verwendet? Welche NOT-NULL Constraints liegen vor? DESC(RIBE) tabellen-name DESCRIBE Beispiel desc employees; Name -----------------------------EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID Null Type -------- ----------------------------NOT NULL NUMBER(6) VARCHAR2(20) NOT NULL VARCHAR2(25) NOT NULL VARCHAR2(25) VARCHAR2(20) NOT NULL DATE NOT NULL VARCHAR2(10) NUMBER(8,2) NUMBER(2,2) NUMBER(6) NUMBER(4) WHERE-Klausel SQL-Schulung Kapitel: 3 Syntax WHERE-Klausel SELECT * | { [DISTINCT] column|expression [alias] } * FROM table; [ WHERE condition(s)]; WHERE schränkt die Abfrage auf die Zeilen ein, die eine Bedingung erfüllen condition besteht aus Spaltennamen, Ausdrücken, Konstanten und einem Vergleichsoperator WHERE-Klausel Beispiel SELECT employee_id, last_name, job_id, department_id FROM employees WHERE department_id = 90; EMPLOYEE_ID ----------------100 101 102 LAST_NAME -----------------King Kochhar De Haan JOB_ID ---------AD_PRES AD_VP AD_VP DEPARTMENT_ID -------------90 90 90 Zeichenfolgen und Datumsangaben Zeichenfolgen und Datumswerte werden in Hochkommata gesetzt Bei Zeichenwerten wird die Gross/Kleinschreibung beachtet Datumswerte sind formatabhängig Defaultformat: DD-MON-YY Beispiel: SELECT last_name, job_id, department_id FROM employees WHERE last_name = 'Whalen'; != last_name = 'WHALEN' SELECT last_name, job_id, department_id FROM employees WHERE hire_date = '17-SEP-87'; Vergleichsoperatoren Operator Bedeutung = Gleich > Grösser als >= Grösser/gleich < Kleiner als <= Kleiner/gleich <> Ungleich BETWEEN…AND… IN(set) LIKE IS NULL bzw. IS NOT NULL Zwischen zwei Werten (Werte eingeschlossen) Entspricht einem Wert aus einer Werteliste Entspricht einem Zeichenmuster Ist ein Nullwert bzw. ist kein Nullwert Syntax Vergleichsoperatoren … WHERE expr operator value Beispiele: … WHERE salary >= 6000 … WHERE last_name LIKE 'Smi%' … WHERE salary BETWEEN 2000 AND 4000 … WHERE last_name BETWEEN 'King' AND 'Smith' … WHERE department_id IN (30,50) … WHERE last_name IN ('Hartstein', 'Vargas') … WHERE commission_pct IS NULL Vergleichsoperator LIKE Symbole _ und % beliebig kombinierbar ESCAPE-Identifier, um nach Symbolen zu suchen Beispiel: ... WHERE last_name LIKE '_o%' ... WHERE job_id LIKE '%SA\_%' ESCAPE '\' Logische Operatoren Operator AND OR NOT Bedeutung Gibt TRUE zurück, wenn jede der durch AND kombinierten Bedingungen wahr ist Gibt TRUE zurück, wenn eine der durch OR kombinierten Bedingungen wahr ist Gibt TRUE zurück, wenn die nachfolgende Bedingung falsch ist AND-Operator AND fordert, dass beiden Komponenten der Bedingung wahr sind AND-Wahrheitstafel AND TRUE FALSE NULL TRUE TRUE FALSE NULL FALSE FALSE FALSE FALSE NULL NULL FALSE NULL OR-Operator OR fordert, dass eine Komponente der Bedingung wahr ist OR-Wahrheitstafel OR TRUE FALSE NULL TRUE TRUE TRUE TRUE FALSE TRUE FALSE NULL NULL TRUE NULL NULL NOT-Operator NOT negiert das Ereignis kann mit IN, BETWEEN, LIKE etc. kombiniert werden NOT-Wahrheitstafel NOT TRUE FALSE NULL FALSE TRUE NULL Prioritätsregeln Priorität Operator(en) 1 2 3 Arithmetische Operatoren Verkettungsoperator Vergleichsoperator 4 5 IS [NOT] NULL, LIKE, [NOT] IN [NOT] BETWEEN 6 7 8 Ungleich Logischer Operator NOT Logischer Operator AND 9 Logischer Operator OR Prioritätsregeln Beispiele SELECT last_name, job_id, salary FROM employees WHERE job_id = 'SA_REP' OR job_id = 'AD_PRES' AND salary > 15000; oder SELECT last_name, job_id, salary FROM employees WHERE (job_id = 'SA_REP' OR job_id = 'AD_PRES‘) AND salary > 15000; Syntax ORDER BY-Klausel SELECT expr FROM table [WHERE condition(s)] [ORDER BY {column, expr, num.position} [ASC|DESC]] sortieren der abgerufenen Zeilen ASC: aufsteigende Reihenfolge, Default DESC: absteigende Reihenfolge steht am Ende der SELECT-Anweisung expr muss Sortierspalte nicht beeinhalten Sortieren In absteigender Reihenfolge sortieren: … ORDER BY hire_date DESC; Nach Spalten Alias sortieren: … ORDER BY annsal; Nach mehreren Spalten sortieren: … ORDER BY department_id, salary DESC; Nach numerischer Position sortieren: … ORDER BY 2 DESC Austauschvariablen Syntax: &variablenname bzw. '&variablenname ‘ Benutzer wird zur Eingabe aufgefordert Überall im SELECT-Statement erlaubt WHERE-Klausel mit variablen Bedingungen SELECT-Klausel mit variablen Spalten ORDER BY-Klausel mit variablen Sortierkriterium etc. &&variablenname für Wiederverwendbarkeit Austauschvariablen Beispiele SELECT employee_id, last_name, salary, department_id FROM employees WHERE employee_id = &employee_num; SELECT employee_id, last_name, job_id, &col FROM employees WHERE &condition ORDER BY &order_column; SELECT employee_id, last_name, job_id, &&col FROM employees ORDER BY &col; DEFINE / UNDEFINE DEFINE employee_num = 200 SELECT employee_id, last_name, salary, department_id FROM employees WHERE employee_id = &employee_num; UNDEFINE employee_num Hinweise SELECT * FROM employees WHERE last_name = &name; Benutzer muss für name 'irgendwas' eingeben vs. SELECT * FROM employees WHERE last_name = '&name'; Benutzer muss für name irgendwas eingeben Single Row Funktionen SQL Schulung: Kapitel 4 SQL-Funktionen (Oracle) Bearbeitung von Datenwerten Single Row-Funktionen numerische datumsbezogene Funktionen dienen folgenden Zwecken: Berechnungen mit Daten durchführen Einzelne Datenelemente ändern Ausgabe für Zeilengruppen bearbeiten Datumswerte und Zahlen für die Anzeige formatieren Spaltendatentypen konvertieren Multiple Row-Funktionen (→ Aggregatfunktionen) Single Row-Funktionen bearbeiten Datenelemente akzeptieren Argumente und geben einen Wert zurück bearbeiten jede zurückgegebene Zeile geben ein Ergebnis pro Zeile zurück können den Datentyp ändern können verschachtelt sein akzeptieren Spalten oder Ausdrücke als Argumente function_name [(arg1, arg2, …)] SR-Funktionen -Funktionalität jede von der Abfrage zurückgegebene Zeile wird bearbeitet pro Zeile wird ein Ergebnis zurückgegeben der zurückgegebene Datenwert kann einen anderen Datentyp haben als der referenzierte Wert die Funktionen erwarten möglicherweise ein oder mehrere Argumente sie können in SELECT-, WHERE- und ORDER BYKlauseln verwendet, sowie verschachtelt werden Single Row-Funktionen Zeichenfunktionen akzeptieren Zeichenwerte und liefern Zeichen- oder numerische- Werte zurück numerische Funktionen akzeptieren numerische Werte und geben numerische Werte zurück Datumsfunktionen bearbeiten Werte vom Datentyp DATE. Zurückgegeben wird ein DATE mit einer Ausnahme ein NUMBER. Konvertierungsfunktionen konvertieren Werte von einem Datentyp in einen anderen Allgemeine Funktionen NVL, NVL2, NULLIF, COALESCE, CASE und DECODE Zeichenfunktionen I Funktionen zur Umwandlung der Groß/Kleinschreibung Funktion Zweck LOWER(column|expr) Konvertiert alphanum. Zeichenwerte in Kleinbuchstaben UPPER(column|expr) Konvertiert alphanum. Werte in Grossbuchstaben INITCAP(column|expr) Konvertiert alphanum. Werte in Großschreibung, wobei der 1.Buchstabe groß, alles folgende kleingeschrieben wird Zeichenfunktionen II Funktionen zum Bearbeiten von Zeichen Funktion Zweck CONCAT (col1|expr1, col2|expr2 ) Verkettet den 1. Zeichenwert mit dem 2. Entspricht ||-Operator SUBSTR(column|expr,m Gibt bestimmte Zeichen aus einem [,n]) Zeichenwert zurück. Die zurückgegebene Teilzeichenfolge beginnt bei der Zeichenposition m und ist n Zeichen lang. LENGTH(column|expr) Liefert die Anzahl der Zeichen i. Ausdruck INSTR(column|expr,‘stri ng‘, [,m],[n]) Gibt die numerische Position einer benannten Zeichenfolge zurück. Optional kann mit m die Position angegeben werden, wo die Suche beginnen soll. n Default m,n=1 Zeichenfunktionen II-Fortsetzung Funktion Zweck LPAD(column|expr,n,‘ Füllt den Zeichenwert rechts- bzw. string‘) linksbündig bis zur Zeichenposition n mit RPAD(column|expr,n, Leerzeichen auf. ‘string‘) TRIM(leading|trailing| Ermöglicht es, Zeichen am Anfang und/oder both, trim_character am Ende einer Zeichenfolge FROM trim_source) abzuschneiden. Wenn trim_character oder trim_source ein Zeichenliteral ist, müssen Sie in Hochkommata gesetzt werden. REPLACE(text, search_string, replacement_string) Sucht nach einer Zeichenfolge u. ersetzt diese durch die angegebene Ersatzzeichenfolge. Funktionen zur Umwandlung der Groß/Kleinschreibung Beispiele -- Konvertiert in Kleinbuchstaben SELECT LOWER('SQL Kurs') FROM DUAL; -- Konvertiert in Grossbuchstaben SELECT UPPER('SQL Kurs') FROM DUAL; -- Konvertiert den 1.Buchstaben in Gross-- folgende Zeichen in Kleinschreibweise SELECT INITCAP('SQL Kurs') FROM DUAL; Hinweis: die DUAL-Tabelle dient als Mittel zur Anzeige von Funktionsergebnissen -- gibt die Namen in Gross- und die job-id‘s in Kleinbuchstaben aus SELECT 'The Job-ID for ' || UPPER(last_name) || ' is ' || LOWER(job_id) AS "Employee Details" FROM employees; Funktionen zur Umwandlung der Groß/Kleinschreibung Beispiele II SELECT employee_id, last_name, department_id FROM employees WHERE last_name = 'higgins'; 0 rows selected SELECT employee_id, last_name, department_id FROM employees WHERE LOWER(last_name) = 'higgins'; EMPLOYEE_ID LAST_NAME DEPARTMENT_ID ---------------------- ------------------------- ---------------------205 Higgins 110 1 rows selected … WHERE UPPER(last_name) = 'HIGGINS'; … WHERE INITCAP(last_name) = 'Higgins'; Funkt. zur Bearbeitung von Zeichen Beispiel Ausgabe SELECT CONCAT('Hello', 'World') FROM DUAL; HelloWorld SELECT SUBSTR('HelloWorld',1,5) FROM DUAL; Hello SELECT LENGTH('HelloWorld') FROM DUAL; 10 SELECT INSTR('HelloWorld','W') FROM DUAL; 6 SELECT LPAD(salary,10 ,'*') FROM EMPLOYEES; … *****24000 SELECT RPAD(salary,10 ,'*') FROM EMPLOYEES; … 24000***** … SELECT REPLACE ('JACK and JUE','J','BL') FROM DUAL; BLACK and BLUE SELECT TRIM ('H' FROM 'HelloWorld') FROM DUAL; elloWorld Funktion z. Bearbeitung von Zeichen SELECT employee_id, CONCAT(first_name, last_name) NAME, LENGTH (last_name), INSTR(last_name, 'a') "Contains 'a' ?" FROM employees WHERE SUBSTR(last_name, -1,1) = 'n'; EMPLOYEE_ID -----------200 201 102 105 110 112 NAME ------------------JenniferWhalen MichaelHartstein LexDe Haan DavidAustin JohnChen Jose ManuelUrman LENGTH(LAST_NAME) -----------------6 9 7 6 4 5 Contains 'a' ? --------------3 2 5 0 0 4 Numerische Funktionen akzeptieren numerische Werte und liefern numerische Werte zurück Funktion Zweck ROUND(column|expr, n) Rundet eine Spalte, einen Ausdruck oder einen Wert auf n Dezimalstellen. Ist kein Wert für n angegeben, wird auf einen ganzzahligen Wert gerundet. TRUNC(column|expr, n) Schneidet eine Spalte, einen Ausdruck oder einen Wert auf n Dezimalstellen ab. Ist kein Wert für n angegeben, werden die Ziffern hinter dem Dezimalkomma abgeschnitten MOD(m,n) Gibt den Rest von m geteilt durch n zurück Hinweis: MOD wird häufig verwendet um zu ermitteln, ob ein Wert gerade oder ungerade ist. Numerische Funktionen Beispiele Beispiel Ausgabe SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL; 45,92 46 50 SELECT TRUNC(45.923,2), TRUNC(45.923,0), TRUNC(45.923,-1) FROM DUAL; 45,92 45 40 SELECT MOD(45,2), MOD(45,0), MOD(45,77), MOD(46,2) FROM DUAL; 1 45 45 0 Mit Datumswerten arbeiten Oracle speichert Datumswerte im folgenden Format: Jahrhundert, Jahr, Monat, Tag, Stunde, Minute, Sekunde Default-Anzeigeformat: DD-MON-RR gültige Datumswerte liegen zwischen 1.Januar 4712 v.Chr. und dem 31.Dezember 9999 SYSDATE liefert Datum und Uhrzeit Mit Datumswerten rechnen eine Zahl addieren oder subtrahieren um einen neuen Datumswert zu erhalten Zahl ↔ Anzahl an Tagen Datum +/- Zahl = Datum zwei Datumswerte subtrahieren um die Anzahl dazwischenliegender Tage zu ermitteln Datum – Datum = Anzahl Tage Stunden zu einem Datum addieren, indem die Anzahl der Stunden durch 24 dividiert wird. Datum + Zahl/24 = Datum Arithmetische Operatoren mit Datumswerten: SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS FROM employees WHERE department_id = 90; Datumsfunktionen Funktion Ergebnis MONTH_BETWEEN(d1, d2) Berechnet die Anzahl Monate zwischen zwei Datumswerten (d1 und d2) ADD_MONTH(date,n) Addiert n Kalendermonate zu einem Datum date NEXT_DAY(date, char) Sucht nach dem 1.Auftreten des durch char angegebenen Wochentags LAST_DAY(date) Letzter Tag des Monats von date ROUND(date [, format]) Datumswert runden TRUNC(date [, format]) Datumswert abschneiden Datumsfunktionen Beispiele Beispiel Ausgabe SELECT MONTHS_BETWEEN('01-SEP-95','01-JAN-94') FROM DUAL; 20 SELECT MONTHS_BETWEEN('01-JAN-94','01-SEP-95') FROM DUAL; -20 SELECT ADD_MONTHS('11-JAN-94',6) FROM DUAL; 11-JUL-94 SELECT LAST_DAY('11-FEB-94') FROM DUAL; 28-FEB-94 SELECT ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR') FROM DUAL; wenn sysdate: 25.07.07 01-AUG-07 01-JAN-08 SELECT TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR') FROM DUAL; wenn sysdate: 25.07.07 01-JUL-07 01-JAN-07 Hinweis: Das Ausgabeformat ist abhängig von den gesetzten Datenbankparametern! Datumsfunktionen Beispiele II SELECT employee_id EMP_ID, hire_date, TRUNC (MONTHS_BETWEEN (SYSDATE, hire_date),4) TENSURE, ADD_MONTHS(hire_date,6) REVIEW, NEXT_DAY(hire_date, 'FRIDAY') NEXTDAY, LAST_DAY(hire_date) LASTDAY FROM employees WHERE MONTHS_BETWEEN (SYSDATE, hire_date) < 91; EMP_ID ------167 173 HIRE_DATE ---------21.04.00 21.04.00 TENSURE --------90,402 90,402 REVIEW --------21.10.00 21.10.00 NEXTDAY --------28.04.00 28.04.00 LASTDAY --------30.04.00 30.04.00 Implizite Datentypkonvertierung bei Zuweisungen unter den folgenden Datentypen kann der Oracle-Server eine automatische Typkonvertierung vornehmen: Hinweis: Es sollte auf eine implizite Datenkonvertierung verzichtet werden, um die Zuverlässigkeit einer Anweisung zu garantieren. Von VARCHAR2 oder CHAR In NUMBER VARCHAR2 oder CHAR DATE NUMBER DATE VARCHAR2 VARCHAR2 Explizite Datentypkonvertierung SQL stellt 3 Funktionen bereit, um einen Wert von einem Datentyp in einen anderen zu konvertieren: TO_CHAR(number|date, [fmt], [nlsparams]) Konvertiert eine Zahlen- o. Datumswert in eine VARCHAR2Zeichenfolge nach der Formatmaske fmt. numerische Werte: nlsparams gibt die folgenden Zeichen an, die von Zahlenformatelementen zurückgegeben werden: Dezimalzeichen Gruppentrennzeichen lokales Währungszeichen internationales Währungszeichen Ohne nlsparams wird der Defaultwert der Session verwendet Explizite Datentypkonvertierung II TO_CHAR(number|date, [fmt], [nlsparams]) Datumswerte: nlsparams legt die Sprache fest, in der die Namen der Monate und Tage sowie deren Abkürzungen zurückgegeben werden. TO_NUMBER (char, [fmt],[nlsparams]) Konvertiert eine Zeichenfolge, die aus Ziffern besteht, in eine Zahl im Format fmt. nlsparams hat hier denselben Zweck wie in TO_CHAR TO_DATE (char, [fmt],[nlsparams]) Konvertiert eine Zeichenfolge, die ein Datum darstellt, gemäß der Angaben in fmt in einen Datumswert. Wird fmt nicht angegeben, ist das Format DD-MON-YY nlsparams hat hier denselben Zweck wie in TO_CHAR TO_CHAR mit Datumswerten TO_CHAR(date, 'formatmaske') Die Formatmaske: muss in Hochkommata gesetzt werden unterscheidet zwischen Gross- u. Kleinschreibung kann alle gültigen Elemente eines Datumsformats enthalten verfügt über ein fm-Element, um aufgefüllte Leerzeichen zu löschen oder führende Nullen zu unterdrücken wird durch ein Komma vom Datumswert getrennt Datumsformatmaske - Elemente Element Ergebnis YYYY Vollständiges Jahr als Zahl YEAR Jahr in Worten (Englisch) MM Zweistelliger Zahlenwert für den Monat MONTH Vollständiger Name des Monats MON Abkürzung aus 3 Buchstaben für den Monat DY Abkürzung aus 3 Buchstaben f.d.Wochentag DAY Vollständiger Name des Wochentages DD Tag des Monats als numerischer Wert HH/HH12/HH24 Sunde des Tages, Stunde (1-12) o. Stunde (0-23) MI Minute (0-59) SS/SSSSS Sekunde (0-59) / Sek.n. Mitternacht (0-86399) TO_CHAR mit num. Werten TO_CHAR(number, 'formatmaske') ddspth Element Beschreibung 9 Numerische Position (#9 bestimmt Anzeige) 0 Führende Nullen anzeigen $ Führendes Dollarzeichen L Führendes lokales Wähungssymbol ./, Dezimalpunkt / Komma an angegebener Position D Gibt das Dezimalzeichen a. d. angegebenen Position aus G Gibt das Gruppentrennzeichen a. d. angegebenen Position aus U Gibt das Eurozeichen mit an S Gibt das Vorzeichen mit an +/- B Zeigt den Wert Null nicht als 0 sondern als leeres Feld an Konvertierungsfunktionen Beispiele Beispiel Ausgabe SELECT TO_CHAR(SYSDATE ,'MM/YY') FROM DUAL; 11/07 SELECT TO_CHAR(SYSDATE ,'MONTH/YEAR') FROM DUAL; NOVEMBER/TWO THOUSAND SEVEN SELECT TO_CHAR(SYSDATE ,'HH:MI:SS') FROM DUAL; 02:15:33 SELECT TO_CHAR(SYSDATE ,'HH:MI:SSSSS') FROM DUAL; 02:15:51365 SELECT TO_CHAR(salary, '$99,999.00') FROM employees WHERE employee_id = 100; $24,000.00 Funktionen verschachteln Single Row-Funktionen können in einer beliebigen Zahl von Ebenen verschachtelt werden Verschachtelte Funktionen werden von innen nach außen ausgewertet F3 (F2 (F1 (col, arg1) ,arg2) ,arg3) 1. 2. 3. Funktionen verschachteln Beispiel SELECT last_name, UPPER(CONCAT(SUBSTR(last_name,1,8) ‚_US‘)) FROM employees WHERE department_id = 60; 1. 2. 3. Erg1 = SUBSTR(last_name,1,8) Erg2 = CONCAT(Erg1, ‚_US‘) Erg3 = UPPER(Erg2) SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(hire_date, 6), ‚FRIDAY‘), ‚fmDay, Month DDth, YYYY‘) „Next 6 Month Review“ FROM employees ORDER BY hire_date; Aggregatfunktionen SQL-Schulung: Kapitel 5 Syntax Aggregatfunktion SELECT * | { [DISTINCT] column|expression [alias] } * FROM table [WHERE [GROUP BY [ORDER BY condition] column] column]; werden auf Gruppen von Zeilen angewandt Zeilen werden durch die WHERE-Klausel definiert. sind in der WHERE-Klausel selbst nicht erlaubt (später) liefern ein Ergebnis pro Gruppe Nullwerte werden ignoriert Aggregatfunktionen-Richtlinien DISTINCT bewirkt, dass die Funktion keine doppelten Werte berücksichtigt ALL bewirkt, dass alle Werte, einschl. Doppelter berücksichtigt werden (Default) expr-Argument kann vom Typ CHAR, VARCHAR2, NUMBER oder DATE sein n-Argument bezieht sich auf numerische Datentypen Arten von Gruppenfunktionen und Syntax: Funktion Beschreibung AVG ( [DISTINCT | ALL] n) Durchschnittwert von n. COUNT ({*|[DISTINCT | ALL] expr}) Ermittelt die #Zeilen, für die expr ausgewertet wird MAX ([DISTINCT | ALL] expr) Höchster Wert von expr MIN ([DISTINCT | ALL] expr) Kleinster Wert von expr. STDDEV ([DISTINCT | ALL] n) Standardabweichung von n SUM ([DISTINCT | ALL] n) Summe der Werte von n VARIANCE ([DISTINCT | ALL] n) Varianz von n Aggregatfunktionen Beispiele SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employees WHERE hire_date >= '29.01.00' AND job_id LIKE '%REP%'; SELECT MIN(hire_date), MAX(hire_date) FROM employees; COUNT Funktion 3 Formate: COUNT (*) gibt die Anzahl Zeilen aus der Tabelle zurück, die die Kriterien der SELECT-Anweisung erfüllen. COUNT(expr) gibt die Anzahl der nicht leeren Werte in der durch expr angegebenen Spalte zurück COUNT(DISTINCT expr) gibt die Anzahl der eindeutigen, nicht leeren Werte in der durch expr angegebenen Spalte zurück COUNT Beispiele SELECT COUNT(*) FROM employees; → ermittelt Anzahl Angestellter SELECT COUNT(commission_pct) FROM employees; → ermittelt Anzahl Angestellter, die eine Provision bekommen SELECT COUNT(*) - COUNT(commission_pct) FROM employees; → ermittelt die Anzahl Angestellter, die keine Provision bekommen SELECT COUNT(DISTINCT department_id) FROM employees; → ermittelt die Anzahl unterschiedlicher Abteilungen, die Angestellte haben Aggregatfunktionen u. Nullwerte Nullwerte werden ignoriert WHERE Klauseln können dies nicht verhindern: SELECT COUNT(commission_pct) FROM employees WHERE commission_pct is null; → 0 Zeilen NVL zwingt Aggregatfunktionen Nullwerte einzubeziehen SELECT COUNT(NVL(commission_pct,0)) FROM employees WHERE commission_pct is null; → 72 Zeilen Exkurs: NVL konvertiert einen Nullwert in einen konkreten Wert. Definiert ist NVL für DATE, CHAR, VARCHAR2 und NUMBER Datengruppen SQL-Schulung: Kapitel 6 Syntax GROUP-BY Klausel SELECT * | { [DISTINCT] column|expression [alias] } * FROM [WHERE [GROUP BY [ORDER BY table condition] group_by_expression] column] Tabellenzeilen können in kleine Gruppen aufgeteilt werden group_by_condition gibt die Spalten an, deren Werte die Basis für die Gruppierung der Zeilen darstellen. Die group_by_condition Spalte muss nicht Bestandteil der SELECT-Klausel sein. In Verbindung mit Aggregatfunktionen, müssen alle Spalten in der SELECT-Klausel, die nicht in Aggregatfunktionen enthalten sind, in der GROUP BY-Klausel angegeben werden GROUP BY-Klausel Beispiele SELECT department_id, AVG(salary) FROM employees; → Fehler SELECT department_id, AVG(salary) FROM employees GROUP BY department_id; → Ermittelt Durchschnittsgehalt pro Department DEPARTMENT_ID ---------------------10 20 30 … AVG(SALARY) ---------------------4400 9500 4150 Gruppen in Gruppen GROUP BY-Klausel mit mehreren Spaltenangaben Reihenfolge in der GROUP BY-Klausel definiert Haupt- u. Untergruppen SELECT department_id, job_id, AVG(salary) FROM employees GROUP BY department_id, job_id ORDER BY department_id, job_id; DEPARTMENT_ID ---------------------10 20 20 30 30 JOB_ID ---------AD_ASST MK_MAN MK_REP PU_CLERK PU_MAN AVG(SALARY) -----------------4400 13000 6000 2780 11000 Syntax HAVING-Klausel SELECT * | { [DISTINCT] column|expression [alias] } * FROM [WHERE [GROUP BY [HAVING [ORDER BY table condition] group_by_expression] group_by_condition] column] Gruppenergebnisse einschränken auf Basis der Aggregatfunktion Aggregatfunktionen sind in der WHERE-Klausel nicht erlaubt → HAVING-Klausel legt fest, welche Gruppen angezeigt werden sollen HAVING auch ohne GROUP BY möglich HAVING-Klausel Beispiel SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary) > 10000; Abarbeitungsreihenfolge: 1. Zeilen werden gruppiert 2. die Aggregatfunktion wird auf die Gruppe angewandt 3. die Gruppe, die die Kriterien in der HAVING-Klausel erfüllt, werden angezeigt HAVING-Klausel Beispiele II SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING MAX(salary) > 10000; SELECT job_id, SUM(salary) PAYROLL FROM employees WHERE job_id NOT LIKE '%REP%' GROUP BY job_id HAVING SUM(salary) > 13000 ORDER BY SUM(salary) SELECT MAX(AVG(salary)) "Max. Durchschnittsgehalt" FROM employees GROUP BY department_id → Hinweis: Gruppenfunktionen können in bis zu 2 Ebenen verschachtelt werden Joins (Daten aus mehreren Tabellen anzeigen) SQL-Schulung: Kapitel 7 Arten von Joins nach SQL:1999-Standard Zu den SQL:1999.Standard konformen Joins zählen: Cross Joins Natural Joins USING-Klausel Full (zweiseitige) Outer Joins Beliebige Join-Bedingungen für Outer Joins Syntax SQL:1999-Standard SELECT table1.column, table2.column FROM table1 [NATURAL JOIN table2] | [JOIN table2 USING (column_name)] | [JOIN table2 ON (table1.column_name = table2.column_name)] | [LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)] | [CROSS JOIN table2]; NATURAL JOIN basiert auf allen Spalten, die in beiden Tabellen denselben Namen haben ausgewählt werden die Zeilen, die in allen übereinstimmenden Spalten die gleichen Werte haben gleichnamige Spalten mit unterschiedlichen Datentypen lösen Fehler aus Spalten, die in beiden Tabellen denselben Namen haben, müssen ohne Kennzeichner auskommen NATURAL JOIN Beispiel desc locations; Name -----------------------------LOCATION_ID STREET_ADDRESS POSTAL_CODE CITY STATE_PROVINCE COUNTRY_ID desc departments; Name -----------------------------DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID Null Type -------- ------------------------------NOT NULL NUMBER(4) VARCHAR2(40) VARCHAR2(12) NOT NULL VARCHAR2(30) VARCHAR2(25) CHAR(2) Null -------NOT NULL NOT NULL Type ------------------------------NUMBER(4) VARCHAR2(30) NUMBER(6) NUMBER(4) NATURAL JOIN Beispiel Forts. SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations DEPARTMENT_ID --------------60 50 10 20 30 90 DEPARTMENT_NAME ------------------------IT Shipping Administration Marketing Purchasing Executive LOCATION_ID --------------1400 1500 1700 1800 1700 1700 CITY ---------------------Southlake South San Francisco Seattle Toronto Seattle Seattle … SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations WHERE department_id IN (20,50) DEPARTMENT_ID ----------------20 50 DEPARTMENT_NAME --------------------Marketing Shipping LOCATION_ID ----------------1800 1500 CITY ---------------------Toronto South San Francisco JOINS mit der USING-Klausel wenn mehrere Spalten denselben Namen, aber unterschiedliche Datentypen haben, können Sie die NATURAL JOIN-Klausel mit der USING-Klausel ändern und die Spalten angeben, die für einen Equi Join verwendet werden mit der USING-Klausel können Sie angeben, dass nur eine Spalte verwendet werden soll, wenn mehrere übereinstimmende Spalten existieren NATURAL JOIN- und USING-Klauseln schliessen sich gegenseitig aus für die in der USING-Klausel referenzierten Spalten dürfen in der gesamten SQL-Anweisung keine Kennzeichner verwendet werden USING-Klausel Beispiel SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE location_id = 1400; CITY DEPARTMENT_NAME ------------------------------ -----------------------------Southlake IT SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1400 ORA-25154: column part of USING clause cannot have qualifier Mehrdeutige Spaltennamen mit Tabellenpräfixen können die Spaltennamen, die in mehreren Tabellen vorkommen, eindeutig gekennzeichnet werden Tabellenpräfixe verbessern die Performance mit Spalten-Aliasnamen können die Spalten unterschieden werden, die identische Namen in unterschiedlichen Tabellen aufweisen Tabellen-Aliasnamen verwenden mit Aliasnamen können Abfragen vereinfacht werden die Lesbarkeit von Abfragen wird erhöht die Performance wird gesteigert max. 30 Zeichen gilt nur für die aktuelle SELECT-Anweisung SELECT e.employee_id, e.last_name, d.location_id, department_id FROM employees e JOIN departments d USING (department_id); ON-Klausel die Join-Bedingung für Natural Joins ist im Prinzip ein Equi-Join aller Spalten mit gleichen Namen. mit der ON-Klausel können beliebige Bedingungen oder die zu verknüpfenden Spalten angegeben werden die Spalten müssen nicht den gleichen Namen haben die Join-Bedingung wird von anderen Suchkriterien getrennt die ON-Klausel macht den Code lesbarer ON-Klausel Beispiel SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id ); EMPLOYEE_ID -----------200 201 202 114 119 115 116 … LAST_NAME ----------Whalen Hartstein Fay Raphaely Colmenares Khoo Baida DEPARTMENT_ID --------------10 20 20 30 30 30 30 DEPARTMENT_ID ----------------10 20 20 30 30 30 30 LOCATION_ID -----------1700 1800 1800 1700 1700 1700 1700 ON-Klausel (Self Join) eine Tabelle wird mit sich selbst verknüpft es müssen unterschiedliche Aliasnamen verwendet werden sinnvoll, wenn Werte einer Spalte mit anderen Werten derselben Spalte verglichen werden (z.B. hierarchisch strukturierte Daten) Beispiel: SELECT e.last_name emp, m.last_name mgr FROM employees e JOIN employees m ON (e.manager_id = m.employee_id ); EMP ------------------------Fay Gietz Zlotkey Cambrault … MGR ------------------------Hartstein Higgins King King Zusätzliche Bedingungen die Join-Bedingung kann mit beliebigen Bedingungen kombiniert werden. SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id ) AND e.manager_id=149; ist equivalent zu SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id ) WHERE e.manager_id=149; 3-Way Joins mit der ON-Klausel Verbindung von 3 Tabellen Ausführungsrichtung nach SQL:1999 von links nach rechts SELECT employee_id, city, department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id ) JOIN locations l ON (d.location_id = l.location_id); 1. ausführbarer Join: emloyees JOIN departments referenzierbar sind Spalten dieser Tabellen 2. ausführbarer Join: departments JOIN locations Non Equi Join nicht auf den = -Operator bezogen Beispiel: SELECT e.last_name, e.salary, j.grade_level FROM employees e JOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal; Outer Join verwenden, wenn Datensätze ohne direkte Übereinstimmung existieren Zeile wird angezeigt, trotzdem Join-Bedingung nicht erfüllt ist es werden alle Zeilen zurückgegeben, die die JoinBedingung erfüllen + einige oder alle Zeilen aus einer Tabelle, für die keine Zeilen in der anderen Tabelle die Join-Beziehung erfüllen Arten: LEFT OUTER RIGHT OUTER FULL OUTER OUTER Join Arten LEFT OUTER: ruft alle Zeile aus der linken Tabelle ab, auch wenn in der rechten Tabelle keine Übereinstimmungen existieren RIGHT OUTER: ruft alle Zeilen aus der rechten Tabelle ab, auch wenn in der linken Tabelle keine Übereinstimmungen existieren FULL OUTER: Zeigt alle Zeilen an, die Übereinstimmungen aufweisen, zzgl. Zeilen aus beiden Tabellen, die keine Übereinstimmungen aufweisen LEFT OUTER JOIN Beispiel SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id; LAST_NAME ----------------Grant Higgins Gietz Sciarra DEPARTMENT_ID DEPARTMENT_NAME ------------------ -----------------110 110 100 Accounting Accounting Finance Faviet 100 Finance → es werden alle Angestellten mit Ihrer Department-Zuordnung angezeigt, auch wenn es keine Zuordnung gibt RIGHT OUTER JOIN Beispiel SELECT e.last_name, d.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id; LAST_NAME DEPARTMENT_ID --------------- ---------------120 270 130 … 260 Zlotkey 80 Whalen 10 Weiss 50 DEPARTMENT_NAME -------------------Treasury Payroll Corporate Tax Recruiting Sales Administration Shipping → es werden alle Departments mit Ihrer Department-Zuordnung angezeigt, auch wenn ihnen keine Angestellten zugeordnet sind FULL OUTER JOIN Beispiel SELECT e.last_name, d.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON e.department_id = d.department_id; LAST_NAME DEPARTMENT_ID DEPARTMENT_NAME ------------- ------------- -----------------------------120 Treasury 270 Payroll 130 Corporate Tax Vishney 80 Sales Vargas 50 Shipping Grant 50 Shipping Grant → es werden alle Departments und alle Angestellten anzeigt, mit und ohne jeweiliger Zuordung Kartesische Produkte Definition: Alle Zeilen aus der 1.Tabelle werden mit allen Zeilen aus der 2.Tabelle verknüpft Anzahl generierter Zeilen = Anzahl Zeilen d. 1. Tabelle * Anzahl Zeilen d. 2.Tabelle ein kartesisches Produkt wird gebildet, wenn: eine Join-Bedingung fehlt eine Join-Bedingung ungültig ist alle Zeilen aus der ersten Tabelle mit allen Zeilen aus der zweiten Tabelle verknüpft werden → gültige Join Bedingungen sind wichtig! CROSS JOIN-Klausel erstellt Kreuzprodukt aus zwei Tabellen ein Kreuzprodukt entspricht dem kartesischen Produkt Beispiel: SELECT e.department_name, d.department_name FROM departments e CROSS JOIN departments d; Unterabfragen SQL-Schulung: Kapitel 8 Zweck von Unterabfragen eine Unterabfrage ist eine SELECT- Anweisung, die in eine Klausel einer anderen SELECT-Anweisung eingebettet ist z.B. WHERE-Klausel HAVING-Klausel nützlich, wenn Zeilen aus einer Tabelle mit einer Bedingung ausgewählt werden, die von den Daten in einer Tabelle selbst abhängt Unterabfragen Syntax SELECT FROM WHERE select_list table expr operator (SELECT select_list FROM table); die Unterabfrage (innere Abfrage) wird einmal vor der Hauptabfrage (äussere Abfrage) ausgeführt. das Ergebnis der Unterabfrage wird von der Hauptabfrage verwendet operator eine Vergleichsbedingung Single Row- u. Multiple Row-Operatoren Unterabfrage Beispiel SELECT last_name, salary FROM employees 11000 WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel'); LAST_NAME ------------------------King Kochhar De Haan Greenberg Russell Partners Errazuriz Ozer SALARY ---------------------24000 17000 17000 12000 14000 13500 12000 11500 Unterabfragen Richtlinien Unterabfragen werden in Klammern () eingeschlossen bessere Lesbarkeit durch: Unterabfragen werden auf der rechten Seite der Vergleichsbedingung angegeben Verwendung von Single Row- und Multiple RowOperatoren führen zu 2 Arten von Unterabfragen: Single Row-Unterabfrage Multiple Row-Unterabfrage Haupt- und Unterabfrage können sich auf unterschiedliche Tabellen beziehen Arten von Unterabfragen Single Row-Unterabfrage Abfrage, deren innere SELECT-Anweisung nur eine Zeile zurückgibt Multiple Row-Unterabfrage Abfrage, deren innere SELECT-Anweisung mehrere Zeilen zurückgibt Multiple Column-Unterabfragen Abfrage, deren innere SELECT-Anweisung mehrere Spalten zurückgibt (später) Singe Row-Unterabfrage geben nur eine Zeile zurück verwenden Single Row-Operatoren =, >, >=, <, <=, <> Beispiel: SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141); LAST_NAME ------------------------Nayer Mikkilineni Landry Markle Bissot JOB_ID ---------ST_CLERK ST_CLERK ST_CLERK ST_CLERK ST_CLERK … Single Row-Unterabfrage Beispiel SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143); Aggregatfunktionen in Unterabfragen mit einer Aggregatfunktion kann eine Unterabfrage auf eine Zeile reduziert werden Beispiel: SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees ); LAST_NAME JOB_ID SALARY ------------------------- ---------- ---------------------Olson ST_CLERK 2100 Unterabfragen in HAVING-Klausel das Managementsystem führt Unterabfragen zuerst aus Unterabfragen-Ergebnis wird an die HAVING Klausel der Hauptabfrage weitergeleitet Beispiel: SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50); Wieviele Zeilen werden zurückgegeben? SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE last_name = ‘Haas‘ ); no rows selected Hinweis: Es gibt keinen Angestellten mit dem Namen Haas, so liefert die Unterabfrage keine Zeilen zurück. Ergebnis der Unterabfrage ist null. Ein Vergleich mit null liefert immer null, auch wenn es eine Jobkennung null geben würde. Wo liegt der Fehler? SELECT FROM WHERE employee_id, last_name employees salary = ( SELECT MIN(salary) FROM employees GROUP BY department_id); ERROR at line 4: ORA-01427: single-row subquery returns more than one row Die Unterabfrage liefert mehrere Zeilen zurück, daher muss auch ein Multiple Row Operator für die Verarbeitung der Unterabfrage eingesetzt werden! Multiple Row-Unterabfrage geben mehrere Zeilen zurück verwenden Multiple Row-Vergleichsoperatoren IN, ANY, ALL SELECT FROM WHERE employee_id, last_name employees salary IN ( SELECT MIN(salary) FROM employees GROUP BY department_id); Das Suchkriterium der Hauptabfrage sieht dann wie folgt aus: SELECT employee_id, last_name FROM employees WHERE salary IN (2500, 4200, 4400, 6000, 7000, 8300, 8600, 17000); ANY-Operator SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG'; Bedeutung und Anwendung von ANY: < ANY weniger als das Maximum > ANY mehr als das Minimum = ANY hat dieselbe Bedeutung wie IN ALL-Operator SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG'; Bedeutung und Anwendung von ALL: < ALL weniger als das Minimum > ALL mehr als das Maximum Mengenoperatoren SQL-Schulung: Kapitel 9 Mengenoperatoren kombinieren die Ergebnisse von zwei oder mehr Komponentenabfragen zu einem Ergebnis werden auch zusammengesetzte Abfragen genannt haben die gleiche Priorität Auswertung von links nach rechts, bzw. open nach unten Operator Rückgabe UNION Alle eindeutigen Zeilen, die von einer der Abfragen ausgewählt werden UNION ALL Alle Zeilen, die von einer der Abfragen ausgewählt werden, einschliesslich doppelter Zeilen INTERSECT Alle eindeutigen Zeilen, die von beiden Abfragen ausgewählt werden MINUS Alle eindeutigen Zeilen, die von der ersten, nicht jedoch von der zweiten Anweisung ausgewählt werden UNION Operator gibt Ergebnisse aus beiden Abfragen zurück doppelte Ergebnisse werden ausgeblendet Anzahl und Datentyp der gewählten Spalten müssen in allen von der Abfrage verwendeten SELECTAnweisungen identisch sein UNION gilt für alle ausgewählten Spalten die Spaltennamen müssen nicht identisch sein der IN-Operator hat eine höhere Priorität als der UNION-Operator Standard: Ausgabe in aufsteigender Reihenfolge sortiert, basierend auf der ersten Spalte UNION-Operator Beispiel SELECT employee_id, job_id FROM employees UNION SELECT employee_id, job_id FROM job_history; doppelte Datensätze werden ausgeblendet Datensätze gelten als gleich, wenn sie in allen Projektionsspalten gleich sind UNION ALL-Operator im Gegensatz zu UNION werden doppelte Zeilen nicht ausgeblendet die Ausgabe wird nicht standardmässig sortiert DISTINCT kann nicht verwendet werden INTERSECT-Operator gibt alle die Zeilen zurück, die in allen Abfragen vorkommen Anzahl und Datentyp der von den SELECTAnweisungen der Abfragen gewählten Spalten müssen in allen von der Abfrage verwendeten SELECT-Anweisungen identisch sein Spaltennamen müssen nicht identisch sein eine Änderung der Reihenfolge der Abfragen, welche die Schnittmenge bilden, wirkt sich nicht auf das Ergebnis aus INTERSECT ignoriert NULL-Werte nicht INTERSECT-Operator Beispiel SELECT employee_id, job_id FROM employees INTERSECT SELECT employee_id, job_id FROM job_history; liefert die Angestellten, die einmal die Job- Position gewechselt haben und wieder in die alte Position zurückgekehrt sind MINUS-Operator gibt die Zeilen aus der ersten Abfrage zurück, die in der zweiten Abfrage nicht vorkommen Anzahl und Datentyp der von den SELECTAnweisungen der Abfragen gewählten Spalten müssen in allen von der Abfrage verwendeten SELECT-Anweisungen identisch sein Spaltennamen müssen nicht identisch sein alle Spalten in der WHERE-Klausel müssen in der SELECT-Klausel enthalten sein, damit der Operator MINUS ordnungsgemäss funktioniert MINUS-Operator Beispiel SELECT employee_id, job_id FROM employees MINUS SELECT employee_id, job_id FROM job_history; liefert die Angestellten, die noch nie den Job gewechselt haben Mengenoperatoren Richtlinien die Ausdrücke in den SELECT-Listen müssen in Anzahl und Datentyp übereinstimmen durch Klammern kann die Ausführungsreihenfolge geändert werden die ORDER BY-Klausel darf nur ganz am Ende der Anweisung stehen akzeptiert den Spaltennamen, Aliasnamen aus der ersten SELECT-Anweisung oder die positionale Notation Mengenoperatoren können in Unterabfragen verwendet werden Ausdrücke in den SELECT-Listen SELECT employee_id, department_id FROM employees WHERE (employee_id, department_id) IN (SELECT employee_id, department_id FROM employees UNION SELECT employee_id, department_id FROM job_history); Dummy Spalten um SELECT-Listen anzugleichen SELECT department_id, TO_NUMBER(null) location, hire_date FROM employees UNION SELECT department_id, location_id, TO_DATE(null) FROM departments; DML (Data Manipulation Language) SQL-Schulung: Kapitel 10 Datenmanipulationssprache (DML) eine DML-Anweisung wird ausgeführt, wenn in einer Tabelle eine neue Zeile hinzugefügt wird → INSERT in einer Tabelle eine vorhandene Zeile geändert wird → UPDATE in einer Tabelle eine vorhandene Zeile gelöscht wird → DELETE eine Transaktion besteht aus einer Zusammenstellung von DML-Anweisungen, die eine logische Arbeitseinheit bilden eine Transaktion kann bestätigt werden → COMMIT eine Transaktion kann rückgängig gemacht werden → ROLLBACK INSERT-Anweisung Syntax INSERT INTO table [(column [, column….])] VALUES (value [, value…]); mit dieser VALUE-Klausel-Syntax wird genau eine Zeile eingefügt table column value steht für den Namen der Tabelle ist der Name der Tabellenspalte ist der entsprechende Wert der Spalte INSERT-Anweisung die Spaltenangaben können weggelassen werden, wenn für alle Spalten Werte in Default-Reihenfolge angegeben werden Implizite Methode: weglassen der Spalte aus der Spaltenliste: INSERT INTO departments (department_id, department_name) VALUES (30, 'Purchasing'); Explizite Methode: Für alle Spalten werden Werte angegeben: INSERT INTO departments VALUES (30, 'Purchasing',NULL,NULL); INSERT Anweisung Forts. Datumswerte und Zeichenketten werden in einfachen Anführungszeichen angegeben mit DESC tabellenname kann die DefaultReihenfolge ermittelt werden DBMS prüft Datentypen, Datenbereiche und Datenintegritätsbedingungen (Constraints) NOT NULL Constraint UNIQUE Constraint FOREIGN KEY Constraint CHECK Constraint Spezielle Werte SYSDATE ist eine Funktion, die das aktuelle Datum und Uhrzeit zurückliefert INSERT INTO employees VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567', SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100); TO_DATE für nicht Default-Formate INSERT INTO employees VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567', TO_DATE('FEB 3, 1999', 'MON DD, YYYY'), 'AC_ACCOUNT', 6900, NULL, 205, 100); Default-Format: DD-MON-YY YY entspricht dem aktuellem Jahrhundert, DefaultUhrzeit ist 00:00:00 Zeilen aus anderen Tabellen kopieren INSERT in Verbindung mit einer Unterabfrage INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct FROM employees WHERE job_id LIKE '%REP%'; keine VALUES-Klausel die Anzahl der Spalten in der INSERT-Klausel muss mit der Spaltenanzahl in der Unterabfrage übereinstimmen INSERT über Unterabfrage Syntax INSERT INTO table [(column [, column….])] subquery; Anzahl der Datentypen der Spalten in der Spaltenliste der INSERT-Klausel müssen mit der Anzahl und den Datentypen der Werte in der Unterabfrage übereinstimmen. Für eine Kopie aller Zeilen einer Tabelle: INSERT INTO copy_emp SELECT * FROM employees; Achtung: copy_emp muss natürlich existieren! UPDATE-Anweisung Syntax UPDATE table SET column = value [, column = value, …] [WHERE condition]; table column value condition steht für den Namen der Tabelle ist die Tabellenspalte, deren Wert geändert werden soll ist der entsprechende Wert identifiziert die zu aktualisierenden Zeilen und besteht aus Spaltennamen, Ausdrücken, Konstanten, Unterabfragen und Vergleichsoperatoren UPDATE-Anweisung Beispiele UPDATE employees SET department_id = 70 WHERE employee_id = 113; Updates mit Hilfe von Unterabfragen: UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205), salary = (SELECT salary FROM employees WHERE employee_id = 205) WHERE employee_id = 114; Hinweis: Die Unterabfragen brauchen sich nicht auf die gleiche Tabelle beziehen DELETE-Anweisung Syntax DELETE [FROM] table [WHERE condition]; table condition ist der Name der Tabelle identifiziert die zu löschenden Zeilen und besteht aus Spaltennamen, Ausdrücken, Konstanten, Unterabfragen und Vergleichsoperatoren DELETE-Anweisung Beispiele DELETE FROM departments WHERE department_name = 'FINANCE'; → Löscht das Department Finance DELETE FROM copy_emp; → Löscht alle Datensätze der Tabelle copy_emp DELETE FROM departments WHERE department_id IN (30,40); → Löscht die Departments mit der ID 30 und 40 DELETE-Anweisung Beispiele II DELETE FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name LIKE '%Public%'); → Löscht alle Angestellten aller Abteilungen, welche im Namen Public verwenden. TRUNCATE-Anweisung Entfernt alle Zeilen aus einer Tabelle, so dass die Tabelle anschliessend leer und die Tabellenstruktur weiter intakt ist ist eine Anweisung der Datendefinitionssprache (DDL), keine DML-Anweisung, und kann nicht ohne Weiteres rückgängig gemacht werden Syntax TRUNCATE TABLE table_name; Beispiel: TRUNCATE TABLE copy_emp; TRUNCATE effiziente Methode um Tabellen zu leeren schneller als DELETE, weil: es eine DDL-Anweisung ist, ohne ROLLBACK-Informationen existierende DELETE-Trigger werden umgangen unterliegt dennoch CONSTRAINTS Datenbanktransaktionen Können bestehen aus: DML-Anweisungen, die eine konsistente Änderung der Daten bewirken einer DDL-Anweisung einer Anweisung der Datenkontrollsprache (DCL) Datenbanktransaktionen II eine Transaktion beginnt, wenn die erste DML-SQL-Anweisung ausgeführt wird eine Transaktion endet bei einem der folgenden Ereignisse: eine COMMIT- oder ROLLBACK-Anweisung wird abgesetzt eine DDL- oder DCL-Anweisung wird ausgeführt ein Benutzer beendet die Session das System stürzt ab Nach der Beendigung einer Transaktion startet die nächste ausführbare SQL-Anweisung automatisch die nächste Transaktion DDL- und DCL-Anweisungen werden autom. festgeschrieben, die Transaktion wird implizit beendet. COMMIT- und ROLLBACK Anweisungen stellen die Datenkonsistenz sicher erstellen eine Sicht auf die Datenänderung bevor sie dauerhaft gespeichert wird → Kontrolle über die dauerhafte Speicherung gruppieren logisch zusammenhängende Operationen explizite Steueranweisungen für Transaktionen Transaktionen steuern Anweisung Beschreibung COMMIT Beendet die aktuelle Transaktion, indem alle noch nicht gespeicherten Datenänderungen dauerhaft festgeschrieben werden SAVEPOINT name Markiert einen Savepoint innerhalb einer Transaktion ROLLBACK Beendet die aktuelle Transaktion, indem alle noch nicht gespeicherten Datenänderungen verworfen werden Rollt die akt. Transaktion zum angegebenen Savepoint ROLLBACK TO SAVEPOINT name zurück, wodurch alle Änderungen und/oder Savepoints verworfen werden, die nach dem Savepoint erstellt wurden, zu dem das Rollback erfolgt. Wird die TO SAVEPOINT-Klausel weggelassen, so wird die gesammte Transaktion zurückgesetzt. Änderungen zurückrollen UPDATE …. SAVEPOINT update_done; Savepoint created. INSERT… ROLLBACK TO update_done; Rollback complete. → das Insert wird rückgängig gemacht Implizite Transaktionsverarbeitung Commit wird automatisch gesetzt bei: DDL-Anweisungen DCL-Anweisungen autom. Rollback bei Systemausfall Vorsicht bei bzw. mit AUTOCOMMIT Zustand der Daten (vor Commit u. Rollback) jede Datenänderung ist im Verlauf einer Transaktion vorübergehend, bis die Transaktion festgeschrieben wird DML-Operationen finden zunächst im Datenbank-Buffer statt der aktuelle Benutzer kann die Ergebnisse von DML- Operationen durch Abfragen der entsprechenden Tabellen prüfen andere Benutzer können die Ergebnisse der DML-Operation des akt. Benutzers nicht sehen DML-Operationen sperren die entsprechenden Zeilen, damit die Daten nicht von mehreren Seiten gleichzeitig geändert werden Zustand der Daten (nach Commit) Datenänderungen werden dauerhaft in der Datenbank festgeschrieben der vorherige Zustand kann nicht wiederhergestellt werden (Ausnahme, durch das DBMS-Recovery) alle Benutzer können sich die Ergebnisse anzeigen Sperren der betroffenen Zeilen werden freigegeben. Diese Zeilen können von den Benutzern wieder bearbeitet werden alle Savepoints werden gelöscht Daten festschreiben DELETE FROM employees WHERE employee_id = 99999; 1 row deleted. INSERT INTO departments VALUES (290, ' Corporate Tax ', NULL, 1700); 1 row created. COMMIT; Commit complete. Zustand der Daten (nach Rollback) Datenänderungen werden rückgängig gemacht der vorherige Zustand der Daten wird wieder- hergestellt Sperren der betroffenen Zeilen werden freigegeben. alle Savepoints werden gelöscht Daten festschreiben DELETE FROM employees; 107 rows deleted. ROLLBACK; Rollback complete. DELETE FROM employees WHERE employee_id = 164; 1 row deleted. SELECT * FROM employees WHERE employee_id = 164; no rows selected. SELECT * FROM employees; 106 rows selected. COMMIT; Commit complete. DDL-Anweisungen !!! DELETE FROM employees; 107 rows deleted. COMMIT; CREATE TABLE xyz; COMMIT; SELECT * FROM emloyees; no rows selected. ROLLBACK; SELECT * FROM employees; no rows selected. implizites Commit vor und nach jeder DDL-Anweisung!!! Lesekonsistenz die Lesekonsistenz stellt jederzeit eine konsistente Ansicht der Daten sicher. Lesevorgängen werden keine Daten angezeigt, die gerade geändert werden. die Änderungen eines Benutzers verursachen keine Konflikte mit den Änderungen eines anderen Benutzers Schreibvorgänge können sicher sein, dass Änderungen an der Datenbank konsistent erfolgen. die Lesekonsistenz stellt für dieselben Daten folgendes sicher: Lesevorgänge müssen keine Schreibvorgänge abwarten Schreibvorgänge müssen keine Lesevorgänge abwarten die Lesekonsistenz stellt sicher, dass jedem Benutzer die Daten mit dem Status zum Zeitpunkt des letzten Commits angezeigt werden Lesekonsistenz technisch sie wird automatisch implementiert es wird eine Teilkopie der Datenbank in Undo-Segmenten aufbewahrt, sobald eine DML-Operation ausgeführt wird Daten aus den Undo-Segmenten: Snapshot Undo-Segmente werden nach dem Commit/Rollback wieder freigegeben im Rollback-Fall werden die Daten aus den Undo-Segmenten wieder in die Tabellen geschrieben DDL (Data Definition Language) SQL-Schulung: Kapitel 11 Datendefinitionssprache (DDL) CREATE datenbankobjekt Erzeugt ein neues Datenbankobjekt ALTER datenbankobjekt Nimmt Änderungen an der Definition des Datenbankobjekts vor DROP datenbankopjekt Löscht ein Datenbankobjekt Hinweis: Es sind unterschiedliche Privilegien notwendig, um die Methoden der DDL zu verwenden. Datenbankobjekte Tabellen Views Sequences Pseudospalten Indizes Synonyme DDL- Tabellen SQL-Schulung: Kapitel 12 Benennungsregeln Tabellen und Spaltennamen: müssen mit einem Buchstaben beginnen dürfen 1-30 Zeichen lang sein dürfen nur die folgenden Zeichen enthalten: A-Z, a-z, 0-9, _,$,# dürfen nicht mit dem Namen eines anderen Objekts desselben Benutzers übereinstimmen dürfen nicht mit einem reservierten Wort übereinstimmen (abhängig vom jeweiligen DBMS) Ansonsten: es sollten aussagekräftige Namen gewählt werden Gross- und Kleinschreibung spielt keine Rolle CREATE TABLE-Anweisung Syntax CREATE TABLE [schema].table (column datatype [DEFAULT expr] [,…]); CREATE TABLE Privileg Speicherbereich schema table column datatype DEFAULT expr Eigentümer Tabellenname Spaltenname Datentyp u. Länge der Spalte definiert default, falls der Spalte kein Wert zugewiesen wird Tabellen anderer Benutzer referenzieren Tabellen anderer Benutzer befinden sich in einem anderen Schema. Schema muss als Präfix vor den Tabellennamen gesetzt werden User muss berechtigt sein, die Tabellen lesen zu dürfen SELECT * FROM userA.employees; SELECT * FROM userB.employees; OPTION DEFAULT Für Einfügeoperationen kann ein Default-Wert definiert werden … hire_date DATE DEFAULT SYSDATE zulässige Werte sind Literalwerte, Ausdrücke und SQLFunktionen Unzulässige Werte sind Spaltennamen und Pseudospalten der Default-Datentyp muss dem Spaltendatentyp entsprechen CREATE TABLE hire_dates (id NUMBER(8), hire_date DATE DEFAULT SYSDATE); Table created. DESCRIBE dept Datentypen Datentyp Beschreibung VARCHAR2(n) Zeichendaten variabler Länge mit (1 < n > 4000 Bytes) CHAR(n) Zeichdaten fester Länge mit (1 < n > 2000 Bytes) NUMBER(n,p) Numerische Daten variabler Länge. n ist Gesamtstellenzahl und p ist Anzahl Nachkommastellen DATE Datums- u. Uhrzeit-Wert LONG Zeichendaten variabler Länge (→ 2 GB) CLOB Zeichendaten (→ 4 GB) RAW (n) und LONG RAW Binärdaten des Typs RAW (1 < n > 2000 Bytes) LONG RAW (→ 2 GB) BLOB Binärdaten (→ 4GB) BFILE In einer externen Datei gespeicherte Binärdaten (→ 4 GB) ROWID Ein Base-64-Code, der die eindeutige Adresse einer Zeile in einer Tabelle bestimmt Datetime-Datentypen Datentyp Beschreibung TIMESTAMP Datum mit Nachkommastellen f. Sekunden INTERVAL YEAR TO MONTH Wird als Intervall von Jahren und Monaten gespeichert INTERVAL DAY TO SECOND Wird als Intervall von Tagen, Stunden, Minuten und Sekunden gespeichert TIMESTAMP ist eine Erweiterung von DATE setzt sich zusammen aus Jahr, Monat, Tag sowie Stunden, Minuten, Sekunden und 1/1000 stel Sekunde Angabge von Zeitzonen moeglich) Constraints erzwingen Regeln auf Tabellenebene verhindern das Löschen einer Tabelle, wenn Abhängigkeiten vorhanden sind Constraint-Typen: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK Constraints und ihre Bedeutung Constraint Beschreibung NOT NULL Gibt an, dass die Spalte keinen Nullwert enthalten darf UNIQUE Gibt eine Spalte oder Spaltenkombination an, deren Werte in allen Zeilen der Tabelle eindeutig sein muss PRIMARY KEY Identifiziert jede Zeile einer Tabelle eindeutig FOREIGN KEY Richtet eine Fremdschlüsselbeziehung zwischen der Spalte und einer Spalte in der referenzierten Tabelle ein und setzt diese durch CHECK Legt eine Bedingung fest, die erfüllt sein muss Constraints Richtlinien nicht benannte Constraints bekommen einen generierten Namen (bei Oracle SYS_Cn) können mit der Tabelle zusammen erstellt oder im nachhinein definiert werden definiert auf Spalten- oder Tabellenebene Constraints, die mehrere Spalten betreffen muessen auf Tabellenebene definiert werden im Data Dictionary gespeichert Constraints definieren Syntax CREATE TABLE [schema.]table (column datatype [DEFAULT expr] [column_constraint], … [table_constraint][,…]); auf Spaltenebene column [CONSTRAINT constraint_name] constraint_type auf Tabellenebene column,… [CONSTRAINT constraint_name] constraint_type (column, …) Constraints definieren Beispiel Constraint auf Spaltenebene: CREATE TABLE employees ( employee_id NUMBER(6) CONSTRAINT emp_emp_id_pk PRIMARY KEY, first_name VARCHAR2(20),… ) Constraint auf Tabelleneben: CREATE TABLE employees ( employee_id NUMBER(6), first_name VARCHAR2(20),.. job_id VARCHAR2(10) NOT NULL, CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID)); ) NOT NULL Constraint stellt sicher, dass für die Spalte keine Nullwerte akzeptiert werden Spalten ohne NOT NULL Constraint dürfen standardmässig Nullwerte enthalten ausgenommen Primary Key-Spalten NOT NULL Constraints werden auf Spaltenebene definiert UNIQUE-Constraint definiert, dass ein Wert für eine Spalte o. Spaltenkombination nur einmal in der Tabelle für die Spalte vorkommt UNIQUE-Schlüssel definiert auf Tabellen- o. Spaltenebene Erlauben Nullwerte, diese dürfen dann auch mehrfach vorkommen, da sie keinem anderen Wert entsprechen Hinweis: Ein Nullwert in einer Spalte erfüllt stets ein UNIQUE-Constraint PRIMARY KEY-Constraint erstellt Primärschlüssel für die Tabelle es kann nur einen pro Tabelle geben ist eine Spalte oder Spaltengrupe, die jede Zeile einer Tabelle eindeutig identifiziert setzt Eindeutigkeit der Spalte oder Spaltenkombination durch und stellt sicher, dass keine Spalte, die zu einem Primärschlüssel gehört, einen Nullwert enthält Implizit wird auf die Spalte o. Spaltenkombination ein eindeutiger Index gesetzt. FOREIGN KEY-Constraint FOREIGN KEY (o. referenzielle Integritäts-) Constraints bestimmen eine Spalte oder Spaltenkombination als Fremdschlüssel richten eine Beziehung zwischen einem Primär- oder UNIQUE-Schlüssel in derselben oder einer anderen Tabelle ein ein Fremdschlüsselwert muss einem vorhandenen Wert in der übergeordneten Tabelle entsprechen oder NULL sein basieren auf Datenwerten und sind rein logische (nicht physische) Zeiger definiert auf Spalten- o. Tabellen-Ebene FOREIGN KEY-Constraint II ein zusammengesetzter Fremdschlüssel muss mit Hilfe der Definition auf Tabellenebene erstellt werden. ein Einspaltiger-Fremdschlüssel kann auf Spaltenebene definiert werden. CREATE TABLE employees (… department_id NUMBER(4) CONSTRAINT emp_depid_fk REFERENCES departments (department_id)); oder CREATE TABLE employees (… department_id NUMBER(4), CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments (department_id), … ); FOREIGN KEY-Constraint Schlüsselwörter FOREING KEY definiert die Spalte der referenzierten Tabelle (untergeordnete Tabelle) auf Tabellen Constraint-Ebene REFERENCES identifiziert die Tabelle und Spalte in der übergeordneten Tabelle ON DELETE CASCADE löscht die abhängigen Zeilen aus der untergeordneten Tabelle, wenn eine Zeile in der übergeordneten Tabelle gelöscht wird ON DELETE SET NULL konvertiert abhängige Fremdschlüsselwerte in Nullwerte Hinweis, Richtung: Der Fremdschlüssel wird in der untergeordneten Tabelle definiert. Die Tabelle mit der referenzierten Spalte ist die übergeordnete Tabelle Ohne die Option ON DELETE CASCADE oder ON DELETE SET NULL kann die Zeile in der übergeordneten Tabelle nicht gelöscht werden, wenn diese in der untergeordneten Tabelle referenziert wird. CHECK Constraint definiert eine Bedinung, die jede Zeile erfüllen muss nicht zulässig sind: Referenzen auf die Pseudospalten CURRVAL, NEXTVAL, LEVEL und ROWNUM Aufrufe der Funktionen SYSDATE, UID, USER und USERENV Abfragen, die andere Werte in andere Zeilen referenzieren …, salary NUMBER(2) CONSTRAINT emp_salary_min CHECK (salary > 0),… CREATE TABLE Beispiel CREATE TABLE employee (employee_id NUMBER(6) CONSTRAINT ep_employee_id PRIMARY KEY, first_name VARCHAR2(20), last_name VARCHAR2(25) CONSTRAINT ep_last_name_nn NOT NULL, email VARCHAR2(25) CONSTRAINT ep_email_nn NOT NULL, CONSTRAINT ep_email_uk UNIQUE, phone_number VARCHAR2(20), hire_date DATE CONSTRAINT job_id VARCHAR2(10) CONSTRAINT salary NUMBER(8,2) CONSTRAINT commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) CONSTRAINT departments (department_id) ); ep_hire_date_nn NOT NULL, ep_job_nn NOT NULL, ep_sal_ch CHECK (salary > 0), ep_dept_fk REFERENCES Constraints verletzen UPDATE employees SET department_id = 55 WHERE department_id = 110; Hinweis: department 55 existiert nicht! UPDATE employees * ERROR at line 1: ORA-02291: integrity constraint (HR.EP_DEPT_FK) violated – parent key not found Constraints verletzen II DELETE FROM departments WHERE department_id = 60; Hinweis: In der Abteilung 60 arbeiten Angestellte (employees) DELETE FROM departments * ERROR at line 1: ORA-02292: integrity constraint (HR.ep_dept_fk) violated – child record found CREATE TABLE incl. Subquery Tabellen können auch anhand einer Unterabfrage erstellt werden Syntax CREATE TABLE table [(column, column…)] AS subquery die Anzahl der Spalten in der neuen Tabelle muss mit der Projektionsklausel der Unteranweisung übereinstimmen definieren von Spalten mit Spaltennamen und Default-Werten CREATE TABLE incl. Subquery Richtlinien die Tabelle wird mit den angegebenen Spaltennamen erstellt die von der SELECT-Anweisung abgerufenen Zeilen werden in die neue Tabelle eingefügt die Spaltendefinition darf nur den Spaltennamen und DefaultWert enthalten sind Spaltenspezifikationen angegeben, so muss die Anzahl der Spalten der Anzahl der Spalten in der SELECT-Liste der Unterabfrage entsprechen sind keine Spaltenspezifikationen angegeben, so entsprechen die Spaltennamen der Tabelle den Spaltennamen der Unterabfrage im Gegensatz zu den Datentypendefinitionen der Spalten werden die Integritätsregeln nicht an die neue Tabelle übergeben CREATE TABLE incl. Subquery Beispiel CREATE TABLE dept80 AS SELECT employee_id, last_name, salary * 12 ANNSAL, hire_date FROM employees WHERE department_id = 80; Table created. DESCRIBE dept80 Name ------------------EMPLOYEE_ID LAST_NAME ANNSAL HIRE_DATE Null --------NOT NULL NOT NULL NOT NULL Type -------------------------NUMBER(6) VARCHAR2(25) NUMBER DATE ALTER TABLE SQL-Schulung: Kapitel ALTER TABLE-Anweisung neue Spalten zu einer Tabelle hinzufügen vorhandene Spalten einer Tabelle ändern Spalten aus einer Tabelle entfernen neue Constraints für eine Tabelle definieren Default-Werte für Spalten setzen o. löschen Tabellen löschen alle Daten und die Struktur der Tabelle werden gelöscht alle noch nicht gespeicherten Transaktionen werden festgeschrieben (committed) alle Indizes werden gelöscht alle Constraints werden gelöscht Views und Synonyme bleiben erhalten, sind jedoch ungültig kein ROLLBACK ! nur der Ersteller der Tabelle oder ein Benutzer mit dem Privileg DROP ANY TABLE kann die Tabelle entfernen ! Views SQL-Schulung: Kapitel 13 VIEW eine View ist eine logische Tabelle, die auf einer Tabelle oder einer anderen View basiert eine View enthält selber keine Daten! Grundlegende Tabellen: Basistabellen wird im Data Dictionary als SELECT-Anweisung gespeichert Datenzugriff beschränken verschiedene Ansichten derselben Daten vereinfachen von komplexen Abfragen Datenunabhängigkeit Einfache und komplexe Views einfache View: leitet Daten aus nur einer Tabelle ab enthält keine Funktionen oder Datengruppen kann DML-Operationen über die View ausführen komplexe View: leitet Daten aus mehreren Tabellen ab enhält Funktionen oder Datengrupen lässt nicht immer DML-Operationen über die View zu CREATE VIEW-Anweisung Syntax: CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias]…)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY [CONSTRAINT constraint]] Schlüsselwort Bedeutung OR REPLACE erstellt die View, auch wenn sie schon vorhanden ist FORCE Erstellt die View, auch wenn Basistabellen nicht existieren NOFORCE Erstellt die View nur, wenn die Basistabellen existieren view / constraint Name der View bzw. Name des jeweiligen Contraints Alias Gibt Namen für die Ausdrücke an, die von der Abfrage der View ausgewählt werden subquery Eine vollständige Select-Anweisung WITH CHECK OPTION es werden nur Zeilen eingefügt /aktualisiert, für welche die View berechtigt ist WITH READ ONLY es können keine DML-Operationen an dieser View ausgeführt werden Views erstellen Richtlinien die Unterabfrage, die eine View definiert, kann komplexe SELECT-Syntax, einschliesslich Joins, Gruppen und Unterabfragen, enthalten werden keine Constraint-Namen vergeben, so generiert das DBMS einen Namen Oracle: SYS_Cn die Option OR REPLACE kann verwendet werden, um die Definition einer View zu verändern, ohne sie zuvor zu löschen und neu zu erstellen oder die zuvor erteilten Objektprivilegien neu zu erteilen. CREATE VIEW Beispiele CREATE VIEW empvu80 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 80; View created. CREATE VIEW salvu50 AS SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY FROM employees WHERE department_id = 50; View created. Views auslesen Daten aus Views werden genauso ausgelesen wie aus einer Tabelle in der FROM-Klausel wird der Viewname angegeben können mit Tabellen verjoint werden können in beliebig komplexen SELECT-Anweisungen eingebunden sein Beispiele: SELECT * FROM salvu50; SELECT last_name FROM empvu50 WHERE salary > 6000; komplexe View Beispiel CREATE VIEW dept_num_vu (name, minsal, maxsal, avgsal) AS SELECT d.department_name, MIN(e.salary), MAX(e.salary), AVG(e.salary) FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY d.department_name; DML-Operationen an Views ausführen DML-Operationen können i.d. Regel an allen einfachen Views ausgeführt werden es können keine Zeilen entfernt werden, wenn die View eines der folgenden Elemente enthält: Aggregatfunktionen GROUP BY-Klausel Schlüsselwort DISTINCT Pseudospalten-Schlüsselwort ROWNUM DML-Operationen an Views ausführen DML-Operationen können i.d. Regel an allen einfachen Views ausgeführt werden es können keine Zeilen geändert werden, wenn die View eines der folgenden Elemente enthält: Aggregatfunktionen GROUP BY-Klausel Schlüsselwort DISTINCT Pseudospalten-Schlüsselwort ROWNUM Spalten, die durch Ausdrücke definiert sind DML-Operationen an Views ausführen DML-Operationen können i.d. Regel an allen einfachen Views ausgeführt werden es können keine Zeilen hinzugefügt werden, wenn die View eines der folgenden Elemente enthält: Aggregatfunktionen GROUP BY-Klausel Schlüsselwort DISTINCT Pseudospalten-Schlüsselwort ROWNUM Spalten, die durch Ausdrücke definiert sind NOT NULL-Spalten in den Basistabellen, die nicht für die View selektiert wurden WITH CHECK OPTION mit der Klausel wird sichergestellt, dass an einer View ausgeführte DML-Operationen innerhalb der Domäne der View bleiben Beispiel: CREATE OR REPLACE VIEW empvu20 AS SELECT FROM employees WHERE department_id 20 WITH CHECK OPTION CONSTRAINT empvu20_ck; Der Versuch, die Abteilungsnummer für eine Zeile in der View zu ändern, scheitert, da er gegen das WITH CHECK OPTIONConstraint verstösst. DML-Operationen verweigern durch WITH READ ONLY werden alle DML- Operationen verhindert Jeder Versuch, eine DML-Operation an der View abzusetzen führt zu einer Fehlermeldung CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT employee_id, last_name, job_id FROM employees WHERE department_id = 10 WITH READ ONLY; Views entfernen DROP VIEW view; Name der View DROP VIEW empvu80; View dropped. eine View wird ohne Datenverluste entfernt nur der Ersteller oder ein Benutzer mit dem Privileg DROP ANY VIEW kann eine View löschen Sequences SQL-Schulung: Kapitel 14 Sequences eine Sequence ist ein Datenbankobjekt, das Ganzzahlwerte erstellt kann automatisch eindeutige Nummern generieren ist ein gemeinsam verwendbares Objekt kann verwendet werden um einen Primärschlüssel zu erstellen ersetzt Anwendungs-Code beschleunigt den Zugriff auf Sequence-Werte wenn sie im Cache gespeichert sind eine Sequence ist nicht an eine Tabelle gebunden! CREATE SEQUENCE- Anweisung CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}] CREATE SEQUENCE SYNTAX Schlüsselwort Bedeutung sequence Steht für den Namen des Sequence-Generators INCREMENT BY n Gibt das Intervall zwischen Sequencenummern an, fehlt die Klausel wird 1 als Intervall verwendet START WITH n Gibt die erste zu generierende Sequence-Nummer an. Fehlt die Klausel wird mit 1 begonnen. MAXVALUE n Gibt den höchsten Wert an, den die Sequence generieren kann NOMAXVALUE Legt einen Höchstwert von 1027 für die aufsteigende Sequence und -1 für die absteigende Sequence fest MINVALUE n Gibt den kleinsten Wert der Sequence an NOMINVALUE Legt einen kleinsten Wert von 1 für eine aufsteigende Sequence und -1026 für die absteigene Sequence fest SEQUENCES Beispiel für eine Primärschlüssel Sequence CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE; Sequence created. Pseudospalten NEXTVAL und CURRVAL NEXTVAL gibt den nächsten verfügbaren Sequence-Wert zurück. Bei jeder Referenzierung wird ein eindeutiger Wert zurückgegeben, selbst bei verschiedenen Benutzern CURRVAL ruft den aktuellen Sequence-Wert ab NEXTVAL muss für die Sequence ausgegeben werden, bevor CURRVAL einen Wert enthält können verwendet werden in: SELECT-Liste einer SELECT-Anweisung, die nicht Bestandteil einer Unterabfrage ist SELECT-Liste einer Unterabfrage in einer INSERT-Anweisung VALUES-Klausel einer INSERT-Anweisung SET-Klausel einer UPDATE-Anweisung können nicht verwendet werden in: SELECT-Liste einer View SELECT-Anweisung mit dem Schlüsselwort DISTINCT SELECT-Anweisung mit den Klausel GROUP BY, HAVING oder ORDER BY Unterabfrage in einer SELECT-, DELETE- oder UPDATE-Anweisung DEFAULT Ausdruck in einer CREATE TABLE- oder ALTER TABLE-Anweisung Sequence verwenden SELECT dept_deptid_seq.CURRVAL FROM dual; SELECT dept_deptid_seq.NEXTVAL FROM dual; Sequence-Werte im Cache das Caching von Sequence-Werten ermöglicht einen schnelleren Zugriff auf die Werte Lücken zwischen den Sequence-Werten können in folgenden Fällen auftreten Bei einem ROLLBACK Bei einem Systemausfall wenn eine Sequence von mehreren Tabellen verwendet wird SEQUENCES ändern ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}]; Sequences ändern Richtlinien nur der Eigentümer oder ein Benutzer mit dem ALTER-Privileg darf Änderungen vornehmen die Änderung wirkt sich nur auf zukünftige Sequence-Nummern aus die Sequence muss gelöscht und neu erstellt werden, wenn der Startwert o. aktuelle Wert neu gesetzt werden soll bestimmte Validierungsmassnahmen werden durchgeführt, so kann kein kleiner Max.Value gesetzt werden. das Entfernen einer Sequence erfolgt mit der DROPAnweisung: DROP SEQUENCE sequence; Sequence dropped. Indizes SQL-Schulung: Kapitel 15 Indizes ein Index ist ein Schemaobjekt wird vom Server verwendet, um den Abruf von Zeilen mit Hilfe eines Zeigers zu beschleunigen kann I/O-Vorgänge mit Hilfe einer beschleunigten Pfadzugriffsmethode reduzieren, die Daten schneller zu finden ist unabhängig von der indizierten Tabelle aber…wird eine Tabelle gelöscht, so werden auch die zugehörigen Indizes gelöscht wird automatisch verwendet und verwaltet Ohne Indizes → Full Table scan Indexerstellung - Verfahren automatisch: ein eindeutiger Index wird automatisch erstellt, wenn ein PRIMARY KEY- oder UNIQUE-Constraint in einer Tabellendefinition verwendet wird manuell: vom Benutzer explizit angelegte nicht-eindeutige Indizes, welche den Zeilenzugriff beschleunigen z.B. bei Foreign Key Beziehungen. Hinweis: ein eindeutiger Index kann auch manuell erstellt werden, es ist jedoch nicht ratsam, da hierfür ein UNIQUE-Constraint verwendet werden muss, welches dann implizit einen eindeutigen Index erstellt. Indizes erstellen CREATE INDEX index ON table (column [, column]…); index table column Name des Index Name der Tabelle Tabellenspalte, die indiziert werden soll Beispiel für einen Index auf last_name: CREATE INDEX emp_last_name_idx ON employees(last_name); Index created. Index erstellen - Richtlinien Ein Index sollte in folgenden Fällen erstellt werden, wenn: eine Spalte viele verschiedene Werte hat eine Spalte viele Nullwerte enthält eine oder mehrere Spalten häufig gemeinsam in einer WHERE-Klausel oder Join-Bedingung verwendet werden Es sollte kein Index erstellt werden, wenn: die Spalten nur selten als Bedingung in Abfragen verwendet werden die Tabelle nur klein ist und die meisten Abfragen wahrscheinlich mehr als 2 bis 4 Prozent der Zeilen in der Tabelle abrufen die Tabelle häufig aktualisiert wird die indizierten Spalten als Bestandteil eines Ausdrucks referenziert werden Index erstellen – Richtlinien II Achtung: es sollten nicht zuviele Indizes für eine Tabelle angelegt werden bei jeder DML-Operation, müssen die Indizes aktualisiert werden je mehr Indizes mit einer Tabelle verknüpft sind, desto grösser ist der Aufwand für den DB-Server bei der Aktualisierung aller Indizes Indizes entfernen DROP INDEX index; entfernt einen Index aus dem Data Dictionary dies hat keine Auswirkungen auf die sonstige Tabellenstruktur oder die Daten Indizes können nicht geändert sondern nur gelöscht und neu angelegt werden man muss Eigentümer sein, oder das Privileg DROP ANY INDEX besitzen, um einen Index zu löschen Wird eine Tabelle gelöscht, so werden auch die zugehörigen Indizes gelöscht Synonyme SQL-Schulung: Kapitel 16 Synonyme sind Alias-Namen um Datenbankobjekten einen alternativen Namen zu geben vereinfacht Zugriff einfache Referenzen auf Tabellen anderer Benutzer kürzen von langen Objektnamen CREATE [PUBLIC] SYNONYM synonym FOR object; PUBLIC erstellt ein Synonym, das allen Benutzern zugänglich ist synonym steht für den Namen des zu erstellenden Synonyms object bezeichnet das Objekt, für welches das Synonym erstellt wird Das Objekt darf nicht in einem Package enthalten sein der Name eines privaten (private) Synonyms muss sich von allen anderen Objekten des Benutzers unterscheiden Synonyme erstellen u. entfernen CREATE SYNONYM d_sum FOR dept_sum_vu; Synonym created. DROP SYNONYM d_sum; Synonym dropped. CREATE PUBLIC SYNONYM dept FOR alice.departments; Synonym created. DROP PUBLIC SYNONYM dept; Synonym dropped. Data Dictionary SQL-Schulung: Kapitel 17 Data Dictionary speichert Informationen zur Datenbank ist genau wie andere Datenbankdaten in Tabellen und Views strukturiert ist schreibgeschützt Zugriff mit SQL Views Definitionen aller Schemaobjekte in der Datenbank Default-Werte für Spalten Integritäts-Constraint-Informationen Namen von Oracle-Benutzern Privilegien und Rollen der einzelnen Benutzer andere allgemeine Datenbankinformationen Data Dictionary-Struktur View-Präfix Zweck USER_ View des Benutzers (Inhalt des Schemas, Elemente, Eigentümer) ALL_ Erweiterte View des Benutzers (Objekte, auf die der Benutzer zugreifen kann) DBA_ View des Datenbankadministrators V$ Performance-bezogene Daten USER_OBJECTS z.B.: OBJECT_NAME, OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS, GENERATED ALL_OBJECTS USER-Views View Bedeutung USER_OBJECTS Alle Schemabezogenen Objekte USER_TABLES Tabelleninformationen USER_TAB_COLUMNS Spalteninformationen USER_CONSTRAINTS Constraintinformationen USER_CONS_COLUMNS Spalten-Constraintzuordnung USER_VIEWS View-Informationen incl. SelectStatement USER_SEQUENCES Sequence-Information USER_SYNONYMS Synonym-Information COMMENT-Anweisung Kommentare setzen in Tabellen, Spalten, Views → 2000 Byte max. Kommentare anzeigen lassen: ALL_COL_COMMENTS USER_COL_COMMENTS ALL_TAB_COMMENTS USER_TAB_COMMENTS Kommentare hinzufügen COMMENT ON [TABLE table | COLUMN table.column ] IS 'text';