Eksempler: Subqueries

EksempelDB: Kursregister

person

personid navn
1 Per Olsen
2 Anne Evensen
3 Hans Jensen
4 Inger Karlsen
5 Hans Nilsen
6 Janne Elise Julsen

kurs

kursid navn
1 Matematikk
2 Datakommunikasjon
3 Databaser
4 Matematikk II
5 Programmering for web
6 Engelsk fonetikk

elevKurs

kursid(FK->kurs) blokk elevid(FK->person)
1 1-02 1
1 1-02 2
1 1-03 4
2 2-02 2
2 4-03 3
2 4-03 4
3 6-03 3
4 5-03 4
5 2-03 2
5 2-03 4

laererKurs

kursid(FK->kurs) blokk laererid(FK->person)
1 1-02 5
1 1-03 1
2 2-02 6
2 4-03 6
3 6-03 1
4 5-03 5
5 2-03 6
5 6-04 NULL

Queries

Skriv ut kursid og kursnavn for kurs som ikke har noen lærer
SELECT DISTINCT kursid, navn
FROM kurs
WHERE kursid IN(SELECT kursid
                FROM laererKurs
                WHERE laererid IS NULL);
        
=>
kursid      navn                      
----------- ------------------------- 
5           Programmering for web

(1 row(s) affected)
        
Skriv ut kursid og kursnavn for kurs som aldri har hatt elever
SELECT DISTINCT k.kursid, navn
FROM kurs k, elevKurs e
WHERE k.kursid <> ALL(SELECT kursid
                      FROM elevKurs);
        
=>
kursid      navn                      
----------- ------------------------- 
6           Engelsk fonetikk

(1 row(s) affected)
        
Skriv ut navn på student, navn på kurs og hvilken blokk kurset går i for alle studenter som ble undervist av Janne Elise Julsen høsten 2002.
SELECT p.navn AS 'Navn, person', k.navn AS 'Kursnavn', e.blokk
FROM person p, kurs k, elevKurs e
WHERE e.elevid IN (SELECT DISTINCT kursid
                   FROM elevKurs
                   WHERE kursid <> (SELECT DISTINCT kursid
                                    FROM laererKurs l, person p
                                    WHERE navn = 'Janne Elise Julsen'
                                    AND (blokk = '1-02' OR blokk = '2-02' OR blokk = '3-02')
                                    AND l.laererid = p.personid)
                   AND (blokk = '1-02' OR blokk = '2-02' OR blokk = '3-02'))
AND (blokk = '1-02' OR blokk = '2-02' OR blokk = '3-02')
AND p.personid = e.elevid
AND k.kursid = e.kursid;
        
=>
Navn, person         Kursnavn                  blokk 
-------------------- ------------------------- ----- 
Per Olsen            Matematikk                1-02

(1 row(s) affected)
        

Elin K. Ajer Andreassen, 2004