Einführung in SQL Die Sprache SQL (Structured Query Language) ist eine Programmiersprache für relationale Datenbanksysteme, die auf dem ANSI-SQL-Standard beruht. SQL wird heute von fast jedem Datenbanksystem unterstützt. Damit hat der Programmierer die Möglichkeit, Anwendungen zu entwickeln, die mit verschiedenen Datenbanksystemen lauffähig sind, ohne dass Änderungen des Quellcodes notewendig sind. Sprachumfang: DDL (Data Definition Language) DQL (Data Query Language) Erstellen von Datenbanken, Tabellen und Indizes Abfragen von Daten DML (Data Manipulation Language) Anlegen, Ändern und Löschen von Datensätzen DCL (Data Controlling Language) Anlegen von Benutzern und Vergabe von Zugriffsrechten Seite 1 von 12 2012 Die Abfragesprache DQL Die DQL besteht nur aus einer einzigen Anweisung, der SELECT-Anweisung. Diese besitzt jedoch sehr viele Erweiterungen, so dass sich verschiedenste Abfrageresultate ergeben können. einfache Form: SELECT <Feldliste> FROM <Tabelle> Beispiele: SELECT * from Kunde selektiert alle Felder der Tabelle Kunde SELECT Nummer,Name from Kunde selektiert nur die Felder Nummer und Name aus der Tabelle Kunde Erweiterung mit WHERE SELECT <Feldliste> FROM <Tabelle> WHERE <Bedingung> [AND | OR] <Bedingung> Vergleichsoperatoren: = >= <= < > <> gleich größer gleich kleiner gleich kleiner größer ungleich logische Operatoren: AND OR NOT logisches UND logisches ODER Negation Seite 2 von 12 2012 SELECT * from Kunde where Ort = 'Frankfurt' Alle Kunden die in Frankfurt wohnen SELECT Nummer, Name, Vorname from Kunde where Name = 'Meier' Alle Personen mit dem Namen Meier SELECT * from Kunde where Name = 'Meier' AND Ort = 'München' Alle Kunden mit dem Namen Meier die in München wohnen Der Operator LIKE Über Wildcards können unscharfe Selektionskriterien erstellt werden. SELECT <Feldliste> FROM <Tabelle> WHERE <Feldname> LIKE <muster> SELECT <Feldliste> FROM <Tabelle> WHERE <Feldname> LIKE <muster> Muster: % oder * _ oder ? steht für beliebigen Rest für ein Zeichen Beispiele: SELECT * from Kunde WHERE Name LIKE 'S%' Suche alle Kunden, deren Name mit S beginnt SELECT * from Kunde WHERE Name LIKE '__y%' Suche alle Kunden, deren Name an der dritten Stelle ein y aufweist. SELECT * from abteilung where stadt like '%E%' Suche alle Abteilungen in denen sich im Ortsnamen ein E befindet. Seite 3 von 12 2012 Die Operatoren IN und BETWEEN Mit dem IN-Operator können mehrere Konstanten angegeben werden, auf die dann die Suche beschränkt wird. SELECT <Feldliste> FROM <Tabelle> WHERE <Feldname> IN(<konst1>,<konst2>,...) SELECT <Feldliste> FROM <Tabelle> WHERE <Feldname> BETWEEN <wert1> AND <wert2> Beispiele: SELECT * from Kunde where id IN(5,17,40) SELECT * from project where mittel between 95000 and 120000 Der NULL-Operator SELECT * FROM <tabelle> WHERE <Feldname> IS [NOT] NULL Beispiele: select * from Kunde where Name is NULL select * from arbeiten where Vorname is NOT NULL Unterabfragen Bis jetzt wurde der Vergleich in der WHERE -Klausel immer mit einer Konstanten durchgeführt. Zusätzlich dazu ist es möglich, den Vergleich mit dem Ergebnis einer weiteren SELECT-Anweisung durchzuführen. Eine Unterabfrage wird häufig als innere SELECT-Anweisung bezeichnet. Eine Unterabfrage kann im Zusammenhang mit folgenden Operatoren auftreten: alle Vergleichsoperatoren IN-Operator Seite 4 von 12 2012 Unterabfragen mit Vergleichsoperatoren SELECT * FROM <Tabelle> WHERE <Feldname> = (SELECT * FROM <tabelle> WHERE <Feldname> = <wert>) Beispiele: SELECT abt_nr from mitarbeiter where m_nr in (select m_nr from arbeiten where pr_nr = 'p3') Nennen Sie die Abteilungsnummer allwe Mitarbeiter, die im Projekt p3 arbeiten. SELECT distinct pr_nr from arbeiten where m_nr < (select m_nr from mitarbeiter where m_name = 'Müller') Nennen Sie die Nummern aller Projekte, in welchen Mitarbeiter arbeiten, deren Personalnummer kleiner als die Nummer des Mitarbeiters namens Müller ist. Unterabfragen mit IN-Operator SELECT * FROM <Tabelle> WHERE <Feldname> IN (SELECT <Feldliste> FROM <Tabelle> WHERE <Feldname> = <wert>) Nennen Sie die Daten aller Mitarbeiter, die in München arbeiten Die GROUP BY -Klausel Die GROUP BY- Klausel definiert eine oder mehrere Spalten als Gruppenkennzeichen, wonach die Reihen gruppiert werden. SELECT <Feldname>,... FROM <tabelle> GROUP BY <Feldname> Beispiel: SELECT aufgabe from arbeiten GROUP BY aufgabe SELECT pr_nr, aufgabe from arbeiten GROUP BY pr_nr, aufgabe Gruppieren aller Mitarbeiter nach Projektnummer und Aufgabe Seite 5 von 12 2012 Aggregatfunktionen Min Max Sum AVG Count Die Aggregatfunktionen können in einer SELECT-Anweisung mit oder ohne GROUP BY-Klausel erscheinen. Falls die SELECT-Anweisung die GROUP BY-Klausel nicht enthält, dürfen in der Projektion nur die Spaltennamen angegeben werden, die als Parameter der Aggregatfunktion erscheinen. Alle Spaltenamen, die nicht Parameter der Aggregatfunktion sind, dürfen in der SELECT-Anweisung erscheinen, falls sie zur Gruppierung verwendet werden. Die Funktionen MIN und MAX Die Funktionen ermitteln den kleinsten oder größten Wert aus einer Tabelle SELECT MIN(<Feldname>) as <alias> FROM <tabelle> Beispiele: select MIN(m_nr) as min_m_nr from mitarbeiter kleinste Personalnummer eines Mitarbeiters select m_nr, m_name from mitarbeiter where m_nr = (select min(m_nr) from mitarbeiter) Personalnummer und Namen des Mitarbeiters mit der kleinsten Personalnummer select m_nr from arbeiten where einst_dat = (select max(einst_dat) from arbeiten where aufgabe = 'Projektleiter') Finden Sie die Personalnummer des Projektleiters, der in dieser Position als letzter eingestellt wurde. Seite 6 von 12 2012 Die Funktion SUM Die Aggregatfunktion SUM berechnet die Summe der Werte einer Spalte. Die Spalte muss numerisch sein. SELECT SUM(<Feldname>) <alias> from <tabelle> Beispiele: select SUM(mittel) summe from projekt Berechnen der Summe aller finanziellen Mittel Die Funktion COUNT Die Aggregatfunktion COUNT hat zwei verschiedene Formen. Die erste Form sieht wie folgt aus: COUNT ([distinct] <spalten_name>) Sie berechnet die Anzahl der Werte der Spalte, wobei alle mehrfach vorhandenen Werte nicht berücksichtigt werden. Die zweite Form der Funktion COUNT sieht folgendermaßen aus: COUNT(*) oder COUNT(1) Sie berechnet die Anzahl der Reihen. Beispiel: select pr_nr, count(m_nr) as anzahl from arbeiten group by pr_nr Finden sie heraus, wie viele Mitarbeiter in jedem Projekt arbeiten. select pr_nr, count(aufgabe)as anzahl from arbeiten group by pr_nr Finden Sie heraus, wie viele verschiedene Aufgaben in jedem Projekt ausgeübt werden. Seite 7 von 12 2012 Die HAVING-Klausel Die HAVING-Klausel hat dieselbe Funktion für die GROUP-BY-Klausel wie die WHERE-Klausel für die SELECT-Anweisung. HAVING <Bedingung> Beispiel: select pr_nr from arbeiten group by pr_nr having count(*) < 4 Nennen Sie alle Projekte, mit denen weniger als vier Mitarbeiter befasst sind. Die ORDER BY-Klausel Die ORDER-BY-Klausel definiert die Reihenfolge der Ausgabe aller ausgewählten Reihen einer SELECT-Anweisung. Diese Klausel ist optional (ASC ist Defaultwert) ORDER BY <feldname> [ ASC | DESC] SELECT m_nr, m_name, m_vorname from mitarbeiter order by m_nr UNION Mit UNION können zwei SELECT-Anweisungen miteinander verbunden werden SELECT name,vorname from <tabelle> UNION SELECT name,vorname from <tabelle> Die Felder müssen denselben Datentyp besitzen und in der gleichen Reihenfolge angegeben werden. Beispiel: select m_nr from mitarbeiter where abt_nr = 'a1' UNION select m_nr from arbeiten where einst_dat < '01.01.1988' order by 1 Seite 8 von 12 2012 Komplexe Abfragen Verknüpfen zweier oder mehrerer Tabellen Der Equijoin Finden Sie für jeden Mitarbeiter, zusätzlich zu seiner Personalnummer, Namen und Vornamen, auch die Abteilungsnummer und den Standort der Abteilung. die doppelten Spalten beider Tabellen sollen ausgegeben werden. select mitarbeiter.*,abteilung.* from mitarbeiter, abteilung where mitarbeiter.abt_nr = abteilung.abt_nr Das Kartesische Produkt select * from mitarbeiter,abteilung Jeder Spalte der Tabelle mitarbeiter wird mit jeder Spalte der Tabelle abteilung verkettet. Das so entstandene Zwischenergebnis heißt Kartesisches Produkt. Eine Tabelle mit sich selbst verknüpfen select a.abt_nr, a.abt_name, from abteilung a, abteilung b where a.stadt = b.stadt and a.abt_nr <> b.abt_nr Finden sie alle Abteilungen, an deren Standort sich weitere Abteilungen befinden. INNER JOIN Gibt die Datenmenge aus beiden Tabellen zurück. Es werden nur Daten ausgegeben, die in beiden Tabellen vorkommen. SELECT Bestellungen.Menge, Artikel.EP FROM Artikel INNER JOIN Bestellungen ON Artikel.Artnr = Bestellungen.ArtNr; SELECT Kunden.Name, Kunden.Vorname, Bestellungen.Menge, Artikel.EP FROM Kunden INNER JOIN (Artikel INNER JOIN Bestellungen ON Artikel.Artnr = Bestellungen.ArtNr) ON Kunden.KdNr = Bestellungen.KdNr; LEFT JOIN SELECT Bestellungen.Menge, Artikel.Artnr FROM Artikel LEFT JOIN Bestellungen ON Artikel.Artnr = Bestellungen.ArtNr WHERE (((Bestellungen.Menge) Is Null)); Welcher Artikel wurde noch nie bestellt Seite 9 von 12 2012 Die INSERT-Anweisung INSERT INTO mitarbeiter (m_nr, m_name, m_vorname) values(15201,'Lang','Viktor') INSERT INTO mit_neu(abt_nr, abt_name) select abt_nr, abt_name from abteilung where stadt = 'München' Die UPDATE-Anweisung UPDATE arbeiten set aufgabe = 'Gruppenleiter' where m_nr = 18316 and pr_nr = 'p2 UPDATE projekt set mittel = mittel * 0.89 Die DELETE-Anweisung Mit der DELETE-Anweisung werden Reihen aus einer Tabelle gelöscht. Beispiel: DELETE from <tabelle> where <bedingung> DELETE from arbeiten where m_nr = (select m_nr from mitarbeiter where m_name = 'Mozer' VIEWs Jedes View wird mit der Anweisung CREATE VIEW erstellt. die allgemeine Form dieser Anweisung ist: CREATE VIEW <view_name> AS <select_anweisung> Beispiel: CREATE VIEW qrySachbearbeiter as select m_nr, pr_nr, einst_dat from arbeiten where aufgabe = 'Sachbearbeiter‘ Seite 10 von 12 2012 Die Datendefinitionssprache DDL Erstellen einer Tabelle CREATE TABLE <Tabellenname> (<Spaltendef1>,<Spaltendef2>,...) Eine Spaltendefinition baut sich wie folgt auf: Bezeichner: Name des Attributs Datentyp: ChAR, SHORT,LONG,FLOAT,DOUBLE,Date,Blob,Bit,TEXT Zusatz: NOT NULL, WITH NULL, UNIQUE NOT NULL: das Feld kann keine Null-Werte enthalten WITH NULL: das Feld darf leer sein UNIQUE: das Feld ist indiziert, keine doppelten Einträge Beispiel: CREATE TABLE Kunde (Id integer NOT NULL, Name varchar(15), Ort varchar(30)) Erstellen einer Tabelle Kunde mit den Spalten Id, Name, Ort CREATE TABLE Kunde(id integer UNIQUE, Name varchar(15) NOT NULL) create table abteilung (abt_nr varchar(4) not null, abt_name varchar(20) not null, stadt char(15) null, primary key(abt_nr)) Primary Key-Klausel (CONSTRAINT) CONSTRAINT <schluesselname> PRIMARY KEY <feldname> CREATE TABLE Kunde (id integer CONSTRAINT PRIMARY KEY id, Name varchar(30) NOT NULL) Die referentielle Integrität Sie ermöglicht dem Benutzer die Einschränkung in Bezug auf Tabellen, die einen Primär- oder entsprechenden Fremdschlüssel enthalten. create table abteilung ( abt_nr char(4) not null, abt_name char(20) not null, stadt char(15) null, primary key(abt_nr)) Seite 11 von 12 2012 create table mitarbeiter ( m_nr integer not null, m_name char(20) not null, m_vorname char(20) not null, abt_nr char(4) null, primary key(m_nr), foreign key(abt_nr) references abteilung(abt_nr)) Ändern einer Tabelle ALTER TABLE <Tabellenname> <MODIFIER> Modifier: ADD COLUMN ALTER COLUMN DROP COLUMN Hinzufügen von Spalten (ADD) Ändern einer Spalte (MODIFY) Löschen einer Spalte (DROP) Beispiele: ALTER TABLE Kunde ADD dummy SMALLINT Hinzufügen der Spalte dumme zur Tabelle Kunde ALTER TABLE Kunde MODIFY Name CHAR(30) Ändern des Datentyps der Spalte Name der Tabelle Kunde ALTER TABLE Kunde DROP dummy Löschen der Spalte dummy aus der Tabelle Kunde Seite 12 von 12 2012