Philipp Cimiano AG Semantische Datenbanken und Wissensverarbeitung

Cognitive Interaction Technology Center of Excellence Datenbanken I - SQL – 5.11.2009 Philipp Cimiano AG Semantische Datenbanken und Wissensverarbei...
Author: Jörg Dieter
0 downloads 0 Views 480KB Size
Cognitive Interaction Technology Center of Excellence

Datenbanken I - SQL – 5.11.2009

Philipp Cimiano AG Semantische Datenbanken und Wissensverarbeitung

1

Cognitive Interaction Technology Center of Excellence

SQL

2

• SQL steht für „Structured Query Language“. • Als Vorgänger der SQL Sprache wurde Anfang der 70er die Sprache „Sequel“ im Kontext des „R“-Systems von IBM eingeführt. • SQL ist heutzutage der „de facto“ Standard im Hinblick auf Anfragesprachen für relationale Datenbanken. • Es gab im Laufe der Zeit veschiedene SQL Versionen: • SQL-86 • SQL-89 • SQL-92 • SQL-99 • SQL-2003 • SQL-2006 • SQL-2008

Cognitive Interaction Technology Center of Excellence

Komponenten von SQL

• SQL gliedert sich in folgende Komponenten: -Data Definition Language: umfasst Befehle um Schemas zu definieren oder zu ändern, Tabellen zu löschen, etc. -Data-Manipulation Language -Integrity Constraints -View Definition -Transaction Control -Embedded/Dynamic SQL -Authorization

3

Cognitive Interaction Technology Center of Excellence

Komponenten von SQL

• SQL gliedert sich in folgende Komponenten: -Data Definition Language -Data-Manipulation Language: umfasst die Query Language von SQL, die zum größten Teil auf der relationalen Algebra basiert. Sie beinhaltet auch Befehle um Zeilen in eine Tabelle einzufügen, Zeilen zu löschen, zu ändern usw. -Integrity Constraints -View Definition -Transaction Control -Embedded/Dynamic SQL -Authorization 4

Cognitive Interaction Technology Center of Excellence

Komponenten von SQL

• SQL gliedert sich in folgende Komponenten: -Data Definition Language -Data-Manipulation Language -Integrity Constraints: die DDL beinhaltet auch Befehle zur Spezifikation von Bedingungen, die in allen Instanzen der Datenbank erfüllt sein müssen. Updates. die diesen Bedingung zuwiderlaufen, werden nicht erlaubt. -View Definition -Transaction Control -Embedded/Dynamic SQL -Authorization 5

Cognitive Interaction Technology Center of Excellence

Komponenten von SQL

• SQL gliedert sich in folgende Komponenten: -Data Definition Language -Data-Manipulation Language -Integrity Constraints -View Definition: die DDL erlaubt uns auch die Spezifikation von Sichten auf die Datenbank. -Transaction Control -Embedded/Dynamic SQL -Authorization

6

Cognitive Interaction Technology Center of Excellence

Komponenten von SQL

• SQL gliedert sich in folgende Komponenten: -Data Definition Language -Data-Manipulation Language -Integrity Constraints -View Definition -Transaction Control: SQL stellt uns Befehle zur Verfügung, um Transaktionen zu definieren (Beginn/Ende) -Embedded/Dynamic SQL -Authorization

7

Cognitive Interaction Technology Center of Excellence

Komponenten von SQL

• SQL gliedert sich in folgende Komponenten: -Data Definition Language -Data-Manipulation Language -Integrity Constraints -View Definition -Transaction Control -Embedded/Dynamic SQL: SQL Befehle können in diverse Programmiersprachen eingebettet werden (C,C++,Java,...) -Authorization

8

Cognitive Interaction Technology Center of Excellence

Komponenten von SQL

• SQL gliedert sich in folgende Komponenten: -Data Definition Language -Data-Manipulation Language -Integrity Constraints -View Definition -Transaction Control -Embedded/Dynamic SQL -Authorization: Die DDL beinhaltet Befehle, um Zugangsrechte für Tabellen zu spezifizieren.

9

Cognitive Interaction Technology Center of Excellence

Schema Definition

create table r(A1 D1, A2 D2,...,An Dn ... ) Wobei: • r der Name der Relation ist • A1,...,An die Attribute mit ihren entsprechenden Domänen D1,...,Dn sind. 10

Cognitive Interaction Technology Center of Excellence

Constraints

• Als Constraints betrachten wir vorerst nur die Spezifikation von Primärschlüsseln. • Mit „primary key (A1,...,An)“ bringt man zum Ausdruck, dass die Attribute A1,..,An den Primärschlüssel einer Relation darstellen.

11

Cognitive Interaction Technology Center of Excellence

Standard Domänen

• char(n)/character: string mit einer Länge von genau n Zeichen • varchar(n): string mit einer variable Länge von bis zu n Zeichen • int/integer: eine ganze Zahl (maschinenabhängig) • smallint: eine „kleine“ ganze Zahl (maschinenabhängig) • numeric(p,d): eine Zahl mit p Ziffern (zusätzlich zu einem Vorzeichen), wobei d Ziffern „rechts vom Komma“ sind. Mit numeric(3,1) können wir z.B. 44.5 speichern aber weder 444.5 noch 0.32 darstellen. • real: Fließkommazahlen (maschinenabhängig) • float(n): eine Fließkommazahl mit mindestens n Ziffern 12

Cognitive Interaction Technology Center of Excellence

Beispiel customer

• create table customer (customer_name char(20), customer_street char(20), customer_city char(30), primary key (customer_name))

13

Cognitive Interaction Technology Center of Excellence

Beispiel branch

• create table branch (branch_name char(15), branch_city char(30), assets numeric(16,2), primary key (branch_name))

14

Cognitive Interaction Technology Center of Excellence

Beispiel account

• create table account (account_number char(10), branch_name char(15), balance numeric(12,2), primary key (account_number))

15

Cognitive Interaction Technology Center of Excellence

Beispiel depositor

• create table depositor (customer_name char(20), account_number char(10), primary key (customer_name,account_number))

16

Cognitive Interaction Technology Center of Excellence

Hinzufügen von Zeilen (Tupeln)

• Um Zeilen einer Tabelle hinzuzufügen verwenden wir den insert-Befehl: insert into account values (´A-9732´,´Perryridge´,1200)

17

Cognitive Interaction Technology Center of Excellence

Löschen

• Löschen von allen Einträgen in einer Tabelle: delete from r Es können dann noch Tupel hinzugefügt werden. • Löschen der gesamten Tabelle mit dem Schema:

18

drop table r Es können keine Tupel mehr hinzugefügt werden; die Tabelle ist „weg“.

Cognitive Interaction Technology Center of Excellence

Hinzufügen/Löschen von Attributen

• Hinzufügen von Attribut A mit Domäne D zu Tabelle r: alter table r add A D „Null“-values werden für dieses Attribut eingefügt. • Löschen von Attribut A mit Domäne D: alter table r drop A Alle Werte dieser „Spalte“ werden gelöscht.

19

Cognitive Interaction Technology Center of Excellence

SQL Anfragesprache

• Eine SQL Anfrage hat typischerweise die folgende Form: select A1,A2,...,An from r1,r2,...,rm where P wobei: • der select-Teil einer Projektion entspricht. Man spezifiziert damit die Attribute, die man gerne als Ergebnis zurückgeliefert haben möchte. • der from-Teil dem kartesischen Produkt der Relationen r1,r2,...,rm enrspricht. • Der where-einer Selektionsoperation mit Bedingung P entspricht. 20

Cognitive Interaction Technology Center of Excellence

Interpretation einer SQL Anfrage in Bezug zur relationalen Algebra

select A1,A2,...,An from r1,r2,...,rm where P

21

Cognitive Interaction Technology Center of Excellence

Der select-Teil • Bsp: Finde die Namen aller Branchen in der Tabelle loan.

22

Cognitive Interaction Technology Center of Excellence

select branch_name from loan

Wichtig: SQL eliminiert keine Duplikate (das ist teuer!) außer man gibt es explizit an! 23

Cognitive Interaction Technology Center of Excellence

select distinct

• Man kann die Entfernung von Duplikaten erfordern wenn man das keyword „distinct“ nach „select“ verwendet: select distinct branch_name from loan

24

Cognitive Interaction Technology Center of Excellence

Arithmetische Ausdrücke

• Wie in der relationalen Algebra auch können wir im selectTeil (Projektion in der rel. Algebra) auch arithmetische Ausrücke angeben: select loan_number,branch_name,amount*100 from loan

25

Cognitive Interaction Technology Center of Excellence

Der where-Teil

• Der where-Teil dient zur Spezifikation einer Bedingung, die von den Ergebnissen erfüllt sein muss. Bsp: Finde alle Kreditnummern (loan_number) von der Perryridge Filiale mit einem Kreditbetrag von mindestens 1200 Euro: select loan_number from loan where branch_name =‘Perryridge‘ and amount > 1200 26

Cognitive Interaction Technology Center of Excellence

„From“-Teil

• Der From-Teil dient zur Spezifikation eines kartesischen Produktes. Er gibt also die Tabellen an, die kombiniert werden sollen. • Es ist relativ einfach, in SQL einen Natural Join zu durchzuführen: select customer_name, borrower.loan_number,amount from borrower, loan where borrower.loan_number=loan.loan_number 27

Cognitive Interaction Technology Center of Excellence

Rename in SQL

• SQL erlaubt natürlich auch die Umbenennung von Tabellen und Attributen. • Das funktioniert wie folgt: alterName as neuerName

• „as“ kann sowohl in dem „select“-Teil als auch im „from“-Teil auftreten.

28

Cognitive Interaction Technology Center of Excellence

Beispiel „as“ im select-Teil

select customer_name, borrower.loan_number as loan_id, amount from borrower, loan where borrower.loan_number=loan.loan_number

29

Cognitive Interaction Technology Center of Excellence

Tupelvariablen

• SQL erlaubt es uns, Tupelvariablen für Relationen einzuführen durch das keyword ‚as‘ , z.B. im ‚from‘-Teil:

select customer_name, T.loan_number, S.amount from borrower as T, loan as S where T.loan_number = S.loan_number 30

Cognitive Interaction Technology Center of Excellence

Tupelvariablen

• Tupelvariablen sind besonders nützlich wenn wir Zeilen innerhalb einer Tabelle vergleichen wollen:

select distinct T.branch_name from branch as T, branch as S where T.assets > S.assets and S.branch_city =‘Brooklyn‘ 31

Cognitive Interaction Technology Center of Excellence

String-Operationen

• SQL erlaubt es uns in Anfragen Stringmuster zu verwenden. • Muster bestehen aus zwei besonderen Symbolen: • % kann für eine beliebige Anzahl an Zeichen stehen • _ kann für ein beliebiges Zeichen stehen

• Man kann diese Symbole mit einem ‚like‘-Ausdruck verwenden: select customer_name from customer where customer_street like %Main%

32

Cognitive Interaction Technology Center of Excellence

Anordnung der Tupel

• Man kann in SQL auch die Ergebnisse sortieren nach bestimmten Attributen, aufsteigend oder absteigend:

select distinct customer_name from borrower, loan where borrower.loan_number=loan.loan_number and branch_name=‘Perryridge‘ order by customer_name

33

Wenn nichts anderes angegeben ist, ordnet „order by“ die Ergebnisse aufsteigend an. Bei einem „order by“ statement muss SQL sortieren (das ist teuer!)

Cognitive Interaction Technology Center of Excellence

Mengen-Operatoren

• Union • Intersect • Except

34

Cognitive Interaction Technology Center of Excellence

Union-Operator

• Der Union Operator in SQL entspricht dem -Operator in der relationalen Algebra. • Bsp: Wir wollen alle Kunden finden, die ein Girokonto oder einen Kredit besitzen: (select customer_id from depositor) union (select customer_id from borrower) 35

Cognitive Interaction Technology Center of Excellence

Union-Operator

• Wichtig: Die Union-Operation eliminiert automatisch doppelte Tupel (Duplikate). • Man kann das aber durch Verwendung von ‚all‘ unterbinden: (select customer_name from depositor) union all (select customer_name from borrower) 36

Cognitive Interaction Technology Center of Excellence

Intersect-Operator

• Der SQL intersect-Operator entsprich dem der relationalen Algebra. (select distinct customer_name from depositor) intersect (select customer_name from borrower) 37

-Operator

Cognitive Interaction Technology Center of Excellence

Intersect-Operation

• Die intersect-Operation eliminiert ebenfalls doppelte Tupel. Man kann das ebenfalls unterbinden:

(select distinct customer_name from depositor) intersect all (select customer_name from borrower)

38

Die Anzahl der „Kopien“ die für ein Tupel zurückgegeben werden entspricht dem Minimum der „Kopien“ des Tupels von den beiden Tabellen. Bemerkung: intersect gibt es in MySQL nicht! (Übung)

Cognitive Interaction Technology Center of Excellence

Except-Operator • Der except-Operator entspricht dem set-difference (-) Operator der relationalen Algebra. • Der folgende SQL Ausdruck gibt uns alle Kunden, die ein Girokonto aber kein Kredit haben: (select distinct customer_name from depositor) except (select customer_name from borrower) 39

Bemerkung: except gibt es in MySQL nicht! (siehe Folie 54)

Cognitive Interaction Technology Center of Excellence

Except-Operator

• Der except-Operator eliminiert ebenfalls doppelte Tupel. • Auch das können wir durch das keyword ‚all‘ unterbinden. (select distinct customer_name from depositor except all (select customer_name

40

from borrower) Die Anzahl der Kopien eines Tupels in der Ergebnismenge entspricht der Anzahl der Kopien in der ersten Tabelle abzüglich der Anzahl der Kopien dieses Tupels in der zweiten Tabelle (wenn die Differenz positiv ist).

Cognitive Interaction Technology Center of Excellence

Aggregationsfunktionen

• Durchschnitt: avg • Minimum: min • Maximum: max • Summe: sum • Anzahl: count Die Eingabe von sum und avg müssen Mengen von numerischen Werten sein; min, max und count können auch mit Strings arbeiten. 41

Cognitive Interaction Technology Center of Excellence

Beispiel

• Bsp: Wir wollen den durchschnittlichen Kontostand in der Filiale in Perryridge haben: select avg (balance) from account where branch_name=‘Perryridge‘

42

Cognitive Interaction Technology Center of Excellence

Gruppierung und Aggregation

• Auch in SQL können wir (wie in der relationalen Algebra) gruppieren vor dem aggregieren: select branch_name, avg(balance) from account group by branch_name Beim Durchschnitt werden Duplikate natürlich nicht eliminiert. 43

Cognitive Interaction Technology Center of Excellence

Gruppierung und Aggregation

• In einigen Fällen wollen wir aber, dass Duplikate eliminiert werden. • Bsp: Finde die Anzahl von Kunden pro Filiale select branch_name, count (distinct customer_name) from depositor, account where depositor.account_number=account.account_number group by branch_name 44

Cognitive Interaction Technology Center of Excellence

Gruppierung und Aggregation

• In manchen Fällen möchten wir auch Bedingungen knüpfen an die Gruppen, deren Werte aggregiert werden. Das geht mit Hilfe des ‘having‘-Operators:

select branch_name, avg(balance) from account group by branch_name having avg(balance) > 500 45

Cognitive Interaction Technology Center of Excellence

Zusammenspiel von having, group by und where

• Wenn wir in einem SQL Ausdruck (Anfrage) sowohl having, group by als auch where verwenden, dann ist die Abarbeitungsreihenfolge wie folgt: 1.  Zuerst wird die Bedingung in der where-Clause verifiziert. 2.  Die Tupel, welche die where-Bedingung erfüllen, werden gruppiert. 3.  Es werden die Gruppen rausgefiltert, welche die havingBedingung nicht erfüllen. 4.  Dann wird der entsprechende Menge von Werten aggregiert. 46

Cognitive Interaction Technology Center of Excellence

„Null“-Werte

• SQL erlaubt auch die Verwendung von „null“-Werten. Sie werden im Wesentlichen wie bei der relationalen Algebra behandelt. • Wir können zusätzlich explizit auf „null“-Werte testen: select loan_number from loan where amount is null

47

Cognitive Interaction Technology Center of Excellence

Auswertung von SQL Ausdrücken

• Für einen SQL Ausdruck select ... from R1,...,Rn where P liefert SQL nur die Tupel zurück, die auf der Bedingung P „true“ zurückliefern. Solche Tupel, die für die Bedingung zu „false“ oder „unknown“ ausgewertet werden, werden nicht zurückgeliefert. 48

Cognitive Interaction Technology Center of Excellence

Behandlung von null/unknown

• Bei Vergleichen mit einem „null“-Wert wird der Wert „unknown“ zurückgeliefert. • Bool‘sche Operatoren: -„and“: • true and unknown = unknown • false and unknown = false • unknown and unknown = unknown

-„or“: • true or unknown=true • false or unknown=unknown • unknown or unknown = unknown

-„not“: • not unknown = unknown 49

Cognitive Interaction Technology Center of Excellence

Aggregationsfunktionen und „null“-Werte

• Faustregel: Alle Aggregationsfunktionen ausser count ignorieren „null“-Werte. • Konsequenz: Die Menge der Werte die aggregiert werden kann leer sein. Dann ist das Ergebnis der Aggregationsfunktion „null“. • Die Anzahl der Tupel (count) in einer leeren Liste ist natürlich „0“.

50

Cognitive Interaction Technology Center of Excellence

Geschachtelte SQL Anfragen

• Es gibt verschiedene Arten und Weisen, in SQL komplexere Anfragen zu stellen bzw. Anfragen ineinander zu schachteln: -Set Membership / Comparison Queries -Complex Queries -With-Clause Queries -Views

51

Cognitive Interaction Technology Center of Excellence

Set Membership

• Wir können das keyword „in“ verwenden, um zu testen, ob bestimmte Tupel in einer Menge enthalten (oder nicht enthalten) sind: select distinct customer_name from borrower where customer_name in (select customer_name from depositor) Frage: Was berechnet diese Query? 52

Cognitive Interaction Technology Center of Excellence

Komplexeres Beispiel für Set Membership Queries

select distinct customer_name from borrower, loan where borrower.loan_number = loan.loan_number and branch_name=‘Perryridge‘ and (branch_name,customer_name) in (select branch_name, customer_name from depositor, account where depositor.account_number= account.account_number) 53

Cognitive Interaction Technology Center of Excellence

EXCEPT als „NOT IN“

(select distinct customer_id from depositor) except (select customer_id from borrower) können wir dann auch schreiben als: select distinct customer_id from depositor where customer_id not in (select customer_id from borrower) 54

Cognitive Interaction Technology Center of Excellence

Vergleichsoperationen auf Mengen

• Nochmal zu unserer Anfrage: „Finde die Namen aller Filialen, die höhere Anlagewerte als (mindestens) eine Filiale in Brooklyn haben.“ • Bisher hatten wir das so gemacht: select distinct T.branch_name from branch as T, branch as S where T.assets > S.assets and S.branch_city=‘Brooklyn‘ Das können wir auch durch Vergleichsoperationen auf Menge realisieren. 55

Cognitive Interaction Technology Center of Excellence

Vergleichsoperationen auf Mengen

select branch_name from branch where assets > some (select assets from branch where branch_city=‘Brooklyn‘)

56

Diese Query ist durchaus näher an der natürlichsprachlichen Formulierung der Anfrage. Wir können in SQL folgende Keywords für Vergleiche mit Menge verwenden: < some, some, >=some, = some und some. (nicht das gleich wie not in!)

Cognitive Interaction Technology Center of Excellence

Vergleichsoperationen mit Mengen (weitere Beispiele)

• Bsp: Finde alle Filialen, die höhere Anlagewerte als alle Filialen in Brooklyn haben. select branch_name from branch where assets > all (select assets from branch where branch_city=‘Brooklyn‘) SQL stellt zusätzlich folgende Vergleichsoperatoren auf Mengen bereit: < all, = all, all (identisch zu not in). 57

Cognitive Interaction Technology Center of Excellence

Vergleichsoperatoren auf Mengen (weitere Beispiele)

• Bsp: „Finde die Filiale mit dem höchsten durchschnittlichen Kontostand“. • Problem: Wir können in SQL Aggregationsfunktionen nicht schachteln: select branch, max(avg(balance)) from branch

58

Cognitive Interaction Technology Center of Excellence

Vergleichsoperatoren auf Mengen (weitere Beispiele)

• Bsp: „Finde die Filiale mit dem höchsten durchschnittlichen Kontostand“. select branch_name from account group by branch_name having avg (balance) >= all (select avg(balance) from account group by branch_name) 59

Cognitive Interaction Technology Center of Excellence

Test auf leere Relationen

• Wir können die keywords „exists“ (bzw. „not exists“) verwenden um zu prüfen, dass es Elemente (bzw. keine Elemente) gibt, die eine bestimmte Bedingung erfüllen. select customer_name from borrower where exists (select * from depositor where depositor.customer_name= borrower.customer_name) 60

Cognitive Interaction Technology Center of Excellence

Enthaltensein von Mengen

• Interessanterweise können wir „not exists“ verwenden, um das Enthaltensein von einer Menge in einer anderen Menge zu prüfen.

61

Cognitive Interaction Technology Center of Excellence

Enthaltensein von Mengen

• Bsp: Finde alle Kunden, die Konten bei allen Filialen von Brooklyn haben. • Für jeden Kunden K gibt es zwei relevante Mengen: -A(K): die Menge der Filialen bei denen dieser Kunde ein Konto hat. -B: die Menge aller Filialen in Brooklyn.

• Idee: liefere alle K zurück, so dass B eine Teilmenge von A (K) ist. (Übungsaufgabe)

62

Cognitive Interaction Technology Center of Excellence

Complex Queries

• Wir können in SQL nicht nur Teil-Ausdrücke in Form von SetMembership Konstrukten im „where“ oder „having“-Teil einbetten, sondern auch in dem „from“-Teil. • Bsp: Finde den Durchschnitts-Saldo von allen Filialen deren Saldo im Durchschnitt größer als 500 ist: Select name, avg from (select branch_name as name, avg(balance) as avg from account group by branch_name) as avg_balance where avg > 500 63

Cognitive Interaction Technology Center of Excellence

Complex Queries

Bsp: Finde das Maximum der Summe aller Saldos für alle Branchen: select max(tot_balance) from (select branch_name, sum(balance) as tot_balance from account group by branch_name) as branch_total

64

Cognitive Interaction Technology Center of Excellence

Sichten (Views)

• Um das Verfassen von komplexeren Queries zu erleichtern können in SQL sogenannte „Sichten“ (Views) definiert werden. Das sind im Wesentlichen „benamte“ Query-Audrücke, die in anderen Query-Ausdrücken verwendet werden können. Eine Sicht wird in SQL wie folgt erzeugt: create view as

65

Cognitive Interaction Technology Center of Excellence

Beispiel Sichten

• Nehmen wir an, ein Mitarbeiter der Bank muss Briefe an alle Kunden der Bank schicken. Er braucht eine Liste aller Kunden (unabhängig ob die Kunden ein Girokonto oder einen Kredit besitzen) pro Filiale. Wir können hierfür eine Sicht wie folgt definieren: create view all_customer as (select branch_name, customer_id from depositor,account where depositor.account_number=account.account_number) union (select branch_name, customer_id from borrower, loan where borrower.loan_number=loan.loan_number) 66

Cognitive Interaction Technology Center of Excellence

Sichten

• Sichten können nun ganz normal als Relation verwendet werden: select customer_name from all_customer where branch_name=‘Perryridge‘

67

Cognitive Interaction Technology Center of Excellence

Bemerkungen zu Sichten

• Die Ausdrücke, die Sichten zu Grunde liegen, werden dynamisch ausgewertet zu dem Zeitpunkt zu welchem der einbettende Ausdruck ausgewertet wird. • Aus Effizienzgründen können Sichten auch „ausmaterialisert“ werden, d.h. die Ergebnisse können explizit gespeichert werden. Man spricht dann von einer ausmaterialisierten Sicht (materialized view). Dann muss man allerdings immer dafür sorgen, dass bei Änderung der entsprechenden Tabellen die ausmaterialisierten Sichten neu berechnet werden (view maintenance). 68

Cognitive Interaction Technology Center of Excellence

Komplexe Anfragen mit „with“

69

• Anstatt Sichten global zu definieren, kann man das Schreiben von Anfragen auch dadurch erleichtern, dass man „lokale“ oder „temporäre Sichten“ mit Hilfe des keywords „with“ einführt: with max_balance (value) as select max(balance) from account select account_number from account, max_balance where account.balance = max_balance.value Bemerkung: „with“-Ausdrücke werden nicht von MySQL unterstützt!

Cognitive Interaction Technology Center of Excellence

Komplexe Anfragen mit „with“ (Weiteres Beispiel)

70

• Bsp: Wir wollen alle Filialen finden deren gesamtes Saldo höher ist als der Durchschnitt des gesamtes Saldos über alle Filialen (vgl. Folie 59). with branch_total (branch_name,value) as select branch_name, sum(balance) from account group by branch_name with branch_total_avg(value) as select avg(value) from branch_total select branch_name from branch_total, branch_total_avg where branch_total.value >= branch_total_avg.value