Övningar i SQL
Övningar i SQL Använd Access för att öva SQL (= Structured Query Language) Skapa tabeller med SQL 1. Ny databas: SQLÖVNING Klicka: Frågor > Ny > Design > OK >Stäng > SQL Radera ordet SELECT. Skriv in denna SQL-sats för att skapa tabellen AVD: CREATE TABLE AVD ( AvdNr NUMBER PRIMARY KEY, AvdNamn CHAR(20), Ort CHAR(20), Chef CHAR(3) ); Fält Kör frågan! Om något blev fel: Man kan ta bort tabellen ANST med denna SQL-sats: DROP TABLE AVD; Skriv i så fall in SQL-satsen i en fråga. Tryck! 2. Ny fråga, eller ändra i föregående Skapa tabellen ANST med SQL-satsen: CREATE TABLE ANST ( AnstNr NUMBER PRIMARY KEY, AnstNamn CHAR(20), Titel CHAR(20), Lön NUMBER, AnstDatum DATE, AvdNr NUMBER ); Tryck!
Lägg in poster i tabeller 3. Ny fråga, eller ändra i föregående Lägg in en post i AVD: INSERT INTO AVD VALUES (10, 'Administration', 'Göteborg', 'AA' ); Tryck! 4. Öppna tabellen AVD på vanligt sätt i Access. Mata in värden så att tabellen innehåller följande: AvdNr AvdNamn Ort Chef 10 Administration Göteborg AA 20 Försäljning Mölndal BB 30 Produktion Kungälv CC 5a. Lägg in en post i ANST: INSERT INTO ANST VALUES (101, 'Svensson', 'Försäljare', 17000, '2000-11-01', 20 ); Tryck! 5b. Lägg in ytterligare en post i ANST: INSERT INTO ANST VALUES (102, Larsson, 'Försäljare', 18000, '2000-11-01', 20 ); Tryck!
6. Öppna tabellen ANST på vanligt sätt i Access. Mata in värden så att tabellen innehåller följande: AnstNr AnstNamn Titel Lön AnstDatum AvdNr 101 Svensson Försäljare 17000 2000-11-01 20 102 Larsson Försäljare 18000 2000-11-01 20 103 Carlsson Prod.chef 19500 2000-11-01 30 104 Bengtsson Försäljn.chef 19800 2000-11-01 20 105 Johansson Maskinist 15000 2000-11-01 30 106 Swahn Kontorist 15000 2000-10-01 10 107 Andersson VD 32000 1999-10-01 10 108 Nilsson Maskinist 14000 2000-01-01 30 Viktig anmärkning: Ibland vill man skriva in värden endast i vissa fält. Antag att vi i ovanstående exempel vill ge värden till fälten AnstNamn, Titel, AnstDatum och AvdNr men lämna fälten AnstNr och Lön tomma. SQL-satsen skulle då bli så här: INSERT INTO ANST (AnstNamn, Titel, AnstDatum, AvdNr) VALUES ( Ek, 'Sekreterare', '2000-11-01', 20 ); Man räknar alltså upp de fält som påverkas inom parentes efter tabellnamnet, och efter ordet VALUES skriver man, inom parentes, i tur och ordning, värdet för respektive fält. Ett typiskt fall där man inte vill tilldela ett fält ett värde är när fältet är av typen räknare, det vill säga när fältet är ett heltal som automatiskt räknas upp (auto-increment) när en ny post läggs till.
Visa innehåll i tabeller (Tryck! efter varje sats.) 7. Ny fråga, eller ändra i föregående (klicka SQL) Visa hela innehållet i ANST: SELECT * ; 8. Gör en projektion (visa vissa kolumner): SELECT AnstNamn, Titel, Lön ; 9. Gör projektion och selektion (visa endast vissa rader, här anställda på avdelning 30): WHERE AvdNr=30; 10. Sammansatta villkor: Visa information om försäljare på avd 20: WHERE Titel='Försäljare' AND AvdNr=20; 11. Visa information om de på avd 10 som har högre lön än 30000: WHERE AvdNr=10 AND Lön>30000; 12. Visa info om personal som antingen jobbar på avd 10 eller har en lön som är större än 18000 (eller båda dessa villkor): WHERE AvdNr=10 OR Lön>18000; 13. Visa info om personal med lön mellan 18000 och 25000: WHERE Lön > 18000 AND Lön < 25000;
14. Visa info om personal med lön i intervallet 18000 till 25000: WHERE Lön >= 18000 AND Lön <= 25000; 15. Samma som ovan, alternativt skrivsätt: WHERE Lön BETWEEN 18000 AND 25000; 16. Visa all personal med efternamn som börjar på bokstaven S : WHERE AnstNamn LIKE "S*"; 17. Visa alla som har son-namn : WHERE AnstNamn LIKE "*son*"; 18. Visa alla som inte jobbar på avd 30: WHERE NOT(AvdNr=30); 19. Visa all info i ANST i bokstavsordning efter Titel: SELECT * ORDER BY Titel; 20. Visa all info i ANST i sorterat efter Lön: SELECT * ORDER BY Lön;
21. Visa all info i ANST i sorterat efter Lön (högsta lön först): SELECT * ORDER BY Lön DESC; Descending = fallande 22. Visa personal som inte jobbar på avd 10 i ordning efter lön, fallande. WHERE NOT(AvdNr=10) ORDER BY Lön DESC; 23. Visa årslönen för alla (beräknat fält): SELECT AnstNamn, Lön*12 ; 24. Som ovan men med att alias (snyggare kolumnhuvud): SELECT AnstNamn, Lön*12 AS Årslön ; 25. Visa kolumnen Titlar: SELECT Titel ; 26. Visa alla förekommande titlar: SELECT DISTINCT Titel ; 27. Visa de fem anställda som har lägst lön: SELECT TOP 5 * ORDER BY Lön ; 28. Visa de fem anställda som har högst lön: SELECT TOP 5 * ORDER BY Lön DESC;
29. Visa hälften av personalen, den del som har högst lön: SELECT TOP 50 PERCENT * ORDER BY Lön DESC; Formler 30. Använd formeln COUNT för att visa antalet rader i tabellen ANST: SELECT COUNT(*) ; 31. Samma, men med alias: SELECT COUNT(*) AS Antal ; 32. Visa den totala lönesumman: SELECT SUM(Lön) ; 33. Visa medellönen: SELECT AVG(Lön) AS Medellön ; 34. Visa den största lönen: SELECT MAX(Lön) AS Maxlön ; Gruppering 35. Visa medellönen för de olika jobben (titlarna) : SELECT Titel, AVG(Lön) GROUP BY Titel;
36. Som ovan med alias: SELECT Titel, AVG(Lön) AS Medellön GROUP BY Titel; 37. Visa lönesumman på avdelningarna: SELECT AvdNr, SUM(Lön) AS Lönesumma GROUP BY AvdNr; 38. Selektion på gruppnivå: Visa lönesumman på avdelning 20: SELECT AvdNr, SUM(Lön) AS Lönesumma GROUP BY AvdNr HAVING AvdNr=20; Joins 39. Join ( samkörning ) på tabellerna AVD och ANST. Visa info om anställda samt om den avdelning som de jobbar på: Samma fältnamn i två tabeller! Då måste du ta med även tabellnamnet! SELECT AnstNr, AnstNamn, Titel, Lön, AnstDatum, ANST.AvdNr, AvdNamn, Ort, AVD WHERE ANST.AvdNr=AVD.AvdNr; 40. Som ovan, men bara för avdelning 30: SELECT AnstNr, AnstNamn, Titel, Lön, AnstDatum, ANST.AvdNr, AvdNamn, Ort,AVD WHERE ANST.AvdNr=AVD.AvdNr AND ANST.AvdNr=30; 41. Alternativ till 39 ovan: SELECT AnstNr, AnstNamn, Titel, Lön, AnstDatum, ANST.AvdNr, AvdNamn, Ort INNER JOIN AVD ON ANST.AvdNr=AVD.AvdNr;
Övningar 42. Visa hela innehållet i AVD 43. Visa all info om alla maskinister 44. Visa lönen för alla kontorister 45. Visa AnstNamn, AvdNamn och Ort för alla anställda 46. Visa AnstNamn, AvdNamn och Ort för alla anställda. Sortera efter AnstNamn i bokstavsordning. 47. Visa AnstNamn, AvdNamn och Ort för alla som heter Svensson. 48. Visa AnstNamn, AvdNamn och Ort för alla vars efternamn börjar på S. 49. Vilken är den minsta lönen? 50. Visa den minsta lönen på respektive avdelning. 51. Visa lönesumman på respektive ort. 52. Visa lönesumman för avdelningen i Mölndal Uppdatera data i tabellen 53. Alla ska få sin lön ökad med 1000 kronor: UPDATE ANST SET Lön = Lön + 1000; Öppna ANST och kolla att uppdatering skett! 54. Alla utom VD:n ska dessutom få ett lönepåslag på 15 % UPDATE ANST SET Lön = Lön*1.15 WHERE NOT(Titel="VD"); Öppna ANST och kolla att uppdatering skett! Ta bort data från en tabell 55. Den anställde som har anställningsnummer 102 blir uppsagd. Ta bort posten ur tabellen! DELETE WHERE AnstNr = 102; Öppna ANST och kolla!
Ändra tabellstruktur 56. Man vill ha med ett kommentarfält i AVD-tabellen: ALTER TABLE AVD ADD COLUMN Kommentar TEXT(30); Öppna AVD och kolla! Index 57. Index används för att snabbare kunna hitta och sortera poster Vi vill sätta ett index på fältet AnstNamn i ANST-tabellen: CREATE INDEX AnstNamn ON ANST(AnstNamn); Öppna ANST i Design-mod och kolla att AnstNamn har ett (icke unikt) index. Anm: Unika index används om man dessutom vill att samma värde inte ska förekomma flera gånger. En primär nyckel får automatiskt unikt index.