Seminar Einführung in SQL mit Oracle von Prof. Dr. Rainer Schwenkert Hochschule München c Vervielfältigung nur mit Zustimmung des Autors
Themenbereiche SQL-Historie Wichtige DDL- und DML-Anweisungen Der Select-Befehl Spezialthemen R. Schwenkert - HM Januar 2010 Seite 1
Die standardisierte Sprache SQL Was ist SQL? SQL ist eine Abkürzung für Structured Query Language. SQL ist eine Norm-Datenbanksprache (ANSI und ISO) zur Definition, Kontrolle, Abfrage und Manipulation von Daten in (objekt)relationalen Datenbanksystemen. Durch seine Rolle als Quasi-Standard ist SQL sehr stark verbreitet, da eine gewisse Unabhängigkeit vom benutzten Datenbankmanagementsystem erzielt werden kann. SQL wurde Mitte der 70er Jahre im Rahmen des Projekts System R (erste lauffähige relationale Datenbank) von IBM unter der Abkürzung SEQUEL (Structured English Query Language) entwickelt. R. Schwenkert - HM Januar 2010 Seite 2
Die standardisierte Sprache SQL Historische Entwicklung des Standards 1987: SQL0 ist erster Standard überhaupt, ohne Konzepte zur Integritätssicherung; 1989: SQL1 mit Integritätserweiterungen, jedoch viele Schwächen bei praxisrelevanten Aufgabenstellungen; 1992: SQL2 bzw. SQL-92 genannt, deutliche Verbesserung von SQL1; 1999: SQL3 bzw. SQL-99 Erweiterung von SQL2 um prozedurale Elemente und objektorientierte Ansätze; 2003: SQL4 bzw. SQL:2003: Integration von XML in SQL; R. Schwenkert - HM Januar 2010 Seite 3
Die standardisierte Sprache SQL Der SQL3-Standard Typischer heutiger Dialekt in Produkten: SQL3 + proprietäre Ergänzungen Der SQL3-Standard trat am 15. November 1999 in Kraft. SQL3 definiert einen Sprachkern, das sog. Core-SQL als minimalen Sprachumfang. Diesen Kern muss jede standardkonforme Implementierung von SQL3 umfassen. Wir werden in diesem Seminar wesentliche Aspekte von Core-SQL kennen lernen, darüber hinaus einige wichtige Oracle-Besonderheiten. R. Schwenkert - HM Januar 2010 Seite 4
Die standardisierte Sprache SQL Unterschied von SQL zu Programmiersprachen SQL ist im Gegensatz zu gängigen Programmiersprachen mengenorientiert: das Ergebnis einer Abfrage ist stets eine Menge von Tupeln (diese kann auch leer sein oder aus nur einem Element bestehen), also wieder eine Tabelle; deskriptiv: der Anwender formuliert lediglich die gewünschten Eigenschaften der Datensätze (logische Beschreibung) und erhält eine Antwort ohne Kenntnis der inneren Struktur der Datenbank. R. Schwenkert - HM Januar 2010 Seite 5
Die standardisierte Sprache SQL Nachteile von SQL Verschiedene DBS-Hersteller verwenden verschiedene Standards und zusätzlich eigene Erweiterungen. Integritätsprüfungen sind in den meisten SQL-Implementierungen nicht in ausreichendem Umfang realisiert. SQL ist redundant, d.h. ein und dieselbe Abfrage lässt sich oft auf mehrere Weisen formulieren, ohne dass der Anwender weiß, welche Art die schnellere, effektivere ist. SQL läßt das Auftreten von sog. uneigentlichen Relationen (Multisets), d.h. Tabellen mit mehrfachen Tupeln (Duplikaten) zu. Dadurch wird die Effizienz der Abfrageoptimierung gemindert. R. Schwenkert - HM Januar 2010 Seite 6
Die standardisierte Sprache SQL Vereinbarungen zur Syntax-Beschreibung Zunächst wird immer die allgemeine Form der Kommandos vorgestellt. Dann bauen wir eine Beispieldatenbank auf. Dabei werden die Befehle strukturiert und übersichtlich angegeben, obwohl SQL formatfrei ist und nicht zwischen Großund Kleinschreibung unterscheidet. Bei der Syntaxdefinition werden wir Schlüsselworte groß schreiben, benutzerspezifische Angaben hingegen klein. Optionale Teilausdrücke sind in eckige Klammern ([...]) gesetzt, diese Klammern sind kein Bestandteil der SQL-Syntax. Der senkrechte Strich wird zur Trennung von Alternativen verwendet. R. Schwenkert - HM Januar 2010 Seite 7
Die DDL - Data Definition Language Die DDL - Aufbau einer Datenbank Wir wollen hier die DDL-Befehlsklasse von SQL, zu der die Befehle CREATE/DROP TABLE: Erzeugen/Löschen von Tabellen ALTER TABLE: Änderung des Tabellenaufbaus CREATE/DROP INDEX: Index für Tabellen anlegen/löschen CREATE/DROP VIEW: Erzeugen/Löschen einer virtuellen Tabelle (Sicht) gehören, vorstellen. R. Schwenkert - HM Januar 2010 Seite 8
Die DDL - Data Definition Language Die Beispieldatenbank ABT ABTNR AN AS AW NAME Ausland Nord Ausland Süd Ausland West ABTL ABTNR PNR AN 111 AS 222 AW 333 PERS PNR NAME VORNAME ABTNR GEHALT 100 Stocker Manfred AN 3 500 Müller Andreas AW 4 111 Meier Stefan AN 5 102 Huber Herbert AS 7 222 Stoer Michael AS 3 333 Wenzel Ludger AW 6 112 Jäger Heinz AN 5 444 Müller Stefan AW 6 R. Schwenkert - HM Januar 2010 Seite 9
Die DDL - Data Definition Language Die Beispieldatenbank PKFZZ PNR KFZNR FAEHIGKEIT 100 1 gut 100 2 mittel 100 3 mittel 500 1 schlecht 111 2 mittel 111 3 gut 102 1 schlecht 222 1 gut 333 2 gut 112 3 schlecht KFZ KFZNR NAME 1 LKW 2 Kran 3 Bagger R. Schwenkert - HM Januar 2010 Seite 10
Die DDL - Data Definition Language Definition von Tabellen Für jede in die Datenbank aufzunehmende Tabelle muss nun eine Tabelle erzeugt werden: CREATE TABLE Tabellenname (Spaltenname_1 Datentyp_1, Spaltenname_2 Datentyp_2,... Spaltenname_n Datentyp_n); R. Schwenkert - HM Januar 2010 Seite 11
Die DDL - Data Definition Language Definition von Tabellen Datentypen Die wichtigsten standardisierten SQL-Datentypen sind: ANSI-Datentyp Erläuterung Oracle-Datentyp SMALLINT INT,INTEGER DEC[IMAL](m,n) NUMERIC(m,n) ganze Zahl mit Vorzeichen (klein) ganze Zahl mit Vorzeichen Dezimalzahl mit mindestens m Stellen, davon n Nachkommastellen Dezimalzahl mit exakt m Stellen, davon n Nachkommastellen NUMBER(38) NUMBER(n,m) NUMBER(n,m) CHAR[ACTER](n) Zeichenkette (String) mit fester Länge n CHAR(n) CHAR[ACTER] VARYING(n) Zeichenkette (String) mit variabler Länge bis n VARCHAR2(n) DATE Datum (JJJJ-MM-TT) DATE R. Schwenkert - HM Januar 2010 Seite 12
Die DDL - Data Definition Language Definition der Beispieldatenbank CREATE TABLE Abt CREATE TABLE Abtl (Abtnr CHAR(2), (Abtnr CHAR(2), Name VARCHAR2(14)); Pnr NUMBER(4)); CREATE TABLE Pers CREATE TABLE Pkfzz (Pnr NUMBER(4), (Pnr NUMBER(4), Name CHAR(14), Kfznr NUMBER(2), Vorname CHAR(10), Faehigkeit CHAR(8)); Abtnr CHAR(2)); CREATE TABLE (Kfznr Name Kfz NUMBER(2), VARCHAR2(6)); R. Schwenkert - HM Januar 2010 Seite 13
Die DDL - Data Definition Language Modifikation von Tabellen ALTER TABLE Tabellenname ADD DROP (Spaltenname_1 Spaltenname_2... Spaltenname_n Datentyp_1, Datentyp_2, Datentyp_n); Unsere Verbesserung lautet nun: ALTER TABLE ADD (Gehalt Pers NUMBER(1)); Steht im ALTER-Befehl anstelle der ADD- eine DROP-Klausel, so werden die dort spezifizierten Spalten gelöscht. R. Schwenkert - HM Januar 2010 Seite 14
Die DDL - Data Definition Language Modifikation von Tabellen ALTER TABLE Tabellenname MODIFY (Spaltenname_1 Datentyp_1,... Spaltenname_n Datentyp_n); Datentypänderungen (z.b. NUMBER zu CHAR(n)) sind nur erlaubt falls die betreffende Spalte leer ist. Änderung der Länge von VARCHAR2-Spalten ist jederzeit möglich. ALTER TABLE MODIFY (Name Kfz VARCHAR2(8)); R. Schwenkert - HM Januar 2010 Seite 15
Die DDL - Data Definition Language Definition eines Index Ein Index ist eine physikalische Zugriffsstruktur. Er erleichtert den Zugriff auf Zeilen über Bedingungen, welche die indexierten Attribute betreffen. CREATE [UNIQUE] INDEX Indexname ON Tabellenname (Spaltenname_1 [ASC DESC],... Spaltenname_n [ASC DESC]); Das Befehlswort UNIQUE erstellt einen eindeutigen Index. Eindeutigkeit wird stets vom System geprüft (eventl. werden Einfüge- bzw. Änderungsvorgänge nicht ausgeführt. ASC bzw. DESC legen die Sortierreihenfolge (auf- bzw. absteigend) fest, keine Angabe entspricht der Standardvorgabe ASC. R. Schwenkert - HM Januar 2010 Seite 16
Die DDL - Data Definition Language Definition eines Index Wir indexieren nun die Personaltabelle mit einem Index Persnr (aufsteigend sortiert): CREATE UNIQUE INDEX ON Pers (Pnr ASC); Persnr Da die Pflege eines Index aufwendig ist (Updates der Basisrelation, Speicherbedarf), sollte man den Index löschen, sobald er nicht mehr benötigt wird: DROP INDEX Persnr; R. Schwenkert - HM Januar 2010 Seite 17
Die DML - Data Manipulation Language Die DML - Datenbankabfragen und -manipulationen Zur DML-Befehlsklasse von SQL gehören die folgenden Befehle: SELECT: Tabellen abfragen DELETE: Datensätze (Zeilen) einer Tabelle löschen INSERT: Datensätze (Zeilen) in eine Tabelle einfügen UPDATE: Daten (Zeilen, Spaltenwerte) in einer Tabelle verändern Beim Abfragen von Tabellen werden natürlich keine Daten manipuliert. Dennoch zählt der SELECT-Befehl zur DML. R. Schwenkert - HM Januar 2010 Seite 18
Die DML - Data Manipulation Language Der INSERT-Befehl Eingabe von Tabellenzeilen INSERT INTO Tabellenname [(Spaltenname_1, Spaltenname_2,..., Spaltenname_n)] VALUES (Wert_1, Wert_2,..., Wert_n); Wird die bei der Tabellendefinition angegebene Spaltenreihenfolge eingehalten, so kann die Aufzählung der Spaltennamen entfallen. Die Reihenfolge der Eingabewerte muss der vereinbarten Spaltenreihenfolge entsprechen. Alphanumerische Daten müssen in einfache Hochkommata (... ) eingeschlossen werden. R. Schwenkert - HM Januar 2010 Seite 19
Die DML - Data Manipulation Language Eingabe von Tabellenzeilen Füllen der Beispiel-DB INSERT INTO Pers (Pnr, Vorname, Name, Gehalt, Abtnr) VALUES (100, Manfred, Stocker, 3, AN ); Bei Einhaltung der Spaltenreihenfolge aus dem CREATE TABLE-Befehl (GE- HALT nach ABTNR) genügt auch: INSERT INTO Pers VALUES (500, Müller, Andreas, AW, 4); R. Schwenkert - HM Januar 2010 Seite 20
Die DML - Data Manipulation Language Der INSERT-Befehl Zweite Form Sind die in die Tabelle zu übernehmenden Daten bereits in anderen Tabellen vorhanden, dann kann auch mit dem SELECT-Befehl gearbeitet werden: INSERT INTO Tabellenname [(Spaltenname_1, Spaltenname_2,..., Spaltenname_n)] SELECT-Befehl; Beispiele folgen später. Oracle sieht weitere Möglichkeiten zum Datenimport (SQLLoader, CSV-Import) aus externen Dateien vor. R. Schwenkert - HM Januar 2010 Seite 21
Die DML - Data Manipulation Language Datenbankabfragen Der SELECT-Befehl Prinzipielle Funktionsweise des SELECT-Befehls: Was? SELECT <Attributliste> Resultatsattribute Woher? FROM <Tabellenliste> angefragte Tabellen Wann? WHERE <Bedingung(en)> Bedingung(en) an die Resultatstupel R. Schwenkert - HM Januar 2010 Seite 22
Die DML - Data Manipulation Language Datenbankabfragen Der SELECT-Befehl Eine vereinfachte Syntax des SELECT-Befehls lautet: SELECT [ALL DISTINCT] Spaltenliste FROM Tabellenname_1, Tabellenname_2,..., Tabellenname_n WHERE Bedingung Subquery GROUP BY Spaltenliste HAVING Bedingung Subquery ORDER BY Spaltenliste [ASC DESC]; Die einzelnen Teile des SELECT-Befehls nennt man Klauseln. R. Schwenkert - HM Januar 2010 Seite 23
Die DML - Data Manipulation Language Formale Regeln für die Reihenfolge der Klauseln Die SELECT-Klausel muss am Anfang stehen, danach kommt die FROM- Klausel. Alle Klauseln bis auf die SELECT- und FROM-Klausel können weggelassen werden. Die WHERE-Klausel hat stets nach der FROM-Klausel zu erscheinen. Die HAVING-Klausel darf nur in Verbindung mit einer vorangestellten GROUP BY-Klausel eingesetzt werden. Die ORDER BY-Klausel muss am Ende stehen. R. Schwenkert - HM Januar 2010 Seite 24
Die DML - Data Manipulation Language Der SELECT-Befehl Einfache Beispiele Den gesamten Inhalt einer Tabelle (z.b. der Tabelle PKFZZ) kann man sich mittels in der SELECT-Klausel anzeigen lassen. Möchte man nur bestimmte Spalten der Tabelle sehen, so gibt man deren Namen an: SELECT * FROM Pkfzz; SELECT Pnr, Kfznr FROM Pkfzz; Jede Tabelle hat eine Pseudospalte, die intern vom System vergeben wird. Damit ist jede Tabellenzeile eindeutig identifizierbar. Die Spalte sieht man nur durch explizite Angabe des Spaltennamens ROWID. SELECT ROWID, Pnr, Kfznr FROM Pkfzz; R. Schwenkert - HM Januar 2010 Seite 25
Die DML - Data Manipulation Language Die WHERE-Klausel an Beispielen Wer arbeitet in der Abteilung AN? SELECT Name, Vorname FROM Pers WHERE Abtnr= AN ; Suche die Vornamen aller Mitarbeiter, die in AN oder AW arbeiten und nicht Stocker heißen. SELECT Vorname FROM Pers WHERE (Abtnr= AN OR Abtnr= AW ) AND NOT Name= Stocker ; R. Schwenkert - HM Januar 2010 Seite 26