4.2.4

4.2.4 Βασικές Ερωτήσεις Ανάκτησης
**Στόχοι / Προσδοκώμενα Αποτελέσματα** Ο μαθητής/τρια πρέπει να είναι ικανός/ή:
 * να χρησιμοποιεί την εντολή SELECT ώστε να αναζητά συγκεκριμένες πληροφορίες σε πίνακα
 * να χρησιμοποιεί ψευδώνυμα στηλών στην παρουσίαση των αποτελεσμάτων της αναζήτησης
 * να δημιουργεί συσχετισμένες στήλες
 * να χρησιμοποιεί τη φράση DISTINCT για την απαλοιφή πολλαπλών εμφανίσεων
 * να καθορίζει συνθήκες επιλογής εγγραφών στη φράση WHERE
 * να χρησιμοποιεί τη φράση FROM στην εντολή SELECT ώστε να αναζητά πληροφορίες από περισσότερους πίνακες
 * να χρησιμοποιεί την εντολή SELECT ώστε να αναζητά συγκεκριμένες πληροφορίες σε διαθέσιμες βάσεις δεδομένων για την επίλυση προβλημάτων

Η γλώσσα ερωτήσεων της SQL βασίζεται σε πράξεις συνόλου και σχέσεων. Η εντολή Select, χρησιμοποιείται για την εμφάνιση (ανάκληση) δεδομένων από τη βάση δεδομένων. Μια χαρακτηριστική ερώτηση σε SQL για την αναζήτηση δεδομένων έχει την εξής μορφή/ σύνταξη:
 * Η Εντολή Select**

code format="sql" Select Πεδίο_1, Πεδίο_2, … Πεδίο_n From Πίνακας_1, Πίνακας_2, …, Πίνακας_m Where συνθήκη; code

Η φράση **Select** ακολουθείται από μια λίστα πεδίων, τα οποία θα εμφανίζονται στο αποτέλεσμα. Tα πεδία (στήλες) χωρίζονται μεταξύ τους με κόμματα. Η φράση **From** δηλώνει τις σχέσεις (πίνακες) στους οποίους θα γίνει η αναζήτηση, ορίζονται δηλαδή ο/οι πίνακα/ες της ΒΔ από όπου θα ανακτηθούν οι πληροφορίες. Η φράση **Where** (δεν είναι υποχρεωτική) καθορίζει τη συνθήκη/ ες επιλογής κάποιων εγγραφών.

**Select**, αντιστοιχεί στην πράξη της προβολής της σχεσιακής άλγεβρας
 * from**, αντιστοιχεί στην πράξη του καρτεσιανού γινομένου της σχεσιακής άλγεβρας
 * where**, αντιστοιχεί στη συνθήκη της πράξης της επιλογής στη σχεσιακή άλγεβρα

Θα εξετάσουμε μέσα από παραδείγματα διάφορες μορφές τις εντολής Select

//**Απλή μορφή**// Επιλογή και παρουσίαση πληροφοριών από συγκεκριμένα πεδία πίνακα code format="sql" Select Επώνυμο, Όνομα From Μαθητής code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής

Επιλογή και παρουσίαση πληροφοριών όλων των πεδίων του πίνακα code format="sql" Select * From Μαθητής code Δηλαδή επέλεξε ΟΛΑ τα πεδία και εμφάνισε όλες τις πληροφορίες από τον πίνακα Μαθητής

Με τη φράση Select μπορούμε να συνδυάσουμε ένα σύνολο από χαρακτηριστικά, ώστε να έχουμε επιλογές στην εμφάνιση των αποτελεσμάτων, όπως: Συνδυασμός μιας ή και περισσοτέρων πράξεων ( +, - , * , / ), ακολουθώντας την προτεραιότητά τους. Τα πεδία που συμμετέχουν στις αριθμητικές παραστάσεις θα πρέπει να είναι και αυτά αριθμητικά. code format="sql" Select Όνομα, Ώρες*3 From Μάθημα code
 * Α**. //**Αριθμητικές εκφράσεις**//

Δηλαδή επέλεξε τα πεδία Όνομα και τις αντίστοιχες Ώρες πολλαπλασιασμένες με το 3 (που εκφράζει τον αριθμό των τμημάτων), από τον πίνακα Μάθημα

Επιλέγει και παρουσιάζει μια στήλη (πεδίο) με εναλλακτική επικεφαλίδα στην έξοδο. Καθορίζουμε το ψευδώνυμο μετά την στήλη, χρησιμοποιώντας το χαρακτήρα κενό. Παρατήρηση: Ψευδώνυμα βάζουμε μόνο στην φράση SELECT. code format="sql" Select Όνομα, Ώρες*3 Συνολικές_Ώρες From Μάθημα code
 * Β**. //**Ψευδώνυμα Στηλών**//

Δηλαδή επέλεξε τα πεδία Όνομα και τις αντίστοιχες Ώρες πολλαπλασιασμένες με το 3 (που εκφράζει τον αριθμό των τμημάτων), από τον πίνακα Μάθημα με όνομα της δεύτερης στήλης το Συνολικές_Ώρες
 * [[Image:MySQL SELECT Ώρες.png width="500"]] || [[Image:MySQL SELECT Συνολοικές_Ώρες.png width="500"]] ||
 * Εικόνα 4.2.4.1 Αριθμητική πράξη: πεδίου με αριθμό (Ώρες*3) || Εικόνα 4.2.4.2 Χρησιμοποίηση του Ψευδώνυμου ώστε να χαρακτηρίσουμε την πληροφορία (Συνολικές_Ώρες) ||

Η πράξη συσχέτισης (concat) επιτρέπει μια στήλη να συνδεθεί με μια άλλη είτε αριθμητική είτε χαρακτήρων. Έτσι φτιάχνεται μία μόνο στήλη. code format="sql" Select concat(Επώνυμο, Όνομα) Ονοματεπώνυμο From Μαθητής code
 * Γ**. //**Συσχετισμένες στήλες**//

Δηλαδή επέλεξε και εμφάνισε τα δεδομένα στα πεδία Επώνυμο και Όνομα με όνομα στήλης το Ονοματεπώνυμο (ψευδώνυμο), από τον πίνακα Μαθητής. Τα δεδομένα εμφανίζονται χωρίς κενό μεταξύ τους

Είναι κάθε χαρακτήρας, έκφραση, αριθμός που μπαίνει στην φράση SELECT και η οποία δεν είναι όνομα στήλης ούτε ψευδώνυμο. Οι εκφράσεις πρέπει να είναι μέσα σε μονά ‘  ‘, ενώ για τους αριθμούς δεν χρειάζονται. code format="sql" Select concat (Επώνυμο,‘ ‘,Όνομα) Ονοματεπώνυμο From Μαθητής code
 * Δ**. //**Εκφράσεις**//

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


 * [[Image:MySQL SELECT Επώνυμο Όνομα.png width="500"]] || [[Image:MySQL SELECT Ονοματεπώνυμο.png width="500"]] ||
 * Εικόνα 4.2.4.3 Εμφάνιση των περιεχομένων των στηλών Επώνυμο & Όνομα || Εικόνα 4.2.4.4 Συσχέτιση των στηλών Επώνυμο & Όνομα, χρησιμοποίηση της έκφρασης 'κενό', ώστε να διαχωρίζονται και το Ψευδώνυμο (Ονοματεπώνυμο) για να χαρακτηρίσουμε την πληροφορία ||

Για να πραγματοποιηθεί η διαγραφή των διπλοτύπων, εισάγεται τη λέξη κλειδί distinct μετά τη select Το ερώτημα code format="sql" Select ΑΜ From ΕγγραφήΜαθητή code
 * Ε**. //**Απαλοιφή πολλαπλών εμφανίσεων –distinct**//

Δηλαδή θα μας εμφανίζει όλους τους Αριθμούς Μητρώων (ΑΜ) των μαθητών μετά από την εγγραφή τους στα διαφορετικά σχολικά έτη, από τον πίνακα ΕγγραφήΜαθητή Για να απαλείψουμε τις πολλαπλές εμφανίσεις των ΑΜ των μαθητών χρησιμοποιούμε τη λέξη κλειδί distinct code format="sql" Select distinct ΑΜ From ΕγγραφήΜαθητή code

Δηλαδή επέλεξε και εμφάνισε μόνο τα διαφορετικά ΑΜ, από τον πίνακα ΕγγραφήΜαθητή code format="sql" Select distinct ΑΜ, Τάξη From ΕγγραφήΜαθητή code

Δηλαδή επέλεξε και εμφάνισε μόνο τους διαφορετικούς συνδυασμούς ΑΜ και Τάξη από τον πίνακα ΕγγραφήΜαθητή


 * Η φράση WHERE**

Με τη φράση Where καθορίζουμε συνθήκες επιλογής κάποιων εγγραφών του πίνακα με βάση τιμές των πεδίων. Οι συνθήκες καθορίζονται από τη σύγκριση τιμών πεδίων του πίνακα και μπορεί να είναι, τιμές αριθμητικές, αλφαβητικές, αριθμητικές εκφράσεις και συναρτήσεις.

Μια συνθήκη προσδιορίζεται από: το **Όνομα πεδίου**, τον **Τελεστής σύγκρισης** και το **Όνομα πεδίου** ή τη **σταθερή τιμή** ή τη **λίστα τιμών**

Οι τελεστές καθορίζουν την σχέση μεταξύ των τιμών που συγκρίνονται και είναι: Στις ακολουθίες χαρακτήρων μπορεί να γίνεται χρήση ειδικών χαρακτήρων που παίρνουν τη θέση οποιονδήποτε άλλων. Για τον τελεστή LIKE, αυτοί είναι: Μπορούμε να χρησιμοποιήσουμε περισσότερες από μια συνθήκες με τη χρήση των λογικών τελεστών **AND**, **OR** και **NOT**. Στις δημιουργημένες συνθήκες η προτεραιότητα ακολουθεί τη σειρά: NOT, AND, OR
 * ~ ΤΕΛΕΣΤΗΣ ||~ ΛΕΙΤΟΥΡΓΙΑ ||
 * = || ίσο με ||
 * <> || διάφορο του ||
 * > || μεγαλύτερο από ||
 * < || μικρότερο από ||
 * >= || μεγαλύτερο ή ίσο από  ||
 * <= || μικρότερο ή ίσο από ||
 * BETWEEN…AND… || μεταξύ δύο τιμών ||
 * IN (LIST) || μια από τις τιμές της λίστας ||
 * LIKE || σύγκριση με ακολουθία χαρακτήρων ||
 * IS NULL || κενό πεδίο (ανύπαρκτη τιμή) ||
 * ||~ ΤΕΛΕΣΤΗΣ LIKE ||
 * % (ποσοστό) || οποιοιδήποτε χαρακτήρες (0, 1, ή πολλοί) ||
 * - (κάτω παύλα) || οποιοσδήποτε ένας χαρακτήρας ||
 * Λογικοί τελεστές**

Στις συγκρίσεις γίνεται διάκριση ανάμεσα σε κεφαλαία και πεζά.


 * ΠΑΡΑΔΕΙΓΜΑΤΑ**:

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Όνομα='Γιώργος' code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν το όνομα του μαθητή είναι ‘Γιώργος’

code format="sql" Select Όνομα, Ώρες From Μάθημα Where Ώρες >=4 code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες Όνομα και Ώρες από τον πίνακα Μάθημα, όταν οι ώρες του μαθήματος είναι μεγαλύτερες ή ίσες με 4

code format="sql" Select Όνομα, Ώρες From Μάθημα Where Ώρες <>4 code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες Όνομα και Ώρες από τον πίνακα Μάθημα, όταν οι ώρες του μαθήματος είναι διαφορετικές από 4

code format="sql" Select Όνομα, Ώρες From Μάθημα Where Ώρες between 4 and 5 code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες Όνομα και Ώρες από τον πίνακα Μάθημα, όταν οι ώρες του μαθήματος είναι μεταξύ 4 και 5 ωρών, δηλαδή μεγαλύτερες ή ίσες με 4 και μικρότερες ή ίσες με 5

code format="sql" Select Όνομα, Ώρες From Μάθημα Where Ώρες in (4, 5) code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες Όνομα και Ώρες από τον πίνακα Μάθημα, όταν οι ώρες του μαθήματος είναι 4 ή 5, δηλαδή ικανοποιούν τις τιμές που περιλαμβάνονται στην παρένθεση

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Όνομα like "Μ%" code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν το όνομα του μαθητή αρχίζει από “M”

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Όνομα like "Μ____" code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν το όνομα του μαθητή αρχίζει από “M” και περιλαμβάνει 5 χαρακτήρες

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Ημερομηνία_Γέννησης is Null code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν η Ημερομηνία_Γέννησης δεν είναι συμπληρωμένη

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Όνομα not like "Μ%" code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν το όνομα του μαθητή δεν αρχίζει από “M”

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Ημερομηνία_Γέννησης is not Null code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν η Ημερομηνία_Γέννησης είναι συμπληρωμένη

Σημείωση: Ποτέ δεν γίνετε σύγκριση με Null. Πάντα χρησιμοποιούμε τις φράσεις is Null ή is not Null. code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Όνομα like "Μ%" and Πόλη='Χανιά' code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν το όνομα του μαθητή αρχίζει από “M” και είναι από τα Χανιά

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Όνομα like "Μ%" and Πόλη='Χανιά' or Πόλη='Ρέθυμνο' code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν το όνομα του μαθητή αρχίζει από “M” και είναι από τα Χανιά ή το Ρέθυμνο ανεξαρτήτως Ονόματος μαθητή

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Όνομα like "Μ%" and (Πόλη='Χανιά' or Πόλη='Ρέθυμνο') code

ή

code format="sql" Select Επώνυμο, Όνομα From Μαθητής Where Όνομα like "Μ%" or Πόλη='Χανιά' and Πόλη='Ρέθυμνο' code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα από τον πίνακα Μαθητής, όταν το όνομα του μαθητή αρχίζει από “M” και είναι από τα Χανιά ή το Ρέθυμνο Σημείωση: Ισχύει και στις λογικές πράξεις η προτεραιότητα των πράξεων (Not, And, Or)


 * [[Image:MySQL SELECT Μαθητής WHERE NOT NULL.png width="500"]] || [[Image:MySQL SELECT Μάθημα WHERE LIKE OR.png width="500"]] ||
 * Εικόνα 4.2.4.5 Εμφάνιση των μαθητών που έχει συμπληρωθεί η Ημερομηνία γέννησης || Εικόνα 4.2.4.6 Εμφάνιση των μαθητών που είτε είναι από τα Χανιά και το όνομά τους αρχίζει από Μ, είτε είναι από το Ρέθυμνο (ο Μαθητής είναι από το Ρέθυμνο) ||


 * Δεδομένα από περισσότερους από ένα πίνακα**


 * Η φράση FROM**

Οι εγγραφές ενός πίνακα μπορούν να συνδυαστούν με τις εγγραφές ενός άλλου πίνακα, εφόσον υπάρχουν κοινά πεδία στους δύο πίνακες. Ο συνδυασμός γίνεται βάσει των τιμών του κοινού πεδίου. Στη φράση from ορίζονται οι πίνακες. Για να μπορέσουμε να εμφανίζουμε τις πληροφορίες των πινάκων, στη φράση where θα πρέπει να συνδέσουμε τα κοινά πεδία. Η αναφορά μας σε ένα πεδίο ενός πίνακα γίνεται με το συμβολισμό: <όνομα-πίνακα>.<όνομα-πεδίου>

Η πρόταση from αντιστοιχεί στην πράξη του καρτεσιανού γινομένου της σχεσιακής άλγεβρας. Δίνει τη λίστα των σχέσεων που πρέπει να σαρωθούν κατά την αξιολόγηση της έκφρασης. Όταν το ίδιο γνώρισμα εμφανίζεται στο σχήμα περισσότερων από μια σχέσεων, τότε γίνεται διάκριση βάση του συμβολισμού: <όνομα-σχέσης>**.**<όνομα-γνωρίσματος>

code format="sql" Select Επώνυμο, Όνομα, Τάξη From Μαθητής, ΕγγραφήΜαθητή Where Μαθητής.ΑΜ= ΕγγραφήΜαθητή.ΑΜ_Μαθητή code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα και την Τάξη από τους πίνακες Μαθητής και ΕγγραφήΜαθητή, για όλους τους μαθητές. Στο αποτέλεσμα, εμφανίζονται όλοι οι δυνατοί συνδυασμοί των δύο πινάκων που έχουν κοινό πεδίο τον ΑΜ
 * ΠΑΡΑΔΕΙΓΜΑΤΑ**

code format="sql" Select Επώνυμο, Όνομα, Τάξη From Μαθητής, ΕγγραφήΜαθητή Where Μαθητής.ΑΜ= ΕγγραφήΜαθητή.ΑΜ_Μαθητή and Σχολ_έτος='2013-2014' code Δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα και την Τάξη από τους πίνακες Μαθητής και ΕγγραφήΜαθητή, για τους μαθητές στο σχολικό έτος 2013-2014. Στο αποτέλεσμα, περιορίζονται οι συνδυασμοί των δύο πινάκων στο σχολικό έτος 2013-2014

Εικόνα 4.2.4.7 Γίνεται αρχικά το join condition (Μαθητής.ΑΜ= ΕγγραφήΜαθητή.ΑΜ_Μαθητή) και στη συνέχεια η εμφάνιση των μαθητών το σχολικό έτος 2013-2014


 * Υποερωτήματα**

Τα υποερωτήματα είναι ερωτήματα που περιέχονται στη φράση WHERE άλλων ερωτημάτων. Τα αποτελέσματα των υποερωτημάτων δεν εμφανίζονται αλλά απλά δρουν βοηθητικά, ώστε να συνδεθούν τα στοιχεία των πινάκων. code format="sql" Select Επώνυμο, Όνομα From Μαθητής, ΕγγραφήΜαθητή Where Μαθητής.ΑΜ= ΕγγραφήΜαθητή.ΑΜ_Μαθητή and ΑΜ in (Select ΑΜ From ΕγγραφήΜαθητή 		Where Σχολ_έτος='2013-2014') code Παρατηρούμε ότι έχουμε το ίδιο αποτέλεσμα με το προηγούμενο ερώτημα, δηλαδή επέλεξε και εμφάνισε τις πληροφορίες για το Επώνυμο, Όνομα και την Τάξη από τους πίνακες Μαθητής και ΕγγραφήΜαθητή, για τους μαθητές στο σχολικό έτος 2013-2014. Στο αποτέλεσμα, περιορίζονται οι συνδυασμοί των δύο πινάκων στο σχολικό έτος 2013-2014)

**Ερωτήσεις/ Δραστηριότητες** 1. Προσδιορίστε και αναπτύξτε τις αντίστοιχες εντολές select, ώστε να απαντηθούν τα ερωτήματα:
 * Εμφανίστε για όλους τους μαθητές τις πληροφορίες Επώνυμο, Όνομα, Πατρώνυμο, Ημερομηνία_Γέννησης
 * Εμφανίστε για τα αγόρια μαθητές τις πληροφορίες Επώνυμο, Όνομα, Πατρώνυμο, Ημερομηνία_Γέννησης
 * Εμφάνισε τους διαφορετικούς μαθητές της Β τάξης
 * Ποια είναι τα μαθήματα της Α τάξης;
 * Ποιος ο γραπτός βαθμός του μαθητή Μαρινάκη στο μάθημα Συστήματα Διαχείρισης Βάσεων Δεδομένων και Εφαρμογές στο Διαδίκτυο το σχολικό έτος 2014-2015;
 * Ποιοι μαθητές δεν έχουν βαθμό στο μάθημα Συστήματα Διαχείρισης Βάσεων Δεδομένων και Εφαρμογές στο Διαδίκτυο το σχολικό έτος 2014-2015;