---
title: "vad är skillnaden mellan Inner-, left- och right join????"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/21929-vad-är-skillnaden-mellan-inner-left-och-right-join"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "mikul"
published: "2002-02-08T23:44:00.000Z"
updated: "2002-02-09T21:20:00.000Z"
replies: 9
views: 2741
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/21929-vad-är-skillnaden-mellan-inner-left-och-right-join"
---

# vad är skillnaden mellan Inner-, left- och right join????

## #1 — mikul, 2002-02-08T23:44Z

jag hade precis tänkt att lär mig join... men jag fattade inte vad skillnaden var...
kan någon förklara lite närmare för mig?

/ Mikul

Permalänk: https://www.webforum.nu/p/21929

## #2 — LarsG, 2002-02-09T00:08Z

Sök, jag har nog förklarat det 5 gånger i olika inlägg.

Permalänk: https://www.webforum.nu/p/353876

## #3 — mikul, 2002-02-09T00:13Z

ok.... ska försöka...

/ Mikul

Permalänk: https://www.webforum.nu/p/353877

## #4 — mikul, 2002-02-09T00:56Z

hej igen...

jag lyckas facktiskt inte hitta nåt inlägg som förklarar skillnaden mellan left, right och inner join...
du har inte lust att skriva lite snabbt om det i alla fall??

/ Mikul

Permalänk: https://www.webforum.nu/p/353878

## #5 — LarsG, 2002-02-09T13:07Z

Skillnad mellan inner join och outer join

En inner join mellan två tabeller kan skrivas på flera sätt, dessa två är de
vanligaste

```
   select  DESCRIPTION, COST
     from  CHARGES, BILL
    where  BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
      and  RESERVATION = 1349
```

```
   select  DESCRIPTION, COST
     from  CHARGES inner join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
    where  RESERVATION = 1349
```

 

Dvs returnera alla poster där värdena i kolumnen BILL.CHARGE_CODE är lika med
värdena CHARGES.CHARGE_CODE och charges.RESERVATION  har värdet 1349

Resultat

```
[red]
DESCRIPTION   COST

ROOM          800
CAR PARK      70
MISCELLANEOUS 30

    3 rows found
```

Att skriva villkoret i from eller i where är bara en syntaktisk skillnad och har
ingen betydelse för prestanda. Man anger bara vilka poster man vill ha och inte hur
dessa skall hämtas.

I exemplen så använder jag = i villkoret. Det kallas för en equi-join och är det
absoluta vanligaste, men man kan använda vilka villkor som helst och ha komplexa 
uttryck med and och or.

Eftersom resultatet av en join är en tabell så går det att joina detta resultat 
med en annan tabell

```
     select GUEST_LNAME,GUEST_FNAME,DESCRIPTION,COST
       from BOOK_GUEST as BG,CHARGES as C,BILL as B
      where BG.RESERVATION = 1349
        and BG.RESERVATION = C.RESERVATION
        and C.CHARGE_CODE = B.CHARGE_CODE
```

Resultat

```
[red]
GUEST_LNAME   GUEST_FNAME  DESCRIPTION   COST

HESTSON       ANNIKA       ROOM          800
HESTSON       ANNIKA       CAR PARK      70
HESTSON       ANNIKA       MISCELLANEOUS 30

    3 rows found 
[/red]
```

En left outer join anges alltid i from och kan se ut så här

```
   select DESCRIPTION, COST
     from CHARGES left outer join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
    and RESERVATION = 1349
```

Resultat

```
DESCRIPTION   COST

ROOM          800
CAR PARK      70
MISCELLANEOUS 30
LAUNDRY       <null>
MINI BAR      <null>
RESTAURANT    <null>

    6 rows found 
[/red]
```

Skillnaden mot en inner join är att man får alla rader från den tabellen som står
till vänster i joinklausulen. Om det finns poster i den högra tabellen som uppfyller 
joinvillkoret så får man dessa annars så får man en post med null i de kolumner som 
kommer från den högra tabellen. 

Det är ingen egentlig skillnad mellan en left outer join och en right outer join. Man
kan skriva om ovanstående left outer join som en right outer join

```
   select DESCRIPTION, COST
     from BILL right outer join CHARGES on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
    and RESERVATION = 1349
```

 

som ger samma resultat. 

Det går att kombinera inner join och outer join

```
     select GUEST_LNAME,GUEST_FNAME,DESCRIPTION,COST
       from (BOOK_GUEST BG inner join CHARGES C on BG.RESERVATION = C.RESERVATION)
       left outer join BILL B on C.CHARGE_CODE = B.CHARGE_CODE
      where BG.RESERVATION = 1349
```

I det här fallet så är det inte speciellt relevant eftersom det kommer att bli samma
resultat som om det varit enbart inner join. (Varför?)

Det finns även några andra typer av join som omnämns, de är dock inte så vanligt att
olika databashanterare har stöd för dem

Natural join innebär att man joinar på alla kolumner med samma namn i de båda tabellerna. 

```
      select DESCRIPTION,COST
        from CHARGES natural join BILL
```

eller

```
      select DESCRIPTION,COST
        from CHARGES natural left join BILL
```

Enligt sql-standard så kan man utelämna orden inner och outer, men det verkar vara några
dbms som trots det kräver att man anger dem.

Cross join innebär att man får kryssprodukten av alla rader i de båda tabellerna

```
      select *
        from CHARGES cross join BILL
```

Full join är unionen av en left join och right join mellan två tabeller

```
      select *
        from CHARGES full join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
```

Man får alla poster som uppfyller join-villkoret, alla poster i den vänstra tabellen
som inte uppfyller villkoret och alla poster i den högra tabellen som inte uppfyller
villkoret.

Den kan också skrivas som

```
     select DESCRIPTION, COST
       from CHARGES left outer join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
   where CHARGES.CHARGE_CODE is null
     union all
     select DESCRIPTION,COST
        from CHARGES inner join BILL 
on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
    union all
     select DESCRIPTION, COST
       from CHARGES right outer join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
 where BILL.CHARGE_CODE is null
```

Permalänk: https://www.webforum.nu/p/353879

## #6 — mikul, 2002-02-09T15:14Z

Tack så mycket LarsG...
nu fattar jag lite mer i alla fall...
men  det är fortfarande några saker som är oklart för mig och som jag inte riktigt fattade vad du menade med...
exempelvis:
vad menar du med "kryssprodukten"?
och sen fattade jag inte extákt vad outer left/right join gör som inte inner join gör och tvärtom...

förlåt om jag är jobbig, men det måste ju finnas dumma människor oxå om det ska finnas smarta... ;-)

/ Mikul

Permalänk: https://www.webforum.nu/p/353880

## #7 — LarsG, 2002-02-09T16:54Z

Kryssprodukt innebär att du får alla möjliga kombinationer av poster från båda tabellerna.

Jag tänkte att detta skulle beskriva skillnaden

> Skillnaden mot en inner join är att man får alla rader från den tabellen som står
> till vänster i joinklausulen. Om det finns poster i den högra tabellen som uppfyller 
> joinvillkoret så får man dessa annars så får man en post med null i de kolumner som kommer från den högra tabellen. 
>
> Det är ingen egentlig skillnad mellan en left outer join och en right outer join. Man kan skriva om ovanstående left outer join som en right outer join

Vad är det som är oklart?

Permalänk: https://www.webforum.nu/p/353881

## #8 — mikul, 2002-02-09T17:29Z

> man får alla rader från den tabellen som står till vänster i joinklausulen.

 
vilken är den vänstra resp högra i den här koden:

```
select field1, field2
from table1 left outer join table2 on table2.field3 = table1.field3
and field4 = 'fråga'
```

och vad menar du med "joinklausulen"?

sen tror jag att jag fattade resten...

nu ska jag åka och bowla :D jippi! cu!

/ Mikul

Permalänk: https://www.webforum.nu/p/353882

## #9 — LarsG, 2002-02-09T17:34Z

table1 är vänstra

join-klausul är hela uttrycket

```
table1 left outer join table2 on table2.field3 = table1.field3
and field4 = 'fråga'
```

Permalänk: https://www.webforum.nu/p/353883

## #10 — mikul, 2002-02-09T21:20Z

Tack så mycket LarsG...
nu fattar jag lite mer i allafall... tror jag...hehe...

jag skickade ett mail till dig för ett tag sedan...
men du svarade inte...
du kan ju ta en titt om dy hittar nåt gammalt mail från mikul@allehanda.net som ligger och skräpar...
;)

ha det så bra så länge..

/ Mikul

Permalänk: https://www.webforum.nu/p/353884

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/21929-vad-är-skillnaden-mellan-inner-left-och-right-join
