Transcript S.sid

ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
ΕΣΔ232 – Οργάνωση Δεδομένων
στη Κοινωνία της Πληροφορίας
SQL: Ερωτήματα,
προγραμματισμός και εναύσματα
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Περιεχόμενα
Περιεχόμενα


Το βασικό SQL ερώτημα

Φωλιασμένα ερωτήματα

Τελεστές συνάθροισης

Ενσωματωμένη SQL

Εναύσματα

Παραδείγματα
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Βιβλιογραφία Ενότητας
Βιβλιογραφία


[Ramakrishnan 2002a]: Chapter 5

[Ullman 2007]: Chapter 5

[Seyed 2007]: Chapter 5

[Forta 2005]: Chapters 2-3

[Oppel 2004]: Chapter 4

[Petersen 2002]: Chapter 8

[Taylor 2000]: Chapter 12

Αθ. Μάργαρης, Πανεπιστήμιο Μακεδονίας: SQL
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Το βασικό SQL ερώτημα
Η βασική δομή σύνταξης ενός SQL ερωτήματος έχει την πιο κάτω μορφή:
SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification

relation-list Κατάλογος με τα ονόματα πινάκων οι οποίοι θα χρησιμοποιηθούν
για τον υπολογισμό του ερωτήματος (είναι πιθανό τα ονόματα αυτά να
ακολουθούνται από μεταβλητές διαστήματος -range-variables).

target-list Κατάλογος πεδίων από τους πίνακες τα οποία θέλουμε να
εμφανιστούν στα αποτελέσματα

qualification Κριτήρια επιλογής μέσω συγκριτικών τελεστών (Attr op const or
Attr1 op Attr2, όπου op είναι ένας από τους πιο κάτω τελεστές <, >, =, ≥,
≤, ≠) οι οποίοι συνδυάζονται μέσω των λογικών τελεστών AND, OR και NOT.

DISTINCT είναι μια προαιρετική επιλογή η οποία υποδεικνύει ότι η απάντηση
του ερωτήματος πρέπει να περιέχει μόνο διαφορετικές γραμμές.
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Οι πίνακες (στιγμιότυπα) των
παραδειγμάτων
Στα επόμενα παραδείγματα θα χρησιμοποιήσουμε τα πιο κάτω στιγμιότυπα
των πινάκων Sailors (2 διαφορετικά στιγμιότυπα S1 και S2) και Reserves
(στιγμιότυπο R1).

S1
R1
sid
snam
e
rating
age
22
dustin
7
45
31
lubber
8
55
58
rusty
10
35
sid
bid
date
22
101
15/10/2009
58
103
11/12/2009
S2
sid
sname
rating
age
28
yuppy
9
35
31
lubber
8
55
44
guppy
5
35
58
rusty
10
35
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα


Η στρατηγική υπολογισμού των
ερωτημάτων
Το αποτέλεσμα ενός SQL ερωτήματος προκύπτει με την εκτέλεση
των πιο κάτω βημάτων:
1.
Υπολογισμός του καρτεσιανού γινομένου των πινάκων στο relation-list.
2.
Απόρριψη των εγγραφών που δεν πληρούν τα κριτήρια επιλογής που
περιλαμβάνονται στα qualifications
3.
Απόκρυψη των πεδίων που δεν περιλαμβάνονται στο target-list.
4.
Αν υπάρχει η επιλογή DISTINCT οι γραμμές με όμοιο περιεχόμενο
διαγράφονται.
Στην πράξη η πιο πάνω στρατηγική υπολογισμού των ερωτημάτων
SQL δεν είναι καθόλου αποδοτική.

Τα συστήματα DBMS χρησιμοποιούν εναλλακτικές μεθόδους
υπολογισμού των αποτελεσμάτων σε SQL ερωτήματα. Η μελέτη των
μεθόδων αυτών δεν εμπίπτει στο αντικείμενο του μαθήματος
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Παράδειγμα υπολογισμού
SELECT S.sname
S1
FROM Sailors S, Reserves R
WHERE S.sid=R.sid AND R.bid=103
R1
sid
sn
am
e
ratin
g
age
2
2
d
u
stin
7
4
5
sid
bid
date
3
1
lu
b
b
e
r
8
5
5
22
101
15/10/2009
5
8
ru
sty
1
0
3
5
58
103
11/12/2009
S1xR1
1.
Υπολογισμός καρτεσιανού
γινομένου SxR πινάκων S και R.
2.
Έλεγχος κριτηρίων S.sid=R.sid και
R.bid=103.
3.
Απόκρυψη όλων των πεδίων πλην
του S.sname
4.
DISTINCT δεν έχει οριστεί (έτσι και
αλλιώς δεν υπάρχουν όμοιες
γραμμές στο αποτέλεσμα).
sid
sname
rating
age
sid
bid
date
22
dustin
7
45
22
101
15/10/2009
22
dustin
7
45
58
103
11/12/2009
31
lubber
8
55
22
101
15/10/2009
31
lubber
8
55
58
103
11/12/2009
58
rusty
10
35
22
101
15/10/2009
58
rusty
10
35
58
103
11/12/2009
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Μεταβλητές διαστήματος

Οι μεταβλητές διαστήματος είναι απαραίτητες αν ο ίδιος πίνακας
εμφανίζεται δύο φορές στη συνιστώσα FROM (δηλαδή στο
relation_list).

Το προηγούμενο ερώτημα μπορεί να γραφεί και ως:
SELECT S.sname
FROM Sailors S, Reserves R
WHERE S.sid=R.sid AND bid=103
ή
SELECT sname
FROM Sailors, Reserves
WHERE Sailors.sid=Reserves.sid AND bid=103

Σε κάθε περίπτωση η χρήση μεταβλητών διαστήματος είναι καλή
πρακτική!
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Εκφράσεις και συμβολοσειρές
(strings)
SELECT S.age, age1=S.age-5, 2*S.age AS age2
FROM Sailors S
WHERE S.sname LIKE ‘B_%B’

Το πιο πάνω παράδειγμα δείχνει τη χρήση αριθμητικών εκφράσεων
στην εμφάνιση των αποτελεσμάτων αλλά και της χρήσης ταύτισης
συμβολοσειρών στα κριτήριο επιλογής:

Βρες τις τριάδες (ηλικία ναυτικών και δύο πεδίων τα οποία ορίζονται
βάση αριθμητικών εκφράσεων) για τους ναυτικούς των οποίων το όνομα
αρχίζει και τελειώνει σε B και περιέχει το πολύ τρεις χαρακτήρες

Οι τελεστές AS και = είναι οι δύο τρόποι μέσω των οποίων δίνουμε
όνομα στις αριθμητικές εκφράσεις (2*S.age AS age2, age1=S.age-5).

Ο τελεστής LIKE χρησιμοποιείται για σύγκριση συμβολοσειρών. ‘_’
χρησιμοποιείται για οποιοδήποτε (μη κενό) χαρακτήρα και το `%’
υποδηλώνει 0 ή περισσότερους τυχαίους χαρακτήρες.
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Οι τελεστές UNION, EXCEPT και
INTERSECT
Έστω ότι ζητούμε τα sid των ναυτικών που έχει κάνει κράτηση για μια
κόκκινη ή πράσινη βάρκα:
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND (B.color=‘red’ OR B.color=‘green’)

Ο τελεστής UNION χρησιμοποιείται για τον υπολογισμό της ένωσης δύο
συμβατών (ως προς τα πεδία) συνόλων από εγγραφές (οι οποίες προκύπτουν
ως αποτέλεσμα SQL ερωτημάτων).
SELECT S.sid FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’
UNION
SELECT S.sid FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’

Αν αντικαθιστούσαμε το OR με AND στο πρώτο ερώτημα τι αποτέλεσμα θα
παίρναμε;

Ο τελεστής EXCEPT εξαιρεί τα αποτελέσματα του δευτέρου ερωτήματος από
αυτά του πρώτου (Δηλαδή: βρες τα sid των ναυτικών που έχουν κάνει
© 2013 Nicolas Tsapatsoulis
κράτηση σε κόκκινη αλλά όχι σε πράσινη βάρκα)
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Οι τελεστές UNION, EXCEPT και
INTERSECT(2)
Έστω ότι ζητούμε τα sid των ναυτικών που έχει κάνει κράτηση για μια
κόκκινη ή πράσινη βάρκα:
SELECT S.sid FROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2
WHERE S.sid=R1.sid AND R1.bid=B1.bid
AND S.sid=R2.sid AND R2.bid=B2.bid
AND (B1.color=‘red’ AND B2.color=‘green’)

Ο τελεστής INTERSECT χρησιμοποιείται για τον υπολογισμό της τομής δύο
συμβατών (ως προς τα πεδία) συνόλων από εγγραφές (οι οποίες προκύπτουν
ως αποτέλεσμα SQL ερωτημάτων)
SELECT S.sid FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’
INTERSECT
SELECT S.sid FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Οι τελεστές UNION, EXCEPT και
INTERSECT(3)
Στη MySQL οι τελεστές EXCEPT και INTERSECT δεν υποστηρίζονται.
Υλοποιούνται συνήθως με χρήση των τελεστών NOT IN και IN:
EXCEPT:
SELECT DISTINCT S.sid FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='red'
AND S.sid NOT IN (SELECT DISTINCT S.sid FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='green');
INTERSECT:
SELECT DISTINCT S.sid FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='red'
AND S.sid IN (SELECT DISTINCT S.sid FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='green');
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Φωλιασμένα ερωτήματα
Φωλιασμένα ερωτήματα ονομάζουμε SQL ερωτήματα τα οποία
βρίσκονται στην περιοχή των κριτηρίων WHERE ενός άλλου SQL
ερωτήματος:
 Να βρεθούν τα ονόματα των ναυτικών που έχουν κάνει κράτηση για τη
βάρκα με αριθμό 103:
SELECT S.sname
FROM Sailors S
WHERE S.sid IN (SELECT R.sid
FROM Reserves R
WHERE R.bid=103)

Τα φωλιασμένα ερωτήματα μπορεί να υπάρχουν και στην περιοχή του
FROM αλλά και του HAVING
 Για να βρούμε τα ονόματα των ναυτικών που δεν έχουν κάνει κράτηση για
τη βάρκα με αριθμό 103 χρησιμοποιούμε στη θέση του IN το NOT IN
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Φωλιασμένα ερωτήματα με
συσχέτιση
Να βρεθούν τα ονόματα των ναυτικών που έχουν κάνει κράτηση για τη
βάρκα με αριθμό 103:
SELECT S.sname
FROM Sailors S
WHERE EXISTS ( SELECT *
FROM Reserves R
WHERE R.bid=103 AND S.sid=R.sid)

Ο τελεστής EXISTS είναι ένας ακόμη τελεστής σύγκρισης συνόλων
(όπως ο τελεστής IN).
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Τελεστές σύγκρισης συνόλων

Αντίστοιχα των τελεστών IN και EXISTS υπάρχουν και τελεστές NOT
IN, NOT EXISTS με προφανή ερμηνεία.

Επιπλέον των ανωτέρω υπάρχει και η δυνατότητα της ακόλουθη
σύνταξης:
 op ANY, op ALL,
Όπου ο τελεστής op είναι κάποιος από τους τελεστές σύγκρισης >,<,=,≥,≤, ≠

Βρες τους ναυτικούς με rating μεγαλύτερο από αυτό του ναυτικού με
όνομα Horatio:
SELECT *
FROM Sailors S
WHERE S.rating > ANY ( SELECT S2.rating
FROM Sailors S2
WHERE S2.sname=‘Horatio’);
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Παράδειγμα Ι
Υλοποίηση τελεστή INTERSECT με χρήση του τελεστή IN:
Να βρεθούν τα sid’s των ναυτικών που έχουν κάνει κράτηση σε
κόκκινη αλλά και πράσινη βάρκα:
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’ AND S.sid IN
(SELECT S2.sid
FROM Sailors S2, Boats B2, Reserves R2
WHERE S2.sid=R2.sid AND R2.bid=B2.bid AND
B2.color=‘green’)

Ομοίως ο τελεστής EXCEPT υλοποιείται με χρήση του NOT IN.

Για να βρούμε τα ονόματα αντί τα sid’s των ναυτικών στα πιο πάνω
ερωτήματα αντικαθιστούμε το S.sid με S.sname στο SELECT.
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Τελεστές συνάθροισης
Οι τελεστές συνάθροισης
χρησιμοποιούνται για
ομαδική επεξεργασία των
αποτελεσμάτων:
 COUNT (*)
(πλήθος εγγραφών)
 COUNT ( [DISTINCT] A)
(διακριτές τιμές ως προς
το πεδίο Α)
 SUM ( [DISTINCT] A)
(άθροισμα διακεκριμένων
τιμών στο πεδίο Α)
 AVG ( [DISTINCT] A)
(Μ.Ο. διακεκριμένων
τιμών στο πεδίο Α)
 MAX (A)
 MIN (A)
SELECT COUNT (*) FROM Sailors S
SELECT AVG (S.age) FROM Sailors S
WHERE S.rating=10
SELECT COUNT (DISTINCT S.rating)
FROM Sailors S WHERE S.sname=‘Bob’
SELECT AVG ( DISTINCT S.age)
FROM Sailors S WHERE S.rating=10
SELECT S.sname FROM Sailors S
WHERE S.rating = (SELECT MAX(S2.rating)
FROM Sailors
S2)
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Παράδειγμα ΙΙ
Να βρεθεί το όνομα και η ηλικία του γηραιότερου ναυτικού:
SELECT S.sname, S.age FROM Sailors S
WHERE S.age =(SELECT MAX(S2.age)
FROM Sailors S2);
SELECT S.sname, S.age FROM Sailors S
WHERE (SELECT MAX(S2.age) FROM Sailors S2) = S.age

Το δεύτερο ερώτημα είναι ισοδύναμο με το πρώτο και υποστηρίζεται από το
πράτυπο SQL/92. Σε ορισμένα όμως DBMS δεν υποστηρίζεται.
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Οι τελεστές GROUP BY και
HAVING

Μέχρι τώρα εξετάσαμε τους τελεστές συνάθροισης όπως αυτοί εφαρμόζονται
για όλες τις εγγραφές που πληρούν ένα συγκεκριμένο κριτήριο (π.χ. Μ.Ο
ηλικίας, μέγιστη ηλικία κλπ).

Σε μερικές περιπτώσεις επιθυμούμε να εφαρμόσουμε τους τελεστές αυτούς
σε ομάδες εγγραφών.

Έστω το ερώτημα:

Βρες την ηλικία του νεαρότερου ναυτικού για κάθε διαφορετική τιμή του πεδίου
rating.

Γενικά δεν γνωρίζουμε πόσες διαφορετικές τιμές υπάρχουν για το rating.

Αν ξέραμε ότι υπάρχουν 10 διαφορετικές τιμές θα μπορούσαμε να γράψουμε 10 (!)
ερωτήματα ως ακολούθως:
For i = 1, 2, ... , 10:
SELECT MIN (S.age)
FROM Sailors S
WHERE S.rating = i
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Οι τελεστές GROUP BY και
HAVING(2)

Οι τελεστές GROUB BY και HAVING μας βοηθούν να αποφύγουμε το
προηγούμενο πρόβλημα

Σύνταξη:
SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification
GROUP BY grouping-list
HAVING group-qualification

Το target-list περιέχει
1.
Τα ονόματα πεδίων
2.
Όρους με τελεστές συνάθροισης (π.χ., MIN(S.age)).

Ο κατάλογος πεδίων πρέπει να είναι ένα υποσύνολο του grouping-list.

Κάθε εγγραφή στην απάντηση αντιστοιχεί σε μια ομάδα (group) και
επομένως τα πεδία αυτά πρέπει να έχουν μια και μοναδική τιμή για το
group (Group είναι ένα σύνολο εγγραφών οι οποίες έχουν τις ίδιες τιμές
για όλες τις τιμές των πεδίων του grouping-list.)
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Υπολογισμός ερωτημάτων που
περιέχουν GROUB BY
1.
Το καρτεσιανό γινόμενο των πινάκων στο relation-list υπολογίζεται
2.
Εγγραφές οι οποίες δεν πληρούν τα κριτήρια επιλογής διαγράφονται
3.
Τα πεδία τα οποία δεν δηλώνονται στο target_list αποκρύπτονται
4.
Οι υπόλοιπες εγγραφές ομαδοποιούνται με βάση τα πεδία του
grouping-list.
5.
Τα κριτήρια επιλογής όπως περιγράφονται στο HAVING (groupqualification) εφαρμόζονται και κάποιες ομάδες (που δεν τα
πληρούν) απαλείφονται.


Οι εκφράσεις στο group-qualification πρέπει να παράγουν μια και
μοναδική τιμή ανά group!
Μια μόνο εγγραφή ανά group δημιουργείται
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Παράδειγμα ΙΙΙ
Να βρεθεί η ηλικία του νεαρότερου ναυτικού, μεγαλύτερου από 18 χρονών,
για κάθε διαφορετική τιμή rating και για ratings με τουλάχιστον 2 ναυτικούς
sid
sname
rating
age
22
dustin
7
45
29
brutus
1
33
GROUP BY S.rating
31
lubber
8
55
HAVING COUNT(*) > 1
58
rusty
10
35
64
horatio
7
35
71
zorba
10
16
SELECT S.rating, MIN(S.age)
FROM Sailors S
WHERE S.age > 18
S3

Μόνο τα S.rating και S.age αναφέρονται στις περιοχές των SELECT, GROUP
BY ή HAVING, επομένως τα άλλα πεδία δεν χρησιμοποιούνται στο
αποτέλεσμα.

Η 2η στήλη στα αποτελέσματα δεν έχει όνομα. Μπορούμε να
χρησιμοποιήσουμε τον τελεστή AS για να της δώσουμε όνομα
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Παράδειγμα ΙV
Να βρεθεί η ηλικία του νεαρότερου ναυτικού, μεγαλύτερου από 18 χρονών,
για κάθε διαφορετική τιμή rating και για ratings με τουλάχιστον 2 ναυτικούς
(κάθε ηλικίας)
sid
sname
rating
age
S3
22
dustin
7
45
FROM Sailors S
29
brutus
1
33
WHERE S.age > 18
31
lubber
8
55
GROUP BY S.rating
58
rusty
10
35
HAVING 1 < (SELECT COUNT(*)
64
horatio
7
35
71
zorba
10
16
SELECT S.rating, MIN(S.age)
FROM Sailors S2
WHERE S.rating=S2.rating)

Στο πιο πάνω παράδειγμα η περιοχή HAVING προκύπτει από ένα φωλιασμένο
ερώτημα.

Συγκρίνεται τα αποτελέσματα με το προηγούμενο ερώτημα
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα

Παράδειγμα V
Για κάθε κόκκινη βάρκα βρείτε τον αριθμό των κρατήσεων που
έχουν γίνει για αυτήν
SELECT B.bid, COUNT(*) AS scount
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’
GROUP BY B.bid

Ομαδοποίηση τριών πινάκων

Τι θα παίρναμε ως αποτέλεσμα αν αφαιρούσαμε B.color=‘red’ από το
WHERE και προσθέταμε ένα HAVING με τη συνθήκη αυτή?
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Παραδείγματα
Εναύσματα

Έναυσμα: διαδικασία η οποία ξεκινά αυτόματα εφόσον κάποιες
αλλαγές λάβουν χώρα στο σύστημα DBMS

Τρία τμήματα:


Event (ενεργοποίηση εναύσματος)

Condition (συνθήκη εκτέλεσης του εναύσματος)

Action (αποτέλεσμα εκτέλεσης εναύσματος)
Παράδειγμα:
CREATE TRIGGER youngSailorUpdate
AFTER INSERT ON SAILORS
REFERENCING NEW TABLE NewSailors
FOR EACH STATEMENT
INSERT
INTO YoungSailors(sid, name, age, rating)
SELECT sid, name, age, rating
FROM NewSailors N
WHERE N.age <= 18
© 2013 Nicolas Tsapatsoulis
ΕΣΔ 232: Οργάνωση Δεδομένων στη Κοινωνία της Πληροφορίας
 Το βασικό SQL ερώτημα
 Φωλιασμένα ερωτήματα
 Τελεστές συνάθροισης
 Ενσωματωμένη SQL
 Εναύσματα
 Σύνοψη / Παραδείγματα

Παραδείγματα
Να λύσετε τις ασκήσεις:
1.
5.7
2.
5.9
3.
5.11
από το βιβλίο σας [Ramakrishnan 2002a]
© 2013 Nicolas Tsapatsoulis