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



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

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

Informationssystem och Databasteknik. Frågespråk mot relationsmodellen

Frågespråk mot relationsmodellen

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

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

Grunderna i SQL del 1

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

Övningar i SQL. SQLAccess.doc Ove Lundgren

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

Databasutveckling Introduktion till SQL och TSQL

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

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

Databasspråket SQL - online.

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.

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

Design och underhåll av databaser

Databasspråket SQL - online.

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

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

Structured query language (SQL)

Structured Query Language (SQL)

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

WCMS-15, Webbutvecklare CMS

D1. Create Domain TEXT30 char(30) Default INGET VÄRDE! ;

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

Laboration SQL. Kom igång.

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

Tentamen i Databasteknik

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

DDL Kommandon CREATE/DROP Database CREATE /ALTER/DROP Table ALTER/ADD/DROP Column CREATE /ALTER/DROP Index

Databaser och SQL - en kort introduktion

Analytisk relationsdatabasdesign

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

Lösningsförslag till Exempel tentamen

Databasspråket SQL - online.

Föreläsning 3 Transformation från konceptuell datamodell till relationsschema ( Syntetisk databasdesign ) Vad är ett databashanteringssystem?

Tentamen. Databasmetodik Lördag 27 september 2014 kl

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

Databasspråket SQL - online.

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

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

Karlstads Universitet, Datavetenskap 1

Vad är SQL? Introduktion till SQL

Tentamen 4,5 hp Delkurs: Databaser och databasdesign 7,5hp Tentander: VIP2, MMD2, INF 31-60, ASP

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

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

Denna laboration skapades för elever vid Roslagens Högskola men kan användas av vem som helst. Namnen på servrarna måste i så fall ändras.

Sätta upp e-post server Ubuntu 14.04, del 1 installation av programvara, konfiguration av mysql och Postfix

Databaser. Vad du ska lära dig: Ordlista

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

Föreläsning 5: Relationsmodellen

Databaser och. SQL, utsökningar mot en tabell

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?

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

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

3. Dynamiska webbplatser, 20 Yhp (4 v)

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

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

Grunderna i SQL del 1

Exempel-Tentamen III

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

Tentamen i Databasteknik

EMPS(NAME, SALARY, DEPT)

Föreläsning 6: Introduktion av listor

Relationsmodellen och syntetisk databasdesign

Vyer, Prepared Statements, Triggers

Idag. 1. En enkel databas. 2. Prata med databaser (frågepsråket SQL)

Informationssystem och Databasteknik

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

732G16: Databaser - Design och programmering

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

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

TER3. Försättsblad till skriftlig tentamen vid Linköpings universitet G28 TEN1 Webprogrammering och databaser Tentamen IDA 1 (7)

DVA234 Databaser. Dag Nyström, Introduktion till databaser och MS SQL Server

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

Databaser - Design och programmering

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

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

För att XCOPY i SQL Server Express ska fungera måste data och logg ligga i samma mapp, vilket naturligtvis inte är så bra.

Databaser och Datamodellering Foreläsning IV

Lösningar till tentamen i EDAF75

Sample exam questions. Database exam TIG058

INNEHÅLL. Historik Vad är SQL Språkuppbyggnad SELECT Operatorer Logiska/Jämförelse SELECT med Alias och JOIN INSERT UPDATE DELETE

Prova på-laboration i SQL

Frågeoptimering. Frågeoptimering kapitel 14

FileMaker 14. SQL-referens

Disposition. 1. Kopplingen mellan Processanalys (DFDdiagram) 2. Treskikts Client-Server arkitektur (Fig 1.8) 3. Data layer

Lösningsförslag till Tentamen,

Skapa en databas. Skapa en tabell. Gör man antingen genom kommandot

Tentamen för DD1370 Databasteknik och informationssystem

Relationskalkyl (RK)

INNEHÅLL SQL DEL 2. Funktioner inbyggda Aggregatfunktioner Skalärfunktioner. Chapter 11. Beginning SQL Server 2008 for Developers

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

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

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

Transkript:

Primtiva operatorer projektion π selektion σ union differens - kryssprodukt X Relationsalgebra Tilldelning := Relationsalgebran är sluten: Med hjälp av dessa operatorer kan andra (icke-primitiva) operatorer definieras: Icke-primitiva operatorer R 1 op R 2 R relation relation relation theta-join θ ekvi-join naturlig join X snitt division ((R 1 op R 2) op R ) op R 4 Tar en eller två tabeller som argument (indata). Producerar en ny tabell som resultat! 1 av 52 Projektion π - Unär operator π A1, A2,...An (Relationsnamn) Vertikal delmängd av attribut ANSTÄLLD Projektion innebär att välja ut ett antal attribut ur en relation. p,lön ANSTÄLLD Projektion Lön Chef Avd Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 0000 Eva Berg Skor Eva Berg 5000 Eva Berg Parfym Lön Per Kvist 15000 Bo Gren 20000 Sten Rot 22000 Nils Hed 0000 Eva Berg 5000 attribut t s (π A1,A2,...An (R)) = antalet attribut, dvs just här = n π A1,A2,...An (R) R, vanligen R Omordning av attribut möjligt via π π Lön, (ANSTÄLLD) Lön 15000 20000 22000 0000 5000 Per Kvist Bo Gren Sten Rot Nils Hed Eva Berg 2 av 52

ANSTÄLLD Selektion innebär att man väljer ut ett antal tupler ur en relation baserat på något villkor. s Avd=Parfym ANSTÄLLD Selektion σ - Unär operator Horisontelll delmängd av rader σ villkor (R) Enkelt villkor: attribut θ attribut attribut θ värde, där θ {=,, <, >,, } Sammansatt villkor: villkor operator villkor där operator {NOT, AND, OR} Selektion Lön Chef Avd Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 0000 Eva Berg Skor Eva Berg 5000 Eva Berg Parfym Lön Chef Avd Bo Gren 20000 Eva Berg Parfym Eva Berg 5000 Eva Berg Parfym t s (σ villkor (R)) = t s (R) σ villkor (R) R av 52 Kartesisk product A B (eller ibland A * B) ska tolkas som alla rader i A kombinerade med alla rader i B A a b c B x y A B a x a y b x b y c x c y t s (A B) = t s (A) + t s (B) A B = A B 4 av 52

Kartesisk produkt, ett exempel till ANSTÄLLD Lön Chef Avd Anamn Våning Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 0000 Eva Berg Skor Eva Berg 5000 Eva Berg Parfym AVDELNING Leksaker 2 Livsmedel Parfym Skor 2 Trädgård 1 ANSTÄLLD AVDELNING Lön Chef Avd Anamn Våning Och så vidare på samma sätt... Eva Berg 20000 Eva Berg Parfym Eva Berg 20000 Eva Berg Parfym Eva Berg 20000 Eva Berg Parfym Eva Berg 20000 Eva Berg Parfym Eva Berg 20000 Eva Berg Parfym Leksaker Livsmedel Parfym Skor Trädgård Leksaker Livsmedel Parfym Skor Trädgård 2 2 1 2 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). 5 av 52 θ JOIN ( theta-join ) där θ {=,, <, >,, } ANSTÄLLD Avd Pia 5 Mia Ken AVDELNING Avd A 5 Bröd 1 Ost Vin ANSTÄLLD θ AVDELNING Anställd.Avd = Avdelning.Avd Anst. Avd. Avd Avd Anamn Pia Mia Ken 5 5 Bröd Vin Vin t s (AθB) = t s (A) + t s (B) AθB A B 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. Observation: σ θ-villkor (A B) Α θ θ-villkor B 6 av 52

NATURAL JOIN ANSTÄLLD Avd AVDELNING Avd A ANSTÄLLD X AVDELNING Avd Anamn Pia 5 5 Bröd Pia 5 Bröd Mia 1 Ost Mia Vin Ken Vin Ken 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 (i annat fall blir NATURAL JOIN samma sak som Cartesisk produkt). Observation: π(σ =-villkor (A B)) Α X B 7 av 52 Övning i relationsalgebra ANSTÄLLD(, Lön, Chef, Avd) Vad innebär följande uttryck i naturligt språk? p (s Lön > 20000 (ANSTÄLLD)) Skriv ett relationsalgebraiskt uttryck som ger namnen på cheferna för de anställda som tjänar mer än 25000 på skoavdelningen. AVDELNING ANSTÄLLD Lön Chef Avd Anamn Våning Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 0000 Eva Berg Skor Eva Berg 5000 Eva Berg Parfym Leksaker 2 Livsmedel Parfym Skor 2 Trädgård 1 π Chef (σ Lön>20000 AND Avd= Sko (ANSTÄLLD)) 8 av 52

Övning i relationsalgebra ANSTÄLLD(, Lön, Chef, Avd) AVDELNING(Anamn, Våning) Skriv ett relationsalgebraiskt uttryck som ger namn och lön för de anställda som arbetar på andra våningen. Metod I (flera steg): Rätt_avdelningar := σ Våning=2 (AVDELNING) Rätt_anställda := ANSTÄLLD θ Avd=Anamn Rätt_avdelningar Rät_uppgifter_om_anställda := π, Lön (Rätt_anställda) Metod II (ett enda långt relationsalgebraiskt uttryck): π, Lön (ANSTÄLLD θ Avd=Anamnσ Våning=2 (AVDELNING)) 9 av 52 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 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 UNION B? A UNION B? A UNION B! A B A B A B a b a b a b a b c a b a b a 1 a x a 1 a 1 m a x b x a 2 a y a 2 a 2 n a y a m b 2 b x b 2 b 2 o b x b x 10 av 52

UNION A Fido Karo Mindy Ossi Ras Pudel Dvärgtax B Fido Emir Lady Morris Ras Schäfer Welsh Corgie Alla rader som finns i A plus alla rader som finns i B A B Fido Karo Mindy Ossi Emir Lady Morris Ras Pudel Dvärgtax Schäfer Welsh Corgie Observation: A Β = Β Α t s (A B) = t s (A) = t s (B) A B A + B max( A, B ) 11 av 52 SNITT (INTERSECT) A Fido Karo Mindy Ossi Ras Pudel Dvärgtax B Fido Emir Lady Morris Ras Schäfer Welsh Corgie A B Fido Ras Alla rader som finns i både A och B Observation I : A Β = Β Α t s (A B) = t s (A) = t s (B) A B min( A, B ) 12 av 52

DIFFERENCE (MINUS) A Fido Karo Mindy Ossi Ras Pudel Dvärgtax B Fido Emir Lady Morris Ras Schäfer Welsh Corgie A MINUS B Karo Mindy Ossi Ras Pudel Dvärgtax Alla tupler som finns i A men inte i B t s (A B) = t s (A) = t s (B) A B A Observation: A - B B - A 1 av 52 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 aldrig ätit glass PERSON GLASS Glass Päronsplit ÄTANDE Glass Päronsplitt Päronsplit 1. Skapa en relation som som innehåller alla personer som har ätit glass: GLASSÄTARE := π (ÄTANDE) 2. Dra sen bort denna mängd tupler från relationen PERSON (dvs mängden av alla personer): ALDRIG_ÄTIT_GLASS := PERSON - GLASSÄTARE Observera att man måste projicera ut från ÄTANDE eftersom differens kräver att de ingående relationerna ska vara unionskompatibla! 14 av 52

A x x x y y z z z B m n o m n m n 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. o. 15 av 52 R Resultat A 2 A 1 1 A 2 a A 1 a A 1 1 a 2 a 2 1 a a 2 a 1 2 a 2 S 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 t s (A B) = t s (A) - t s (B) A B A 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) 16 av 52

Kvot fortsättning... Kvot är användbart för frågor av typ: Ta fram alla som gjort allt/har alla egenskaperna etc. T ex Ta fram alla som ätit av alla glass-sorterna ÄTANDE Glass Päronsplitt Päronsplit GLASS Glass Päronsplit ÄTANDE GLASS KVOT kallas även DIVISION 17 av 52 Sammanfattning av några relationsalgebraiska operatorer UNION INTERSECT(= SNITT) DIFFERENCE A B A B A B A UNION B A INTERSECT B A DIFFERENCE B (A MINUS B) Alla rader som förekommer i A eller B PROJECTION Alla rader som förekommer i både A och B De rader som förekommer i A men inte i B SELECTION 18 av 52

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) 19 av 52 SQL - Structured Query Language SELECT, Lön FROM ANSTÄLLD WHERELön > 17000 p X s SQL kan uttrycka allt som går att uttrycka i relationsalgebran - språket är relationally complete 20 av 52

SQL-DML SELECT, utsökning INSERT, lägga in (vanligen rader i en tabell) UPDATE, ändra DELETE, ta bort 21 av 52 SELECT SELECT, Avd FROM ANSTÄLLD WHERE Lön > 25000 ANSTÄLLD Lön Chef Avd Anamn Våning Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 0000 Eva Berg Skor Eva Berg 5000 Eva Berg Parfym AVDELNING Leksaker 2 Livsmedel Parfym Skor 2 Trädgård 1 Resultat: Nils Hed Eva Berg Avd Skor Parfym 22 av 52

ANSTÄLLD WHERE predikatet kan innehålla: jämförelseoperatorerna =, <>, > >=, <, =< logiska operatorerna AND, OR och NOT paranteser kan användas för att styra utvärderingen BETWEEN för att testa intervall Lön Chef Avd Anamn Våning Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 0000 Eva Berg Skor Eva Berg 5000 Eva Berg Parfym AVDELNING Leksaker 2 Livsmedel Parfym Skor 2 Trädgård 1 SELECT, Våning FROM ANSTÄLLD, AVDELNING WHERE Avd = Anamn AND Lön BETWEEN 22000 AND 0000 Resultat: Våning Sten Rot Nils Hed 1 2 av 52 Kvalificerade attributnamn Om ett attributnamn förekommer i flera av de berörda tabellerna måste det kvalificeras med tabellnamnet: ANSTÄLLD Lön Chef Anamn Avd Anamn Våning Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 0000 Eva Berg Skor Eva Berg 5000 Eva Berg Parfym AVDELNING Leksaker 2 Livsmedel Parfym Skor 2 Trädgård 1 SELECT, Våning FROM ANSTÄLLD, AVDELNING WHERE ANSTÄLLD.Anamn = AVDELNING.Anamn AND Lön BETWEEN 22000 AND 0000 24 av 52

Alias Alias för tabellnamn kan införas (t ex om tabellnamnen är långa) SELECT A1., A2.Våning FROM ANSTÄLLD A1, AVDELNING A2 WHERE A1.Anamn = A2.Anamn AND Lön > 25000 25 av 52 Alias fortsättning Alias är även användbart när man vill joina en tabell med sig själv: Ta fram namn och lön på alla anställda som har en chef som tjänar mer än 0000 kr: SELECT A1., A1.Lön FROM ANSTÄLLD A1, ANSTÄLLD A2 WHERE A1.Chef = A2. AND A2.Lön > 0000 ANSTÄLLD AVDELNING Lön Chef Anamn Avd Anamn Våning Bo Gren 20000 Eva Berg Parfym Sten Rot 22000 Nils Hed Skor Nils Hed 0000 Eva Berg Skor Eva Berg 5000 Eva Berg Parfym Leksaker 2 Livsmedel Parfym Skor 2 Trädgård 1 Resultat: Per Kvist Bo Gren Nils Hed Eva Berg Lön 15000 20000 0000 5000 26 av 52

Nästlade frågor Ta fram namn och lön på alla anställda som har en chef som tjänar mer än 0000 kr: SELECT, Lön FROM ANSTÄLLD WHERE Chef IN (SELECT FROM ANSTÄLLD WHERE Lön > 0000) Här använde vi nästling som ett alternativ till att joina en tabell med sig själv! (se föregående fråga) 27 av 52 Nästlade frågor motsvarande aldrig, inga etc. Ta fram namn på alla personer som aldrig ätit glassen Päronsplitt SELECT WHERE NOT IN (SELECT WHERE Glass= Päronsplitt ) SELECT WHERE Glass Päronsplitt SELECT EXCEPT SELECT WHERE Glass = Päronsplitt Alternativ ÄTANDE Glass Päronsplitt Päronsplit 28 av 52

Nästlade frågor med NOT EXISTS Ta fram namn på alla som ätit av alla glasstyperna: SELECT Ä. Ä WHERE NOT EXISTS (SELECT Glass FROM GLASS WHERE Glass NOT IN (SELECT Glass FORM ÄTANDE WHERE = Ä.)) Det får inte existera någon glass i GLASS som inte ätits av Ä. ÄTANDE Glass Resultat: Päronsplitt Päronsplit GLASS Glass Päronsplit 29 av 52 Nästlade frågor forts. Ta fram namn på alla som ätit samma glassar som : SELECT Ä. Ä WHERE NOT EXISTS (SELECT Glass WHERE = AND Glass NOT IN (SELECT Glass WHERE = Ä.)) ÄTANDE Glass Päronsplitt Päronsplit GLASS Glass Päronsplit Det får inte existera någon glass som ätit som inte den vi söker ätit. Hmm... Räcker detta? 0 av 52

SELECT Ä. Ä WHERE NOT EXISTS (SELECT Glass WHERE = AND Glass NOT IN (SELECT Glass WHERE = Ä.)) AND NOT EXISTS (SELECT Glass WHERE = Ä. AND Glass NOT IN (SELECT Glass WHERE = )) Nästlade frågor forts. Ta fram namnen på de som ätit samma glassar som ätit: Det får inte existerar någon glass som ätit som inte de vi söker ätit. Det får heller inte existera någon glass som de vi söker ätit som inte ätit. Resultat: Ingen hade ätit precis de glassar ätit (utom ). 1 av 52 Vyer kan göra det lite enklare CREATE VIEW s_glassar AS (SELECT Glass WHERE = ) SELECT Ä. WHERE NOT EXISTS (SELECT Glass FROM s_glassar WHERE Glass NOT IN (SELECT Glass WHERE = Ä.)) AND NOT EXISTS (SELECT Glass WHERE = Ä. AND Glass NOT IN s_glassar) 2 av 52

DISTINCT SQL rensar inte duplikat automatiskt (vilket ju operatorerna i relationsalgebra gjorde). För att eliminera dubletter anges DISTINCT. Ta fram alla som ätit minst en glass som även ätit: SELECT DISTINCT() From ÄTANDE WHERE Glass IN s_glassar SELECT From ÄTANDE WHERE Glass IN s_glassar Resultat: Resultat: av 52 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 4 av 52

Exempel på aggregat-funktioner SELECT COUNT(*) Ger antalet rader i tabellen ÄTANDE Resultat: 8 SELECT COUNT(DISTINCT ) Ger antalet (unika) personer i tabellen ÄTANDE Resultat: 5 av 52 ORDER BY En relation (tabell) saknar ju ordning, men man kan sortera resultatet (vanligen presenteras resultatet i primärnyckelordning om man läser från en tabell). SELECT DISTINCT ORDER BY Ger alla namnen sorterade i bokstavsordning Resultat: 6 av 52

GROUP BY Grupperar rader efter det värde som anges. Ta fram alla personer och hur mycket glass de ätit per person: SELECT, count(glass) GROUP BY Resultat: 2 7 av 52 Ge ny kolumnrubrik till resultat Grupperar rader efter det värde som anges. Ta fram alla personer och hur mycket glass de ätit per person: SELECT, count(glass) AS Glass_antal GROUP BY Resultat: Glass_antal 2 8 av 52

GROUP BY OCH HAVING HAVING fungerar på grupper som WHERE fungerar på rader, dvs elimenerar grupper Ta fram alla personer som ätit mer än 2 glassar: SELECT, count(glass) GROUP BY HAVING COUNT(Glass) > 2 Resultat: 9 av 52 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 personer som ätit fler glassar än ätit SELECT, count(glass) Resultat: GROUP BY HAVING COUNT(Glass) > (SELECT count(glass) WHERE NAMN = ) 40 av 52

UNION Ta fram alla avdelningar som ligger på plan 1 eller avdelningar där personer är antällda som tjänar mer än 20000 eller båda delar: Alternativ SELECT Anamn FROM AVDELNING WHERE Våning = 1 UNION SELECT Anamn FROM ANSTÄLLD WHERE Lön > 20000 SELECT AVDELNING.Anamn FROM AVDELNING, ANSTÄLLD WHERE AVDELNING.Anamn = ANSTÄLLD.Anamn AND Våning = 1 OR Lön > 20000 ANSTÄLLD(, Lön, Chef, Anamn) AVDELNING(Anamn, Våning) 41 av 52 INTERSECT(SNITT) Ta fram alla avdelningar som ligger på plan 1 OCH där det finns personer anställda som tjänar mer än 20000: Alternativ ANSTÄLLD(, Lön, Chef, Anamn) AVDELNING(Anamn, Våning) SELECT Anamn FROM AVDELNING WHERE Våning = 1 INTERSECT SELECT Anamn FROM ANSTÄLLD WHERE Lön > 20000 SELECT AVDELNING.Anamn FROM AVDELNING, ANSTÄLLD WHERE AVDELNING.Anamn = ANSTÄLLD.Anamn AND Våning = 1 AND Lön > 20000 42 av 52 ANSTÄLLD.An

EXCEPT(MINUS) Ta fram alla avdelningar som inte har några personer som tjänar mer än 0000: Alternativ ANSTÄLLD(, Lön, Chef, Anamn) AVDELNING(Anamn, Våning) SELECT Anamn FROM AVDELNING EXCEPT SELECT Anamn FROM ANSTÄLLD WHERE Lön > 0000 SELECT Anamn FROM AVDELNING WHERE Anamn NOT IN (SELECT Anamn FROM ANSTÄLLD WHERE Lön > 0000) 4 av 52 Textsträngsmatchning Ta fram alla anställda vars namn börjar på bokstaven n: SELECT FROM ANSTÄLLD WHERE LIKE n% Kolumnnamn LIKE textkonstant, där textkonstant kan utgöras av % (svarar mot 0 eller flera tecken) och/eller _ (svarar mot ett godtyckligt tecken) och/eller övriga tecken (som motsvarar sig själva). Mari_ K%sson svarar mot en textsträng som börjar på Mari och följs av minst ett godtyckligt tecken, ett blanktecken, ett K, samt ett godtyckligt antal valfria tecken avslutat med bokstäverna sson. Exempel: Karlsson, Marie Klasson men också Mari Ksson. I t ex Access svarar % mot * och _mot? 44 av 52

INSERT Används för att lägga till rader i redan existerande tabeller: Två sätt: antingen med specificerade värden eller via SELECT: INSERT INTO GLASS VALUES( Dajmstrut ); INSERT INTO ÄTANDE VALUES(, Dajmstrut ) Om man tänker sig att man har en annan tabell (benämnd statistik) som innehåller på personer och deras genomsnittliga ätande kan man skapa INSERT via SELECT INSERT INTO statistik(, snittkvant) SELECT, avg(glass) GROUP BY Vad händer om de två INSERT-satserna anropas i omvänd ordning? 45 av 52 DELETE Används för att ta bort rader i redan existerande tabeller: Ta bort glassen Dajmstrut : DELETE FROM GLASS WHERE Glass = Dajmstrut Vad händer om de med de rader i ÄTANDE som refererar till Dajmstrut? Ta bort alla rader i tabellen ÄTANDE: DELETE 46 av 52

UPDATE Betraka tabellan GLASS_I_LAGER till nedan. Om en leverans med 200 päron- split anländer samtidigt som man vill rea just päronsplit kan följande UPDATEsats exekveras. Används för att ändra innehållet i ett eller flera attribut i rader i redan existerande tabeller: UPDATE GLASS_I_LAGER SET Antal_i_lager = Antal_i_lager + 200, Pris = 6.00 WHERE Glass = Päronsplit GLASS_I_LAGER (före UPDATE) Glass Päronsplit Antal_i_lager 250 00 700 Pris 7.00 15.00 11.00 GLASS_I_LAGER (efter UPDATE) Glass Päronsplit Antal_i_lager 450 00 700 Pris 6.00 15.00 11.00 47 av 52 Några slutord om vyer (VIEWS) En vy är en mall genom vilken man ser en databas. En vy är dynamisk, dvs varje gång man gör SELECT på en vy ser man aktuella värden. En vy är inte en ny 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 IS:4 IS:4 IS:4 GKD GKD GKD GKD GKD Kalle Olle Kalle Olle Eva Knut VG G U VG VG G G G G GruppA GruppA GruppB GruppB Grupp1 Grupp2 Grupp2 Grupp1 Grupp2 Schemaläggaren vill bara kunna läsa Kurs och Student Studenterna får bara läsa Kurs, Student och Grupp Lärarna och studierektor behöver både kunna läsa och skriva hela tabellen 48 av 52

Några slutord om vyer (VIEWS) 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 Kurs och Student Studenterna får bara läsa Kurs, Student och Grupp Lärarna och studierektor behöver både kunna läsa och skriva hela tabellen 49 av 52 Fördelar med vyer visst logiskt dataoberoende 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 50 av 52

Vy - exempel Returnera alla som aldrig ätit Päronsplit men ändå ätit minst en likadan glass som : CREATE VIEW EJPÄRON AS (SELECT,Glass FROM Glassätande WHERE NOT IN (SELECT FROM Glassätande WHERE Glass= Päronsplit )) EJPÄRON Glass CREATE VIEW STINAS_GLASSAR AS (SELECT Glass FROM Glassätande WHERE = ) STINAS_GLASSAR Glass Päronsplit SELECT EP. FROM EJPÄRON EP, STINAS_GLASSAR SG WHERE EP.Glass=SG.Glass 51 av 52 Mera schema-ddl CREATE TABLE EMPLOYEE (EID VARCHAR(11) NOT NULL UNIQUE, BID CHAR(7) NOT NULL, PRIMARY KEY(EID), FOREIGN KEY(BID) REFERENCES BUSINESS ON DELETE CASCADE ON UPDATE CASCADE) DDL: DML: DCL: CREATE SCHEMA CREATE TABLE CREATE VIEW CREATE INDEX DROP TABLE DROP VIEW DROP INDEX ALTER TABLE SELECT INSERT UPDATE DELETE GRANT REVOKE Förelsäsning 6! 52 av 52