Här är lite praktiska exempeldata om man vill provköra: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));
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);
select Id from Webbsida where Adress = 'http://www.databasteknik.se/';
Alternativt kan man skriva frågan med nästlade underfrågor i where-villkoret:select Webbsida.Adress from Sokord, Finns, Webbsida where Sokord.Id = Finns.Sokord and Finns.Webbsida = Webbsida.Id and Sokord.Ord = 'flogiston';
select adress
from Webbsida
where Id in (select Webbsida
from Finns
where Sokord in (select Id
from Sokord
where Ord = 'flogiston'));
Alternativt kan man skriva frågan med nästlade underfrågor 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%';
select adress
from Webbsida
where Id in (select Webbsida
from Finns
where Sokord in (select Id
from Sokord
where Ord like 'flo%'));
ellerselect Sokord.Ord from Sokord, Finns, Webbsida where Sokord.Id = Finns.Sokord and Finns.Webbsida = Webbsida.Id and Webbsida.Adress = 'http://www.uu.se/';
select Ord
from Sokord
where Id in (select Sokord
from Finns
where Webbsida in (select Id
from Webbsida
where adress = 'http://www.uu.se/'));
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';
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:
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.select adress from Webbsida, Finns, Sokord where Webbsida.Id = Finns.Webbsida and Finns.Sokord = Sokord.Id and Sokord.Ord = 'flogiston' and Sokord.Ord = 'struts';
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'));
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'));
select Ord
from Sokord
where id not in (select Sokord
from Finns);