Labb 1 Del A Skapa och hantera en databas Sy5e (översikt) SQL är både DDL (Data De0inition Language) och DML (Data Manipulation Language). DDL betyder att språket kan användas för att skapa, ändra, och ta bort databaser, tabeller och vyer. DML betyder att man kan lägga in, ändra och ta bort data i tabellerna. I del A av denna labb ska ni öva på DDL-aspekten av SQL. I del B kommer ni sedan få öva på att göra sökningar i en existerande databas, alltså att jobba med SQL som ett DML - språk. Förberedelser krävs för denna labb, se labbsidan. Kontoinformation för databashanteraren MySQL skickas per epost strax efter kursstart. Rubriken på brevet är "MySQL database created". Om ni har läst någon kurs tidigare, på IDA, och då fått databaskonto ska samma konto användas (då får ni inget nytt brev). Redovisning Övningen redovisas genom att ni skickar in två 0iler med epost till lärarna enligt nedan. I del A ska 0ilerna heta [LiUid]_lab1A_schema.txt och [LiUid]_lab1A_data.txt. Instruk?oner/Förberedelser Läs kapitel 7-9 i kursboken. Det kan vara särskilt bra att ha koll på sidorna 177-185. Kolla att du fått lösenordet till ditt MySQL-konto. Om du har glömt det 0inns en länk för att begära nytt lösenord på labbsidan. Labbassistenten kan INTE hjälpa dig med detta lösenord. Logga in på en SU-terminal och starta ett kommandorads-fönster. I det startar du en textbaserad databasklient, som ansluter till din egen mysqldatabas (med ditt student-id och det lösenord du fått) på IDAs server (db-und.ida.liu.se) med kommandot: prompt> mysql -h db-und.ida.liu.se -u [liuid] -p Enter password Mata in det lösenord som du fått. Det skrivs inte ut. Om du får problem prova nedanstående kommando: mysql --host=db-und.ida.liu.se --user=[liuid] --password=[lösen] Du byter alltså [liuid] i ovanstående mot ditt eget student-id och [lösenord] mot det lösenord du fått. Sedan ges följande utskrifter om allt gått rätt: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 86 Server version: 5.5.32 Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> Ge sedan kommandot mysql> use [liuid] för att komma åt din egen databas. Sedan kan du mata in dina SQL-kommandon här vid denna prompt (mysql>). Ett tips är att ha en text0il (lämpligen de som ska redovisas) öppen i en textredigerare (INTE word) där du redigerar kommandona och sedan klipper in dem i denna kommandotolk. Här kan du nämligen inte redigera dina kommandon, och vissa blir ganska långa. Notera dock att ctrl-c avslutar kommandotolken mysql. Uppgi5erna 1. Er första uppgift är att lägga in några tabeller i er databas. Använd CREATE TABLE - kommandot för att skapa tre tabeller med följande struktur: Forskare Kolumn-namn ID Förnamn Efternamn Huvudämne Födelsedatum Datatyp Int Varchar(100) Varchar(100) Varchar(255) Date Priser Kolumn-namn Namn Prissumma Datatyp Varchar(255) Float HarVunnit Kolumn-namn Forskare Pris Datum Datatyp int Varchar(255) Date De understrukna kolumn-namnen visar vilken/vilka kolumner som ska vara primary keys. När ni har skapat tabellerna ska ni lägga till att fältet HarVunnit.Forskare är främmande nyckel till Forskare.ID, och HarVunnit.Pris är främmande nyckel till
Priser.Namn. Gör detta med Alter Table-kommandot (ALTER TABLE <tabellnamn> ADD CONSTRAINT. ) Testa med DESCRIBE TABLE och SHOW CREATE TABLE att ni har rätt struktur. Spara de kommandon som använts för att skapa tabellerna (create table och alter table) i text0ilen lab1a_schema.txt. 2. Nu ska ni in med lite data i dessa tabeller. Stoppa in de data som 0inns nedan i de två tabellerna med INSERT INTO -kommandot. Utöver de data som 0inns nedan, lägg även till minst två rader (per tabell) med passande data som ni själva hittar på. Forskare ID Förnamn Efternamn Huvudämne Födelsedatum 1 Herbert Simon NULL 1916-06-15 2 Allen Newell Kognitionsvetenskap 1927-03-19 Priser Namn Prissumma Nobelpris i Ekonomi 10000000 A.M. Turing Award 8429973.3 HarVunnit Forskare Pris Datum 1 Nobelpris i Ekonomi 1978-12-10 1 A. M. Turing Award 1975-01-01 2 A. M. Turing Award 1975-01-01 Testa med SELECT * FROM <tabellnamn> att ni fått med all data. Spara de kommandon som använts för att stoppa in data i text0ilen lab1a_data.txt 3. OBS! Innan ni gör denna uppgift: Se till att ni sparat kommandona för att skapa tabellerna i lab1a_schema och kommandona för data i lab1a_data! Nu ska ni ta bort data: Ta bort alla utdelningar av priset Nobelpris i Ekonomi (dvs alla rader ur tabellen HarVunnit där Pris är Nobelpris i Ekonomi ). Använd DELETE FROM <tabell> WHERE <villkor>. Man kan också använda Drop Table för att ta bort hela tabeller. Använd drop för att ta bort några tabeller i er databas. Lägg sedan till kommandot DROP TABLE IF EXISTS <tabellnamn> i lab1a_schema.txt för alla tre tabeller ni skapar. Lägg drop-kommandona före Create Table-kommandona. Man kan använda sig av externa 0iler för att skapa tabeller och stoppa in data. Genom kommandot source <0ilnamn> kan man köra förberedda 0iler, till exempel era 0iler lab1a_schema.txt och lab1a_data.txt.
Testa att köra först lab1a_schema och sedan lab1a_data (vad skulle hända om du vände på ordningen?). Kontrollera att tabeller och data är korrekta och ser ut som de gjorde efter ni gjort klart uppgift 2. Del B Söka i Databas Sy5e Nu ska ni öva på att skriva SQL-frågor, från de allra enklaste upp till en ganska avancerad nivå. Se till att utnyttja den handledda tiden väl. Uppgift 1 nedan görs med fördel på egen hand, den tar tid men är inte svår. Redovisning Övningen redovisas genom att ni lämnar in två 0iler, en för deluppgift 1 nedan och en för resten av deluppgifterna. Den första 0ilen ska heta [LiUid]_Lab1B_relations och vara en illustration/bild av deluppgift 1 nedan. Den andra 0ilen ska heta [LiUid]_Lab1B_sql.txt och ska innehålla de kommandon ni skapat för att lösa respektive deluppgift nedan, samt de svar som systemet genererade. Visa både vad ni skrev för uttryck för att få fram svaret, och vad svaret blev. Glöm inte bort att också förklara varför det blev som det blev, på de deluppgifter där det efterfrågas. Även här kan det vara bra att ha en textredigerare med redovisnings0ilen öppen där ni skriver in och redigerar kommandona, kopierar till den textbaserade databasklienten (kommandotolk) mysql, och sedan kopierar resultatet åt andra hållet. Notera att ctrl-c dödar kommandotolken, så muskommandona för kopiering fungerar bäst. Då riskerar man heller inte att det kommando man redovisar faktiskt inte fungerar för att man skrivit av fel. Instruk?oner/Förberedelser Läs kapitel 7-9 i kursboken. Det 0inns även mycket information på internet med beskrivningar av SQL-kommandon för att söka ut data. Förbered installation av Johnsson Brothers databasens tabeller genom att ladda ner script-0ilerna company_schema.sql och company_data.sql (0inns på labbsidan) till ditt konto. Håll reda på var du lägger dem och att de inte komprimeras på vägen. Om du vill samla 0ilerna för kursens labbar i en egen mapp, se till att du står i den mappen då du startar mysql-kommandotolken. Installera Johnson Brothers databasen på ditt eget databaskonto (detta görs bara en gång) genom att läsa in script-0ilerna med source-kommandot i mysql (som i del A). Nedanstående exempel utgår från att 0ilerna 0inns lagrade i den mapp du startade mysqlkommandotolken från. Om du lagt 0ilerna under Desktop/Skrivbord får du 0lytta dem först. mysql> source company_schema.sql Query OK, 0 rows affected (0.01 sec)... Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings:
mysql> source company_data.sql Query OK, 25 rows affected (0.01 sec) Records: 25 Duplicates: 0 Warnings: 0... Query OK, 0 rows affected (0.00 sec) Uppgi5erna 1. Undersök databasen med hjälp av kommandona show tables, describe, show create table. Rita upp ett relationsschema med alla relationer (tabeller) och attribut, markera referensattribut (foreign key) som pilar mellan relationerna. Observera att du behöver denna information för de senare uppgifterna. Det relationsschema som ni skapar kan till exempel ritas för hand och för redovisning fotas av med en telefon, eller rita i ritprogram (tar tid!). 2. Lista namnen på alla avdelningar, d.v.s attributet name för alla rader i tabellen jbdept. 3. Lista all information som 0inns om alla anställda, d.v.s. alla kolumner för alla rader i tabellen jbemployee. 4. Vilka delar 0inns inte på lager, d.v.s. qoh (Quantity On Hand) = 0? (tabellen som avses är jbparts) 5. Vilka anställda har en lön som är mellan 9000 och 10000? 6. Lista hur gammal varje anställd var när han eller hon började arbeta på företaget. Tips: Kolla kapitel 9 i databasboken. 7. Vilka anställda har ett "son"-namn? (Dvs efternamnet slutar på "son"). (Ja, du får anta att strukturen är <Efternamn komma Förnamn> för att bli av med Jason). Se samma kap som ovan. 8. Vilka saker (i jbitem) har levererats av leverantören med namnet "Fisher-Price"? Använd dig av en kapslad fråga (nästlad). ID-numret för leverantören Fisher-Price får inte förekomma som konstant i frågan. 9. Ställ samma fråga som ovan, fast utan kapsling (nästling). Id-numret får inte heller här förekomma som konstant. 10.Ta reda på namnet och färgen på alla delar som är tyngre än en kortläsare. Använd dig av en kapslad fråga. Vikten på kortläsaren får inte förekomma som en konstant i frågan. 11.Samma fråga som ovan, fast utan kapsling (nästling). Vikten får fortfarande inte 0innas som konstant. Tips: kolla kapitel 7.17 i boken och/eller föreläsningen om SQL. 12.Vad är medelvikten på svarta delar? Tips: det du behöver är "Aggregeringsfunktioner".
13.För varje leverantör i Massachusetts (Mass), ta reda på totalvikten av allt de levererat. Svaret ska vara en lista med namnen på leverantörerna och deras totala levererade vikt. Tips: levererade delar 0inns i tabellen jbsupply. 14.Skapa en helt ny tabell med samma utseende som jbitem och fyll den med alla saker (ur jbitem) som kostar mindre än medelpriset. Du ska inte använda mer än två kommandon, och ett räcker. 15.Skapa en vy över alla saker i jbitem som kostar mindre än medelpriset. Vad är skillnaden mellan denna vy och tabellen i ovanstående fråga? (ledning: Vad händer vid uppdatering av jbitem?) 16. Oops, jordbävning! Alla leverantörer i Los Angeles har problem. Försök att ta bort dem ur jbsupplier. Vad händer när du kör DELETE-kommandot? Varför? Varför hände inte det när du tog bort rader i A-delen av övningen? 17.En databasadministratör i företaget har försökt ta reda på hur bra olika leverantörers saker säljer. Han har skapat en hjälpvy och kan med hjälp av den få reda på hur många saker som sålts från varje leverantör: mysql> create view sale_supply(supplier, item, quantity) as select jbsupplier.name, jbitem.name, jbsale.quantity from jbsupplier, jbitem, jbsale where jbsupplier.id=jbitem.supplier and jbsale.item=jbitem.id; Ok. mysql> select supplier, sum(quantity) from sale_supply group by supplier; 6 rows selected ----------------------------------- SUPPLIER SUM ----------------------------------- Cannon 6 Koret 1 Levi-Strauss 1 Playskool 2 White Stag 4 Whitman's 2 ----------------------------------- mysql> Ett problem är att han skulle vilja ha med även leverantörer vars varor inte blivit sålda. Hjälp honom! De0iniera om sale_supply så att den också tar med leverantörer som inte har någon försäljning. Tips: Titta på hur tabellerna ser ut och vilka värden som 0inns. Tänk efter vad som händer i frågan. Läs sedan om Join som beskrivs i kap. 8.7-8.11.