Presentation laddar. Vänta.

Presentation laddar. Vänta.

MODB v t2007 nikos dimitrakas 1 SQL nikos dimitrakas 08-162099 rum 6626 Connolly/Begg (3rd & 4th edition) kapitel 5, 6 (och lite överallt)

Liknande presentationer


En presentation över ämnet: "MODB v t2007 nikos dimitrakas 1 SQL nikos dimitrakas 08-162099 rum 6626 Connolly/Begg (3rd & 4th edition) kapitel 5, 6 (och lite överallt)"— Presentationens avskrift:

1 MODB v t2007 nikos dimitrakas 1 SQL nikos dimitrakas rum 6626 Connolly/Begg (3rd & 4th edition) kapitel 5, 6 (och lite överallt)

2 MODB v t2007 nikos dimitrakas 2 SQL Structured Query Language olika förslag till databasspråk för relations-DBMS har förekommit, QUEL, SQL SQL fick tidigt dominerande ställning, IBM internationella standarden för data sub-language för relations-DBMS kallas SQL, togs publicerade ISO en standard som kallas SQL2 (eller SQL92) standarden överensstämmer till stora delar med aktuella SQL-dialekter för de vanligaste DBMS 1999 publicerade ISO en ny version av standarden, SQL1999 (eller SQL3). Denna standard innehåller en del objektorienterade funktionalitet kom den senaste versionen kallad SQL2003. olika förslag till databasspråk för relations-DBMS har förekommit, QUEL, SQL SQL fick tidigt dominerande ställning, IBM internationella standarden för data sub-language för relations-DBMS kallas SQL, togs publicerade ISO en standard som kallas SQL2 (eller SQL92) standarden överensstämmer till stora delar med aktuella SQL-dialekter för de vanligaste DBMS 1999 publicerade ISO en ny version av standarden, SQL1999 (eller SQL3). Denna standard innehåller en del objektorienterade funktionalitet kom den senaste versionen kallad SQL2003.

3 MODB v t2007 nikos dimitrakas 3 Uppdelning av SQL databeskrivning, SQL-DDL (Data Definition Language) databearbetning, SQL-DML (Data Manipulation Language) behörighet, SQL-DCL (Data Control Language) databeskrivning, SQL-DDL (Data Definition Language) databearbetning, SQL-DML (Data Manipulation Language) behörighet, SQL-DCL (Data Control Language) SQL kan uttrycka allt som går att uttrycka i relationsalgebran - språket är "relationally complete"

4 MODB v t2007 nikos dimitrakas 4 SQL - DDL CREATE TABLE, skapa tabell ALTER TABLE, ändra tabell DROP TABLE, ta bort tabell CREATE INDEX, skapa index DROP INDEX, ta bort index CREATE VIEW, skapa vy DROP VIEW, ta bort vy CREATE TABLE, skapa tabell ALTER TABLE, ändra tabell DROP TABLE, ta bort tabell CREATE INDEX, skapa index DROP INDEX, ta bort index CREATE VIEW, skapa vy DROP VIEW, ta bort vy CREATE SCHEMA CREATE DATABASE (även CATALOG) CREATE TRIGGER DROP TRIGGER CREATE PROCEDURE DROP PROCEDURE CREATE SCHEMA CREATE DATABASE (även CATALOG) CREATE TRIGGER DROP TRIGGER CREATE PROCEDURE DROP PROCEDURE

5 MODB v t2007 nikos dimitrakas 5 SQL-DML INSERT, lägg till UPDATE, ändra DELETE, ta bort COMMIT, spara ROLLBACK, återställ SELECT, utsökning INSERT, lägg till UPDATE, ändra DELETE, ta bort COMMIT, spara ROLLBACK, återställ SELECT, utsökning

6 MODB v t2007 nikos dimitrakas 6 SQL-DCL CREATE USER, skapa användare CREATE SCHEMA DROP USER, ta bort användare DROP SCHEMA GRANT, ge behörighet REVOKE, ta bort behörighet CREATE USER, skapa användare CREATE SCHEMA DROP USER, ta bort användare DROP SCHEMA GRANT, ge behörighet REVOKE, ta bort behörighet

7 MODB v t2007 nikos dimitrakas 7 Exempel DDL, DML Skapa en databas –från konceptuell modell till färdiga tabeller Fylla på med data –mata in data –ändra data –ta bort data Ställa frågor mot databasen –enkla frågor –aggregerade frågor

8 MODB v t2007 nikos dimitrakas 8 Konceptuell modell  Logisk modell  Relationsdatabas

9 MODB v t2007 nikos dimitrakas 9 Konceptuell modell  Logisk modell  Relationsdatabas CREATE TABLE Hund ( id NUMBER PRIMARY KEY, namn STRING NOT NULL UNIQUE, ras STRING, ägare STRING NOT NULL) CREATE TABLE Hund ( id NUMBER PRIMARY KEY, namn STRING NOT NULL UNIQUE, ras STRING, ägare STRING NOT NULL)

10 MODB v t2007 nikos dimitrakas 10 Konceptuell modell  Logisk modell  Relationsdatabas CREATE TABLE Katt ( kid NUMBER PRIMARY KEY, färg STRING) CREATE TABLE Katt ( kid NUMBER PRIMARY KEY, färg STRING)

11 MODB v t2007 nikos dimitrakas 11 Konceptuell modell  Logisk modell  Relationsdatabas CREATE TABLE Jakt ( hundid NUMBER, katt NUMBER, PRIMARY KEY (hundid, katt), FOREIGN KEY (hundid) REFERENCES Hund (id) ON DELETE CASCADE ON UPDATE CASCADE) CREATE TABLE Jakt ( hundid NUMBER, katt NUMBER, PRIMARY KEY (hundid, katt), FOREIGN KEY (hundid) REFERENCES Hund (id) ON DELETE CASCADE ON UPDATE CASCADE)

12 MODB v t2007 nikos dimitrakas 12 Konceptuell modell  Logisk modell  Relationsdatabas ALTER TABLE Jakt ADD FOREIGN KEY (katt) REFERENCES Katt ON DELETE RESTRICT ON UPDATE CASCADE ALTER TABLE Jakt ADD FOREIGN KEY (katt) REFERENCES Katt ON DELETE RESTRICT ON UPDATE CASCADE

13 MODB v t2007 nikos dimitrakas 13 DROP TABLE Tar bort en tabell Ta bort tabellen Bil! DROP TABLE Bil Ta bort tabellen Bil och alla referenser! Tar bort tabellen bil samt andra databasobjekt som beror på tabellen bil. DROP TABLE Bil CASCADE

14 MODB v t2007 nikos dimitrakas 14 INTEGER SMALLINT NUMBER DECIMAL(p[,q]) FLOAT BOOLEAN CHAR(n) VARCHAR(n) STRING(n) TEXT DATE TIME TIMESTAMP MONEY INTEGER SMALLINT NUMBER DECIMAL(p[,q]) FLOAT BOOLEAN CHAR(n) VARCHAR(n) STRING(n) TEXT DATE TIME TIMESTAMP MONEY Datatyper i SQL CLOB (Character Large OBject) BLOB (Binary Large OBject) XML CLOB (Character Large OBject) BLOB (Binary Large OBject) XML

15 MODB v t2007 nikos dimitrakas 15 INSERT Används för att lägga till rader i en existerande tabell Det finns två sätt med specificerade värden via SELECT Man kan ange ett värde för varje kolumn i den förbestämda ordningen Man kan ange värden endast för vissa kolumner i valfri ordning Man kan lägga till en eller flera rader med ett kommando

16 MODB v t2007 nikos dimitrakas 16 INSERT med specificerade värden Lägg till en rad i tabellen Hund med värden 125, ”Woolfy”, ”Coley”, ”Johan” INSERT INTO Hund VALUES (125, ’Woolfy’, ’coley’, ’Johan’); INSERT INTO Hund (ras, id, namn, ägare) VALUES (’coley’, 125, ’Woolfy’,’Johan’); INSERT INTO Hund (namn, id, ägare) VALUES (’Jumpy’, 3342, ’Lisa’); Lägg till en rad i tabellen Hund med värden 3342, ”Jumpy”, ”Lisa”. Alltså ingen ras! INSERT INTO Hund VALUES (3342, ’Jumpy’, NULL, ’Lisa’);

17 MODB v t2007 nikos dimitrakas 17 INSERT med specificerade värden Lägg till flera rader med en gång (fungerar inte med alla databashanterare, men ingår i standarden): INSERT INTO Hund VALUES (1233, ’Scrapy’, NULL, ’Lisa’), (1555, ’Lucky’, ’Tax’, ’Nils’), (2334, ’Ruddy’, ’Foxhound’, ’Lisa’); INSERT INTO Hund VALUES (1233, ’Scrapy’, NULL, ’Lisa’), (1555, ’Lucky’, ’Tax’, ’Nils’), (2334, ’Ruddy’, ’Foxhound’, ’Lisa’);

18 MODB v t2007 nikos dimitrakas 18 INSERT via SELECT Antag att vi har en tabell temp(hund, antaljakter) där vi vill lägga in hund-id och totalt antal jagade katter. Vi kan då räkna fram innehållet till tabellen temp med en SELECT-sats. Vi skall se hur man skriver sådana satser snart! SELECT-satsens resultat blir nya rader i tabellen temp. INSERT INTO temp(hund, antaljakter) SELECT-sats INSERT INTO temp(hund, antaljakter) SELECT-sats

19 MODB v t2007 nikos dimitrakas 19 INSERT och främmande nycklar Lägger man in ett värde i en kolumn som är främmande nyckel måste detta värde finnas i den relaterade tabellen. Annars misslyckas inmatningen. Lägg till en rad i tabellen Jakt med värden 125 och 122: Fungerar förutsatt att det finns en rad i tabellen Hund med id = 125 och en rad i tabellen Katt med kid = 122. INSERT INTO Jakt (hundid, katt) VALUES (125, 122); INSERT INTO Jakt (hundid, katt) VALUES (125, 122);

20 MODB v t2007 nikos dimitrakas 20 UPDATE Ändrar innehållet i ett eller flera attribut på noll eller flera rader Ändra färgen för alla vita katter till brunt! UPDATE Katt SET färg = ’brunt’ WHERE färg = ’vitt’; UPDATE Katt SET färg = ’brunt’ WHERE färg = ’vitt’;

21 MODB v t2007 nikos dimitrakas 21 DELETE Används för att ta bort en eller flera rader i en tabell DELETE FROM Hund WHERE ägare = ’Johan’; DELETE FROM Hund WHERE ägare = ’Johan’; Ta bort alla gråa katter DELETE FROM Katt WHERE färg = ’grått’; DELETE FROM Katt WHERE färg = ’grått’; Ta bort alla hundar som ägs av Johan Vad händer med främmande nycklarna?

22 MODB v t2007 nikos dimitrakas 22 idnamnrasägare 130BarkyTerrierJohan 135WoolfyColeyJohan 431BeastyTaxMaria 1233ScrapyLisa 1555LuckyTaxNils 2334RuddyFoxhoundLisa 2343GrumpyGolden RetrieverJohan 2345SlickyPeter 3342JumpyLisa kidfärg 122grått 111svart 106vitt 33svart 43svart 45grått 42vitt 55 99brunt 100 hundidkatt Katt Hund Jakt

23 MODB v t2007 nikos dimitrakas 23 Väljer ut data från en eller flera tabeller när alla villkor blir uppfyllda. Ta fram namn och ras för alla hundar som ägs av Johan! Går igenom tabellen rad för rad och tar med i resultatet de rader som uppfyller villkoret. SELECT … FROM … WHERE … SELECT namn, ras FROM Hund WHERE ägare = ’Johan’; SELECT namn, ras FROM Hund WHERE ägare = ’Johan’;

24 MODB v t2007 nikos dimitrakas 24 SELECT vs Relationsalgebra projektion selektion SELECT namn, ras FROM Hund WHERE ägare = ’Johan’; SELECT namn, ras FROM Hund WHERE ägare = ’Johan’; Ta fram namn och ras för alla hundar som ägs av Johan! Π namn, ras σ ägare = ’Johan’ Hund

25 MODB v t2007 nikos dimitrakas 25 WHERE-klausulen Kan innehålla: jämförelseoperatorerna =, <>, >, >=, <, <= logiska operatorerna t ex AND, OR och NOT parenteser för att styra utvärderingen BETWEEN för att testa intervall LIKE för att matcha mönster % _ (eller * ?) IN och EXISTS för att hantera mängder SELECT * FROM Hund WHERE (ras = ’Terrier’ OR ras = ’Coley’) AND ägare <> ’Johan’ AND namn LIKE ’B%’

26 MODB v t2007 nikos dimitrakas 26 ORDER BY klausulen Används för att sortera resultatet i stigande ordning: ASC (default) i fallande ordning: DESC SELECT ras, namn FROM Hund WHERE ägare <> ’Johan’ ORDER BY ras DESC, namn ASC

27 MODB v t2007 nikos dimitrakas 27 SELECT DISTINCT Används för att ta bort dubbletter från resultatet SELECT DISTINCT ras FROM Hund ORDER BY ras Ta fram alla hundraser i stigande ordning!

28 MODB v t2007 nikos dimitrakas 28 NULL Hur skall NULL tolkas? Visa alla vita katter! SELECT kid FROM Katt WHERE färg = ’vitt’; SELECT kid FROM Katt WHERE färg = ’vitt’; SELECT kid FROM Katt WHERE färg <> ’vitt’; SELECT kid FROM Katt WHERE färg <> ’vitt’; Visa alla icke-vita katter!

29 MODB v t2007 nikos dimitrakas 29 SELECT från flera tabeller Ta fram namn för de personer som äger en hund som jagar en katt! SELECT ägare FROM Hund, Jakt WHERE hundid=id SELECT ägare FROM Hund, Jakt WHERE hundid=id SELECT Hund.ägare FROM Hund, Jakt WHERE Jakt.hundid = Hund.id SELECT Hund.ägare FROM Hund, Jakt WHERE Jakt.hundid = Hund.id projektion join-villkor selektion Π ägare σ hundid = id (Hund x Jakt) Π ägare (Hund θ hundid = id Jakt)

30 MODB v t2007 nikos dimitrakas 30 Alias Använd ett alias istället för tabellnamnet för att undvika skriva långa tabellnamn om och om igen skilja mellan olika instanser av samma tabell Vilka två hundar har samma ägare? SELECT h1.namn, h2.namn FROM Hund AS h1, Hund h2 WHERE h1.ägare = h2.ägare AND h1.id > h2.id SELECT h1.namn, h2.namn FROM Hund AS h1, Hund h2 WHERE h1.ägare = h2.ägare AND h1.id > h2.id

31 MODB v t2007 nikos dimitrakas 31 Ett till exempel Vilka två hundar jagar samma katt? SELECT DISTINCT h1.namn, h2.namn FROM Hund h1, Hund h2, Jakt j1, Jakt j2 WHERE h1.id = j1.hundid AND h2.id = j2.hundid AND j1.katt = j2.katt AND h1.id > h2.id SELECT DISTINCT h1.namn, h2.namn FROM Hund h1, Hund h2, Jakt j1, Jakt j2 WHERE h1.id = j1.hundid AND h2.id = j2.hundid AND j1.katt = j2.katt AND h1.id > h2.id

32 MODB v t2007 nikos dimitrakas 32 IN och EXISTS Används för att jobba med mängder (oftast genererade med nästlade SELECT-satser) Vilka hundar jagar en katt med id 122? SELECT namn FROM Hund WHERE id IN (SELECT hundid FROM Jakt WHERE katt=122) SELECT namn FROM Hund WHERE id IN (SELECT hundid FROM Jakt WHERE katt=122)

33 MODB v t2007 nikos dimitrakas 33 IN och EXISTS Vilka hundar jagar en katt med id 122? SELECT namn FROM Hund WHERE EXISTS (SELECT hundid FROM Jakt WHERE katt=122 AND hundid=id) SELECT namn FROM Hund WHERE EXISTS (SELECT hundid FROM Jakt WHERE katt=122 AND hundid=id)

34 MODB v t2007 nikos dimitrakas 34 Ett till exempel Vilka två hundar jagar samma katt? SELECT h1.namn, h2.namn FROM Hund h1, Hund h2 WHERE h1.id > h2.id AND h1.id IN (SELECT hundid FROM Jakt WHERE katt IN (SELECT katt FROM Jakt WHERE hundid=h2.id)) SELECT h1.namn, h2.namn FROM Hund h1, Hund h2 WHERE h1.id > h2.id AND h1.id IN (SELECT hundid FROM Jakt WHERE katt IN (SELECT katt FROM Jakt WHERE hundid=h2.id))

35 MODB v t2007 nikos dimitrakas 35 Division i SQL Vilka hundar jagar alla vita katter? (Division) SELECT namn FROM Hund WHERE NOT EXISTS (SELECT * FROM katt WHERE färg = ’vitt’ AND KID NOT IN (SELECT katt FROM Jakt WHERE hundid=id)) SELECT namn FROM Hund WHERE NOT EXISTS (SELECT * FROM katt WHERE färg = ’vitt’ AND KID NOT IN (SELECT katt FROM Jakt WHERE hundid=id)) VitKatt(katt)  Π kid σ färg = ’vitt’ Katt Π namn (Hund θ id = hundid (Jakt ÷ VitKatt)) VitKatt(katt)  Π kid σ färg = ’vitt’ Katt Π namn (Hund θ id = hundid (Jakt ÷ VitKatt))

36 MODB v t2007 nikos dimitrakas 36 Division i SQL Vad har man i de tre nivåerna? Nivå 1 – Det som vi vill ha i resultatet. Inget annat. Nivå 2 – Det som utgör alla. Har ingen direkt koppling till nivå 1. Nivå 3 – Det som kombinerar det vi letar efter (som finns i nivå 1) och det som utgör alla (som finns i nivå 2).

37 MODB v t2007 nikos dimitrakas 37 Andra mängdoperationer UNION EXCEPT (MINUS) INTERSECT(ION) Kom ihåg Union-kompatibilitet!

38 MODB v t2007 nikos dimitrakas 38 UNION exempel Vilka hundar jagar antingen katt 122 eller katt 42? SELECT namn FROM Hund, Jakt WHERE id = hundid AND katt = 122 UNION SELECT namn FROM Hund, Jakt WHERE id = hundid AND katt = 42 SELECT namn FROM Hund, Jakt WHERE id = hundid AND katt = 122 UNION SELECT namn FROM Hund, Jakt WHERE id = hundid AND katt = 42

39 MODB v t2007 nikos dimitrakas 39 INTERSECT exempel Vilka hundar jagar både katt 122 och katt 42? SELECT namn FROM Hund, Jakt WHERE id = hundid AND katt = 122 INTERSECT SELECT namn FROM Hund, Jakt WHERE id = hundid AND katt = 42 SELECT namn FROM Hund, Jakt WHERE id = hundid AND katt = 122 INTERSECT SELECT namn FROM Hund, Jakt WHERE id = hundid AND katt = 42

40 MODB v t2007 nikos dimitrakas 40 EXCEPT exempel Vilka hundar jagar inga katter? SELECT namn FROM Hund EXCEPT SELECT namn FROM Hund, Jakt WHERE id = hundid SELECT namn FROM Hund EXCEPT SELECT namn FROM Hund, Jakt WHERE id = hundid SELECT namn FROM Hund WHERE id NOT IN (SELECT hundid FROM Jakt)

41 MODB v t2007 nikos dimitrakas 41 Aggregatfunktioner COUNT(*)räknar antalet rader i en tabell COUNT(att) räknar antalet värden i en kolumn MAX(att) ger det största värdet i en kolumn MIN(att)ger det minsta värdet i en kolumn Bara aritmetiska kolumner: SUM(att)summerar värdena i en kolumn AVG(att)tar genomsnittet av värdena i en kolumn VARIANCE(att)räknar ”variationen” av värdena i en kolumn STDEV(att)räknar standard avvikelse av värdena i en kolumn COUNT(*)räknar antalet rader i en tabell COUNT(att) räknar antalet värden i en kolumn MAX(att) ger det största värdet i en kolumn MIN(att)ger det minsta värdet i en kolumn Bara aritmetiska kolumner: SUM(att)summerar värdena i en kolumn AVG(att)tar genomsnittet av värdena i en kolumn VARIANCE(att)räknar ”variationen” av värdena i en kolumn STDEV(att)räknar standard avvikelse av värdena i en kolumn

42 MODB v t2007 nikos dimitrakas 42 Exempel på funktioner Hur många jakter finns det i databasen? SELECT COUNT(*) FROM Jakt SELECT COUNT(*) FROM Jakt Hur många katter jagas? SELECT COUNT(DISTINCT katt) FROM Jakt SELECT COUNT(DISTINCT katt) FROM Jakt

43 MODB v t2007 nikos dimitrakas 43 Nya kolumnnamn Skapar man kolumner med aggregatfunktioner, har de ursprungligen inget namn. Hur många katter jagas av hund 130 eller hund 431? SELECT COUNT(DISTINCT katt) AS kattantal FROM Jakt WHERE hundid = 130 OR hundid = 431 SELECT COUNT(DISTINCT katt) AS kattantal FROM Jakt WHERE hundid = 130 OR hundid = 431 Notera att COUNT(DISTINCT) inte stöds i Access.

44 MODB v t2007 nikos dimitrakas 44 GROUP BY Grupperar rader på angivna kolumner. Rader grupperas i mindre grupper så att inom varje grupp alla rader har samma värden på de angivna kolumner. Kombineras oftast med aggregatfunktionerna. Räkna antal katter av varje färg! SELECT färg, COUNT(kid) AS antal FROM Katt GROUP BY färg; SELECT färg, COUNT(kid) AS antal FROM Katt GROUP BY färg; Alla icke aggregerade kolumner som förekommer i SELECT klausulen måste finnas med i GROUP BY klausulen!

45 MODB v t2007 nikos dimitrakas 45 GROUP BY Exempel Hur många katter jagas av varje hund? SELECT namn, COUNT(katt) AS antal FROM Jakt, Hund WHERE hundid=id GROUP BY hundid, namn ORDER BY antal DESC, namn ASC SELECT namn, COUNT(katt) AS antal FROM Jakt, Hund WHERE hundid=id GROUP BY hundid, namn ORDER BY antal DESC, namn ASC

46 MODB v t2007 nikos dimitrakas 46 HAVING Används för att sätta villkor på resultatet av aggregatfunktioner (villkor på grupper) Vilka katter jagas av minst 3 hundar? SELECT katt FROM Jakt GROUP BY katt HAVING COUNT(hundid) > 2 SELECT katt FROM Jakt GROUP BY katt HAVING COUNT(hundid) > 2

47 MODB v t2007 nikos dimitrakas 47 HAVING Exempel Hur många katter av varje färg jagar varje hund? Visa bara hundar som jagar minst 3 katter! SELECT namn, färg, COUNT(kid) as antal FROM Jakt, Hund, Katt WHERE hundid=id AND katt=kid AND hundid IN (SELECT hundid FROM Jakt GROUP BY hundid HAVING COUNT(katt)>2) GROUP BY namn, färg SELECT namn, färg, COUNT(kid) as antal FROM Jakt, Hund, Katt WHERE hundid=id AND katt=kid AND hundid IN (SELECT hundid FROM Jakt GROUP BY hundid HAVING COUNT(katt)>2) GROUP BY namn, färg

48 MODB v t2007 nikos dimitrakas 48 Nästlade SELECT-satser Det är också möjligt att nästla satser i FROM-klausulen Ta fram alla personer som äger endast 1 hund! (utan att använda HAVING, EXISTS eller IN) SELECT ägare FROM (SELECT ägare, COUNT(id) AS antal FROM Hund GROUP BY ägare) AS nytabell WHERE antal = 1 SELECT ägare FROM (SELECT ägare, COUNT(id) AS antal FROM Hund GROUP BY ägare) AS nytabell WHERE antal = 1

49 MODB v t2007 nikos dimitrakas 49 Utan COUNT(DISTINCT) COUNT(DISTINCT) utan COUNT(DISTINCT): Hur många katter jagas av hund 130 eller hund 431? SELECT COUNT(katt) AS kattantal FROM (SELECT DISTINCT katt FROM Jakt WHERE hundid = 130 OR hundid = 431) SELECT COUNT(katt) AS kattantal FROM (SELECT DISTINCT katt FROM Jakt WHERE hundid = 130 OR hundid = 431)

50 MODB v t2007 nikos dimitrakas 50 Ett till exempel på nästlade satser Ta fram den eller de personer som äger de flesta hundar! SELECT ägare FROM Hund GROUP BY ägare HAVING COUNT(id) = (SELECT MAX(antal) FROM (SELECT ägare, COUNT(id) AS antal FROM Hund GROUP BY ägare) AS nytabell) SELECT ägare FROM Hund GROUP BY ägare HAVING COUNT(id) = (SELECT MAX(antal) FROM (SELECT ägare, COUNT(id) AS antal FROM Hund GROUP BY ägare) AS nytabell)

51 MODB v t2007 nikos dimitrakas 51 Mera nästlade SELECT satser Det är också möjligt att nästla satser i SELECT-klausulen under förutsättningen att de endast producerar en rad och en kolumn. Ta fram alla hundar och antalet katter de jagar! Ta med samtliga hundar! SELECT namn, (SELECT COUNT(*) FROM Jakt WHERE hundid = id) AS antal FROM Hund SELECT namn, (SELECT COUNT(*) FROM Jakt WHERE hundid = id) AS antal FROM Hund Här blir hela den nästlade satsen ett värde i varje rad i resultatet.

52 MODB v t2007 nikos dimitrakas 52 Aritmetiska uttryck +, -, *, / kan användas direkt i SELECT-satser Om varje hund kostar 500 kronor per månad, vad är då kostnaden för varje hundägare? SELECT ägare, COUNT(id)*500 AS hundkostnad FROM Hund GROUP BY ägare SELECT ägare, COUNT(id)*500 AS hundkostnad FROM Hund GROUP BY ägare

53 MODB v t2007 nikos dimitrakas 53 JOIN -operationer INNER JOIN –Tar med alla kombinationer av rader från båda tabellerna då villkoret stämmer LEFT OUTER JOIN –Tar med alla rader från tabellen till vänster och de rader från tabellen till höger som uppfyller villkoret RIGHT OUTER JOIN –Tar med alla rader från tabellen till höger och de rader från tabellen till vänster som uppfyller villkoret FULL OUTER JOIN –Tar med alla rader från båda tabeller CROSS JOIN UNION JOIN

54 MODB v t2007 nikos dimitrakas 54 SELECT namn FROM Hund INNER JOIN Jakt ON (id=hundid) SELECT namn FROM Hund INNER JOIN Jakt ON (id=hundid) INNER JOIN Visa alla hundar som jagar katter! Om tabellerna skall joinas på kolumner med samma namn kan man skriva istället: SELECT namn FROM Hund INNER JOIN Jakt USING kolumnnamn SELECT namn FROM Hund INNER JOIN Jakt USING kolumnnamn

55 MODB v t2007 nikos dimitrakas 55 SELECT kid, hundid FROM Katt LEFT OUTER JOIN Jakt ON (kid=katt) SELECT kid, hundid FROM Katt LEFT OUTER JOIN Jakt ON (kid=katt) Visa alla katter och vilka hundar som jagar dem! SELECT kid, hundid FROM Katt LEFT OUTER JOIN Jakt ON (kid=katt) FULL OUTER JOIN Hund ON (hundid=id) SELECT kid, hundid FROM Katt LEFT OUTER JOIN Jakt ON (kid=katt) FULL OUTER JOIN Hund ON (hundid=id) Visa alla katter och alla hundar och alla jaktförhållanden! OUTER JOIN

56 MODB v t2007 nikos dimitrakas 56 SELECT [DISTINCT] FROM [WHERE ] [GROUP BY [HAVING ]] [ORDER BY ]; SELECT [DISTINCT] FROM [WHERE ] [GROUP BY [HAVING ]] [ORDER BY ]; SELECT-satsens format

57 MODB v t2007 nikos dimitrakas 57 VIEWS CREATE VIEW hundägande AS SELECT ägare, COUNT(id) AS antal FROM Hund GROUP BY ägare CREATE VIEW hundägande AS SELECT ägare, COUNT(id) AS antal FROM Hund GROUP BY ägare En vy (view) är en virtuell tabell som finns för användarna, men skapas med data från andra tabeller Skapa en vy med alla hundägare och antalet hundar de äger!

58 MODB v t2007 nikos dimitrakas 58 Fördelar med VIEWS samma data kan betraktas av olika användare på olika sätt (på samma gång) användaren kan få en förenklad bild av databasen - mindre komplex DML flexibel behörighetskontroll optimering (materialized views) återanvändning

59 MODB v t2007 nikos dimitrakas 59 INDEX CREATE INDEX kattfärg ON Katt(färg, kid) CREATE INDEX kattfärg ON Katt(färg, kid) Ett index skapas för att snabbt kunna komma åt data med SELECT satser, genom att : begränsa kolumner optimera inför JOIN optimera inför selektion optimera inför sortering/gruppering Skapa ett index på kattfärgerna! Skapa ett index på hundägarna och ras! CREATE INDEX hundägare ON Hund(ägare, ras) CREATE INDEX hundägare ON Hund(ägare, ras)

60 MODB v t2007 nikos dimitrakas 60 VIEWS & INDEX Tänk på att dessa tar plats och kräver tid för att hålla uppdaterade! Skapa endast de som verkligen behövs!

61 MODB v t2007 nikos dimitrakas 61 SQL Validator Ni kan kontrollera om era SQL-satser följer standarden här:


Ladda ner ppt "MODB v t2007 nikos dimitrakas 1 SQL nikos dimitrakas 08-162099 rum 6626 Connolly/Begg (3rd & 4th edition) kapitel 5, 6 (och lite överallt)"

Liknande presentationer


Google-annonser