1. ANSI Jointyper
Syntaxen för jointyp är för ANSI-SQL följande:
INNER | {LEFT | RIGHT | FULL} [OUTER] | CROSS
|
Defaultvärdet är INNER. De olika jointyperna beskrivs på följande sätt:
- Equi Join:INNER: Med denna join matchas alla identiska värden mellan två kolumner. Endast de rader där samma vädrde finns i båda kolumnerna i båda tabellerna returneras som svar.
- Equi Join:LEFT OUTER: Som ovan men alla rader från den vänstra tabellen som inte gick att matcha läggs till i resultatet.
- Equi Join:RIGHT OUTER: Som ovan men alla rader från den högra tabellen som inte gick att matcha läggs till i resultatet.
- Equi Join:FULL OUTER: Som ovan men alla rader från den högra och den vänstra tabellen som inte gick att matcha läggs till i resultatet.
- Cross Join:CROSS: Alla rader i den ena tabellen matchas mot alla rader i den andra tabellen.
I följande exempel kommer vi att använda dessa tabeller:
Tabellerna har följande innehåll:
SQL> SELECT * FROM dep;
DEP_PK DEP_NAME
---------- -----------------------
1 Ledningsgruppen
2 Java-utveckling
3 Microsoft-utveckling
4 Arkitektgruppen
5 Handläggare
SQL> SELECT * FROM emp;
EMP_PK DEP_PK FIRST_NAME LAST_NAME SALARY ID_NR
---------- ---------- ---------------- ---------------- ---------- ----------
1 1 Janne Svensson 50000 6712123223
2 2 Olle Kullberg 21000 7402191212
3 2 Per Johansson 23000 7507120101
4 2 Magnus Magnusson 32000 6609121101
5 Karl Alp 0
6 Bertil Svensson 0
6 rader.
|
2. INNER
INNER JOIN är den operation som används per default om inget annat anges. I exemplet nedan använder man INNER JOIN för att hämta avdelningsnamnet ur tabellen dep.
SQL> SELECT first_name, last_name, dep_name
FROM emp
JOIN dep ON(dep.dep_pk=emp.dep_pk);
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Olle Kullberg Java-utveckling
Per Johansson Java-utveckling
Magnus Magnusson Java-utveckling
|
Här visas bara de anställda som har en avdelning knuten till sig.
3. LEFT
Med LEFT JOIN kan man addera de rader från en tabell som inte kan matchas mot en rad i den andra tabellen. I exemplet nedan vill vi göra samma JOIN som ovan med skillnaden att vi vill se alla anställda i tabellen emp, oavsett om det finns en matchning i tabellen dep eller ej:
SQL> SELECT first_name, last_name, dep_name
FROM emp
LEFT OUTER JOIN dep ON(emp.dep_pk=dep.dep_pk);
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Magnus Magnusson Java-utveckling
Per Johansson Java-utveckling
Olle Kullberg Java-utveckling
Bertil Svensson
Karl Alp
6 rader.
|
Nyckelordet OUTER är frivilligt.
4. RIGHT
RIGHT JOIN fungerar precis som LEFT JOIN fast man adderar rader från den andra tabellen. Därför behöve man faktiskt aldrig använda RIGHT JOIN, alla satser kan ju skrivas om som LEFT JOIN genom att man byter plats på tabellerna. I exemplet nedan vill vi att alla avdelningar i dep ska visas, oavsett om de har några anställda som jobbar där:
SQL> SELECT first_name, last_name, dep_name
FROM emp
RIGHT OUTER JOIN dep ON(emp.dep_pk=dep.dep_pk);
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Olle Kullberg Java-utveckling
Per Johansson Java-utveckling
Magnus Magnusson Java-utveckling
Handläggare
Arkitektgruppen
Microsoft-utveckling
7 rader.
|
Nyckelordet OUTER är frivilligt.
5. FULL
FULL JOIN är LEFT JOIN kombinerat med RIGHT JOIN. :
SQL> SELECT first_name, last_name, dep_name
FROM emp
FULL OUTER JOIN dep ON(emp.dep_pk=dep.dep_pk);
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Magnus Magnusson Java-utveckling
Per Johansson Java-utveckling
Olle Kullberg Java-utveckling
Bertil Svensson
Karl Alp
Handläggare
Arkitektgruppen
Microsoft-utveckling
9 rader.
|
Nyckelordet OUTER är frivilligt.
6. CROSS
CROSS JOIN innebär helt enkelt att man kombinerar alla rader i den ena tabellen med alla rader i den andra tabellen, en så kallad kartesisk produkt. Antal rader man får som resultat beräknas enligt följande:
Antal rader i resultatet = Antal rader i tabell 1 * Antal rader i tabell 2
|
Denna typ av join används sällan, eftersom operationen är trivial och inte säger speciellt mycket. Den relation som med primär nyckel och referensnyckel kopplar samman tabellerna används inte ens.
Ett exempel:
SQL> SELECT first_name, last_name, dep_name
FROM emp
FULL CROSS JOIN dep;
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Janne Svensson Ledningsgruppen
Olle Kullberg Ledningsgruppen
Per Johansson Ledningsgruppen
Magnus Magnusson Ledningsgruppen
Karl Alp Ledningsgruppen
Bertil Svensson Ledningsgruppen
Janne Svensson Java-utveckling
Olle Kullberg Java-utveckling
Per Johansson Java-utveckling
Magnus Magnusson Java-utveckling
Karl Alp Java-utveckling
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Bertil Svensson Java-utveckling
Janne Svensson Microsoft-utveckling
Olle Kullberg Microsoft-utveckling
Per Johansson Microsoft-utveckling
Magnus Magnusson Microsoft-utveckling
Karl Alp Microsoft-utveckling
Bertil Svensson Microsoft-utveckling
Janne Svensson Arkitektgruppen
Olle Kullberg Arkitektgruppen
Per Johansson Arkitektgruppen
Magnus Magnusson Arkitektgruppen
FIRST_NAME LAST_NAME DEP_NAME
---------------- ---------------- -----------------------
Karl Alp Arkitektgruppen
Bertil Svensson Arkitektgruppen
Janne Svensson Handläggare
Olle Kullberg Handläggare
Per Johansson Handläggare
Magnus Magnusson Handläggare
Karl Alp Handläggare
Bertil Svensson Handläggare
30 rader.
|