Påminnelse: Vad är en Databas? Databasteknik och informationssystem DD1370 F3 Petter Ögren Ett antal tabeller Referenser (pilar) mellan tabellerna Ex: register abc123 BMW 830101-0000 def100 Volvo 830101-0000 Ett urval ur databasen bestäms av en SQL-fråga Förra föreläsningen l SQL Structured Query Language F2 Idag Vad är en vy? (i SQL) Nu Ett sätt att se en databas En SQL-fråga som fått ett eget namn En ny tabell som får sitt värde definierat av andra tabeller Visa i Base 1
Create view as Create view as Select Skostorlek, avg( Lön ) from Anställd group by Skostorlek Create view Diskriminering as Select Skostorlek, avg( Lön ) from Anställd group by Skostorlek Ny tabell - Får värde från andra tabeller - Går att använda precis som vanliga tabeller SQL standard: - Create view Diskriminering as Select Skostorlek, avg( Lön ) from Anställd group by Skostorlek I Base: - I Base skriver vi bara frågan i ett annat fönster (Tabell/Skapa vy) Alltså: skriv precis som vanlig SQL-fråga (utan create view ) Diskriminering Skostorl. Avg( Lön ) 35 25000 40 26000 Skostorlek 35 20000 40 25000 35 Jasemine 30000 40 Kajsa 27000 Varför vill man söka från flera tabeller? Nu Vem äger bilen ABC123? Vilka bilar äger? Två sätt: - Sök först i ena, använd resultatet till att söka i andra - Kombinera tabellerna, sök i resultatet DEF100 Volvo 830101-0000 Sök först i ena, använd resultatet till att söka i andra Sök först i ena, använd resultatet till att söka i andra Vad heter den som äger bilen ABC123? - Hitta Pnr på den som äger bilen - Hitta Namn på den som har det Pnr Vilka bilar äger? - Hitta Pnr på - Hitta bilar som ägs av det Pnr DEF100 Volvo 830101-0000 Vad heter den som äger bilen ABC123? - Hitta Pnr på den som äger bilen DEF100 Volvo 830101-0000 Select Ägare from where RegNr = ABC123 - Hitta Namn på den som har det Pnr Select Namn from where Pnr = X - Kombinera Select Namn from where Pnr in (Select Ägare from where RegNr = ABC123 ) IN istället för = bra om hel tabell 2
Sök först i ena, använd resultatet till att söka i andra Sök först i ena, använd resultatet till att söka i andra - Select Telefon from where Pnr in (Select Ägare from where Modell = BMW ) - Select Modell from where Ägare in (Select Pnr from where Telefon = 070-000000 ) 070-000000 073-000000 930101-0000 Volvo 930101-0000 BMW Urval: in, not in Hur får vi en lista på alla bilägare? Select * from personer where Pnr in (select Pnr from bilägare) Alla icke-bilägare? Select * from personer where Pnr not in (select Pnr from bilägare) Nu Slå ihop tabeller: join on - Select * from join on Ägare = Pnr Slå ihop tabeller: join on - Select Name from join on Ägare = Pnr where RegNr = ABC123 3
Slå ihop tabeller: join on Slå ihop tabeller: join on - Select Name from join on Ägare = Pnr where RegNr = DEF100 - Select Modell from join on Ägare = Pnr where RegNr = DEF100 BMV Volvo BMV Volvo Slå hop tabeller utan join Nu Hittils - Select * from Tabell where Nu: - Select * from Tabell1, Tabell2 where Vad betyder det att lista flera tabeller? Raderna i Tabell1 kopplas ihop med raderna i Tabell2 i alla möjliga kombinationer Alla möjliga rad-kombinationer Hundar Ludde Select * from hästar, hundar Lady Lufsen 300kg 15kg 20kg Slå ihop tabeller: 2 olika sätt - Select * from join on Ägare = Pnr - Select * from, where Ägare = Pnr - Ger samma resultat Hästar Brunte 300kg Brunte 300kg Ludde 300kg Pålle 400kg Brunte 300kg Lady 15kg Brunte 300kg Lufsen 20kg Pålle 400kg Ludde 300kg Pålle 400kg Lady 15kg Pålle 400kg Lufsen 20kg Nya tabellen har N*M rader om N resp M rader från början. Här 2*3=6 rader. 4
- Select Namn from join on Ägare = Pnr where RegNr = ABC_% Idag 730101-0000 072-000000 - Select Namn from, where Ägare = Pnr and RegNr = 100 - Select Namn from, where Ägare = Pnr and RegNr = 100 order by Namn 730101-0000 072-000000 730101-0000 072-000000 - Select Namn from where Telefon is NULL order by Namn - Select Namn from where Lön < 27000 order by Namn 730101-0000 930101-0000 20000 830101-0000 25000 730101-0000 30000 5
- Select count( Modell ) from where Modell = Volvo - Select Modell, avg( Lön ) from join on Ägare = Pnr group by Modell 3 2 BMW 25000 Volvo 25000 BMW 30000 Volvo 25000 20000 930101-0000 20000 830101-0000 25000 730101-0000 30000 930101-0000 20000 830101-0000 25000 730101-0000 30000 - ett sätt att beskriva tabeller i databas Skriva SQL-frågor (step by step) Tabell en beskriver tabellnamn, kolumnnamn och primärnycklar För tabellerna nedan har vi en Primärnyckelskolumn(er) - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) Andra kolumner Primärnyckel: Unikt värde för varje rad 930101-0000 20000 830101-0000 25000 730101-0000 30000 Steg för att skiva SQL-frågor 1. Förstå en - Vilka tabeller finns - Vilka kolumner finns - Hur sitter tabellerna ihop (samband?) 2. Förstå vad som söks - Behövs info från en eller flera tabeller? 3. Hitta SQL-kommandon som plockar fram rätt info - Leta i SQL-kommandon som ingår i kursen 4. Kombinera ihop ovanstående Detaljerade SQL-uppgifter Lista alla (Pnr) som kört sin egen bil - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) (notera dubbla primärnycklar) - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) Lista alla som åkt i sin egen bil Lista alla som inte åkt i sin egen bil Lista alla som äger bil utan att ha kört den Hur många bilar äger de olika personerna? Lista vem som har kört vems bil (med namn) SELECT * FROM "" JOIN "Kört" ON ""."RegNr" = "Kört"."RegNr" AND ""."Ägare" = "Kört"."Pnr" 6
Lista alla (namn) som kört sin egen bil Lista alla som inte kört sin egen bil - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) SELECT "Namn" FROM "" WHERE "Pnr" IN ( SELECT "Pnr" FROM "" JOIN "Kört" ON ""."RegNr" = "Kört"."RegNr" AND ""."Ägare" = "Kört"."Pnr" ) SELECT "Namn" FROM "" WHERE "Pnr" NOT IN ( SELECT "Pnr" FROM "" JOIN "Kört" ON ""."RegNr" = "Kört"."RegNr" AND ""."Ägare" = "Kört"."Pnr" ) Lista alla som äger bil utan att ha kört den Hur många bilar äger de olika personerna? - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) SELECT "Namn" FROM "" WHERE "Pnr" NOT IN ( SELECT "Pnr" FROM "" JOIN "Kört" ON ""."RegNr" = "Kört"."RegNr" AND ""."Ägare" = "Kört"."Pnr" ) AND "Pnr" IN ( SELECT "Ägare" FROM "" ) SELECT "Ägare", COUNT( "Ägare" ) FROM "" GROUP BY "Ägare SELECT "Ägare", COUNT( "Ägare" ) FROM "" GROUP BY "Ägare ORDER BY COUNT( "Ägare" ) Lista vem som har kört vems bil Lista vem som har kört vems bil, med kolumnnamn Förarnamn och Ägarnamn - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) - (RegNr,Modell,Ägare) - (Pnr,Namn,Lön) select * from "Kört", "", "" where "Kört"."RegNr"=""."RegNr" and "Ägare"=""."Pnr" SELECT "Namn" AS "Förarnamn", "Ägarnamn" FROM "" JOIN ( SELECT "Kört"."Pnr" AS "Förare", ""."Namn" AS "Ägarnamn" FROM "Kört", "", "" WHERE ( "Kört"."RegNr" = ""."RegNr" AND "Ägare" = ""."Pnr" ) ) ON ""."Pnr" = "Förare" 7
Slut 8