Βάσεις Δεδομέμωμ Εξγαζηήξην V Τκήκα Πιεξνθνξηθήο ΑΠΘ 2015-2016
2 Σκοπός του 5 ου εργαστηρίου Σθνπόο απηνύ ηνπ εξγαζηεξίνπ είλαη: ε κειέηε ζύλζεησλ εξσηεκάησλ ζύλδεζεο ζε δύν ή πεξηζζόηεξεο ζρέζεηο ε κειέηε ζύλζεησλ εκθσιεπκέλσλ εξσηεκάησλ
3 Όψεις (Views) Όςε: έλαο εηθνληθόο πίλαθαο πνπ πξνθύπηεη από άιινπο πίλαθεο Μπνξνύκε λα ρξεζηκνπνηήζνπκε κία όςε ζαλ λα είλαη έλαο πίλαθαο (γηα εληνιέο select) Η όςε δελ απαηηείηαη λα είλαη απνζεθεπκέλε ζε θπζηθή κνξθή.
4 Όψεις (Views) Οξηζκόο ηεο όςεο ζηελ SQL: Create view < name of view > as ( sql query ) Δηαγξαθή όςεο ζηελ SQL: Drop view < name of view >
5 Όψεις (Views) Παξάδεηγκα δεκηνπξγίαο όςεο Να νξηζζεί όςε κε όλνκα Η, πνπ πεξηέρεη όινπο ηνπο θσδηθνύο ησλ ηαηληώλ πνπ ζπκκεηέρεη ν Alfred Hitchcock: CREATE VIEW H AS (SELECT IDΤαηλίαο FROM ΤΣ INNER JOIN ΣΥΝΤΕΛΕΣΤΗΣ ON ΤΣ.IDΣπληειεζηή = ΣΥΝΤΕΛΕΣΤΗΣ.ID WHERE ΣΥΝΤΕΛΕΣΤΗΣ. Όλνκα = Alfred Hitchcock )
6 Όψεις (Views) Παξάδεηγκα ρξήζεο όςεο ζε εξσηήκαηα επηινγήο: Να βξεζεί ν θσδηθόο πειάηε κε ην κεγαιύηεξν αξηζκό ελνηθηάζεσλ: CREATE VIEW numrent AS (SELECT IDΠειάηε, COUNT (*) as Α FROM ΕΝΟΙΚΙΑΣΗ GROUP BY IDΠειάηε) SELECT IDΠειάηε FROM numrent WHERE A = (SELECT MAX(A) FROM numrent)
7 Σύμθετα SQL ερωτήματα με δύο ή περισσότερες σχέσεις Να βξεζνύλ νη ηίηινη ησλ ηαηληώλ πνπ γπξίζηεθαλ πξηλ ην 1960 ή απηώλ ζηηο νπνίεο έρεη ζπκκεηάζρεη ε Grace Kelly. Να γίλεη πξνβνιή ησλ δηπινεγγξαθώλ θαζώο θαη λα δνζνύλ κε θζίλνπζα ζεηξά ηαμηλόκεζεο νη πιεηάδεο εμόδνπ. (SELECT Τίηινο FROM ΤΑΙΝΙΑ WHERE Φξνληά < 1960) UNION ALL (SELECT Τίηινο FROM ΤΑΙΝΙΑ, ΣΥΝΤΕΛΕΣΤΗΣ, ΤΣ WHERE ΤΣ.IDΤαηλίαο = ΤΑΙΝΙΑ.ID AND ΤΣ.IDΣπληειεζηήο = ΣΥΝΤΕΛΕΣΤΗΣ.ID AND ΣΥΝΤΕΛΕΣΤΗΣ.Όλνκα = 'Grace Kelly'); ORDER BY Τίηινο
8 Σύμθετα SQL ερωτήματα με δύο ή περισσότερες σχέσεις (Ερώτημα) Να βξεζνύλ νη ηίηινη ησλ ηαηληώλ γηα ηηο νπνίεο είηε δελ ππάξρεη DVD, είηε ππάξρεη DVD θαη δελ έρεη ελνηθηαζηεί πνηέ. (λα κελ ρξεζηκνπνηεζεί ν ηειεζηήο NOT IN).
9 Σύμθετα SQL ερωτήματα με δύο ή περισσότερες σχέσεις (Απάμτηση) Να βξεζνύλ νη ηίηινη ησλ ηαηληώλ γηα ηηο νπνίεο είηε δελ ππάξρεη DVD, είηε ππάξρεη DVD θαη δελ έρεη ελνηθηαζηεί πνηέ. (λα κελ ρξεζηκνπνηεζεί ν ηειεζηήο NOT IN). SELECT Τίηινο FROM ΤΑΙΝΙΑ LEFT OUTER JOIN DVD ON DVD.IDΤαηλίαο = ΤΑΙΝΙΑ.ID LEFT OUTER JOIN ΕΝΟΙΚΙΑΣΗ ON ΕΝΟΙΚΙΑΣΗ.IDdvd = DVD.ID WHERE ΕΝΟΙΚΙΑΣΗ.IDdvd IS NULL
10 Σύμθετα SQL ερωτήματα με δύο ή περισσότερες σχέσεις Γηα θάζε ηαηλία (ηίηινο), λα βξεζεί ν αξηζκόο δηαθνξεηηθώλ ηύπσλ DVD πνπ πεξηέρεη ηελ ηαηλία. Σην απνηέιεζκα λα εκθαλίδνληαη θαη νη ηαηλίεο γηα ηηο νπνίεο δελ ππάξρεη DVD: SELECT ΤΑΙΝΙΑ.Τίηινο, count(dvd.τύπνο) as Πιήζνο FROM ΤΑΙΝΙΑ LEFT OUTER JOIN DVD ON DVD.IDΤαηλίαο = ΤΑΙΝΙΑ.ID GROUP BY ΤΑΙΝΙΑ.ID, ΤΑΙΝΙΑ.Τίηινο
11 Σύμθετα SQL ερωτήματα με δύο ή περισσότερες σχέσεις (Ερώτημα) Να βξεζνύλ νη θσδηθνί ησλ DVD πνπ είλαη ηύπνπ 3D θαη έρνπλ ελνηθηαζζεί πεξηζζόηεξεο από κία θνξέο:
12 Σύμθετα SQL ερωτήματα με δύο ή περισσότερες σχέσεις (Απάμτηση) Να βξεζνύλ νη θσδηθνί ησλ DVD πνπ είλαη ηύπνπ 3D θαη έρνπλ ελνηθηαζζεί πεξηζζόηεξεο από κία θνξέο: SELECT DVD.ID FROM DVD INNER JOIN ΕΝΟΙΚΙΑΣΗ ON DVD.ID = ΕΝΟΙΚΙΑΣΗ.IDdvd WHERE DVD.Τύπνο = 3D GROUP BY DVD.ID HAVING COUNT(*) > 1;
13 Σύμθετα Εμφωλευμέμα SQL ερωτήματα Να βξεζνύλ νη ηίηινη ησλ ηαηληώλ πνπ δελ έρνπλ ελνηθηαζζεί πνηέ (Να κελ γίλεη ρξήζε ηνπ outer join): SELECT Τίηινο FROM ΤΑΙΝΙΑ WHERE NOT EXISTS (SELECT DVD.IDΤαηλίαο FROM ΕΝΟΙΚΙΑΣΗ INNER JOIN DVD ON ΕΝΟΙΚΙΑΣΗ.IDdvd = DVD.ID WHERE IDΤαηλίαο = ΤΑΙΝΙΑ.ID);
14 Σύμθετα Εμφωλευμέμα SQL ερωτήματα (Ερώτημα) Γηα θάζε πειάηε (Επίζεην) λα δνζεί ην πιήζνο ησλ DVD πνπ έρεη ελνηθηάζεη ηνπ νπνίνπ ν ηύπνο είλαη 3D θαζώο θαη ν ηίηινο ηεο ηαηλίαο μεθηλά από ην γξάκκα R :
15 Σύμθετα Εμφωλευμέμα SQL ερωτήματα (Απάμτηση) Γηα θάζε πειάηε (Επίζεην) λα δνζεί ην πιήζνο ησλ DVD πνπ έρεη ελνηθηάζεη ηνπ νπνίνπ ν ηύπνο είλαη 3D θαζώο θαη ν ηίηινο ηεο ηαηλίαο μεθηλά από ην γξάκκα R : SELECT ΠΕΛΑΤΗΣ.Επίζεην, COUNT(DVD.ID) AS 'Πιήζνο FROM ΤΑΙΝΙΑ INNER JOIN DVD ON DVD.IDΤαηλίαο = ΤΑΙΝΙΑ.ID INNER JOIN ΕΝΟΙΚΙΑΣΗ ON ΕΝΟΙΚΙΑΣΗ.IDdvd = DVD.ID INNER JOIN ΠΕΛΑΤΗΣ ON ΠΕΛΑΤΗΣ.ID = ΕΝΟΙΚΙΑΣΗ.IDΠειάηε WHERE ΤΑΙΝΙΑ.Τίηινο LIKE 'R%' AND DVD.Τύπνο='3D' GROUP BY ΠΕΛΑΤΗΣ.ID, ΠΕΛΑΤΗΣ.Επίζεην
16 Σύμθετα Εμφωλευμέμα SQL ερωτήματα (Ερώτημα) Να βξεζεί ν θσδηθόο θαη ην επίζεην ηνπ πειάηε κε ην κεγαιύηεξν αξηζκό ελνηθηάζεσλ:
17 Σύμθετα Εμφωλευμέμα SQL ερωτήματα (Απάμτηση) Να βξεζεί ν θσδηθόο θαη ην επίζεην ηνπ πειάηε κε ην κεγαιύηεξν αξηζκό ελνηθηάζεσλ: SELECT IDΠειάηε, ΠΕΛΑΤΗΣ.Επίζεην FROM ΠΕΛΑΤΗΣ INNER JOIN ΕΝΟΙΚΙΑΣΗ ON ΠΕΛΑΤΗΣ.ID = ΕΝΟΙΚΙΑΣΗ.IDΠειάηε GROUP BY IDΠειάηε, ΠΕΛΑΤΗΣ.Επίζεην HAVING COUNT(*) >= ALL ( SELECT COUNT(*) FROM ΕΝΟΙΚΙΑΣΗ GROUP BY IDΠειάηε )
18 Σύμθετα Εμφωλευμέμα SQL ερωτήματα Να βξεζνύλ νη θσδηθνί θαη νη ηίηινη ησλ ηαηληώλ ζηηο νπνίεο έρεη ζπκκεηάζρεη ν Alfred Hitchcock θαη έρνπλ ελνηθηαζηεί πεξηζζόηεξεο από δύν θνξέο: SELECT DVD.IDΤαηλίαο, ΤΑΙΝΙΑ.Τίηινο FROM ΤΑΙΝΙΑ INNER JOIN DVD ON ΤΑΙΝΙΑ.ID = DVD.IDΤαηλίαο INNER JOIN ΕΝΟΙΚΙΑΣΗ ON ΕΝΟΙΚΙΑΣΗ.IDdvd = DVD.ID WHERE DVD.IDΤαηλίαο IN (SELECT IDΤαηλίαο FROM ΤΣ INNER JOIN ΣΥΝΤΕΛΕΣΤΗΣ ON ΤΣ.IDΣπληειεζηή = ΣΥΝΤΕΛΕΣΤΗΣ.ID WHERE ΣΥΝΤΕΛΕΣΤΗΣ.Όλνκα = 'Alfred Hitchcock') GROUP BY DVD.IDΤαηλίαο, ΤΑΙΝΙΑ.Τίηινο HAVING COUNT(*) > 2
19 Σύμθετα Εμφωλευμέμα SQL ερωτήματα (Ερώτημα) Να βξεζεί ην όλνκα θαη ν θσδηθόο ηνπ ζπληειεζηή πνπ έρεη ηηο πεξηζζόηεξεο ζπκκεηνρέο ζε ηαηλίεο ζπλνιηθά:
20 Σύμθετα Εμφωλευμέμα SQL ερωτήματα (Απάμτηση) Να βξεζεί ην όλνκα θαη ν θσδηθόο ηνπ ζπληειεζηή πνπ έρεη ηηο πεξηζζόηεξεο ζπκκεηνρέο ζε ηαηλίεο ζπλνιηθά: Βρίσκοσμε το πλήθος των σσμμετοτών ανά σσντελεστή SELECT ID,Όλνκα FROM ΣΥΝΤΕΛΕΣΤΗΣ WHERE ID IN (SELECT IDΣπληειεζηή Βρίσκοσμε το όνομα τοσ σσντελεστή Βρίσκοσμε το σσντελεστή με το μεγαλύτερο πλήθος σσμμετοτων FROM ΤΣ GROUP BY IDΣπληειεζηή HAVING COUNT(IDΤαηλίαο) >= ALL (SELECT COUNT(*) FROM ΤΣ GROUP BY IDΣπληειεζηή) )
21 Σύμθετα Εμφωλευμέμα SQL ερωτήματα Να βξεζεί ν θσδηθόο ηνπ DVD κε ηε δεύηεξε κεγαιύηεξε πνζόηεηα. Σην απνηέιεζκα λα εκθαλίδεηαη κόλν ν θσδηθόο απηόο. (Υπόδεημε: ην DVD κε ηε δεύηεξε κεγαιύηεξε πνζόηεηα είλαη απηή πνπ ζπκκεηέρεη ζην top2 ηεο θαηάηαμεο σο πξνο ηελ πνζόηεηα, αιιά δελ ζπκκεηέρεη ζην top1.) CREATE VIEW T1 as (SELECT TOP 2 ID FROM DVD ORDER BY Πνζόηεηα desc) CREATE VIEW T2 as (SELECT TOP 1 ID From DVD ORDER BY Πνζόηεηα desc) SELECT ID DROP VIEW T 1 FROM T2 T 2 WHERE ID NOT IN (SELECT ID FROM T1);