2. Übung zu joins

Werbung
PostgreSQL
27. November 2014
E3A
Übung
1. Ändere die Tabelle wein so ab, dass sie eine Spalte für Preise (5 Stellen, davon 2 Nachkomma)
erhält und füge Preise deiner Wahl ein.
2. Liste die Weinbauern und die Anzahl ihrer Weine aus.
3. Liste die Weinbauern und die Anzahl ihrer Weine aus, aber nur die, die mindestens 2 Weine im
Angebot haben.
4. Wie viele Rotweine und wie viele Weißweine gibt es?
5. Gib eine Liste aller Anbaugebiete aus plus die Anzahl der darin vorhandenen Erzeuger. Anbaugebiete ohne Erzeuger sollen mit einer 0 aufscheinen.
6. Erstelle eine Liste, die die Erzeuger und ihre Weine ausgibt, aber nur solche, deren Preis geringer
als der Durchschnitt aller Weine ist.
7. Welcher Weinbauern produziert den billigsten Wein?
8. Welche Erzeuger produzieren keinen ’grünen veltliner’ ?
9. Erstelle eine Liste der Erzeuger mit dem Wert (Summe Preis) ihrer Weine
10. Schreibe ein Statement, mit dem die Regionen und die Anzahl der Erzeuger pro Region gelistet
werden.
11. Welche Weine haben keine Erzeuger zugeordnet?
12. Liste alle Erzeuger auf, die keine Weine zugeordnet haben und liste alle Weine auf, die keinen
Erzeuger zugeordnet haben. Verwende nur ein Statement.
1
PostgreSQL
November 27, 2014
E3A
Listing 1:
alter table wein add column preis decimal(5,2);
Listing 2:
select e.name, count(we.enr) from erzeuger e join w_e we on e.enr = we.enr
group by e.enr;
--oder mit Weinbauern, die keine Weine haben
select e.name, count(we.enr) from erzeuger e left join w_e we on e.enr = we.enr
group by e.enr;
Listing 3:
select e.name, count(we.enr) from erzeuger e join w_e we on e.enr = we.enr
group by e.enr having count(we.enr) >= 2;
Unterschied having - where: having schränkt ein Ergebnis ein, das mit ’group by’ gruppiert wurde;
where wird eingesetzt, bevor ’group by’ zum Zug kommt
Listing 4:
select farbe, count(*) from wein group by farbe;
Listing 5:
select a.name, count(e.anr) from anbau a left join erzeuger e on a.anr = e.anr
group by a.anr;
Listing 6:
select e.name, w.name from erzeuger e join w_e we on e.enr = we.enr
join wein w on we.wnr = w.wnr
where w.preis < (select avg(preis) from wein);
Listing 7:
select e.name, w.name from erzeuger e join w_e we on e.enr = we.enr
join wein w on w.wnr = we.wnr
where w.preis = (select min(preis) from wein w);
Listing 8:
-- Zuerst alle Weinbauern, die 'Grünen Veltliner' produzieren
select e.name, w.name from erzeuger e join w_e we on e.enr = we.enr
join wein w on w.wnr = we.wnr
where w.name = 'grüner veltliner';
w.name kann weggelassen werden
dann diese Abfrage in eine Unterabfrage einbauen (ein != geht hier nicht, da diese Abfrage mehrere
Zeilen liefert, daher das NOT IN
select e.name from erzeuger e where e.name NOT IN
(
select e.name, w.name from erzeuger e join w_e we on e.enr = we.enr
join wein w on w.wnr = we.wnr
where w.name = 'grüner veltliner'
)
2
PostgreSQL
November 27, 2014
Listing 9:
select e.name, sum(preis) from erzeuger e join w_e we on e.enr = we.enr
join wein w on w.wnr = we.wnr
group by e.enr;
Listing 10:
select r.name,count(e.anr) from region r left join anbau a on r.rnr = a.rnr
left join erzeuger e on a.anr = e.anr
group by r.rnr;
Listing 11:
select w.name, we.enr from wein w left join w_e we on w.wnr = we.wnr
where we.enr is null;
Listing 12:
select w.name, e.name from wein w full join w_e we on w.wnr = we.wnr
full join erzeuger e on e.enr = we.enr
where e.name is null or w.name is null;
3
E3A
Herunterladen