Structured Query Language (SQL) Christer Stuxberg christer.stuxberg@im.uu.se Institutionen för Informatik och Media
Översikt Introduktion Enkla frågor (queries) Hämta en specifik kolumn Sök Sammanfattning av SELECT kommandot Modifiera Data med SQL INSERT UPDATE DELETE
Introduktion till SQL Hette från början SEQUEL (Structured English Query Language), bytte namn då SEQUEL var varumärkesskyddat av en brittisk flygplanstillverkare Det vanligaste kommersiellt använda språket för relationsdatabaser Ett deklarativt frågespråk, du specificerar vad som skall göras istället för hur Relativt enkelt att lära sig då det använder sig utav engelska termer Baseras på relationsalgebra
Målet med SQL Kunna skapa databaser och tabeller Ge möjlighet att lägga till, ändra och ta bort data från tabeller Kunna utföra både enkla och komplexa frågor (queries) Vara enkelt att använda SQL beskriver hur input tabeller ska transformeras till output tabeller.
Kort om literaler Literaler är konstanter som används i SQL-satser Alla icke numeriska värden måste omges av apostrofer Numeriska värden får inte omges av apostrofer (I många miljöer fungerar även citationstecken men standard är att använda apostrofer)
Grundkommandon SELECT vad som ska hämtas från databasen/tabellen INSERT för att lägga till data i en tabell UPDATE för att ändra/uppdatera data i en tabell DELETE för att ta bort data från en tabell
Kom igång med SELECT Vi börjar med en databas som innehåller tabellen Films filmnum title genre restrictions 201 The Spy who Shagged me Action Over 12 678 Harry Potter and the Broomstick Children None 134 Silence of the Lambs Horror Over 17 985 The day of the living dead Horror Over 17 343 Airplane Comedy Over 12 234 Star Wars Action None Vi kan hämta hela tabellen med frågan: SELECT filmnum, title, genre, restrictions FROM Films; Eller så använder vi * för att lista alla kolumner i tabellen: SELECT * FROM Films;
Hämta vissa kolumner Om vi endast är intresserade av filmnum, title och genre från våra filmer: SELECT filmnum, title, genre FROM Films; Den frågan ger oss följande tabell: filmnum title genre 201 The Spy who Shagged me Action 678 Harry Potter and the Broomstick Children 134 Silence of the Lambs Horror 985 The day of the living dead Horror 343 Airplane Comedy 234 Star Wars Action
DISTINCT Om vi hämtar endast genre från vår tabell så kommer vi att få dubbletter För att slippa dubbletter så använder vi DISTINCT kommandot: SELECT genre FROM Films; genre Action Children Horror Horror Comedy Action SELECT DISTINCT genre FROM Films; genre Action Children Horror Comedy
Aggregatfunktioner Vi kan skriva frågor som gör beräkningar på numeriska fält, här på tabellen Staff SELECT staffnum, name, position, salary/12 FROM Staff; ger oss allas månadslön: staffnum name position salary L001 George CEO 60000 L002 John Manager 48000 L003 Adam Assistant 24000 staffnum name position col4 L001 George CEO 5000 L002 John Manager 4000 L003 Adam Assistant 2000
Ge nya kolumner ett namn Den fjärde kolumnen i resultattabellen fick namnen col4 eftersom SQL inte vet hur den ska namnge kolumnen Vi kan använda oss utav AS för att namnge den nya tabellen: SELECT staffnum, name, position, salary/12 AS monthysal FROM Staff; staffnum name position monthlysal L001 George CEO 5000 L002 John Manager 4000 L003 Adam Assistant 2000
Jämförande sökvillkor Hitta alla anställda som tjänar mer än 40000 om året: SELECT staffnum, name, position, salary FROM Staff WHERE salary > 40000; staffnum name position salary L001 George CEO 60000 L002 John Manager 48000
Jämförelseoperatorer SQL stöder de vanliga jämförelseoperatorerna: =, <, >, <>, <=, >= Mer komplexa jämförelser kan göras med hjälp av logiska operatorer: AND, OR, NOT Parenteser används för att bestämma i vilken ordning utvärderingen ska ske.
Intervall sökvillkor Hitta alla anställda som tjänar mellan 20000 och 50000 SELECT staffnum, name, position, salary FROM Staff WHERE salary >= 20000 AND salary <= 50000; staffnum name position salary L002 John Manager 48000 L003 Adam Assistant 24000 Alternativt kan vi skriva: SELECT staffnum, name, position, salary FROM Staff WHERE salary BETWEEN 20000 AND 50000;
Andra sätt att söka ut data För att list alla filmer som tillhör Action eller Children genren: SELECT filmnum, title, genre FROM Films WHERE genre = Action OR genre = Children ; Ger oss följande tabell: filmnum title genre 201 The Spy who Shagged me Action 678 Harry Potter and the Broomstick Children 234 Star Wars Action
Alternativ till samma sökning Vi kan göra samma sökning fast med IN för att se om värdet matchar ett i en lista av värden: SELECT filmnum, title, genre FROM Films WHERE genre IN ( Action, Children );
Mönstermatchning SQL tillåter enklare mönstermatchnings sökningar som kan användas med LIKE kommandot: % representerar 0 eller fler tecken. LIKE S% betyder att första tecknet måste vara S, men resten kan vara vilken sträng som helst. _ representerar vilket tecken som helst (1 tecken). LIKE S betyder att första tecknet måste vara S, följt av 4 andra tecken.
Mönstermatchning SELECT title, genre FROM Films WHERE title LIKE %the% ; Ger oss följande tabell: title The Spy who Shagged me Harry Potter and the Broomstick Silence of the Lambs The day of the living dead genre Action Children Horror Horror
Sortera resultat Om man bara gör en vanlig sökning så får man (oftast) resultatet i den ordningen som de är inlagda i tabellen ORDER BY kan användas för att sortera på en eller flera kolumner Sortering kan göras stigande (ASC) eller fallande (DESC) på en kolumn eller en kombination av kolumner
Sortera resultat Säg att vi vill sortera filmerna på genre och filmnum SELECT * FROM Films ORDER BY genre DESC, filmnum ASC; filmnum title genre restrictions 134 Silence of the Lambs Horror Over 17 985 The day of the living dead Horror Over 17 343 Airplane Comedy Over 12 678 Harry Potter and the Broomstick Children None 201 The Spy who Shagged me Action Over 12 234 Star Wars Action None
SQLs aggregeringsfunktioner Det finns fem aggregeringsfunktioner: COUNT returnerar antalet värden i en specifik kolumn SUM returnerar summan av värdena i en specifik kolumn AVG returnerar medelvärdet av värdena i en specifik kolumn MIN returnerar det minsta värdet i en specifik kolumn MAX returnerar det största värdet i en specifik kolumn De används i SELECT och HAVING satserna
COUNT och SUM Lista antalet anställde med en lön över 40000 och summan av deras löner: SELECT COUNT(staffNum) AS totalstaff, FROM Staff SUM(salary) AS totalsalary WHERE salary > 40000; totalstaff totalsalary 2 108000
Sammanfattning av SELECT SELECT specificerar vilka kolumner som ska vara med i resultatet FROM specificerar vilken eller vilka tabeller som ska användas WHERE filtrerar rader som uppfyller vissa kriterier GROUP BY grupperar rader på ett kolumn värde HAVING filtrerar bort grupper som inte uppfyller vissa kriterier ORDER BY specificerar hur resultatet ska sorteras
Modifiera data SQL kan inte bara hämta data från en databas utan även lägga till, ändra och ta bort data från databasen INSERT lägger till en rad med data i en tabell UPDATE ändrar existerande data i en tabell DELETE tar bort rader med data från en tabell
INSERT Nu ska vi lägga till en rad i Films tabellen: INSERT INTO Films VALUES ( 882, Enter the Dragon, Action, Over 12 ); I det här exemplet så har vi gett värden för alla kolumner i den ordning som specificerades när tabellen skapades Det betyder att vi inte behöver specificera kolumnamnen
UPDATE Vi vill uppdatera Staff tabellen så att alla assistenter får en lönehöjning på 5%. UPDATE Staff SET salary = salary* 1.05 WHERE position = Assistant ; staffnum name position salary L001 George CEO 60000 L002 John Manager 48000 L003 Adam Assistant 24000 staffnum name position salary L001 George CEO 60000 L002 John Manager 48000 L003 Adam Assistant 25200
UPDATE SET kommandot specificerar namnet på en eller fler kolumner som ska uppdateras WHERE kommandot är frivilligt. Om WHERE inte används så kommer alla rader i tabellen uppdateras i kolumnerna som specificerats i SET Om WHERE används så kommer endast de rader som uppfyller kravet att uppdateras
DELETE Nu vill vi ta bort alla skräckfilmer från Films tabellen DELETE FROM Films WHERE genre = Horror ; filmnum title genre restrictions 201 The Spy who Shagged me Action Over 12 678 Harry Potter and the Broomstick Children None 343 Airplane Comedy Over 12 234 Star Wars Action None 882 Enter the Dragon Action Over 12
Öva själv http://www.w3schools.com/sql/ Finns även många andra bra sidor på nätet där man kan lära sig och även få öva lite på olika databaser och tabeller.