Welche Kunden haben die gleiche Ware bestellt? select distinct a1.name, a2.name from Auftrag a1, Auftrag a2 where a1.ware = a2.ware.

Ähnliche Dokumente
4.1 SQL. Wichtige skalare Datentypen

Rückblick. SQL bietet viele Möglichkeiten zur Anfrageformulierung

Daten-Definitionssprache (DDL) Bisher: Realwelt -> ERM -> Relationen-Modell -> normalisiertes Relationen-Modell. Jetzt: -> Formulierung in DDL

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

Die Anweisung create table

SQL 2. Ziele. Fortgeschrittene SQL-Konstrukte. Aggregatfunktionen revisited. Subqueries. Korrelierte Subqueries

Kapitel 6. Datenmalipulation (DML) d. h. insert, update, delete, select im Relationenmodell (in Oracle)

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #4. SQL (Teil 2)

Musterlösung zur Finalklausur Datenbanksysteme am

Kapitel 4: Relationen-Kalkül

Übersicht der wichtigsten MySQL-Befehle

SQL als Zugriffssprache

Seminar 2. SQL - DML(Data Manipulation Language) und. DDL(Data Definition Language) Befehle.

SELECT dient dazu, aus einer vorhandenen Datenbank bestimmte Spalten und Zeilen auszugeben es handelt sich also um eine Auswahlabfrage.

Kapitel 3: Datenbanksysteme

Verbunde (Joins) und mengentheoretische Operationen in SQL

Datenbanksysteme Vorlesung vom noch Kapitel 7: SQL. Oliver Vornberger. Institut für Informatik Universität Osnabrück

Kapitel 3: Die Relationale Algebra

Verbunde (Joins) und mengentheoretische Operationen in SQL

Datenmanagement I SoSe 2006 Aufgabenblatt 4

Kapitel 4: Relationen-Kalkül

Kapitel 5: Sortieren, Gruppieren und Views in SQL

Wiederholung VU Datenmodellierung

dbis Praktikum DBS I SQL Teil 2

Kapitel 3: Datenbanksysteme

Introduction to Data and Knowledge Engineering. 6. Übung SQL

ISU 1. Ue_08/02_Datenbanken/SQL. 08 Datenbanken. Übung. SQL Einführung. Eckbert Jankowski.

Unterabfragen (Subqueries)

Vorlesung Datenbankmanagementsysteme

Kapitel 3: Datenbanksysteme

Abfragen (Queries, Subqueries)

Kapitel 3: Datenbanksysteme

Kapitel 3: Datenbanksysteme

Relationale Anfragesprachen

Kapitel 5: Mehr zu SQL

ARBEITSBLATT ZUR SQL-BEFEHLEN

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

Kapitel 3: Datenbanksysteme

SQL Data Manipulation Language (DML) und Query Language (QL)

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Datenbanksysteme 2013

SQL. Ziele. Grundlagen von SQL. Beziehung zur relationalen Algebra SELECT, FROM, WHERE. Joins ORDER BY. Aggregatfunktionen. dbis.

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 27. Nov M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5

Einführung in SQL. 1. Grundlagen SQL. Structured Query Language. Viele Dialekte. Unterteilung: i. DDL (Data Definition Language)

Lösungen der Übungsaufgaben von Kapitel 10

Dieser Foliensatz darf frei verwendet werden unter der Bedingung, dass diese Titelfolie nicht entfernt wird.

insert, update, delete Definition des Datenbankschemas select, from, where Rechteverwaltung, Transaktionskontrolle

Kapitel 5: Mehr zu SQL

Auf einen Blick. Abfrage und Bearbeitung. Erstellen einer Datenbank. Komplexe Abfragen. Vorwort... 13

Fortsetzung: Projektion Selektion. NULL Werte

Es wird empfohlen folgendes Material anzusehen:

Auf einen Blick. Abfrage und Bearbeitung. Erstellen einer Datenbank. Komplexe Abfragen. Vorwort 13

Oracle 10g Einführung

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

Konstante Relationen

PRG2 Folien Zicari Teil 5. Einführung in Datenbanken SS 2007

GROUP BY, HAVING und Sichten

Kapitel 9. Embedded SQL. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Inhaltsverzeichnis. Vorwort Kapitel 1 Einleitung... 15

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #3. SQL (Teil 1)

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

A Datendenition in SQL ( Punkte)

Inhaltsverzeichnis. Vorwort 13. Kapitel 1 Einleitung 15

SQL: statische Integrität

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

8. Relationale Datenbanksprachen

Datenbanksysteme I. Klausur zum Praktikum. Mehrere Professoren prüfen mit genau einem Beisitzer genau einen Studenten.

Aggregatfunktionen in der Relationenalgebra?

4.5 Anfragen mit Mengenoperatoren

Datenmanipulation in SQL (1): Subselect:

Datenmanipulation in SQL. Select Anweisung

Kapitel 3: Die Relationale Algebra

Daniel Warner SQL. Das Praxisbuch. Mit 119 Abbildungen. Franzis

Kommunikation und Datenhaltung. Übungsblatt D1. (Relationale Algebra & SQL)

Dieser Foliensatz darf frei verwendet werden unter der Bedingung, dass diese Titelfolie nicht entfernt wird.

Inhaltsverzeichnis. Einleitung

Finalklausur zur Vorlesung Datenbanksysteme I Wintersemester 2003/2004 Prüfer: Prof. R. Bayer, Ph.D. Datum: Zeit: 16.

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Kapitel 8: Datenintegrität

Kapitel 3: Datenbanksysteme

Antwort auf QB ist Menge von Tupeln, i-e. selbst wieder Relation (wie bei rel. Algebra) in QB "Zugriff" auf Tupel mit Tupel-Variablen

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Uni Duisburg-Essen Fachgebiet Informationssysteme Prof. Dr. N. Fuhr. Praktikum: Datenbanken Woche 7: Noch mehr SQL

Visualisierung in Informatik und Naturwissenschaften

4. Objektrelationales Typsystem Kollektionstypen. Nested Table

SQL. Abfragesprache Datenmanipulation - DML

Vorlesung Informationssysteme

SQL. DDL (Data Definition Language) Befehle und DML(Data Manipulation Language)

MCSA: SQL 2016 Database Development

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten

Datenbanksysteme noch Kapitel 7: SQL. Vorlesung vom Oliver Vornberger. Institut für Informatik Universität Osnabrück

Kapitel 5: Sortieren, Gruppieren und Views in SQL

Structured Query Language (SQL) als standardisierte Anfragesprache für relationale Datenbanken

Kapitel 4: Relationen-Kalkül

7. XML-Datenbanksysteme und SQL/XML

ACCESS SQL ACCESS SQL

Aggregatfunktionen in SQL

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Transkript:

*HVFKDFKWHOWH$QIUDJHQ In einer SQL-Anweisung können in der where-klausel, from-klausel, select-klausel wieder SQL-Anweisungen auftreten. Man spricht dann auch von einer geschachtelten Anfrage oder Unteranfrage. Bei Unteranfragen werden häufig 7XSHOYDULDEOHQ benutzt. Eine Tupelvariable wird in der from-klausel deklariert und dabei einer Relation zugeordnet. Tupelvariablen sind dann erfoderlich, wenn die gleiche Relation mehrfach in einer Anfrage benutzt wird. Welche Kunden haben die gleiche Ware bestellt? select distinct a1.name, a2.name from Auftrag a1, Auftrag a2 where a1.ware = a2.ware Seite 123 von 135

8QWHUDQIUDJHLQGHUIURP.ODXVHO Innerhalb einer from-klausel kann statt einer Relation eine Unteranfrage benutzt werden. Dann ist es ebenfalls möglich, eine Tupelvariable an diese Unteranfrage zu binden. Bestimmte Anfragen lassen sich erst über solche Unterfragen formulieren: Beispiel Wieviel Stück werden von einer Ware im Durchschnitt bestellt? select avg(t.summe) from (select Ware, count(*) as summe from Auftrag group by Ware) t Die having-klausel kann dann auch durch eine äquivalente where-klausel ersetzt werden. Anfrage mit having-klausel äquivalente Anfrage ohne having-klausel select A, agg(b) as C select * from R from ( select A, agg(b) as C where FW from R group by A where FW having FH(C) group by A) t where FH(t.C) Seite 124 von 135

8QWHUDQIUDJHQLQGHUVHOHFW.ODXVHO Einige Datenbanksysteme unterstützen auch Unteranfragen in der select-klausel (z. B. SQL Server): Damit ist es möglich nach einem Attribut zu gruppieren und gleichzeitig im Aggregat verschiedene where-bedingungen zu berücksichtigen. Beispiel: select Ware, (select count(*) from Auftrag A where A.Ware = B.Ware and Menge > 20), (select count(*) from Auftrag A where A.Ware = B.Ware and Menge <= 20) from Auftrag B Damit folgt daraus, dass eine Anfrage mit einer group-by-klausel in eine äquivalente Anfrage ohne diese Klausel umgewandelt werden kann. Seite 125 von 135

8QWHUDQIUDJHQLQGHUZKHUH.ODXVHO In der where-klausel wird dabei noch unterschieden, ob das Resultat der Unteranfrage einen skalaren Wert oder eine Relation zurückliefert. Wir betrachten zunächst den ersten Fall: Skalare Unteranfragen Welche Lieferanten liefern Lampen, deren Preis 50% unter dem Durschnittspreis für Lampen liegen? select LName, Preis from Lieferant where Ware = 'Lampe' and Preis < ( Skalare Unteranfragen mit Exists select avg(preis)/2 from Lieferant where Ware = 'Lampe') In der where Klausel werden auch Unteranfragen erlaubt, die einen Booleschen Wert zurückliefern. Diese sind durch das Schlüsselwort exists gekennzeichnet. Dabei ist die Bedingung exists <Subquery> wahr, falls die Unteranfrage nicht leer ist. Seite 126 von 135

Welche Lieferanten liefern irgendetwas, das Huber bestellt hat? select distinct LName from Lieferant L where exists (select Ware from Auftrag where L.Ware = Ware and KName = Huber ) Gültigkeit von Tupelvariablen in Unteranfragen Bei dieser Unteranfrage wird Bezug genommen auf eine Tupelvariable, die in der äußeren Anfrage definiert wurde. Bei der Auswertung der Anfrage wird entsprechend so wie beim Tupelkalkül vorgegangen ( von außen nach innen ). Man spricht dann auch von einer NRUUHOLHUWHQ8QWHUDQIUDJH. Eine XQNRUUHOLHUWH8QWHUDQIUDJH braucht nur einmal ausgewertet zu werden. Dagegen muss eine korrelierte Anfrage für jedes äußere Tupel ausgewertet werden. Eine Tupelvariable ist in allen zugehörigen Unteranfragen gültig. Eine Redeklaration der gleichen Tupelvariable überdeckt die äußere Deklaration der Variablen. Sucht man die Deklaration einer Tupelvariable geht man also von innen nach außen. Es wird die Deklaration benutzt, die zuerst gefunden wird (und alle anderen ignoriert). Seite 127 von 135

0HQJHQZHUWLJH8QWHUDQIUDJHQ Durch Verwendung vom Schlüsselwort in kann getestet werden, ob ein Attribut einen Wert in einer Menge annimmt (oder auch nicht) select KName, KAdr from Kunde where Kunde in (select KName from Auftrag) Wie kann die Anfrage formuliert werden, ohne dabei eine Unteranfrage zu benutzen? Soll nun getestet werden, ob ein Attribut mit allen Elementen einer Menge in einer bestimmten Beziehung steht, kann das Schlüsselwort all benutzt werden. Suche für alle Waren die Namen der günstigsten Lieferanten! select LName, Ware from Lieferant L where Preis <= all( select Preis from Lieferant where Ware = L.Ware) Seite 128 von 135

Differenz durch Unteranfragen Eine Differenz zwischen Relationen kann über except ausgedrückt werden (wird nicht von allen DBMS unterstützt) oder durch eine Unteranfrage mit not in und not exists. Beispiele: Berechne alle Kunden, die derzeit keine Waren bestellt haben. select * from Kunde where Kname not in (select Kname from Auftrag) RGHU select * from Kunde K where not exists (select KName from Auftrag where KName = K.KName) Seite 129 von 135

Anfragen mit Allquantoren Da [ \ [ œ [ \ [, können alle Anfragen mit einem Allquantor in äquivalente Anfragen umgeformt werden, die nur noch Existenzquantoren benutzen. Welche Lieferanten liefern alles, was Bercken bestellt hat? Anfrage im Tupelkalkül: {t{lname} forall(u in Auftrag) u.kname = Bercken ex(v in Lieferant) v.ware = u.ware und v.lname = t.lname} Anfrage in SQL select distinct LName from Lieferant L where not exists( select Ware from Auftrag where KName = 'Bercken' and not Ware in ( select Ware from Lieferant where LName =L.LName)) Seite 130 von 135

$OOTXDQWLIL]LHUWH$QIUDJHQLQ64/ Anfrage: Welche Kunden haben alle Waren bestellt? SQL select * from Auftrag group by KName having count(*) = (select count(*) from (select distinct Ware from Auftrag)) Seite 131 von 135

bqghuqhlqhu5hodwlrqhqlqvwdq] Tupelweises Einfügen: insert into <Relationen-Name> [(<Attributname> [, <Attributname>] * )] values (<Konstante> [, Konstante] * ) oder mengenweises Einfügen insert into <Relationen-Name> [(<Attributname> [, <Attributname>] * )] select... from... where... Löschen: delete from <Relationen-Name> [where <Bedingung>] Verändern: update <Relationen-Name> set <Attributname> = <Ausdruck> [, <Attributname> = <Ausdruck>] * [where <Bedingung>] Seite 132 von 135

%HLVSLHOH Füge den Kunden Zeitler mit dem Kontostand 0 DM ein! insert into Kunde (KName, Kto) values ('Zeitler', 0) /* KAdresse wird automatisch auf den Defaultwertauf, in diesem Fall null, gesetzt */ Erhöhe den Kontostand von Zeitler um 200! update Kunde set Kto = Kto + 200 where KName = 'Zeitler' Seite 133 von 135

Motivation 5HNXUVLRQ In unserer Datenbank können Kunden auch wieder Lieferanten für andere Kunden sein. Das ist in der Praxis sehr oft der Fall! Folgende Anfrage soll dann unterstützt werden: Berechne alle Lieferanten, die Waren an VW liefern können: select LName from Auftrag A, Lieferant L where A.Ware = L.Ware and A.KName = VW Jetzt sollen noch die potentiellen Lieferanten der Lieferanten berechnet werden: select LName from Lieferant L, Auftrag A where A.Ware = L.Ware and KName in (select LName from Auftrag A, Lieferant L where A.Ware = L.Ware and A.KName = VW) Die Berechnung aller direkten und indirekten potentiellen Lieferanten von VW kann mit den bisher vorgestellten Mitteln jedoch in SQL nicht formuliert werden. Seite 134 von 135

5HNXUVLRQLQ2UDFOH Erst im SQL3-Standard wurden Möglichkeiten geschaffen, rekursive Anfragen zu formulieren. Wir werden später auf die spezielle Syntax von SQL 3 eingehen. Zuvor gab es für spezielle rekursive Anfragen verschiedene Insellösungen von den Herstellern, wie z. B. eine Tiefensuche in Oracle: In der Klausel start with wird der Ausgangspunkt der Tiefensuche angegeben, in unserem Fall A.KName = VW Hinter der Klausel connect by wird angegeben, wie bei der Tiefensuche der Vorgänger mit dem Nachfolger (über das Schlüsselwort prior) verbunden wird. In Oracle könnte dann obige Anfrage folgendermaßen formuliert werden: select LName from Lieferant L join Auftrag A on L.Ware = A.Ware connect by KName = prior LName start with KName = VW Seite 135 von 135