SQL Server 2005 Tutorial Αςκήςεισ Γεράσιμος Μαρκέτος InfoLab, Τμήμα Ρληροφορικήσ, Ρανεπιςτήμιο Ρειραιϊσ (http://infolab.cs.unipi.gr/)
Εργαςτηριακή Άςκηςη Σχεδιάςτε ςτον SQL Server 2005 μια βάςη δεδομζνων που καταγράφει τισ ςυναλλαγζσ ενόσ super market. Λάβετε υπόψη ςασ τα εξήσ: Κάθε ςυναλλαγή πραγματοποιείται από ζναν ςυγκεκριμζνο πελάτη ςε ζνα ςυγκεκριμζνο κατάςτημα. Καταγράφουμε την ημερομηνία και την ϊρα τησ ςυναλλαγήσ. Κάποιοι πελάτεσ ζχουν loyalty κάρτεσ. Για αυτοφσ διατηροφμε δημογραφικά δεδομζνα (φφλο, ημερομηνία γζννηςησ, επάγγελμα) Κάθε ςυναλλαγή περιλαμβάνει ζνα ή περιςςότερα προϊόντα για τα οποία καταγράφουμε ποςότητα και τιμή αγοράσ Ζνα προϊόν (Χυμόσ πορτοκαλιοφ) ανήκει ςε ςυγκεκριμζνη ομάδα προϊόντων (Χυμοί) Μια ομάδα προϊόντων (Χυμοί) ανήκει ςε ςυγκεκριμζνη κατηγορία προϊόντων (Ροτά) Για κάθε κατάςτημα θζλουμε να καταγράφουμε γεωγραφικζσ πληροφορίεσ (περιοχή, νομόσ κτλ) 2
και μια πιθανή λύςη Customer CustomerID Name Gender Birthdate Occupation Transaction TransactionID CustomerID StoreID TransactionDatetime Store StoreID PostalCode AreaID Area AreaID TransactionItem TransactionID ItemID Value Quantity Item ItemID GroupID Group GroupID CategoryID Category CategoryID 3
Ειςαγωγή δεδομένων - Demo Συνδεθείτε με τον SQL Server 195.251.230.57 (dbuser/dbuser) και από τη βάςη RetailDemo τραβήξτε τα δεδομζνα του πινάκων Customer και Store 4
Εργαςτηριακή Άςκηςη Βρείτε τουσ πελάτεσ του καταςτήματοσ με ταχυδρομικό κωδικό 16272 Βρείτε πόςουσ πελάτεσ ζχει κάθε κατάςτημα Βρείτε ανά φφλο, πόςουσ πελάτεσ ζχει κάθε περιοχή Βρείτε τουσ πελάτεσ με επάγγελμα ςυνταξιοφχοι Πςεσ περιγραφζσ των επαγγελμάτων είναι null να γίνουν Άγνωςτο Διαγράψτε τουσ πελάτεσ με άγνωςτο το φφλο Βρείτε την ελάχιςτη, μζγιςτη και μζςη ηλικία των πελατϊν 5
Πιθανέσ Λύςεισ Πίνακες: Customer (CustomerID, BirthYear, Gender, Occupation, StoreID) Store (StoreID, Name, ZipCode, Area) Βρείτε τουσ πελάτεσ του καταςτήματοσ με ΤΚ 16272 SELECT CustomerID FROM Customer c INNER JOIN Store s ON c.storeid = s.storeid WHERE s.zipcode = 16272 SELECT CustomerID FROM Customer c, Store s WHERE s.zipcode = 16272 AND c.storeid = s.storeid SELECT CustomerID FROM Customer WHERE StoreID IN (SELECT StoreID FROM Store WHERE ZipCode = 16272) Βρείτε πόςουσ πελάτεσ έχει κάθε κατάςτημα SELECT s.storeid, count(customerid) FROM Store s LEFT OUTER JOIN Customer c ON c.storeid = s.storeid GROUP BY StoreID Βρείτε ανά φφλο, πόςουσ πελάτεσ ζχει κάθε περιοχή SELECT s.area, c.gender, count(*) FROM Customer c RIGHT OUTER JOIN Store s ON c.storeid = s.storeid GROUP BY s.area, c.gender ORDER BY s.area 6
Πιθανέσ Λύςεισ Βρείτε τουσ πελάτεσ με επάγγελμα ςυνταξιοφχοι SELECT CustomerID FROM Customer WHERE Occupation LIKE ΣΥΝ% SELECT CustomerID FROM Customer WHERE Occupation = ΣΥΝΤΑΞΙΟΥΧΟΣ OR Occupation = ΣΥΝΤΑΞΙΟΥΧΟΙ Όςεσ περιγραφέσ των επαγγελμάτων είναι null να γίνουν Άγνωςτο UPDATE Customer SET Occupation = Άγνωςτο WHERE Occupation IS NULL Διαγράψτε τουσ πελάτεσ με άγνωςτο το φφλο DELETE FROM Customer WHERE Gender IS NULL Βρείτε την ελάχιςτη, μέγιςτη και μέςη ηλικία των πελατϊν SELECT MIN(YEAR(GETDATE()) BirthYear) as minage, MAX(YEAR(GETDATE()) BirthYear) as maxage, AVG (YEAR(GETDATE()) BirthYear) as avgage FROM Customer WHERE BirthYear IS NOT NULL 7
Εργαςτηριακή Άςκηςη Εκτελζςτε το ερϊτημα και εμφανίςτε το execution plan Βρείτε τουσ πελάτεσ του καταςτήματοσ με ταχυδρομικό κωδικό 16272 Ορίςτε πρωτεφοντα κλειδιά, κατάλληλη ςχζςη μεταξφ των πινάκων Customer και Store και ορίςτε index ςτον ταχυδρομικό κϊδικα Εκτελζςτε ξανά το ερϊτημα, εμφανίςτε το execution plan και κάντε ςφγκριςη με το προηγοφμενο 8
Επικοινωνία Gerasimos Marketos marketos@unipi.gr http://infolab.cs.unipi.gr/people/marketos University of Piraeus, Information Systems Laboratory 80-82 Zeas Str., 18534 Piraeus, Greece 3rd Floor Phone: (+30) 210 4142437 http://infolab.cs.unipi.gr 9