16
Βάσεις Δεδομένων Ι - 03 SQL – Μέρος 1 ο Φώτης Κόκκορας (MSc/PhD) Τμήμα Μηχανικών Πληροφορικής ΤΕ ΤΕΙ Θεσσαλίας

03 - SQL (μέρος 1)

Embed Size (px)

DESCRIPTION

απλές SELECT εντολές (*, AS, AND/OR/NOT, %, _, NULL, IFNULL, ORDER BY, TOP/LIMIT, IN, DISTINCT), INSERT, DELETE, UPDATE DATABASE: https://dl.dropboxusercontent.com/u/2690181/myBeersDB.zip

Citation preview

Page 1: 03 - SQL (μέρος 1)

Βάσεις Δεδομένων Ι - 03

SQL – Μέρος 1ο

Φώτης Κόκκορας (MSc/PhD) Τμήμα Μηχανικών Πληροφορικής ΤΕ ΤΕΙ Θεσσαλίας

Page 2: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 2 - Βάσεις Δεδομένων Ι

Γιατί SQL; Η SQL είναι γλώσσα πολύ υψηλού επιπέδου

Επιτρέπει να λέμε εύκολα τι θέλουμε να κάνουμε και όχι πώς θα το κάνουμε.

Αποφεύγουμε τις πολλές λεπτομέρειες που υπεισέρχονται στη διαχείριση δεδομένων με

γλώσσες προγραμματισμού όπως C++ ή Java.

Είναι σχετικά απλή γλώσσα, απόρροια του ότι το σύνολο των πράξεων που προβλέπει το

Σχεσιακό Πρότυπο Δεδομένων είναι μικρό.

Το ΣΔΒΣ μετασχηματίζει τα SQL ερωτήματα σε πιο χαμηλού επιπέδου εντολές και

τις οργανώνει με τέτοιο τρόπο ώστε να εκτελούνται βέλτιστα.

Η διαδικασία ονομάζεται βελτιστοποίηση ερωτημάτων (query optimization) και είναι

όπως λέμε "διάφανη" διαδικασία (transparent), δηλ. ο χρήστης δεν το αντιλαμβάνεται!

H γλώσσα SQL είναι ISO standard και, έστω και με μικρές παραλλαγές, χρησιμοποι-

είται σε όλα τα ΣΔΒΔ (MySQL, Oracle, MS SQL, DB2, Postgres, κτλ).

Γιατί τώρα SQL; 1. Το επιτρέπει η απλότητα της γλώσσας!

2. Η γρήγορη εξοικείωση με την SQL θα επιτρέψει τη γρηγορότερη

κατανόηση των "πολύ θεωρητικών" των Βάσεων Δεδομένων.

3. Θα είναι πιο ενδιαφέροντα τα πρώτα εργαστήρια.

Page 3: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 3 - Βάσεις Δεδομένων Ι

First things first... H SQL δεν είναι case sensitive. π.χ. είτε πείτε SELECT ή select είναι το ίδιο.

Προσοχή! σε ονόματα πινάκων και στηλών σε Linux, είναι case sensitive!!!

Μια εντολή SQL τερματίζει συνήθως με το χαρακτήρα ; (ελληνικό ερωτηματικό).

Κάποια ΣΔΒΔ δεν το απαιτούν (πχ MS SQL Server, Access).

Όπως έχουμε ήδη πει, η SQL χωρίζεται σε δύο ομάδες εντολών:

DQL (Data Query Language) ή DML (Data Manipulation Language).

Περιλαμβάνει τις εντολές διαχείρισης των δεδομένων και τις σχετικές με αυτές παραμέτρους.

Οι κυριότερες είναι:

SELECT για υποβολή ερωτήσεων, INSERT για εισαγωγή δεδομένων στην database, UPDATE για

μεταβολή δεδομένων, DELETE για διαγραφή δεδομένων

πολλές παράμετροι στις παραπάνω εντολές - θα δούμε τις περισσότερες αναλυτικά

DDL (Data Definition Language)

Περιλαμβάνει τις εντολές διαχείρισης των βάσεων δεδομένων και τις σχετικές με αυτές

παραμέτρους. Οι κυριότερες είναι:

CREATE DATABASE για δημιουργία μιας νέας βάσης δεδομένων, ALTER DATABASE για τροποποίηση

μιας ΒΔ, DROP DATABASE για διαγραφή μιας ΒΔ

CREATE TABLE για δημιουργία πίνακα, ALTER TABLE για τροποποίηση πίνακα και DROP TABLE για

διαγραφή πίνακα

CREATE INDEX για δημιουργία ευρετηρίου, DROP INDEX για διαγραφή ευρετηρίου

Τα αλφαριθμητικά μπαίνουν πάντα μέσα σε ' και ' . Οι αριθμοί όχι.

Page 4: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 4 - Βάσεις Δεδομένων Ι

Δεδομένα Παραδειγμάτων Τα παραδείγματα εντολών που παρατίθενται στη συνέχεια αφορούν στην database

myBeersDB που έχει το ακόλουθο schema:

Beers(name, manf) Likes(drinker, beer)

Bars(name, license, city, phone, addr) Sells(bar, beer, price)

Drinkers(name, city, phone, addr) Frequents(drinker, bar)

Τα υπογραμμισμένα πεδία σε κάθε

σχέση ορίζουν το πρωτεύον κλειδί.

Το schema έχει όπως στην εικόνα. Οι

γραμμές που ενώνουν τους πίνακες

είναι οι συσχετίσεις ξένων κλειδιών.

πχ το πεδίο bar στη σχέση Sells παίρνει

τιμές όπως το πεδίο name που είναι το

πρωτεύον κλειδί στη σχέση Bars.

Τα αρχεία της database (schema σε

MySQL Workbench file, SQL κώδικας

για δημιουργία της database, SQL

κώδικας για εισαγωγή δεδομένων)

βρίσκονται και στο: https://dl.dropboxusercontent.com/u/2690181/keep/myBeersDB.zip

Page 5: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 5 - Βάσεις Δεδομένων Ι

SELECT ... FROM ... WHERE

Αυτή είναι η δομή μια τυπικής εντολής SELECT:

SELECT <επιθυμητά γνωρίσματα>

FROM <ένας ή περισσότεροι πίνακες>

WHERE <περιορισμοί επιλογής πλειάδων>

Παραδείγματα (δοκιμάστε τα στο Workbench, αφού φτιάξετε την database): SELECT name FROM Beers WHERE manf='Anheuser-Busch';

Επιλογή του γνωρίσματος name από τη σχέση Beers για όσες πλειάδες

της σχέσης Beers έχουν στο γνώρισμα manf τιμή 'Anheuser-Busch'.

σε απλά Ελληνικά: ποιες μπύρες φτιάχνει ο Anheuser-Busch;

Η απάντηση είναι μια σχέση (relation) με ένα μοναδικό γνώρισμα (το

name) και πλειάδες με το όνομα κάθε μπύρας που φτιάχνει ο κατασκευ-

αστής Anheuser-Busch, όπως Budweiser, κτλ. (βλ. πίνακα με

αποτελέσματα δεξιά).

Γενική Ερμηνεία Ερωτήματος:

από τη σχέση στη δήλωση FROM...

εφαρμόζουμε το κριτήριο επιλογής που ορίζει η δήλωση WHERE...

και συλλέγουμε τα δεδομένα που ορίζει η δήλωση SELECT

Page 6: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 6 - Βάσεις Δεδομένων Ι

Λειτουργική Επεξήγηση Ερωτήματος SELECT

Φανταστείτε μια πλειάδα-μεταβλητή (t) να επισκέπτεται κάθε πλειάδα της σχέσης

που μνημονεύεται στη δήλωση FROM.

Γίνεται έλεγχος αν η τρέχουσα πλειάδα ικανοποιεί τις απαιτήσεις που ορίζει η

δήλωση WHERE.

Αν τις ικανοποιεί, υπολογίζονται οι τιμές για τα γνωρίσματα (ή εκφράσεις) που βρί-

σκονται μετά το SELECT, χρησιμοποιώντας τα δεδομένα της τρέχουσας πλειάδας.

Page 7: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 7 - Βάσεις Δεδομένων Ι

Το * στις δηλώσεις SELECT

Αν στη δήλωση FROM υπάρχει μόνο μια σχέση τότε το * στη

δήλωση SELECT σημαίνει "όλα τα γνωρίσματα αυτής της σχέσης".

SELECT * FROM Beers WHERE manf = 'Anheuser-Busch';

Τώρα στο αποτέλεσμα εμπεριέχονται όλα τα γνωρίσματα της σχέσης Beers.

AS: Ορισμός ονόματος σε γνώρισμα αποτελεσμάτων

Μπορούμε να αλλάξουμε όνομα σε γνώρισμα στον πίνακα

αποτελεσμάτων χρησιμοποιώντας τη δήλωση: AS <νέο όνομα>

(χωρίς τα < και > ) SELECT name AS beer, manf FROM Beers WHERE manf = 'Anheuser-Busch'

Page 8: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 8 - Βάσεις Δεδομένων Ι

Υπολογιζόμενα (Calculated) & Σταθερά Πεδία

Μπορούμε να ενσωματώσουμε υπολογισμούς ως

στοιχεία (calculated elements) στις δηλώσεις SELECT:

SELECT bar, beer, price*340.75 AS priceInDrachmas

FROM Sells;

το πεδίο priceInDrachmas υπολογίζεται δυναμικά με βάση το πεδίο price

Προσθήκη σταθερών εκφράσεων: απλά παραθέτουμε την σταθερή

τιμή, πιθανώς ορίζοντας και κάποιο τίτλο (με χρήση του AS):

SELECT drinker,'likes Bud' AS whoLikesBud FROM Likes

WHERE beer = 'Budweiser';

Πιο Πολύπλοκες Συνθήκες στο WHERE Επιτρέπεται η χρήση των λογικών τελεστών AND, OR, NOT

Επιτρέπεται η χρήση τελεστών που παράγουν λογικό αποτέλεσμα

όπως π.χ. οι τελεστές σύγκρισης: =, <>, <, >, <=, >=

SELECT price FROM Sells WHERE bar = 'Gecko Grill' AND beer = 'Budweiser';

Page 9: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 9 - Βάσεις Δεδομένων Ι

Patterns στο WHERE (ισχύουν σε MySQL Server και σε MS SQL Server)

Τι είναι ένα pattern: αλφαριθμητικό που περιέχει τα σύμβολα % ή/και _

% (οποιοδήποτε αλφαριθμητικό – μηδέν ή περισσότεροι χαρακτήρες)

_ (οποιοσδήποτε (ένας) χαρακτήρας)

Σε μια συνθήκη (δήλωση WHERE) μπορούμε να συγκρίνουμε αλφαριθμητικά με

κάποιο pattern ως εξής: <γνώρισμα> LIKE <pattern>

<γνώρισμα> NOT LIKE <pattern>

Παράδειγμα: στις πλειάδες της σχέσης Drinkers(name, addr, phone)

θέλουμε να βρούμε πελάτες με 234 στον αριθμό τηλεφώνου.

Σημείωση: παράδειγμα τηλεφώνου στην database: 415-234-6789

SELECT name, phone FROM Drinkers WHERE phone LIKE '%234%';

Με δεδομένη τη δομή των αριθμών τηλεφώνων, η επόμενη έκφραση είναι ισοδύναμη (γιατι;):

SELECT name, phone FROM Drinkers WHERE phone LIKE '%234-_ _ _ _';

Page 10: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 10 - Βάσεις Δεδομένων Ι

Τιμές NULL σε Στήλες (1/2)

Το NULL ως τιμή σε μια στήλη προκύπτει όταν αυτή δεν έχει τιμή.

Προσοχή: άλλο το NULL και άλλο το '' (2 κολλητά μονά εισαγωγικά).

Το '' είναι το αλφαριθμητικό μηδενικού μήκους.

Η ερμηνεία του NULL εξαρτάται από εμάς και πρέπει να γίνεται με συνέπεια (όχι μια

"έτσι" και μια "αλλιώς"!). Συνήθεις περιπτώσεις:

ελλιπής τιμή (missing value)

Ξέρουμε ότι το bar Caravan (στην myBeersDB) έχει κάποια διεύθυνση αλλά δεν την γνωρίζουμε

μη εφαρμόσιμο (inapplicable)

πχ το γνώρισμα spouse (σύζυγος) δεν έχει νόημα για κάποιον(-α) που δεν είναι παντρεμένος(-η)

Στην SQL δεν μπορούμε να εμπλέξουμε το NULL σε ελέγχους και συνθήκες στο WHERE

τμήμα εκφράσεων, καθώς το αποτέλεσμα θα είναι πάντα UKNOWN.

Η λογική των WHERE συνθηκών στην SQL είναι τρί-τιμη: TRUE, FALSE, UNKNOWN

Μια πλειάδα είναι στα αποτελέσματα ερωτήματος μόνο αν δίνει TRUE για τις συνθήκες

του WHERE και όχι για FALSE ή UNKNOWN

Page 11: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 11 - Βάσεις Δεδομένων Ι

Τιμές NULL σε Στήλες (2/2)

Μπορούμε να ελέγξουμε για την τιμή NULL με τη βοήθεια

των εκφράσεων IS NULL και IS NOT NULL

Ποια bar στον πίνακα Bars δεν έχουν διεύθυνση; SELECT name, addr FROM Bars WHERE addr IS NULL;

Ποια bar στον πίνακα Bars δεν έχουν NULL για διεύθυνση;

SELECT name, addr FROM Bars WHERE addr IS ΝΟΤ NULL;

Προσέξτε τα αποτελέσματα δεξιά! Υπάρχουν bar (2η, 4η, κτλ

πλειάδες) που δεν έχουν διεύθυνση αλλά είναι στα

αποτελέσματα. Τι συμβαίνει;

NULL vs Zero Length String: έχει δοθεί ως τιμή το

αλφαριθμητικό μηδενικού μήκους (το οποίο ΔΕΝ είναι NULL)

IFNULL() και ISNULL() Πρόκειται για συνάρτηση της SQL (MySQL: ifnull(), MS SQL

Server: isnull()) μέσω της οποίας ελέγχουμε αν η τιμή μιας στήλης

είναι NULL και εφόσον είναι την αντικαθιστούμε με κάτι άλλο,

δίνοντας έτσι την ερμηνεία που θέλουμε στο NULL. SELECT name, ifnull(addr,'άγνωστη') AS address FROM Bars WHERE addr IS NULL;

Page 12: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 12 - Βάσεις Δεδομένων Ι

Ταξινόμηση Αποτελεσμάτων - ORDER BY Το ORDER BY χρησιμοποιείται στο τέλος μιας SELECT ερώτησης για να ταξινο-

μήσουμε τα αποτελέσματα με βάση τις τιμές μιας ή περισσότερων στηλών.

Η ταξινόμηση εξ ορισμού είναι αύξουσα (ASC – ascending=αύξουσα) αλλά

μπορούμε να την κάνουμε και φθίνουσα με το DESC (descending=φθίνουσα).

SELECT name FROM Bars ORDER BY name ASC;

Στην αύξουσα ταξινόμηση, τα NULL προηγούνται των

αλφαριθμητικών μηδενικού μήκους και αυτά των μη μηδενικών

αλφαριθμητικών (βλ. αποτελέσματα δεξιά). SELECT name, addr FROM Bars ORDER BY addr;

SELECT TOP (ή LIMIT) Μπορούμε να επιλέξουμε τις πρώτες Ν πλειάδες από

το σύνολο των αποτελεσμάτων, ως εξής:

MySQL: SELECT name FROM Bars LIMIT 4;

MS SQL Server: SELECT TOP 4 name FROM Bars;

με ποσοστό: SELECT TOP 50% name FROM Bars;

Oracle: SELECT name FROM Bars WHERE ROWNUM<=4;

Page 13: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 13 - Βάσεις Δεδομένων Ι

Επιλογή Υποσυνόλου Αποτελεσμάτων (Πλειάδων)

Σε MySQL, μπορούμε να επιλέξουμε πλειάδες με χρήση του τελεστή

LIMIT N,K ο οποίος από το αρχικό σύνολο αποτελεσμάτων επιστρέφει τις

πρώτες Κ εγγραφές, αρχίζοντας από την εγγραφή με δείκτη Ν. SELECT name FROM Bars LIMIT 0,4;

επιστρέφει τις εγγραφές 1η, 2η, 3η και 4η (δηλαδή 4 στο πλήθος),

αρχίζοντας από αυτή με δείκτη 0 (δηλ. την 1η) )

SELECT name FROM Bars LIMIT 19,10;

επιστρέφει 10 εγγραφές αρχίζοντας από την εγγραφή με δείκτη 19,

δηλαδή την 20η, 21η, ...., 29η

Τελεστής ΙΝ Επιτρέπει να ορίσουμε πολλαπλές τιμές στο WHERE.

SELECT name, city FROM Bars WHERE city IN ('Chicago', 'New York');

στα αποτελέσματα, το city θα είναι είτε Chicago ή New York

Τελεστής DISTINCT Αφαιρεί από τα αποτελέσματα τις πολλαπλές απαντήσεις!

χωρίς DISTINCT: SELECT city FROM Bars;

με DISTINCT: SELECT DISTINCT city FROM Bars;

Page 14: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 14 - Βάσεις Δεδομένων Ι

INSERT INTO (εισαγωγή πλειάδας) Το χρησιμοποιούμε για εισαγωγή πλειάδων. Έχει δύο τρόπους σύνταξης:

με απαρίθμηση πεδίων INSERT INTO beers (name, manf) VALUES ('Mythos', 'AZ AE');

Χρησιμοποιείται όταν δεν δίνουμε τιμές σε όλα τα πεδία της σχέσης, οπότε

πρέπει να πούμε για ποιες στήλες δίνουμε.

Υπενθυμίζεται ότι επιτρέπεται να μην δώσουμε τιμή αν κάποιο γνώρισμα, σε επίπεδο

σχεδίασης της σχέσης, έχει δηλωμένη default τιμή ή επιτρέπεται να πάρει τιμή NULL.

Μπορούμε να βάλουμε τα πεδία με όποια σειρά θέλουμε, αρκεί να την τηρήσουμε στο VALUES

χωρίς απαρίθμηση πεδίων INSERT INTO beers VALUES ('Mythos', 'Αθηναϊκή AE');

ο δεύτερος τρόπος είναι εφικτός μόνο εάν παρέχουμε τιμή σε όλες τις στήλες της πλειάδας

Σε κάθε περίπτωση, αν το επιθυμούμε, μπορούμε να δώσουμε και τιμή NULL ως εξής: INSERT INTO beers VALUES ('Amstel', 'Αθηναϊκή AE', NULL, NULL);

Αν κατά την εκτέλεση μιας εντολής INSERT προκύψει ότι η πλειάδα που πάει να

δημιουργηθεί έχει ίδιο πρωτεύων κλειδί με άλλη υπάρχουσα πλειάδα, η εντολή

αποτυγχάνει με σχετικό μήνυμα (primary key violation).

Επιτρέπεται να καταχωρήσουμε ταυτόχρονα πολλαπλές πλειάδες: INSERT INTO beers VALUES ('Amstel','xyzw'), ('Amstel Black','abcd');

Σε στήλες με ρύθμιση auto incremental δεν δίνουμε τιμή.

Page 15: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 15 - Βάσεις Δεδομένων Ι

DELETE FROM (διαγραφή πλειάδας)

Το χρησιμοποιούμε για διαγραφή πλειάδων. DELETE FROM Beers WHERE Name='Mythos'

ΠΡΟΣΟΧΗ: το WHERE τμήμα είναι βασικό καθώς προσδιορίζει (μέσω κάποιας

συνθήκης) ποια ή ποιες πλειάδες διαγράφουμε.

Δεν είναι όμως υποχρεωτικό – εξαρτάται τι θέλουμε να διαγράψουμε!

Μπορούμε να διαγράψουμε όλες τις εγγραφές ως εξής (ο πίνακας θα απομείνει άδειος):

DELETE FROM <όνομα πίνακα> ή DELETE * FROM <όνομα πίνακα>

UPDATE (ενημέρωση/μεταβολή πλειάδας)

Χρησιμοποιείται για να μεταβάλουμε την τιμή σε κάποιο ή κάποια πεδία

σε μία ή περισσότερες εγγραφές.

Οι εγγραφές προσδιορίζονται μέσω συνθήκης WHERE.

UPDATE bars SET city='Chicago', addr='106st Addison' WHERE name='The Blank Club';

ΠΡΟΣΟΧΗ: το WHERE τμήμα είναι βασικό καθώς προσδιορίζει (μέσω κάποιας συνθήκης)

ποια ή ποιες πλειάδες διαγράφουμε. Δεν είναι όμως υποχρεωτικό – εξαρτάται τι θέλουμε να

μεταβάλουμε!

Page 16: 03 - SQL (μέρος 1)

Φ. Κόκκορας / Τμ. Μηχανικών Πληροφορικής ΤΕ / ΤΕΙ Θεσσαλίας - 16 - Βάσεις Δεδομένων Ι

Γενική Παρατήρηση

Οι ενέργειες εισαγωγή/INSERT, ενημέρωση/UPDATE και διαγραφή/DELETE δεν

επιστρέφουν κάποιο αποτέλεσμα (όπως για παράδειγμα η επιλογή/SELECT) αλλά

τροποποιούν με κάποιο τρόπο τα δεδομένα της database.

Η επιτυχής εκτέλεση εντολών INSERT, DELETE και UPDATE

προϋποθέτει ότι δεν παραβιάζεται κάποιος άλλος περιορισμός

που τυχόν υπάρχει, όπως πχ περιορισμοί ξένου κλειδιού.

Στην πράξη, μετά την εκτέλεση τέτοιων εντολών, οφείλουμε να ελέγξουμε τυχόν

σφάλματα που καταγράφηκαν στον database server.

το MySQL Workbench ανακοινώνει εξ ορισμού τέτοια σφάλματα

αν η πρόσβαση στην database γίνεται προγραμματιστικά, οι γλώσσες προγραμματισμού

παρέχουν κατάλληλες δομές και εντολές για έλεγχο του τι συνέβη.

...