ΤΕΧΝΟΛΟΓΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ, ΤΜΗΜΑ ΕΠΙΚΟΙΝΩΝΙΑΣ & ΣΠΟΥΔΩΝ ΔΙΑΔΙΚΤΥΟΥ ΕΣΔ 232: ΟΡΓΑΝΩΣΗ ΔΕΔΟΜΕΝΩΝ ΣΤΗ ΚΟΙΝΩΝΙΑ ΤΗΣ ΠΛΗΡΟΦΟΡΙΑΣ Ακαδημαϊκό Έτος 2011 2012, Εαρινό Εξάμηνο Εργαστηριακή Άσκηση 5 21/02/2012 Εισαγωγή στη SQL (μέρος 2ο) Η πέμπτη εργαστηριακή άσκηση έχει σαν στόχο την εξοικείωση των φοιτητών με τη γλώσσα SQL (Structured Query Language) τη πιο δημοφιλή γλώσσα για Σχεσιακά Συστήματα Διαχείρισης Βάσεων Δεδομένων. Βάση δεδομένων Για τις ανάγκες του εργαστηρίου θα χρησιμοποιηθεί η βάση δεδομένων Airport που υλοποιήθηκε στα προηγούμενα εργαστήρια. Airplane ModelNumber RegistrationNumber Capacity Airbus 319 A1 126 Airbus 320 A2 170 Flight FlightNumber From1 To1 DepartureDate DepartureTime ArrivalDate ArrivalTime RegistrationNumber CY312 Larnaca Athens 26/06/2006 10:15 26/06/2006 12:00 A2 CY337 Athens Larnaca 30/06/2006 18:50 30/06/2006 20:25 A1 Passenger GivenNames Surname EmailAddress Christina Nicolaou ch.nicolaou@gmail.com Maria Salpigidou marsal2@hotmail.com Booking EmailAddress marsal2@hotmail.com raimondo@yahoo.com FlightNumber CY337 CY312 1
Χρήση των συνθηκών LIKE, NOT LIKE Χρησιμοποιούνται όταν η σύγκριση συμβολοσειράς πρέπει να είναι πιο «ελεύθερη». Για παράδειγμα εάν επιθυμούμε να εντοπίσουμε επιβάτη το οποίου το επίθετο μπορεί να είναι Salpigides, Salpigidou, Salpigis, κτλ θα χρησιμοποιήσουμε το πιο κάτω ερώτημα: SELECT * FROM passenger WHERE Surname LIKE Salpi% Salpi% -> Η συμβολοσειρά ξεκινάει από Salpi %idou -> H συμβολοσειρά τελειώνει σε idou %alpi% -> Η συμβολοσειρά περιέχει το alpi Όρος DISTINCT, GROUP BY Ο όρος DISTINCT χρησιμοποιείται για την εξάλειψη των διπλών εγγραφών στα αποτελέσματα SELECT DISTINCT field Η συνάρτηση GROUP BY ταξινομεί τα δεδομένα σε ομάδες. Χρησιμοποιείται για να ομαδοποιήσει τα δεδομένα πριν την εφαρμογή της συνθήκης WHERE, ORDER BY κτλ. GROUP BY field1 Άσκηση 1: α) Εισαγωγή στον πίνακα Booking των πιο κάτω εγγραφών: EmailAddress FlightNumber raimondo@hotmail.com AP 5401 Rob.j@yahoo.com QR624 β) Εμφάνιση του ονόματος, επιθέτου και ηλεκτρονικής διεύθυνσης όλων των επιβατών που έχουν ταξιδέψει με τη πτήση AP 5401 ή QR624 SELECT GivenNames, Surname, EmailAddress From Passenger INNER JOIN Booking USING (EmailAddress) WHERE FlightNumber="AP 5401" OR FlightNumber="QR624" SELECT DISTINCT GivenNames, Surname, EmailAddress From Passenger INNER JOIN Booking USING (EmailAddress) WHERE FlightNumber="AP 5401" OR FlightNumber="QR624" SELECT GivenNames, Surname, EmailAddress From Passenger INNER JOIN Booking USING (EmailAddress) WHERE FlightNumber="AP 5401" OR FlightNumber="QR624" GROUP BY EmailAddress 2
Συναρτήσεις Συνάθροισης AVG ( ), MAX ( ), MIN ( ), SUM ( ), COUNT ( ) COUNT (field2) 1 GROUP BY fiedl2 Άσκηση 2: Εύρεση του αριθμού των αεροπλάνων ανά μοντέλο SELECT ModelNumber, COUNT(*) AS '# Airplanes' FROM Airplane GROUP BY ModelNumber Άσκηση 3: Εμφάνιση των στοιχείων του αεροπλάνου με την μεγαλύτερη χωρητικότητα SELECT ModelNumber, MAX(Capacity) AS Capacity FRΟΜ Airplane Άσκηση 4: Εμφάνιση του αριθμού αεροπλάνων και του μέγιστου αριθμού επιβατών που μπορεί να ταξιδέψει εάν ταξιδεύουν ταυτόχρονα όλα τα αεροπλάνα SELECT COUNT(RegistrationNumber) AS '# Airplanes', SUM(Capacity) AS '# passengers' FROM Airplane Χρήση του όρου HAVING Ο όρος HAVING χρησιμοποιείται για να εφαρμόσουμε επιπρόσθετο έλεγχο στη συνάθροιση των γραμμών. Ακολουθεί τον όρο GROUP BY., COUNT (*) GROUP BY field1 HAVING COUNT (*) > 5 Άσκηση 5: Εύρεση των μοντέλων αεροπλάνου για τα οποία υπάρχουν τουλάχιστον 2 καταχωρήσεις στο πίνακα airplane SELECT ModelNumber, COUNT (*) AS '# Airplanes' FROM Airplane GROUP BY ModelNumber HAVING COUNT (*) > 1 3
Φωλιασμένα ερωτήματα Φωλιασμένα ονομάζονται τα ερωτήματα που περιέχονται μέσα σε κάποιο άλλο. Εκτελείται πρώτα το φωλιασμένο και μετά το εξωτερικό ερώτημα. Άσκηση 6: Εύρεση του κωδικού πτήσης και της ώρας αναχώρησης για την πτήση που αναχώρησε πιο πρόσφατα SELECT FlightNumber, DepartureDate From Flight WHERE DepartureDate=(SELECT MAX(DepartureDate) FROM Flight) Άσκηση 7: Εμφάνιση της ηλεκτρονικής διεύθυνσης των επιβατών που ταξίδεψαν με τη τελευταία πτήση SELECT EmailAddress From Booking INNER JOIN Flight USING(FlightNumber) WHERE DepartureDate=(SELECT MAX(DepartureDate) FROM Flight) Τι αλλαγές πρέπει να κάνουμε για να συμπεριλάβουμε το όνομα και επίθετο των επιβατών στα αποτελέσματα; SELECT GivenNames, Surname, FlightNumber, DepartureDate FROM Passenger INNER JOIN Booking USING (EmailAddress) INNER JOIN Flight USING(FlightNumber) WHERE DepartureDate=(SELECT MAX(DepartureDate) FROM Flight) Τελεστές σύγκρισης συνόλων Οι τελεστές EXISTS, IN συνδυαζόμενοι επίσης με το NOT στην άρνηση τους αποτελούν παραδείγματα τελεστών για τη σύγκριση συνόλων. Στην ίδια κατηγορία εμπίπτουν και τα op ANY, op ALL όπου το op συμβολίζει ένα τελεστή από το σύνολο {<, <=, =, <>, >=, >}. Επίσης υποστηρίζεται και η συνιστώσα σύνταξης SOME η οποία είναι συνώνυμη του τελεστή ANY. WHERE field2 IN (SELECT ) WHERE field2 >ANY (SELECT ) WHERE EXISTS (SELECT ) 4
Άσκηση 8: Εύρεση των επιβατών που έχουν ταξιδέψει με πτήση που πραγματοποιήθηκε στις 10/07/2007 (2007-07-10) SELECT Surname FROM Passenger INNER JOIN Booking USING (EmailAddress) WHERE FlightNumber IN (SELECT FlightNumber FROM Flight WHERE DepartureDate='2007-07-10') Άσκηση 9: Εύρεση των επιβατών που δεν έχουν ταξιδέψει με πτήση που πραγματοποιήθηκε στις 10/07/2007 (2007-07- 10) SELECT DISTINCT Surname FROM Passenger INNER JOIN Booking USING (EmailAddress) WHERE FlightNumber NOT IN (SELECT FlightNumber FROM Flight WHERE DepartureDate='2007-07-10') Άσκηση 10: Στον πίνακα Airplane, στην εγγραφή με RegistrationNumber=A6, αλλάξετε το Capacity από 170 σε 180. Εύρεση των πτήσεων που έγιναν με αεροσκάφος που έχει χωρητικότητα μεγαλύτερη από αυτή που έχει τουλάχιστον ένα αεροσκάφος Airbus320 SELECT FlightNumber FROM Flight INNER JOIN Airplane USING (RegistrationNumber) WHERE Capacity > ANY (SELECT Capacity FROM Airplane WHERE ModelNumber="Airbus320") 1) Τι αποτελέσματα θα έχουμε εάν χρησιμοποιήσετε το τελεστή SOME αντί του τελεστή ANY; 2) Τι αποτελέσματα θα έχουμε εάν χρησιμοποιήσετε το τελεστή ALL αντί του τελεστή ANY; Άσκηση 11: Εμφάνιση των στοιχείων των επιβατών που βρισκόταν στην πτήση «CY312» SELECT t1.surname, t1.givennames FROM Passenger AS t1 WHERE EXISTS (SELECT * FROM Booking AS t2 WHERE FlightNumber='CY312' AND t1.emailaddress=t2.emailaddress) Εμφάνιση των στοιχείων των επιβατών που δεν βρίσκονταν στη πτήση «CY312» SELECT t1.surname, t1.givennames FROM Passenger AS t1 WHERE NOT EXISTS (SELECT * FROM Booking AS t2 WHERE FlightNumber='CY312' AND t1.emailaddress=t2.emailaddress) 5
Χρήση μεταβλητών Κάποιες τιμές που επιστρέφονται από ερωτήματα μπορούν να αποθηκευτούν σε μεταβλητές και να χρησιμοποιηθούν στη συνέχεια από μεταγενέστερα ερωτήματα. Το προηγούμενο αίτημα θα μπορούσε να υλοποιηθεί με δύο ερωτήματα χρησιμοποιώντας κάποια μεταβλητή SELECT @DATE:=MAX(DepartureDate) FROM Flight SELECT EmailAddress From Booking INNER JOIN Flight USING (FlightNumber) WHERE DepartureDate=@DATE 6