ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ MYSQL MySQL For Pros Αντώνης Χρυσόπουλος Χριστίνα Αυδίκου Στέλιος Μόσχογλου Θεοδόσης Σουργκούνης
ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ MYSQL
MySQL For Pros
Αντώνης Χρυσόπουλος Χριστίνα Αυδίκου Στέλιος Μόσχογλου Θεοδόσης Σουργκούνης
Διαλέχτε, καλέ κυρία, Διαλέχτε
1. Ταξινόμηση
2. Περιορισμοί
3. Τελεστές LIKE, IN, BETWEEN
4. Ψευδώνυμα - Ημερομηνίες
5. Ενώσεις Πινάκων
Έχω πρώτο πράγμα...
1. Ταξινόμηση
Ταξινόμηση
Εντολή ORDER BY Ταξινομεί το αποτέλεσμα με βάση ένα πεδίο. ASC: Αύξουσα Ταξινόμηση (προεπιλογή).
DESC: Φθίνουσα Ταξινόμηση.
Ακολουθεί πάντα τον όρο WHERE. Είτε υπάρχει είτε όχι.
Παράδειγμα Select πεδία FROM πίνακας WHERE συνθήκη
ORDER BY πεδιο ASC (DESC);
Ταξινόμηση (2)
Αποθηκευμένος πίνακας Artist
artistid name lastname birthdate country genre
1 Tori Amos 1963-08-22 USA Pop / Jazz
2 Britney Spears 1981-12-02 USA Pop
3 Bruce Dickinson 1958-08-07 England Metal
4 Μιχαλάρας Ρακιντζής 1962-01-05 Greece Λίγο από όλα
Ταξινόμηση (3)
Πίνακας αποτελέσματος Artistid name lastname birthdate
3 Bruce Dickinson 1958-08-07
4 Μιχαλάρας Ρακιντζής 1962-01-05
1 Tori Amos 1963-08-22
2 Britney Spears 1981-12-02
SELECT artistid, name, lastname, birthdate FROM Artist ORDER BY birthdate ASC;
Ταξινόμηση (4)
Πίνακας αποτελέσματος Artistid name lastname birthdate
2 Britney Spears 1981-12-02
1 Tori Amos 1963-08-22
4 Μιχαλάρας Ρακιντζής 1962-01-05
3 Bruce Dickinson 1958-08-07
SELECT artistid, name, lastname, birthdate FROM Artist ORDER BY birthdate DESC;
Ταξινόμηση (5)
Πίνακας αποτελέσματος
Artistid name lastname birthdate
2 Britney Spears 1981-12-02
1 Tori Amos 1963-08-22
SELECT artistid, name, lastname, birthdate FROM Artist WHERE name = ‘Britney’ OR lastname = ‘Amos’ ORDER BY birthdate DESC;
Οτι πάρεις ένα ευρώ, ότι πάρεις.
1. Ταξινόμηση
2. Περιορισμοί
Περιορισμοί
Εντολή LIMIT Περιορίζει τον πλήθος των εγγραφών του πίνακα
αποτελέσματος.
Ο όρος αυτός ακολουθεί το ORDER BY. Είτε υπάρχει, είτε δεν υπάρχει.
Κρατάει τα πρώτα N στοιχεία.
Παράδειγμα Select πεδία FROM πίνακας WHERE συνθήκη
ORDER BY πεδιο LIMIT N;
Περιορισμοί (2)
Πίνακας αποτελέσματος Artistid name lastname birthdate
3 Bruce Dickinson 1958-08-07
4 Μιχαλάρας Ρακιντζής 1962-01-05
1 Tori Amos 1963-08-22
SELECT artistid, name, lastname, birthdate FROM Artist ORDER BY birthdate ASC LIMIT 3;
Τρία αποτελέσματα
Οι υπόλοιπες εγγραφές παραλείπονται.
Περιορισμοί (2)
Ποια είναι τα στοιχεία του γηραιότερου καλλιτέχνη της βάσης?
SELECT artistid, name, lastname, birthdate FROM Artist ORDER BY birthdate ASC LIMIT 1;
Artistid name lastname birthdate
3 Bruce Dickinson 1958-08-07
Περιορισμοί (3)
To LIMIT εφαρμόζεται και σε ερωτήματα UPDATE και DELETE.
ΚΑΛΗ ΠΡΑΚΤΙΚΗ! LIMIT 1 σε ερωτήματα που περιμένουμε να αλλάξουν
/ διαγράψουν μόνο μια εγγραφή.
Θα σώσουν την κατάσταση αν ξεχάσεις το WHERE.
DELETE FROM Artist WHERE artistid = 3 LIMIT 1;
Περιορισμοί (4)
Πλήρης Σύνταξη του LIMIT
LIMIT offset, N
Σε αυτή τη μορφή
Παραλείπει εγγραφές από την αρχή του αποτελέσματος ίσες με το offset.
Αν offset = 0 καμία παράλειψη.
Περιορίζει το πλήθος των εγγραφών του αποτελέσματος κατά Ν.
Παράδειγμα LIMIT με offset
Πίνακας αποτελέσματος Artistid name lastname birthdate
2 Britney Spears 1981-12-02
1 Tori Amos 1963-08-22
4 Μιχαλάρας Ρακιντζής 1962-??-??
3 Bruce Dickinson 1958-08-07
SELECT artistid, name, lastname, birthdate FROM Artist ORDER BY birthdate DESC LIMIT 1, 2;
1 εγγραφή από την αρχή παραλείπεται
Δύο έγγραφές
Παράδειγμα LIMIT με offset (2)
Ποια είναι τα στοιχεία του δεύτερου γηραιότερου καλλιτέχνη της βάσης?
SELECT artistid, name, lastname, birthdate FROM Artist ORDER BY birthdate ASC LIMIT 1,1;
Artistid name lastname birthdate
4 Μιχαλάρας Ρακιντζής 1962-01-05
Καρέκλες και τραπέζια και καρέκλες έχω!!!
1. Ταξινόμηση
2. Περιορισμοί
3. Τελεστές LIKE, IN, BETWEEN
Αναζήτηση μέσα σε Αλφαριθμητικά
Τελεστής LIKE Σύνταξη
WHERE πεδίο LIKE έκφραση
Έκφραση Αλφαριθμητικό που περιέχει % ως χαρακτήρα-μπαλαντέρ. Σημαίνει οποιοσδήποτε χαρακτήρας.
Παραδείγματα “Kiss%”: Αρχίζει από “Kiss”
“Kiss Me” OK “Gimme A Kiss Kiss” NOT OK
“Kiss%You”: Αρχίζει από “Kiss” και τελειώνει με “You” “Kissing You” OK “Kiss You and your sister!!!” NOT OK
Παράδειγμα LIKE
SELECT artistid, name, lastname, birthdate FROM Artist WHERE lastname LIKE ’S%’ LIMIT 1;
Artistid name lastname birthdate
2 Britney Spears 1981-12-02
Αναζήτηση μέσα σε Αλφαριθμητικά (2)
Τελεστής IN
Σύνταξη
Πεδίο IN ( τιμή1, τιμη2, ... , τιμήΝ)
Ελέγχει αν μια τιμή ενός πεδίου ανήκει σε ένα σύνολο τιμών.
SELECT artistid, name, lastname FROM Artist WHERE name IN (‘Tori’, ‘Bruce’);
artistid name lastname
1 Tori Amos
3 Bruce Dickinson
Σύγκριση
Οι τελεστές =, <, >, <=, >= λειτουργούν σε:
Αριθμούς
3 < 4
5 = 5
12.2 > -9
Αλφαριθμητικά (λεξικογραφικά)
‘Tori’ >= ‘Bruce’
Ημερομηνίες (χρονολογικά)
‘2001-09-11’ > ‘1987-11-30’
‘2011-11-22 00:00:00’ <= ‘2011-11-22 01:01:01’
Αναζήτηση μέσα σε Αλφαριθμητικά (3)
Τελεστής BETWEEN… AND
Σύνταξη
Πεδίο BETWEEN κάτω_φράγμα AND άνω_φράγμα
Ελέγχει αν μια τιμή βρίσκεται μεταξύ των δύο φραγμάτων (μεγαλύτερο ισο / μικρότερο ίσο).
SELECT name, lastname FROM Artist WHERE name BETWEEN ‘Tori’ AND ‘Zed’;
name lastname
Tori Amos
Τα δύο μισή τιμή σε λέω...
1. Ταξινόμηση
2. Περιορισμοί
3. Τελεστές LIKE, IN, BETWEEN
4. Ψευδώνυμα - Ημερομηνίες
Ψευδώνυμα Στηλών
Εισάγονται με το AS
Σύνταξη
πεδίο AS ψευδώνυμο
Αλλάζουν το όνομα μιας στήλης του αποθηκευμένου πίνακα στον πίνακα αποτελέσματος.
SELECT artistid AS code, name, lastname FROM Artist WHERE name IN (‘Tori’, ‘Bruce’);
code name lastname
1 Tori Amos
3 Bruce Dickinson
Τελεστές Ημερομηνιών
Λέξη-κλειδί INTERVAL
Λέξεις-κλειδιά διάρκειας: SECOND
MINUTE
HOUR
DAY
MONTH
YEAR
Μορφή: INTERVAL Ν διάρκεια
Μπορεί να προστεθεί / αφαιρεθεί από ημερομηνία για να δώσει μία άλλη
Τελεστές Ημερομηνιών (2)
Συνάρτηση NOW()
Επιστρέφει την τωρινή ημερομηνία/ώρα.
NOW(): ‘2010 – 11 – 30 20:00:21’
Παράδειγμα NOW()
Πως θα δείξω ποίοι είναι μέσα στην σελίδα μου? Στήλη lastactive στον πίνακα users
Ενημέρωση κάθε φορά που ανοίγει ένα PHP αρχείο:
UPDATE users SET lastactive = NOW() WHERE userid = 5 LIMIT 1;
Ερώτημα για να πάρω τους online χρήστες:
SELECT username FROM users WHERE lastactive + INTERVAL 5 MINUTE > NOW();
Πράξεις κατά την Επιλογή
Το SELECT επιτρέπει και πράξεις κατά την επιλογή
Δηλαδή τα πεδία στην πραγματικότητα είναι παραστάσεις.
SELECT
(artistid + 10) AS code, name, lastname
FROM
Artist
WHERE
name IN (‘Tori’, ‘Bruce’);
SELECT name, lastname, (birtdate + INTERVAL 100 YEARS) AS death FROM Artist WHERE name IN (‘Tori’, ‘Bruce’);
code name lastname
11 Tori Amos
13 Bruce Dickinson
name lastname death
Tori Amos 2063-08-22
Bruce Dickinson 2058-08-07
Κληρώνει δεν λερώνει...
1. Ταξινόμηση
2. Περιορισμοί
3. Τελεστές LIKE, IN, BETWEEN
4. Ψευδώνυμα – Ημερομηνίες
5. Ενώσεις Πινάκων
ΕΝΩΣΕΙΣ ΠΙΝΑΚΩΝ
Συνδυασμός δεδομένων από πολλούς διαθέσιμους αποθηκευμένους πίνακες.
Ο πίνακας αποτελέσματος μπορεί να περιλαμβάνει δεδομένα από όποιους του ζητήσουμε.
Μπορεί επίσης να φιλτράρει τα αποτελέσματα με χρήση πεδιών από όσους από αυτούς θέλουμε.
Πολλάπλές ενώσεις, ενώνοντας το αποτέλεσμα μιας ένωσης πινάκων με άλλον πίνακα.
ΑΠΛΗ ΕΝΩΣΗ
Είναι η ένωση δύο ή περισσότερων πινάκων σε ένα ερώτημα.
Για να πάρουμε δεδομένα από όλους.
Για να βάλουμε καποια κριτήρια στα αποτελέσματά μας.
Για να ξεχωρίσουμε τα πεδία που έχουν κοινά ονόματα κάνουμε αναφορά σε πεδίο πίνακα
πίνακας.πεδίο
Παράδειγμα
albumid name year studioid
1 Thriller 1982 1
3 Bad 1984 1
4 Τσικουλάτα 2004 2
studioid name location funded
1 Westlake USA 1974
2 Vasipap Greece 2001
SELECT Album.name AS title, year, Studio.name AS recording_studio FROM Album, Studio WHERE Studio.studioid = Album.studioid;
ΑΠΛΗ ΕΝΩΣΗ (2)
Σωστότερη σύνταξη SELECT πεδία FROM Α INNER JOIN B ON A.x = B.y
Έτσι το WHERE μπορεί να χρησιμοποιηθεί και πάλι για φιλτράρισμα και όχι για ένωση πινάκων.
Παραδείγμα (2)
SELECT Album.name AS title, year, Studio.name AS recording_studio FROM Album INNER JOIN Studio ON Studio.studioid = Album.studioid WHERE Studio.studioid = 1;
title year recording_studio
Thriller 1982 Westlake
Bad 1984 Westlake
Δεύτερο Παραδείγμα
Ποιο είναι το studio που ηχογραφήθηκε το πιο παλιό album?
SELECT Studio.name AS recording_studio FROM Studio INNER JOIN Album ON Studio.studioid = Album.studioid ORDER BY year ASC LIMIT 1;
Τρίτο Παραδείγμα
Όλοι οι τίτλοι των album και η τοποθεσία του studio που ηχογραφήθηκαν?
SELECT Album.name AS title, Studio.location FROM Album INNER JOIN Studio ON Studio.studioid = Album.studioid;
name location
Thriller USA
Bad USA
Τσικουλάτα Greece
ΑΡΙΣΤΕΡΗ ΕΝΩΣΗ
Στην περίπτωση που δεν έχουμε για όλα τα studios πληροφορίες.
Τώρα αν κάνουμε το ερώτημα της απλής ένωσης, δεν θα επιστραφούν όλες οι τιμές.
SELECT Album.name AS title, Studio.location FROM Album INNER JOIN Studio ON Studio.studioid = Album.studioid;
studioid name location funded
1 Westlake USA 1974
ΑΡΙΣΤΕΡΗ ΕΝΩΣΗ (2)
Αποτέλεσμα
Κάποια album θα λείπουν επειδή λείπει το studio στο οποίο ηχογραφήθηκε.
Εμείς όμως θέλουμε τις πληροφορίες του album ακόμα και αν δεν έχουμε στοιχεία για το studio.
title location
Thriller USA
Bad USA
ΑΡΙΣΤΕΡΗ ΕΝΩΣΗ (3)
Αλλάζουμε το INNER JOIN με LEFT OUTER JOIN
Αν υπάρχει το κλειδί της ένωσης στον δεξιό πίνακα
Κάνει το ίδιο με την απλή ένωση.
Αν καμιά εγγραφή του δεξιού πίνακα δεν ταιριάζει με την εκάστοτε του αριστερού
Κρατάει τα στοιχεία της εγγραφής του αριστερού πίνακα.
Γεμίζει τα στοιχεία των στηλών του δεξιού πίνακα του αποτελέσματος με NULL.
Παράδειγμα Αριστερής Ένωσης
SELECT Album.name AS title, Studio.location FROM Album LEFT OUTER JOIN Studio ON Studio.studioid = Album.studioid;
title location
Thriller USA
Bad USA
Τσικουλάτα NULL
Καρτεσιανό Γινόμενο
Α x B
Κάθε εγγραφή του πίνακα Α.
Συνδυάζεται με κάθε εγγραφή του πίνακα Β.
Παράδειγμα
albumid title year studio
1 Thriller 1982 1
3 Bad 1984 1
4 Τσικουλάτα 2004 2
studioid name
1 Westlake
2 Vasipap
Studio
Album
x
Καρτεσιανό Γινόμενο (2)
Αποτέλεσμα
albumid title year studio studioid name
1 Thriller 1982 1 1 Westlake
1 Thriller 1982 1 2 Vasipap
3 Bad 1984 1 1 Westlake
3 Bad 1984 1 2 Vasipap
4 Τσικουλάτα 2004 2 1 Westlake
4 Τσικουλάτα 2004 2 2 Vasipap
Παράδειγμα
SELECT title, year, name FROM Album, Studio
title year name
Thriller 1982 Westlake
Thriller 1982 Vasipap
Bad 1984 Westlake
Bad 1984 Vasipap
Τσικουλάτα 2004 Westlake
Τσικουλάτα 2004 Vasipap
Παράδειγμα (2)
Από μόνο του άχρηστο.
Πολύ πιο χρήσιμο με το WHERE.
SELECT title, year, name FROM Album, Studio WHERE studio = studioid
title year name
Thriller 1982 Westlake
Bad 1984 Westlake
Τσικουλάτα 2004 Vasipap
Παράδειγμα Πολλαπλών Ενώσεων
user:
- userid
- username
- password
blog:
- blogid
- title
- text
- userid
comment:
- commentid
- text
- blogid
- userid
- created
Παράδειγμα Πολλαπλών Ενώσεων (2)
Ολοι οι τίτλοι και τα κείμενα από τις αναρτήσεις (postblogs) του χρήστη #5
SELECT text, title FROM blog WHERE userid = 5
Παράδειγμα Πολλαπλών Ενώσεων (3)
Το κείμενο από όλα τα σχόλια που έγιναν σε όλα τα postblogs του χρήστη #5
SELECT comment.text FROM comment INNER JOIN blog ON comment.blogid = blog.blogid WHERE blog.userid = 5 Χρησιμοποιούμε την ένωση για να πάρουμε στοιχεία από τον πίνακα comment και να φιλτράρουμε με βάση τον πίνακα blog.
Παράδειγμα Πολλαπλών Ενώσεων (4)
Το κείμενο και ο χρήστης που έγραψε το σχόλιο από όλα τα σχόλια που έγιναν σε όλα τα postblogs του χρήστη #5
SELECT comment.text, user.name FROM comment INNER JOIN blogs ON comment.blogid = blog.blogid INNER JOIN user ON user.userid = comment.userid WHERE blog.userid = 5
Χρησιμοποιούμε την ένωση για να πάρουμε στοιχεία από τον πίνακα comment και user και να φιλτράρουμε με βάση τον πίνακα blog (ένωση στην ένωση).
Παράδειγμα Πολλαπλών Ενώσεων (5)
Το κείμενο από το πιο πρόσφατο σχόλιο που έγινε σε κάποιο blog του χρήστη #5 μαζί με τον τίτλο του blog;
SELECT blog.title, comment.text FROM comment INNER JOIN blog ON comment.blogid = blog.blogid WHERE blog.userid = 5 ORDER BY comment.created DESC LIMIT 1 Χρησιμοποιούμε την ένωση για να πάρουμε στοιχεία από τον πίνακα comment και comment και για να φιλτράρουμε με χρήση αναφοράς.
Τέλος ο γαύρος!!!
Μάθατε όσα χρειάζεστε για να φτιάξετε την πρώτη σας βάση και να την διαχειριστείτε...
THE END!!!
Ευχαριστούμε πάρα πολύ που δεν κοιμηθήκατε (πάλι...)