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