Page 1 of 5 Laboration SQL Syfte: Under denna laboration skall du bekanta dig med SQL. När laborationen är genomförd skall du klara av att själv formulera enklare SQL-frågor för att kunna ta fram information ur tillgängliga databaser. Kom igång Starta Access Öppna Nwind.mdb Välj fliken Frågor Välj att skapa en ny fråga Välj Stäng när du blir erbjuden att lägga till tabeller Välj SQL i visamenyn Sätt igång och skriv SQL-frågan Datablad i visamenyn eller knappen Utropstecken för att köra frågan Ovan beskrivs databasen NWIND, dess tabeller och attribut och relationerna dem emellan. Strecken visar vilka fält som hör ihop, skissen tolkas så att en kund kan ha många order medan en order hör till en kund. Besvara följande frågor mha av SQL. För godkänt skall frågorna med fet stil redovisas. För pluss redovisas endast de understrukna uppgifterna. Frågorna nedan fungerar på den Northwinddatabas som finns att ladda ner från denna sida (se länken längre upp). Fungerar inte det aktuella datumet eller ordernummret kan det bero på att en annan Norwind-databas används, byt då till datum/ordernummer som existerar i databasen. Enkla frågor 1.Visa alla anställda. 2.Visa namnen för alla anställda. 3.Visa alla speditörer.
Page 2 of 5 Enkla villkor 4.Ta fram all information om den anställde med anställningsnummer 1. 5.Ta fram all information om de anställda som jobbar som säljare. 6.Vad har Vice VD för hemtelefonnummer (befattning=vice VD, försäljning)? 7.Vad heter kontaktpersonen på Svensk Sjöföda AB? 8.Vilka produkter har ett enhetspris på 80,00 kr? Sortering Vid sortering används uttrycket ORDER BY följt av ett eller flera fältnamn. Sortering ser på försata fältnamnet, finns flera med samma värde sorteras de på nästa fältnamn (telefonkatalogen skulle se ut: ORDER BY Efternamn, Förnamn). Om fältnamnet följs av DESC sorteras i fallande ordning, annars i stigande (man kan skriva ASC men det behövs inte). Visa alla anställda sorterade i... 9.Bokstavsordning. 10. Yngst först. 11.Visa alla kunderna, sortera dem i landsordning och för de i samma land skall sortera ske på ort. LIKE, AND och OR Ibland kan man inte använda = för att göra jämförelser eftersom det man söker inte är lika med utan bara nästan lika med. Då används istället för = ordet LIKE tillsammans med? och eller *, där? motsvarar exakt ett valfritt tecken och * motsvarar godtyckligt antal godtyckliga tecken. EXEMPEL 1 Visa alla Anställda vars postnummer innehåller siffran 5 WHERE Postnummer LIKE "*5*" AND och OR används för att kombinera flera villkor, AND innebär att båda villkoren måste vara uppfyld, OR att minst ett måsta vara uppfyllt EXEMPEL 2 Visa alla Anställda vars postnummer innehåller siffran 5 eller siffran 7 WHERE Postnummer LIKE "*5*" OR Postnummer LIKE "*7*" EXEMPEL 3Visa alla Anställda vars postnummer innehåller siffran 5 och som bor i Frankrike WHERE Postnummer LIKE "*5*" AND Land="Frankrike" 12.Vem av de anställda har studerat vid Trinity College?
Page 3 of 5 13.Visa de anställda på Northwind som har efternamn som slutar på "son" 14.Visa namnet och anknytning för de anställda som har chefsbefattningar (ordet chef i befattning eller vd i befattning Beräkningar Beräkningar kan göras direkt i såväl SELECT-delen som WHERE-delen av SQL-satsen: SELECT pris*2 AS DyrtPris Genom att använda ordet AS enligt ovanstående exempel kan man kalla det beräknade fält för något vettigt. 15.Man funderar på att höja priserna med 7% Hur mycket skulle de olika produkterna kosta efter en eventuell prishöjning, kalla priset för "Nytt pris "? Visa även det gamla priset (Hakparenteser runt, annars tolkar Access Nytt Pris som två ord) Det beräknade fältet visar bara siffror, Enhetspris i tabellen är formaterat som valuta, därför visas det som valuta 16.Vilket värde finns på lager för varje produkt (enhetspris*antal i Lager), kallas Lagervärde 17.Visa vilka produkter som har mindre antal i lager än beställningspunkten, visa även de aktuella siffrorna 18.Vilka produkter behöver beställas (Beställningspunkt underskriden och beställt antal=0) 19.Vilka produkter behöver beställas (Antal i lager+beställt antal < Beställningspunkt) Två tabeller När man behöver data från mer än en tabell får man helt enkelt ta med de tabellerna i FROM-delen samt att man i WHERE-delen talar om hur de tabellerna hänger ihop EX: Vilken speditör skickar vilka order: SELECT Företagsnamn, Ordernr FROM [Order], Speditörer WHERE [Skickas Med]=Speditörsnr Om Skickas med hade hetat Speditörsnr hade man varit tvungen att tala om vilken tabell Speditörsnummer kommer ifrån, i så fall hade villkoret varit: WHERE Order.Speditörsnr = Speditörer.Speditörsnr Hakparenteserna ovan behövs runt Skickas Med för att tala om att det är ett fält, annars tolkas det som två ord, runt Order behövs hakparenteserna för att markera att order är ett fält eller tabell och inte det Order som används i ORDER BY 20.Till vilken kategori hör produkten Lakkalikööri? 21.Vilka produkter levereras av Karkki Oy? 22.Vad heter de som levererar lax? Fler tabeller
Page 4 of 5 På motsvarande sätt som med två tabeller 23.Vem levererar de varor som har sålts på order nummer 10249 Aggregering Sammanslagning, man vill visa data aggregerad, dvs summerad på något vis. Användbara funktioner är sum (summa), count (antal), max (största värde), min (minsta värde), Avg (medelvärde av average), stdev (standardavvikelse av standard deviation). Vill man se ett eller flera aggregerade värden för olika grupper kombineras det med satsen group by som kommer efter FROM-satsen: EXEMPEL 1 visa dyraste,billigaste, och genomsnittligt pris samt antal produkter för alla produkter: SELECT Max(Enhetspris) AS Dyrast, Min(Enhetspris) AS Billigast, Avg(Enhetspris) AS Genomsnitt, Count(*) AS AntalProdukter FROM Produkter EXEMPEL 2: visa dyraste, billigaste, och genomsnittligt pris samt antal produkter för respektive kategori SELECT Kategorinamn, Max(Enhetspris) AS Dyrast, Min(Enhetspris) AS Billigast, Avg(Enhetspris) AS Genomsnitt, Count(*) AS AntalProdukter FROM Produkter, kategorier WHERE Produkter.Kategorinr=Kategorier.Kategorinr GROUP BY Kategorinamn När man räknar antal kan man även skriva SELECT Count(*) eftersom man räknar poster. 24.Hur många säljare finns det på Northwind? 25.Hur många produkter finns det under kategorin Konditorivaror? 26.Hur stor var den totala ordersumman 96-12-12? (Datum är alltid krångliga, skriv det med brädgårdar runt: #1996-12-12#), tänk på rabatten. 27.Hur mycket har sålts av respektive produkt, visa även kategorinamn och produktnummer? 28.Vad är medelförsäljningen för produkterna inom respektive kategori? Nästlade frågor Ibland behöver man ställa frågan i två led, då kan nästlade frågor vara behändligt. De skrivs som en ny fråga inom parentes i WHERE-delen EX1: Om det finns order utan Orderspecifikationer, visa all info om de/den ordern: FROM [order] WHERE ordernr NOT IN (SELECT ordernr FROM orderspecifikationer) 29.Vilken kund har inte beställt något? Uppdateringar Om man vill uppdatera data i tabeller kan man använda SQL till det också. I stället för SELECT används UPDATE för ändringar INSERT för Tillägg och DELETE för borttagning
Page 5 of 5 EXEMPEL 1: Allan produkter som kostar 500 kr eller mer skall ha beställningspunkt på 5 UPDATE Produkter SET Beställningspunkt=5 WHERE Enhetspris>=500 EXEMPEL 2: Höj beställningspunkten till det dubbla för alla produkter som kostar mindre än 100 kr UPDATE Produkter SET Beställningspunkt=Beställningspunkt*2 WHERE Enhetspris<100 30.Priserna för alla produkter i kategorin 4 skall höjas med 20%. 31.Priserna för alla produkter utom för de i kategori 4 skall höjas med 5% 32. En kund i Tyskland har fått fel landsnummer i sitt telefonnummer. Ändra telefonnummer det är +47 03 00 07 43 21 men skall vara +49 03 00 07 43 21.