dbwebb-se / databas

Course repo for database course (dbw).
Other
4 stars 2 forks source link

Visuell representation av INNER och OUTER JOIN #46

Open mosbth opened 2 years ago

mosbth commented 2 years ago

När man lär sig joina tabeller kan det ibland underlätta om man har en visuell representation av hur en JOIN fungerar på två tabeller. Här är resurser som kan hjälpa med det.

Vanliga JOINS

Normalt sett är det tre vanliga JOINS man jobbar med inledningsvis när man lär sig databaser.

  1. INNER JOIN (visa de rader från tabellerna som matchar villkoret)
  2. LEFT [OUTER] JOIN (visa alla rader i vänstra tabellen samt de rader från högra tabellen som matchar villkoret)
  3. RIGHT [OUTER] JOIN (visa alla rader i högra tabellen samt de rader från vänstra tabellen som matchar villkoret)

LEFT och RIGHT OUTER är alltså samma sak, skillnaden är bara vilken tabell man utgår ifrån och där man vill se alla värden, även de rader som inte matchar villkoret.

Detaljer om vilka varianter av JOIN som stöds i databasen kan studeras i manualen.

Resurser för JOIN

Exempel på visuell förklaring av JOIN med Venn diagram som visar en logisk relation mellan två mängder.

Visual_SQL_JOINS_orig

dyqnzpuddxk21

SQL_Joins svg

Fler sätt att utföra JOIN

CROSS JOIN

För alla rader i tabell A, matcha alla rader i tabell B.

Om tabell A har 3 rader och tabell B har 5 rader, kommer resultatet att ha 3 x 5 = 15 rader.

Detta är som en INNER JOIN utan villkor. Lägg till villkoret för att göra det till en INNER JOIN.

NATURAL JOIN

JOINS där kolumnerna har samma namn. Matchning mellan raderna sker baserat på kolumnernas namn. Inget annat villkor används.

FULL OUTER JOIN

FULL OUTER JOIN returnerar ett resultset som inkluderar rader från både vänster och höger tabell.

När det inte finns några matchande rader i den vänstra tabellen, kommer kolumnerna i den högra tabellen att innehålla NULL. På samma sätt, när det inte finns några matchande rader i den högra tabellen, kommer kolumnen i den vänstra tabellen att innehålla NULL.

FULL OUTER JOIN stöds inte i MariaDB eller MySQL men du löser det med två OUTER JOINS som du utför en UNION eller UNION ALL på.

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id

Eller använd UNION ALL för att undvika dubbletter av rader i resultatuppsättningen.

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NULL
mosbth commented 2 years ago

Fick ett tips om en video som visar exempel på JOIN. Den verkade rätt bra och tydlig. https://www.youtube.com/watch?v=zGSv0VaOtR0