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/'));
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 adress from Webbsida where Id not in (select Webbsida from Finns where Sokord in (select Id from Sokord where Ord = 'flogiston'));
select Webbsida.Adress from Sokord, Finns, Webbsida where Sokord.Id = Finns.Sokord and Finns.Webbsida = Webbsida.Id and Sokord.Ord <> 'flogiston';
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 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'));
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 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';
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);