Omslaget. Klicka här för att gå till bokens hemsida.

Databasteknik: Svar till övningar - kapitel 7

Övning 1

Tabeller, med primärnyckeln understruken: Referensattribut:

Övning 2

create table Sokord
(Id integer not null primary key,
Ord varchar(20) not null unique);

create table Webbsida
(Id integer not null primary key,
Adress varchar(200) not null unique);

create table Finns
(Sokord integer not null references Sokord(Id),
Webbsida integer not null references Webbsida(Id),
primary key(Sokord, Webbsida));
Här är lite praktiska exempeldata om man vill provköra:
insert into Sokord values (1, 'apa');
insert into Sokord values (2, 'bil');
insert into Sokord values (3, 'Cecilia');
insert into Sokord values (4, 'flogiston');
insert into Sokord values (5, 'struts');
insert into Sokord values (6, 'svamp');
insert into Sokord values (7, 'Zorro');
insert into Sokord values (8, 'och');
insert into Sokord values (9, 'universitet');

insert into Webbsida values (1, 'www.apbil.se');
insert into Webbsida values (2, 'www.zorrosvamp.se');
insert into Webbsida values (3, 'www.ingenting.se');
insert into Webbsida values (4, 'www.flogiston.se');
insert into Webbsida values (5, 'www.flogistonstruts1.se');
insert into Webbsida values (6, 'www.flogistonstruts2.se');
insert into Webbsida values (7, 'www.struts.se');
insert into Webbsida values (8, 'http://www.uu.se/');
insert into Webbsida values (9, 'http://www.databasteknik.se/');

insert into Finns values (1, 1);
insert into Finns values (2, 1);
insert into Finns values (6, 2);
insert into Finns values (7, 2);
insert into Finns values (4, 4);
insert into Finns values (4, 5);
insert into Finns values (5, 5);
insert into Finns values (4, 6);
insert into Finns values (5, 6);
insert into Finns values (5, 7);
insert into Finns values (9, 8);

insert into Finns values (8, 1);
insert into Finns values (8, 2);
insert into Finns values (8, 5);
insert into Finns values (8, 6);
insert into Finns values (8, 7);
insert into Finns values (8, 8);

Övning 3

select Id
from Webbsida
where Adress = 'http://www.databasteknik.se/';

Övning 4

Som en flat fråga, dvs utan någon underfråga i where-villkoret:
select Webbsida.Adress
from Sokord, Finns, Webbsida
where Sokord.Id = Finns.Sokord
and Finns.Webbsida = Webbsida.Id
and Sokord.Ord = 'flogiston';
Alternativt kan man skriva frågan med nästlade underfrågor i where-villkoret:
select adress
from Webbsida
where Id in (select Webbsida
             from Finns
             where Sokord in (select Id
                              from Sokord
                              where Ord = 'flogiston'));

Övning 5

Som en flat fråga, dvs utan någon underfråga i where-villkoret:
select Webbsida.Adress
from Sokord, Finns, Webbsida
where Sokord.Id = Finns.Sokord
and Finns.Webbsida = Webbsida.Id
and Sokord.Ord like 'flo%';
Alternativt kan man skriva frågan med nästlade underfrågor i where-villkoret:
select adress
from Webbsida
where Id in (select Webbsida
             from Finns
             where Sokord in (select Id
                              from Sokord
                              where Ord like 'flo%'));

Övning 6

select Sokord.Ord
from Sokord, Finns, Webbsida
where Sokord.Id = Finns.Sokord
and Finns.Webbsida = Webbsida.Id
and Webbsida.Adress = 'http://www.uu.se/';
eller
select Ord
from Sokord
where Id in (select Sokord
             from Finns
             where Webbsida in (select Id
                               from Webbsida
                               where adress = 'http://www.uu.se/'));

Övning 7

Det här är enklast med en nästlad fråga. Byt ut id in i övning 4 mot id not in:
select adress
from Webbsida
where Id not in (select Webbsida
                 from Finns
                 where Sokord in (select Id
                                  from Sokord
                                  where Ord = 'flogiston'));
Det är svårt att ställa den här typen av "Finns inte"-frågor utan underfrågor. Följande försök är fel, och ger i stället alla webbsidor som innehåller åtminstone något ord som inte är flogiston:
select Webbsida.Adress
from Sokord, Finns, Webbsida
where Sokord.Id = Finns.Sokord
and Finns.Webbsida = Webbsida.Id
and Sokord.Ord <> 'flogiston';

Övning 8

select adress
from Webbsida
where Id in (select Webbsida
             from Finns
             where Sokord in (select Id
                              from Sokord
                              where Ord = 'flogiston'))
  and Id in (select Webbsida
             from Finns
             where Sokord in (select Id
                              from Sokord
                              where Ord = 'struts'));
Notera att vi söker efter två olika ord (flogiston och struts), och då måste vi söka två gånger i tabellerna Sokord och Finns. I lösningen ovan gör vi det med två separata underfrågor i where-villkoret, men om man vill skriva frågan utan underfrågor måste man ha två olika alias för såväl Sokord som Finns:
select adress
from Webbsida, Finns as f1, Sokord as s1,
               Finns as f2, Sokord as s2
where Webbsida.Id = f1.Webbsida and f1.Sokord = s1.Id and s1.Ord = 'flogiston'
and Webbsida.Id = f2.Webbsida and f2.Sokord = s2.Id and s2.Ord ='struts';
Ett vanligt fel: Skriv inte en fråga som kräver att samma ord samtidigt är lika med både flogiston och struts, som till exempel det här felaktiga försöket:
select adress
from Webbsida, Finns, Sokord
where Webbsida.Id = Finns.Webbsida and Finns.Sokord = Sokord.Id
and Sokord.Ord = 'flogiston'
and Sokord.Ord = 'struts';
Den frågan ger förstås alltid noll rader i svaret, eftersom samma ord aldrig samtidigt kan vara lika med både flogiston och struts.

Övning 9

Byt ut and id in i övning 8 mot or id in:
select adress
from Webbsida
where id in (select Webbsida
             from Finns
             where Sokord in (select id
                              from Sokord
                              where Ord = 'flogiston'))
  or id in (select Webbsida
             from Finns
             where Sokord in (select id
                              from Sokord
                              where Ord = 'struts'));

Övning 10

Byt ut and id in i övning 8 mot and id not in:
select adress
from Webbsida
where id in (select Webbsida
             from Finns
             where Sokord in (select id
                              from Sokord
                              where Ord = 'flogiston'))
and id not in (select Webbsida
               from Finns
               where Sokord in (select id
                                from Sokord
                                where Ord = 'struts'));

Övning 11

select Ord
from Sokord
where id not in (select Sokord
                 from Finns);


Av Thomas Padron-McCarthy (e-post: boken@databasteknik.se)
Senaste ändring: 22 juli 2005