Structured Query Language Kræsj-kurs SQL Structured Query Language Kræsj-kurs
SQL: Et deklarativt språk som i grovt trekk består av 3 deler: DDL DML DQL, som vi skal fokusere på idag
SQL: Flere standarder, mest brukt sql:1999. Flere dialekter mySQL har en egen, likner på standarden
DDL Brukes til å definere datastrukturen vår Sette skranker Triggere, etc Litt om dette, men i oblig 2 får vi ferdiglagede DS, eller forhåndsdefinerte DDL
DML Manipulerer dataen i strukturen vår IINSERT, UPDATE, DELETE
DQL Spør etter dataen vi vil ha fra DM SELECT FROM WHERE
mySQL Et relasjons-DBMS I utgangspunktet en ”boks” med tabeller Evolusjonen har gjort denne meget god
DQL:Relasjoner Vi samler dataene våre i relasjoner Vi kaller hver rad et tuppel Navnene ”øverst” kalles attributter Ingen tupler kan være identiske En relasjon bør inneholde en primærnøkkel Id# Navn Adresse Alder 1 Kari Bremnes Bremneslia 54 2 Viggo Hansen Nrk.no 67 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
DQL Hvordan skaffe til veie data;spørre etter den? Antar relasjonen heter personer Vil bruke SQL for å hente alle personene som står oppført Id# Navn Adresse Alder 1 Kari Bremnes Bremneslia 54 2 Viggo Hansen Nrk.no 67 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
SQL:SELECT Henter data ut fra relasjonen vår Kan hente all data eller bare en kolonne Skal vi hente ut et utvalg, må vi fortelle hvilke kolonner som skal hentes ut. Husker at kolonnene har navn etter attributter
SQL SELECT * FROM personer; * Betyr alle kolonner Id# navn Adresse Alder 2 Viggo Hansen Nrk.no 67 1 Kari Bremnes Bremneslia 54 4 Hanne Hansen Oslo 26 3 Trine Jensen Mo i Rana 22 * Betyr alle kolonner Id# Navn Adresse Alder 1 Kari Bremnes Bremneslia 54 2 Viggo Hansen Nrk.no 67 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
SQL:SELECT SELECT navn, Alder FROM personer; FROM personer Viggo Hansen 67 Kari Bremnes 54 Hanne Hansen 26 Trine Jensen 22 FROM personer WHERE Id = 3; Id# Navn Adresse Alder 1 Kari Bremnes Bremneslia 54 2 Viggo Hansen Nrk.no 67 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
SQL:SELECT SELECT a,b,c: FROM a [,b,c,d] WHERE (betingelse) Velger attributter fra relasjonen vår Kan også aggregere (mer om dette senere) FROM a [,b,c,d] Hvilken relasjon? (kan ha flere) WHERE (betingelse) ”Filtrerer” tuplene a < b, f = i g LIKE ’string’ (a< b) AND (f = i) (også or, not)
QUIZ: Hvordan velge alle som er under 30 år? SELECT * FROM personer WHERE Alder < 30 Hvordan gjøre om på denne relasjonen slik at vi kan velge f. eks alle kvinner? Id# Navn Adresse Alder 1 Kari Bremnes Bremneslia 54 2 Viggo Hansen Nrk.no 67 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26 Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
SQL Velge bare kvinner SELECT * FROM personer_m WHERE Kjønn = ’k’; WHERE Kjønn <> ’m’; Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
Aggregering Brukes i SELECT-clause sum, avg, min, max, cunt sum: summen av alle verdier i en kolonne avg: gjennomsnittet min: den minste verdien max: count: teller antall forekomster
SELECT sum() Vil finne sammenlagt alder Summen av kvinnenes alder? SELECT sum( Alder ) FROM personer_m; Summen av kvinnenes alder? SELECT sum( Alder ) FROM personer_m WHERE Kjønn = ’k’; Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
SELECT avg() Gjennomsnittet av alderen til samtlige SELECT avg( Alder ) FROM personer_m; Snittet til alderen av alle under 50 SELECT avg( Alder ) FROM personer_m WHERE Alder < 50; Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
SELECT min(), SELECT max() Alderen til yngste kvinnen SELECT min( Alder ) FROM personer_m WHERE kjønn = ’k’; Alderen til eldste mann SELECT max( Alder ) FROM personer_m WHERE kjønn = ’m’; Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
Hvor mange tupler? Hvor mange kvinner? Hvor mange under 30? SELECT count( * ) FROM personer_m; Hvor mange kvinner? SELECT count( * ) FROM personer_m WHERE Kjønn = ’k’; Hvor mange under 30? SELECT count( * ) FROM personer_m WHERE Alder < 30; Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26
Join Hva om Trine Jensen kjøper en leilighet til? Anakronistiske Trine gifter seg ..får enda et sted å bo Må da oppdatere alle oppføringer dersom relasjonen skal forbli konsistent Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26 Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Jensen Mo i Rana 22 4 Hanne Hansen Oslo 26 5 Bergen Id# Navn Adresse Alder Kjønn 1 Kari Bremnes Bremneslia 54 k 2 Viggo Hansen Nrk.no 67 m 3 Trine Hansen Mo i Rana 22 4 Hanne Hansen Oslo 26 5 Bergen 6
Join Deler opp tabellen (normaliserer) Id# Navn Alder Kjønn 1 Kari Bremnes 54 k 2 Viggo Hansen 67 m 3 Trine Jensen 22 4 Hanne Hansen 26 Deler opp tabellen (normaliserer) Et attributt fra adresser er relatert til personer_m Skal noen bytte navn, trenger vi kun å forandre tabell personer_m Skal noen ha nytt bosted, legger vi til et tuppel i Adresser Id# Adresse F_key 1 Bremneslia 2 Mo i Rana 3 Nrk.no 4 Oslo 5 Bergen 6
Hvordan ”joine” Vi trenger å vite om alias: SELECT p.id, p.Navn, a.Adresse FROM personer p, Adresse a Vi ser at id forekommer i begge tabeller, vi trenger å spesifisere hvilken id vi mener Vi vil ”joine” sammen kolonnen med id fra personer og f_key fra Adresse. Skriver vi p.id der p er alias for personer og a.id der a er alias for Adresse er det ingen tvil om hvilke felter vi mener. p.id = a.f_key: Der hvor disse er identiske
Join Resultatet blir som om begge tabellene var en, dvs. den som ble normalisert Men vi får ingen oppdateringsanomalier, eller: vi slipper dem.