Join Intuitivt: Skjøte sammen to relasjoner R S C Intuitivt: 1. Beregn R S 2. Velg ut de tuplene som tilfredsstiller joinbetingelsen C
Join Bistro bn mkat A kosher A vegetabilsk B uten melk B hallal B glutenfri B kosher C glutenfri C hallal C kosher D vegetabilsk Krav navn mkat Ali hallal Liv kosher Lise kosher Geir glutenfri Bistro C Krav bn Bistro.mkat navn Krav.mkat B hallal Ali hallal C hallal Ali hallal A kosher Liv kosher B kosher Liv kosher C kosher Liv kosher A kosher Lise kosher B kosher Lise kosher C kosher Lise kosher B glutenfri Geir glutenfri C glutenfri Geir glutenfri C: Bistro.mkat = Krav.mkat
Naturlig join R Ser relasjonen som fås fra R og S ved å danne alle mulige sammensmeltinger av ett tuppel fra R med ett fra S der tuplene skal stemme overens i samtlige attributter med sammenfallende navn Fellesattributtene forekommer bare én gang i de sammensmeltede attributtene Resultatskjemaet har attributtene i R etterfulgt av de attributtene i S som ikke også forekommer i R
Naturlig join Bistro bn A A B B B B C C C D mkat kosher vegetabilsk uten melk hallal glutenfri kosher glutenfri hallal kosher vegetabilsk Krav navn Ali Liv Lise Geir mkat hallal kosher kosher glutenfri Bistro Krav bn mkat navn B hallal Ali C hallal Ali A kosher Liv B kosher Liv C kosher Liv A kosher Lise B kosher Lise C kosher Lise B glutenfri Geir C glutenfri Geir
Denne bruker lang t i d : select ( fp. filmid ) from filmparticipation fp, filmparticipation x where fp. filmid = x. filmid and fp. filmid not in ( select y. filmid from filmparticipation y where fp. filmid = y. filmid and y. parttype = director ) ; 32227986
Denne er riktigere : fdb=> select ( distinct filmid ) fdb > from filmparticipation fp fdb > natural join filmitem f i fdb > where filmtype = C fdb > and not exists fdb > ( select filmid fdb( > from filmparticipation x fdb( > where fp. filmid = x. filmid fdb(> and x. parttype = director ) ; 31157
antall filmer i filmparticipation som har regissør select ( distinct filmid ) from filmparticipation fp natural join filmitem f i where filmtype = C and exists ( select filmid from filmparticipation x where fp. filmid = x. filmid and x. parttype = director ) ; 330490
antall filmer i filmparticipation som ikke har regissør select ( distinct filmid ) from filmparticipation fp natural join filmitem f i where filmtype = C and not exists ( select filmid from filmparticipation x where fp. filmid = x. filmid and x. parttype = director ) ; 31157
filmer med i Filmparticipation select ( distinct filmid ) hvorfor d i s t i n c t? from filmparticipation fp ; 934752 uten d i s t i n c t : 10835351
filmer med i Film select ( distinct filmid ) hvorfor d i s t i n c t? from film ; 692361
antall filmer i filmparticipation som ikke finnes i film select ( distinct filmid ) from filmparticipation fp where filmid not in ( select filmid from film ) ; svært tidkrevende hvorfor? denne er bedre antall filmer i filmparticipation som ikke finnes i film select ( distinct filmid ) from filmparticipation fp where not exists ( select f. filmid from film f where fp. filmid = f. filmid ) ; 455223
filmer i Film som ikke er i Filmparticipation select ( distinct filmid ) from film f where not exists ( select f. filmid from filmparticipation fp where fp. filmid = f. filmid ) ; 212832
filmer med i begge select ( distinct filmid ) from film natural join filmparticipation ; 479529
Hengetupler Når vi joiner to tabeller, kaller vi et tuppel som ikke har noen match i den andre relasjonen, et hengetuppel Hengetupler blir ikke med i resultatet av en (vanlig) join, også kalt en inner join Hvis vi ønsker å gjøre en join hvor vi beholder hengetuplene fra en eller begge tabellene, bruker vi en outer join
Hengetupler Et hengetuppel er et tuppel i en av relasjonene som ikke har noe matchende tuppel i den andre relasjonen Hengetupler får ingen representant i resultatrelasjonen etter en join
Hengetupler Bistro bn A A B B B B C C C D mkat kosher vegetabilsk uten melk hallal glutenfri kosher glutenfri hallal kosher vegetabilsk Krav navn Ali Liv Lise Geir mkat hallal kosher kosher glutenfri Hengetupler satt med grå typer i Bistro-relasjonen Bistro Krav bn mkat navn B hallal Ali C hallal Ali A kosher Liv B kosher Liv C kosher Liv A kosher Lise B kosher Lise C kosher Lise B glutenfri Geir C glutenfri Geir
Left outer join Syntaks for en left outer join er slik: select <svar attributter > from tabell 1 left outer join tabell 2 on join betingelse ; Resultatet blir en join av tabell-1 og tabell-2, pluss en linje for hvert hengetuppel i tabell-1 der alle svar-attributtene fra tabell-2 er null Eventuelle hengetupler fra tabell-2 blir ikke med i resultatet
select ( distinct f. filmid ) from film f left outer join filmparticipation p on f. filmid = p. filmid ; 692361
antall filmer som kun er i Film select ( f. filmid ) from film f left outer join filmparticipation p on f. filmid = p. filmid where p. filmid is NULL; 212832
select ( x. * ) from ( ( select filmid from film ) except ( select distinct filmid from filmparticipation ) ) as x ; 212832
Right outer join Syntaks for en right outer join er slik: select <svar attributter > from tabell 1 right outer join tabell 2 on join betingelse ; Resultatet blir en join av tabell-1 og tabell-2, pluss en linje for hvert hengetuppel i tabell-2 der alle svar-attributtene fra tabell-1 er null Eventuelle hengetupler fra tabell-1 blir ikke med i resultatet
select ( distinct p. filmid ) from film f right outer join filmparticipation p on f. filmid = p. filmid ; 934752 pass på kvalifikasjonen bak d i s t i n c t. Ikke likegyldig om p. e l
antall filmer som kun er i Filmparticipation select ( distinct p. filmid ) from film f right outer join filmparticipation p on f. filmid = p. filmid where f. filmid IS NULL; 455223
Full outer join Syntaks for en full outer join er slik: select <svar attributter > from tabell 1 full outer join tabell 2 on join betingelse ; Resultatet blir en join av tabell-1 og tabell-2, pluss en linje for hvert hengetuppel i tabell-1 der alle svar-attributtene fra tabell-2 er null og en linje for hvert hengetuppel i tabell-2 der alle svar-attributtene fra tabell-1 er null
select ( distinct p. filmid ) + ( distinct from film f full outer join filmparticipation p on f. filmid = p. filmid ; f. filmid ) as ant antall 1627113 dette er for mange, vi har få t t med s n i t t e t to ganger, så trek filmer med i begge select ( distinct filmid ) from film natural join filmparticipation ; 479529 1627113 479529 = 1147584
antall filmer som er med i en av tabellene, men ikke i begge select ( distinct x. * ) from ( ( ( select filmid from film ) union ( select distinct filmid from filmparticipation ) ) except ( select distinct filmid from film natural join filmparticipation ) ) as x ; 668055 (1147584 668055 = 479529 )
antall filmid med i en, men ikke i begge select ( distinct p. filmid ) + ( distinct from film f full outer join filmparticipation p on f. filmid = p. filmid where f. filmid is null or p. filmid is null ; f. filmid ) as ant antall 668055