select id,vorname,name,gehalt from ma where abt='U2' and sex='m' and gehalt>80000 order by gehalt desc
select id,vorname,name,gehalt,alter from ma where abt='U2' and sex='m' and gehalt>80000 and (alter < 30 or alter >=60) order by gehalt desc
select abt, vorname,name,alter from ma where (abt = 'K3' or abt = 'A2') and (alter<22 or (sex = 'm' and alter >=64) or (sex= 'w' and alter >= 61))
Erstellen Sie eine Abteilungstabelle
create table ab ( abt char(2), funktion char(20), leiter int)
Füllen Sie die neu erstellte Tabelle mit den notwendigen Daten.
insert into ab values ('A2', 'Einkauf', 549) insert into ab values ('X1', 'Buchhaltung', 592) insert into ab values ('U2', 'Verwaltung', 5) insert into ab values ('B1', 'Verkauf', 686) insert into ab values ('K3', 'Geschaeftsleitung', 885) insert into ab values ('A1', 'PR', 98)
Erstellen Sie eine Tabelle für den Betriebsausflug
create table ba ( ma_id int, bezahlt char(1), rudern char(1), volley char(1), fahrzeug char(4))
Füllen Sie die neu erstellte Tabelle mit den notwendigen Daten.
insert into ba values (310, 'n', 'n', 'j', 'auto') ...
select ma.name,ma.vorname,ab.abt,ab.funktion from ma,ab where ma.id = ab.leiter
select ma.id,ma.name,ma.vorname,ma.abt,ma.gehalt from ma,ab,ma as ma2 where ma.abt = ab.abt and ma2.id = ab.leiter and ma.id <> ma2.id and ma.gehalt >= ma2.gehalt
Die eben vorgestellte Lösung geht von der Mitarbeitertabelle aus und sucht zunächst den Abteilungsleiter. Das geschieht folglich für jeden Mitarbeiter, was überflüssig ist. Eine (hoffentlich) optimale Lösung ist
select ma2.id,ma2.name,ma2.vorname,ma2.abt,ma2.gehalt from ab,ma,ma as ma2 where ab.leiter = ma.id and ab.abt = ma2.abt and ab.leiter <> ma2.id and ma.gehalt <= ma2.gehalt
, die zunächst die relevanten Daten der Abteilungsleiter (im wesentlichen sein Gehalt) ermittelt und dann mit allen Mitarbeitern vergleicht (die dann aus ma2 genommen werden). Gute Datenbanksysteme versuchen, optimale Zugriffswege zu Datenbanken zu ermitteln und so die Ausführungszeiten zu minimieren. Passiert dies nicht, so kann die Art, in der eine Anfrage formuliert ist, sogar über die Durchführbarkeit entscheiden...
select ma.vorname, ma.name, ma.id, ma.abt from ab,ma,ba where ab.leiter = ma.id and ab.leiter = ba.ma_id
select ma.vorname,ma.name from ba,ma where ma.id = ba.ma_id and ba.rudern = 'n' and ba.volley = 'n' and ba.fahrzeug = 'auto'
select ma.abt, count(*) from ba,ma where ma.id = ba.ma_id and ba.volley = 'j' group by ma.abt order by ma.abt
select ma.abt,ma.vorname,ma.name from ba,ma where ma.id = ba.ma_id and ba.volley = 'j' order by ma.abt
xmsql -h nats13 xamtrup "select ma.abt from \ ba,ma \ where ma.id = ba.ma_id and \ ba.volley = 'j' \ order by ma.abt" | \ uniq -c
Author: | Jan W. Amtrup |
Document: | |
Last modified: |