Informationssystem och Databasteknik. Frågespråk mot relationsmodellen

Relevanta dokument
IT i Organisationer och Databasteknik. Frågespråk mot relationsmodellen

Frågespråk mot relationsmodellen

Informationssystem och Databasteknik, 2I-1100 HT2001. Relationsalgebra. Relationsalgebran är sluten: R 1 op R 2 R 3.

Relationsdatabasdesign 2I-4067 HT99. Relationsalgebra. som resultat!

MODELLER OCH SPRÅK FÖR RELATIONSDATABASER: Relationsalgebra, Relationskalkyl (Tuple calculus) & SQL

IT i organisationer och Databasteknik, 2I-1033 HT2002. Relationsalgebra. Relationsalgebran är sluten: R 1 op R 2 R 3.

Övningar i SQL. SQLAccess.doc Ove Lundgren

Idag. 1. Från modell till databasstruktur. 2. Prata med databaser (frågepsråket SQL)

Från verklighet via modell till databas. Idag. Testa reglerna på varuhusmodellen. Från verklighet via modell till databas

Grunderna i SQL del 1

Structured Query Language (SQL)

Databasspråket SQL - online.

Databasspråket SQL - online.

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

SQL. Structured Query Language. Frågespråk för att används för. Kommandon. data åtkomst data manipulation

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Föreläsning 5: Relationsmodellen

DIVISIONSEXEMPEL RELATIONSALGEBRA OCH SQL. r s använder vi för att uttrycka frågor där ordet alla figurerar:

Introduktion till frågespråket SQL (v0.91)

Tabeller och kolumner SQL. Lägga till en ny post. Lägga till en ny post

Frågespråk och SQL. nikos dimitrakas rum 2423

Databasens består av: Tabell Kolumner fält Rader poster (varje post är unik)

Databasspråket SQL - online.

07/11/14. Databasteknik och informationssystem DD1370 F2. Allmänna frågor. Är Lab0 svårbegriplig? Nu: Clickers. Är Kurswebben svårbegriplig?

Databaser - Design och programmering. Operationer i relationsalgebra. Att söka ut data. Exempel DBschema. Att plocka ut data, forts

9. Between 10. Group by 11. Aggregatfunktionerna max, min, sum och avg 12. Nästlade sökningar

Tentamen i Databasteknik

Databaser och. SQL, utsökningar mot en tabell

Tentamen Databasmetodik DB:DSK/FK/DVK/ATD/SP/EIT mfl. äldre kurstillfällen 8 augusti 2013 kl. 9-13

Databasutveckling Introduktion till SQL och TSQL

EMPS(NAME, SALARY, DEPT)

Karlstads Universitet, Datavetenskap 1

Databaser och. SQL, utsökningar mot flera tabeller TENTA. # radnr (#) studnr (#) kursnr * tentadatum * betyg

Grunderna i SQL del 1

08/11/13. Databasteknik och informationssystem DD1370 F3. Ett urval ur databasen bestäms av en SQL-fråga. Påminnelse: Deadline på tisdag

Idag. Exempel. Exempel modellen (1) Exempel...

Databaser. Vad du ska lära dig: Ordlista

Relationsalgebra. Varför behöver jag lära mig relationsalgebra?!

Tentamen. Databasmetodik Lördag 27 september 2014 kl

1. SQL 2. Utsökningar mot flera tabeller. 4. IN-operatorn 5. Join 6. Kartesisk produkt 7. Tabellalias

Programdesign, databasdesign. Databaser - Design och programmering. Funktioner. Relationsmodellen. Relation = generaliserad funktion.

Databasspråket SQL - online.

SQL, nästlade delfrågor Nästlade delfrågor. En nästlda delfråga är ett select-from-where uttryck inom where-klausulen i en annan fråga.

Tentamen i Databasteknik

Informationssystem och Databasteknik

Structured query language (SQL)

Databasspråket SQL - online.

Föreläsning 2: Översikt över ett databassystem

Relationsmodellen och syntetisk databasdesign

Lösningar till tentamen i EDAF75

Lösningsförslag till Tentamen,

WCMS-15, Webbutvecklare CMS

Laboration SQL. Kom igång.

13/11/14. Databasteknik och informationssystem DD1370 F3. Ett urval ur databasen bestäms av en SQL-fråga. Påminnelse: Vad är en Databas?

Tentamen i Databasteknik

Labb LIVE. Exempelkod från föreläsningen. Plushögskolan Frågeutveckling inom MSSQL - SU14

SQL del 2. Christer Stuxberg Institutionen för Informatik och Media

Vad är en databas? Exempel på databaser: Databas = Organiserad samling och lagring av information.

Relationskalkyl (RK)

SQLs delar. Idag. Att utplåna en databas. Skapa en databas

Databaser - Design och programmering. Relationsmodellen. Relationer - som tabeller. Relationer som tabeller. Alternativa notationer: Relationsschema

3. Dynamiska webbplatser, 20 Yhp (4 v)

Tentamen. i Databasteknik. lördagen den 13 mars Tillåtna hjälpmedel: Allt upptänkligt material

Tentamen för DD1370 Databasteknik och informationssystem

Tentamen EIT:DB Databastmetodik 11/ kl Lösningsförslag

Databaser och Datamodellering Foreläsning IV

Tentamen för DD1370 Databasteknik och informationssystem

732G16: Databaser - Design och programmering

Tentamen för DD1370 Databasteknik och informationssystem

Exempel-Tentamen III

Vad är SQL? Introduktion till SQL

Idag. Hur skapar vi och underhåller en databas? DD1370 (Föreläsning 4) Databasteknik och informationssystem 7,5 hp Hösten / 20

Lösningsförslag till fiktiv tentamen för DD1370 Databasteknik och informationssystem

Lösningsförslag, tentamen i Databaser

Inst. för Data- och Systemvetenskap SU Maria Bergholtz. Tentamen. 21/ kl Inga hjälpmedel är tillåtna (annat än ordbok).

Föreläsning 5 Dagens föreläsning går igenom

Fiktiv tentamen för DD1370 Databasteknik och informationssystem

Tentamen Databasmetodik DB:DSK/FK/DVK/ATD/SP/EIT mfl. äldre kurstillfällen Lördag 8 juni kl

Fiktiv tentamen för DD1370 Databasteknik och informationssystem

Vyer, Prepared Statements, Triggers

Databasteknik. Vad är. Vad är databaser bra till? data? föreläsare: Kjell Lindqvist. och NADA. databaser? och. vad är de bra för?

Databaser - Design och programmering. Kursöversikt. Exempel: telefonbok. Varför databaser?

! Teori och praktik. ! Ändringar från förra året. ! Examination (tenta, projekt) LiU. ! Varför ni? ! Varför överhuvudtaget? LiU

25/11/14. Databasteknik och informationssystem DD1370. Påminnelse inför Lab 1 redovisningen. Repetition: ER modellering (gammalt + nytt)

I denna laboration skriver jag inte ut resultatet på de flesta frågorna utan du kör dem själv i din miljö.

Sample exam questions. Database exam TIG058

Dagens föreläsning. KTH & SU, CSC Databasteknik Föreläsning 10 sid 1

Databaser - Design och programmering

Lösningsförslag till Exempel tentamen

Grunderna för relationsmodellen!

Föreläsning 4 Dagens föreläsning går igenom

Databasföreläsning. Del 2 lagrade procedurer, vyer och transaktioner

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

Analytisk relationsdatabasdesign

Labb LABB 1. Databassagan och en rundtur i databasers märkliga värld. Plushögskolan Frågeutveckling inom MSSQL - SU14

Tentamen i. Databasteknik

IT i organisationer och databasteknik

TENTAMEN För kursen. Databasteknik. Ansvarig för tentamen: Anna Palmquist. Förfrågningar: Anslås inom 3 veckor

Vad du skall komma ihåg från tidigare föreläsningar. Dagens föreläsning. Evaluering av frågor. Data dictionary

Tentamen för DD1370 Databasteknik och informationssystem

Transkript:

Informationssystem och Databasteknik HUND Namn Ras Mindy Tax Ossi Tax Frågespråk mot relationsmodellen Relationsalgebra SQL 1

Relationsalgebra Primtiva operatorer projektion π selektion σ union differens - kryssprodukt X Med hjälp av dessa operatorer kan andra (icke-primitiva) operatorer definieras: Icke-primitiva operatorer theta-join θ ekvi-join naturlig join X snitt division Tilldelning := Relationsalgebran är sluten: R 1 op R 2 R 3 relation relation relation ((R 1 op R 2) op R 3 ) op R 4 Tar en eller två tabeller som argument (indata). Producerar en ny tabell som resultat! 2

Projektion π - Unär operator = tar en tabell som indata Vertikal delmängd av attribut, Man väljer ut ett antal kolumner - π A1, A2,...An (Relationsnamn) attribut - π Namn, Lön (Relationsnamn) Omordning av attribut möjligt via π attribut π Lön, Namn (ANSTÄLLD) Lön 15000 20000 22000 30000 35000 Namn Per Kvist Bo Gren Sten Rot Nils Hed Eva Berg 3

Selektion σ - Unär operator Horisontelll delmängd av rader Man väljer ut ett antal rader baserat på något villkor σ villkor (Relationsnamn) Enkelt villkor: Kolumn θ kolumnvärde Kolumn θ kolumn där θ {=,, <, >,, } σ 1. Chef= Eva Berg (ANSTÄLLD) kolumn kolumn-värde 2. σchef=namn(anställd) Namn Lön Chef Avd Per Kvist 15000 Eva Berg Parfym Bo Gren 20000 Eva Berg Parfym Nils Hed 30000 Eva Berg Skor Eva Berg 35000 Eva Berg Parfym kolumn kolumn Namn Lön Chef Avd Eva Berg 35000 Eva Berg Parfym Sammansatt villkor: villkor operator villkor där operator {NOT, AND, OR} 3. Chef= Eva Berg AND Lön>20000 ( ANSTÄLLD ) 3.σ Namn Lön Chef Avd Nils Hed 30000 Eva Berg Skor 4 Eva Berg 35000 Eva Berg Parfym

Kartesisk product A B (eller ibland A * B) ska tolkas som alla rader i A kombinerade med alla rader i B A B A B m n m n a b c x y a x a y b x b y c x c y 5

Kartesisk produkt, ett exempel till ANSTÄLLD ANSTÄLLD AVDELNING Namn Lön Chef Avd Anamn Våning Per Kvist 15000 Eva Berg Parfym Per Kvist 15000 Eva Berg Parfym Per Kvist 15000 Eva Berg Parfym Per Kvist 15000 Eva Berg Parfym Per Kvist 15000 Eva Berg Parfym Och så vidare på samma sätt... Eva Berg 35000 Eva Berg Parfym Eva Berg 35000 Eva Berg Parfym Eva Berg 35000 Eva Berg Parfym Eva Berg 35000 Eva Berg Parfym Eva Berg 35000 Eva Berg Parfym Leksaker Livsmedel Parfym Skor Trädgård Leksaker Livsmedel Parfym Skor Trädgård 2 3 3 2 1 2 3 3 2 1 Totalt har ANSTÄLLD AVDELNING 25 st rader! (ANSTÄLLD har 5 rader och AVDELNING har 5 rader = totalt 5*5 st rader). 6

θ JOIN ( theta-join ) där θ {=,, <, >,, } ANSTÄLLD Namn Avd Pia 5 Mia 3 Ken 3 AVDELNING Avd ANamn 5 Bröd 1 Ost 3 Vin ANSTÄLLD X AVDELNING Anställd.Avd = Avdelning.Avd Namn Anst. Avd. Avd Avd Anamn Pia Mia Ken 5 3 3 5 3 3 Bröd Vin Vin Här bildas den nya tabellen genom att matcha kolumnvärden (här kolumen Avd) från två tabeller. Om jämförelsevillkoret är = talar man om en equi-join. X Observation: σ θ-villkor (A B) Α θ-villkor B 7

NATURAL JOIN ANSTÄLLD AVDELNING ANSTÄLLD X AVDELNING Namn Avd Avd ANamn Namn Avd Anamn Pia 5 5 Bröd Pia 5 Bröd Mia 3 1 Ost Mia 3 Vin Ken 3 3 Vin Ken 3 Vin En NATURAL JOIN är en EQUI-JOIN där man projicerat bort ett av de ingående JOIN-attributen (här tar vi bort dupliceringen av JOINattributet Avd ). En NATURAL JOIN förutsätter att JOIN-attributet (attributen) heter likadant i det två tabeller som ska joinas. 8

NULL Null-värden kan ge problem vid join. ANSTÄLLDA AVDELNING Pnr Anst.nr Adress Avd.nr Avdelning Avd.nr 11111 1A Byv. 3 3 Forskning 3 22222 3B Solsv. 6 5 Försäljn. 5 33333 1AA Byv. 5 3 Admin. 1 44444 2B Byv.7 1 55555 1X Solv. 7 NULL 66666 3Y Byv. 11 NULL En join mellan anställda över Avd.nr kommer att resultera i att de två sista anställda inte kommer med. Beroende på omständigheterna kan detta vara vad som avsågs eller felaktigt. Pnr Anst.nr Adress Avd.nr Avdelning Avd.nr 11111 1A Byv. 3 3 Forskning 3 22222 3B Solsv. 6 5 Försäljn. 5 33333 1AA Byv. 5 3 Forskning 3 44444 2B Byv.7 1 Admin 1 9

OUTER JOIN (s) A Aid Ossi Karo Mindy Ras Tax Pudel NULL B Bid Fido Emir Lady Ras Tax Kanintax NULL A X A.Ras=B.Ras B Aid A.Ras Bid B.Ras Ossi Tax Fido Tax A (LEFT) OUTER (EQUI-) JOIN ON Ras B Aid A.Ras Bid B.Ras Ossi Tax Fido Tax Karo Pudel NULL NULL Mindy NULL NULL NULL A (RIGHT) OUTER (EQUI-) JOIN ON Ras B Aid A.Ras Bid B.Ras Ossi Tax Fido Tax NULL NULL Emir Kanintax NULL NULL Lady NULL A (FULL) OUTER (EQUI-) JOIN ON Ras B Aid A.Ras Bid B.Ras Ossi Tax Fido Tax Karo Pudel NULL NULL Mindy NULL NULL NULL NULL NULL Emir Kanintax NULL NULL Lady NULL 10

Tilldelning eller inte tilldelning Skriv ett relationsalgebraiskt uttryck som ger namn och lön för de anställda som arbetar på andra våningen. ANSTÄLLD Metod I (flera steg): Rätt_avdelningar σ Våning=2 (AVDELNING) Rätt_anställda ANSTÄLLD X Avd=Anamn Rätt_avdelningar Rätt_uppgifter_om_anställda π Namn, Lön (Rätt_anställda) Metod II (ett enda långt relationsalgebraiskt uttryck): π Namn, Lön (ANSTÄLLD X Avd=Anamn (σ Våning=2 (AVDELNING))) 11

Union compatibility Somliga av de relationsalgebraiska operatorerna kräver att de tabeller som de opererar på ska vara unionskompatibla. Detta betyder att de två tabellerna måste ha: samma grad (lika många attribut/kolumner) attribut som motsvarar varandra måste ha samma domän ( attributen som motsvarar varandra måste heta likadant, viktigt inför SQL men även här med avseende på namngivning av kolumner) UNION, SNITT och DIFFERENS är unionskompatibla operatorer. Ska man ta unionen av två tabeller måste tabellerna ha lika många kolumner och de par av kolumner som svarar mot varandra måste vara av samma typ (ha samma domän). A A.a A.b a 1 a 2 b 2 A UNION B? B B.a B.b a x a y b x A UNION B? A A.a A.b a 1 a 2 b 2 B B.a B.b B.c a 1 a 2 b 2 m n o A UNION B! A A.a A.b a x a y b x B B.a B.b b x a m b x 12

UNION A Namn Fido Karo Mindy Ossi Ras Tax Tax Pudel Dvärgtax B Namn Fido Emir Lady Morris Ras Tax Tax Schäfer Welsh Corgie Alla rader som finns i A plus alla rader som finns i B A B Namn Fido Karo Mindy Ossi Emir Lady Morris Ras Tax Tax Pudel Dvärgtax Tax Schäfer Welsh Corgie Observation: A Β = Β Α 13

SNITT (INTERSECT) A Namn Fido Karo Mindy Ossi Ras Tax Tax Pudel Dvärgtax B Namn Fido Emir Lady Morris Ras Tax Tax Schäfer Welsh Corgie A B Namn Fido Ras Tax Alla rader som finns i både A och B Observation I : A Β = Β Α 14

DIFFERENCE (MINUS) A Namn Fido Karo Mindy Ossi Ras Tax Tax Pudel Dvärgtax B Namn Fido Emir Lady Morris Ras Tax Tax Schäfer Welsh Corgie A MINUS B Namn Karo Mindy Ossi Ras Tax Pudel Dvärgtax Alla tupler som finns i A men inte i B Observation: A - B B - A 15

CAR Licencenr Colour Owner ABC123 Blue Lisa AAA111 Red Lisa ABB222 Red Oscar MMM11 Yellow Ben Exempeldatabas PERSON Pname Weight PAddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB COMPANY CName Founded Homepage Telia AB 2001 www.telia.se Ramirent Oy 1989 www.rr.fi 16

Differens fortsättning... Differens är användbart för frågor av typ: Ta fram alla som inte gjort ngt/helt saknar en viss egenskap etc. T ex Ta fram alla personer som inte har någon bil CAR Licencenr Colour Owner ABC123 Blue Lisa AAA111 Red Lisa ABB222 Red Oscar MMM11 Yellow Ben Notera att Owner utgör främmande nyckel mot PERSON tabellen PERSON. PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 1. Skapa en relation som som innehåller alla personer som äger en bil: CAR_OWNER(Pname) := π Owner (CAR) 2. Dra sen bort denna mängd tupler från relationen PERSON (dvs mängden av alla personer): HAVE_NO_CAR := π PName (PERSON) - CAR_OWNER Observera att man måste projicera ut PName från PERSON och Owner Från CAR eftersom differens kräver att de ingående relationerna ska vara unionskompatibla! 17

Aggregat-funktioner i relationsalgebra: MIN, MAX, COUNT, SUM,... PERSON Pname Weight PAddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB Grupperande attribut G Aggregatfunktion(kolumn) (TABELL) Hur många anställda har varje företag? SVAR:= Company G COUNT(Person) (WORKS_AT) Hur många rader finns det i tabellen WORKS_AT? SVAR:= G COUNT(Person) (WORKS_AT) Hur många förtag har fler än 1 anställd? TEMP(Företag, Antal):= Company G COUNT(Person) (WORKS_AT)) SVAR := σ Antal > 1 (TEMP) 18

A B x m x n x o y m y n z m z n z o B m n o Kvot R S Vi har två relationer R och S. R S A x z För att förstå vad R KVOT S är kan man tänka på ungefär följande sätt: Vilka kolumner kommer resultatet att innehålla: Jo R - S dvs de kolumner som förekommer i R men inte i S. I vårt fall blir det kolumnen A i R. Vilka kolumn-värden kommer med i kolumnen A? Jo alla de A-värden i R som är relaterade till ALLA B- värden i S. I vårt fall är detta sant för A-värden x och z. Dvs x har ett B-värde för både m,n och o. Det samma gäller z. A-värdet y kommer inte med eftersom det saknar ett B-värde, nämligen o. 19

R S A 2 A 1 1 A 2 a A 3 1 a A 3 1 1 a 2 a 2 1 a 3 a 3 2 a 1 2 a 2 Resultat Kvot, forts. R(A 1,..., A n, A n+1,..., A n+m) S(A n+1,..., A n+m) R S = Resultat(A 1,..., A n) Varje A 1,...A n - del av en R-tuppel ( huvudet ) har A n+1,...a n+m - del ( svansen ) som är lika med var och en av S-tupplerna, till vänster är n=1 och m=2. A 1 1 För att kunna ta kvoten mellan två relationer måste nämnarens kolumner uppfylla kraven på unionskompatibilitet med en delmängd av täljarens kolumner (mao nämnaren måste vara lika med svansen i täljaren) 20

R S A B x m x n x o y m y n z m z n z o Kandidatvärden A x y z B m n o Kvot kan skrivas om i termer av andra relationsalgebraiska operatorer: Kandidatvärden π A (R) Kombinering π A ((Kandidatvärden X S) - R) Kvoten Kandidatvärden - Kombinering Kandidatvärden X S A B x m x n x o y m y n y o z m z n z o Kombinering A y Kvoten A x z R S A x z 21

Kvot fortsättning... Kvot är användbart för frågor av typ: Ta fram alla som gjort allt/har alla egenskaperna. T ex Ta fram de företag som har alla personer anställda (egentligen lika med uppgiften att ta fram alla de kolumn-värden i tabellen WORKS_AT som är relaterade till (= förekommer i en rad som har en främmande nyckel mot) alla rader i tabellen PERSON ) PERSON Pname Weight PAddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB EMPLOYEES (Person) := π Pname (PERSON) HAVE_THEM_ALL := WORKS_AT EMPLOYEES COMPANY CName Founded Homepage Telia AB 2001 www.telia.se Ramirent Oy 1989 www.rr.fi KVOT kallas även DIVISION 22

Kvot fortsättning... Lista alla företag som har samma anställda som Ramirent Oy har: PERSON Pname Weight PAddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB RAMIS := π (σ Person Company= Ramirent Oy (WORKS_AT)) ALMOST := WORKS_AT RAMIS NOTRAMIS:= π Person (WORKS_AT) - RAMIS TOOFAT := π Company (WORKS_AT X NOTRAMIS)) RESULT := ALMOST - TOOFAT NOTRAMIS.Person = WORKS_AT.Person COMPANY CName Founded Homepage Telia AB 2001 www.telia.se Ramirent Oy 1989 www.rr.fi 23

Sammanfattning av några relationsalgebraiska operatorer UNION INTERSECT(= SNITT) DIFFERENCE projektion π selektion σ union differens - snitt A B Alla rader som förekommer i A eller B A A UNION B A INTERSECT B A DIFFERENCE B (A MINUS B) PROJECTION B Alla rader som förekommer i både A och B A B De rader som förekommer i A men inte i B SELECTION kryssprodukt X theta-join θ ekvi-join naturlig join X division 24

SQL - Structured Query Language SQL har funktioner för att hantera: databeskrivning, SQL-DDL (Data Definition Language) databearbetning, SQL-DML (Data Manipulation Language) behörighet, SQL-DCL (Data Control Language) 25

Icke procedurellt, dvs vad snarare än hur, dvs den som kodar anger vad som söks, (nästan) inte vilka operationer som ska utföras och inte heller i vilken ordning de ska utföras,avd AND AVDELNING.Avd = ANSTÄLLD.AVD JOIN SQL kan uttrycka allt som går att uttrycka i relationsalgebran - språket är relationally complete PLUS lite till, bland annat ORDER BY (DESC; ASC) 26

SQL-DML SELECT - läsning = sökning INSERT - nyskapande (vanligen av rader i en tabell) UPDATE - ändra DELETE - ta bort 27

SELECT SELECT Namn, Avd FROM ANSTÄLLD WHERE Lön > 25000 ANSTÄLLD Namn Lön Chef Avd Per Kvist 15000 Eva Berg Parfym Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 30000 Eva Berg Skor Eva Berg 33000 Eva Berg Parfym Resultat: Namn Nils Hed Eva Berg Avd Skor Parfym 28

WHERE OCH JOIN Predikatet kan innehålla: Jämförelseoperatorer: = <>, >, >=, <, =< Logiska operatorer: AND, NOT, OR, Paranteser kan användas för att styra utvärderingen BETWEEN för att testa intervall ANSTÄLLD Namn Lön Chef Avd Per Kvist 15000 Eva Berg Parfym Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 30000 Eva Berg Skor Eva Berg 33000 Eva Berg Parfym AVDELNING Anamn Våning Leksaker 2 Livsmedel 3 Parfym 3 Skor 2 Trädgård 1 SELECT Namn, Våning FROM ANSTÄLLD, AVDELNING WHERE Avd = Anamn AND Lön BETWEEN 22000 AND 30000 Resultat: Namn Våning Sten Rot 2 Nils Hed 2 29

Kvalificerade attributnamn Om ett attributnamn förekommer i flera av de berörda tabellerna måste det Kvalificeras med tabellnamnet: ANSTÄLLD Namn Lön Chef Anamn Per Kvist 15000 Eva Berg Parfym Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 30000 Eva Berg Skor Eva Berg 33000 Eva Berg Parfym AVDELNING Anamn Våning Leksaker 2 Livsmedel 3 Parfym 3 Skor 2 Trädgård 1 SELECT Namn, Våning FROM ANSTÄLLD, AVDELNING WHERE ANSTÄLLD.Anamn = AVDELNING.Anamn AND Lön BETWEEN 22000 AND 30000 30

Alias Om tabellnamnen är långa kan aliasnamn införas genom att ge en tabell ett alias utan att kommatecken skrivs i tabellen: SELECT A1.Namn, A2.Våning FROM ANSTÄLLD A1, AVDELNING A2 WHERE A1.Anamn = A2.Anamn AND Lön > 25000 31

Alias, fortsättning Alias är även användbart när man vill joina en tabell med sig självt: Ta fram namn och lön på alla anställa som har en chef som tjänar mer än 30000 kronor: SELECT A1.Namn, A1.Lön FROM ANSTÄLLD A1, ANSTÄLLD A2 WHERE A1.Chef = A2.Namn AND A2.Lön > 30000 ANSTÄLLD Namn Lön Chef Anamn Per Kvist 15000 Eva Berg Parfym Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 30000 Eva Berg Skor Eva Berg 33000 Eva Berg Parfym Resultat: Namn Lön Per Kvist 15000 Bo Gren 20000 Nils Hed 30000 Eva Berg 33000 32

Nästlade frågor Ta fram namn och lön på alla anställda som har en chef som tjänar mer än 30000 kr: SELECT Namn, Lön FROM ANSTÄLLD WHERE Chef IN (SELECT Namn FROM ANSTÄLLD WHERE Lön > 30000) ANSTÄLLD(Namn, Lön, Chef, Anamn) AVDELNING(Anamn, Våning) Här använde vi nästling som ett alternativ till att joina en tabell med sig själv! Jämför med föregående fråga. 33

DIFFERENCE I SQL Ta fram namn på alla personer som aldrig ägt en röd bil: SELECT PName FROM PERSON WHERE PName NOT IN (SELECT Owner FROM CAR WHERE Colour = Red ) SELECT Owner FROM CAR WHERE Colour Red SELECT PName AS OWNER FROM PERSON EXCEPT SELECT Owner FROM CAR WHERE Colour = Red Alternativ CAR Licencenr Colour Owner ABC123 Blue Lisa AAA111 Red Lisa ABB222 Red Oscar MMM11 Yellow Ben Resultat: Owner Ben Eva PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 Eva 60 Snög. 2 34

DIVISION i SQL Ta fram namn på de företag som har alla personer anställda: PERSON PName Weight PAddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 SELECT W.Company FROM WORKS_AT W WHERE NOT EXISTS (SELECT PName FROM Person WHERE PName NOT IN (SELECT Person FORM WORKS_AT WHERE Company = W.Company)) Det får inte existera någon person i PERSON som inte är anställd i det företag vi söker WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB Resultatmängd: Company Telia AB 35

Variant på DIVISION. Ta fram namn på alla företag som har samma personer anställda som Ramirent Oy : SELECT W.Company FROM WORKS_AT W WHERE NOT EXISTS (SELECT R.Person FROM WORKS_AT R WHERE R.Company = Ramirent Oy AND R.Person NOT IN (SELECT Person FROM WORKS_AT WHERE Company = W.Company)) PERSON PName Weight PAddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB Det får inte existera någon anställd som Ramirent har som inte det företag vi söker har. Hmm... Räcker detta? Resultatmängd: Company Telia AB Ramirent Oy 36

SELECT W.Company FROM WORKS_AT W WHERE NOT EXISTS (SELECT R.Person FROM WORKS_AT R WHERE R.Company = Ramirent Oy AND R.Person NOT IN (SELECT Person FROM WORKS_AT WHERE Company = W.Company)) AND NOT EXISTS (SELECT A.Person FROM WORKS_AT A WHERE A.Company = W.Company AND A.Person NOT IN (SELECT Person FROM WORKS_AT WHERE Company = Ramirent Oy )) Variant på DIVISION forts. Ta fram namnen på de företag som har samma anställda som Ramirent Oy : Det får inte existera någon anställd i Ramirent Oy som inte är anställd i det företag vi söker. Det får heller inte existera någon anställd i det företag vi söker som inte är anställd i Ramirent Oy. Resultatmängd: Company Ramirent Oy 37

DISTINCT SQL rensar inte duplikat automatiskt (vilket ju operatorerna i relationsalgebra gjorde). För att eliminera dubletter anges DISTINCT. SELECT DISTINCT(Company) FROM WORKS_AT SELECT Company From WORKS_AT Resultat: Company Telia AB Ramirent Oy Resultat: Company Telia AB Telia AB Ramirent Oy Telia AB 38

Inbyggda funktioner, aggregatfunktioner COUNT(*), räknar antalet rader i en tabell COUNT(kolumnnamn), räknar antalet värden i en kolumn SUM(kolumnnamn), summerar värdena i en kolumn AVG(kolumnnamn), tar genomsnittet av värdena i en kolumn MAX(kolumnnamn), ger största värdet i en kolumn MIN(kolumnnamn, ger minsta värdet i en kolumn 39

Exempel på aggregat-funktioner SELECT COUNT(*) FROM WORKS_AT Ger antalet rader i tabellen WORKS_AT Resultat: 4 SELECT COUNT(DISTINCT (Company)) FROM WORKS_AT Ger antalet (unika) företag i tabellen WORKS_AT Resultat: WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB 2 40

Order by En relation (tabell) saknar (ur teoretisk synvinkel åtminstone) ordning men man kan sortera ett sökresultat mot tabellen (görs ingen sortering kommer resultatet vanligen att presenteras i primärnyckelordning). SELECT DISTINCT Company FROM WORKS_AT ORDER BY Company Ger företagsnamnen sorterade i bokstavsordning WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB Resultat: Company Ramirent Oy Telia AB 41

GROUP BY Grupperar rader efter det kolumn-värde som anges Ta fram alla företag och hur många anställda varje företag har: SELECT Company, COUNT(Person) FROM WORKS_AT GROUP BY Company WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB Ger antalet anställda per företag i tabellen WORKS_AT Resultat: Company Telia AB 3 Ramirent Oy 1 42

GROUP BY med ny kolumnrubrik Ta fram alla företag och hur många anställda varje företag har: SELECT Company, COUNT(Person) AS Antal FROM WORKS_AT GROUP BY Company WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB Ger antalet anställda per företag i tabellen WORKS_AT Resultat: Company Antal Telia AB 3 Ramirent Oy 1 43

GROUP BY och HAVING HAVING fungerar på grupper som WHERE fungerar på rader, dvs eliminerar grupper. Ta fram alla företag och hur många anställda varje företag har för de företag som har mer än 2 anställda: SELECT Company, COUNT(Person) AS Antal FROM WORKS_AT GROUP BY Company HAVING COUNT(Person) > 2 WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB Ger antalet anställda per företag i tabellen WORKS_AT Resultat: Company Antal Telia AB 3 44

Mer om nästlade frågor (subselect) Vissa frågor kräver att man beräknar ett värde i databasen för att använda det i en WHERE-klausul. Detta kan endast lösas med en subselect (nåja en vy skulle också fungera). Ta fram alla företag som har fler anställda än Ramirent Oy har: SELECT Company, count(person) FROM WORKS_AT GROUP BY Company HAVING COUNT(Person)> (SELECT count(person) FROM WORKS_AT WHERE Company = Ramirent Oy ) Resultat: WORKS_AT Company Telia AB 3 WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB 45

UNION Lista alla personer som antingen väger mer än 60 kg eller äger en röd bil eller bådadera: CAR Licencenr Colour Owner ABC123 Blue Lisa AAA111 Red Lisa ABB222 Red Oscar MMM11 Yellow Ben SELECT Owner AS Pname FROM CAR WHERE Colour = Red UNION SELECT Pname FROM PERSON WHERE Weight > 60 PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 Eva 65 Snög. 2 SELECT PName FROM CAR, PERSON WHERE Pname = Owner AND((Colour = Red ) OR (Weight > 60)) Varför är detta inte ett alternativ? 46

INTERSECT(SNITT) Lista alla personer som både äger en röd bil väger mer än 60 kg: Alternativ SELECT Owner FROM CAR WHERE Colour = Red INTERSECT SELECT Pname AS Owner FROM PERSON WHERE Weight > 60 SELECT Owner FROM CAR, PERSON WHERE Owner = Pname AND Weight > 60 AND Colour = Red 47

INSERT INTO PERSON VALUES( Eskil, 63, Isgränd 1 ) INSERT Används för att lägga till rader i redan existerande tabeller. Två sätt: antingen med specificerade värden eller via en SELECT-klausul: PERSON WORKS_AT PName Weight Paddress COMPANY Lisa 55 Solv. 2 Person Company CName Founded Homepage Oscar 65 Solv. 3 Lisa Telia AB Telia AB 2001 www.telia.se Ben 75 Bygatan 1 Oscar Telia AB Ramirent Oy 1989 www.rr.fi Eva 65 Snög. 2 Ben Ramirent Oy Ben Telia AB PERSON PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 Eva 65 Snög. 2 Eskil 63 Isgränd 1 INSERT INTO WORKS_AT (Person, Company) (SELECT DISTINCT(PName), DISTINCT(CName) FROM PERSON, COMPANY WHERE Paddress = Isgränd 1 AND CName = Telia AB ) WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB Eskil Telia AB 48

PERSON DELETE Används för att ta bort rader i redan existerande tabeller: PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 Eva 65 Snög. 2 Eskil 63 Isgränd 1 Ta bort personen Eskil Ta bort alla rader i tabellen person WORKS_AT Person Company Lisa Telia AB Oscar Telia AB Ben Ramirent Oy Ben Telia AB DELETE FROM PERSON WHERE PName = Eskil DELETE FROM PERSON PERSON PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 Eva 65 Snög. 2 PERSON PName Weight Paddress 49

PERSON UPDATE Används för att ädra innehållet i ett eller flera attribut: PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 Eva 65 Snög. 2 Eskil 63 Isgränd 1 Öka en persons vikt med 5 kg: UPDATE PERSON SET Weight = Weight + 5 WHERE PName = Eva PERSON PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 1 Eva 70 Snög. 2 Eskil 6 Isgränd 1 50

VYER (VIEWS) för logiskt dataoberoende En vy är en mall genom vilken man ser en databas. En vy är dynamisk, dvs varje gång Man läser en vy (gör SELECT på vyn) ser man aktuella värden. En vy är inte en tabell och dess innehåll kommer inte att lagras på sekundärminne. Det som lagras är definitionen av vyn. Kurs Student Resultat Grupp IS:4 Kalle VG A IS:4 Pelle G A IS:4 Olle G B IS:4 Lisa U B 2i1033 Kalle 5 1 2i1033 Lisa 4 1 2i1033 Oskar 3 2 2i1033 Eskil U 2 Schemaläggaren vill bara kunna läsa attributen Kurs och Student Studenterna får bara läsa attributen Kurs och Student Lärare och studierektor behöver både kunna läsa och skriva hela tabellen 51

Vyer för logiskt dataoberoende Vyer kan definieras på en eller flera bastabeller och eller andra vyer. CREATE VIEW Student_vy AS (SELECT Kurs, Student, Grupp FROM KURSTILLFÄLLE) CREATE VIEW Lärar_vy AS (SELECT * FROM KURSTILLFÄLLE) CREATE VIEW Schemaplanerings_vy AS (SELECT Kurs, Student FROM KURSTILLFÄLLE) Schemaläggaren vill bara kunna läsa attributen Kurs och Student Studenterna får bara läsa attributen Kurs, Student och Grupp Lärare och studierektor behöver både kunna läsa och skriva hela tabellen 52

Vyer för att förenkla långa SQL-satser Ta fram namn på alla personer som aldrig ägt en röd bil: SELECT PName FROM PERSON WHERE PName NOT IN (SELECT Owner FROM CAR WHERE Colour = Red ) SELECT PName FROM PERSON WHERE PName NOT IN (SELECT * FROM Röd_vy) CREATE VIEW Röd_vy AS SELECT PName FROM PERSON, CAR WHERE PName = Owner AND Colour = Red ) CAR Licencenr Colour Owner ABC123 Blue Lisa AAA111 Red Lisa ABB222 Red Oscar MMM11 Yellow Ben Resultat: PName Ben Eva PName Weight Paddress Lisa 55 Solv. 2 Oscar 65 Solv. 3 Ben 75 Bygatan 53 1 Eva 60 Snög. 2