SQL

Normalisering

Reduce data redundancy and improve data integrity

Vi ska normalisera våra databaser för att undvika att lagra för mycket data

Samt att undvika såkallade anomalies

Normaliserad

Anomaly == avvikelse

Om vi duplicerar denna data så utsätts informationen för risker

  • Update anomaly
  • Insertion anomaly
  • Deletion anomaly
  • Normalisering innebär att man delar upp tabeller så att riskerna elimineras.

Normalised

Eventull risk

Födelsedagen behöver aldrig ändras men kan råka göra det ändå

Normalisering

Viktigt att dela upp data i olika tabeller för att undvika avvikelser

Det svåra är att sedan sätta ihop tabellerna igen för att få det resultat man söker

Med SELECT så hämtar vi enbart data och skapar tillfälliga NYA kolumner. Inget i databasen modifierar.

Diskussion i par/grupp

Vilka kolumner och tabeller behövs för följande:

  1. Instagram-post
  2. Skolans register på personerna i FEND16: kontaktinfo, kurser etc.

Övergripande struktur, inte så detaljerat

Använd excel, sheets, paint, papper & penna etc.

När ni är klara, jämför med en annan grupp.

JOINS

Alla JOINS skapar en ny tabell som innehåller alla kolumner från både den första och den andra tabellen. Det som skiljer JOINS är vilka rader som tas med.

  • CROSS - alla rader (behövs inga gemensamma kolumner)
  • INNER - alla rader där värdet i en gemensam kolumn stämmer överens
  • LEFT - alla rader från en INNER JOIN plus även de från den "vänstra" tabellen som inte matchar något i den högra
  • RIGHT - som en LEFT JOIN fast tvärtom

Alla joins utgår ifrån CROSS JOIN

SELECT *
FROM books
INNER JOIN authors 
ON books.author = authors.author

JOINS

JOINS hör till FROM-delen i en SELECT-query och är det första som händer när databasen hämtar data.

WHERE, SELECT och GROUP BY kommer senare.

Bra att ha grejer

Namngivna tabeller

SELECT * FROM authors AS a;
SELECT * FROM authors a;

Blir användbart när vi har flera olika tabeller! Mindre att skriva

Aggregate functions

CONCAT() - Lägger ihop strängar

AVG() - Tar ut medelvärdet

MAX() - Tar ut maxvärdet

MIN() - Tar ut minvärdet

Det finns alltid flera olika sätt att lösa alla SQL-queries

SELECT * FROM city ORDER BY population ASC LIMIT 1;

GROUP BY

När man aggregerar (count, avg, max, min) måste man ibland gruppera efter olika kolumner

Vad händer när ni använder MAX(); för att få ut flera maxvärden

SELECT author, COUNT(books) AS books FROM books;
SELECT author, COUNT(books) AS books FROM books GROUP BY author;