Στο σημερινό δωρεάν μάθημα SQL θα αναλύσουμε μερικούς ακόμα τρόπους που έχουμε διαθέσιμους για να φιλτράρουμε τα δεδομένα που προέρχονται από μια SELECT εντολή.
Όπως ήδη γνωρίζετε, οποιοδήποτε φιλτράρισμα θέλουμε να εφαρμόσουμε αυτό θα γίνει στο WHERE clause. Οι μέχρι τώρα τρόποι που έχουμε δει πρόσθεσαν έξτρα ικανότητες στο φιλτράρισμα των δεδομένων με την προϋπόθεση ότι ήταν γνωστές ολόκληρες οι λέξεις που ψάχναμε. Πως θα ψάξουμε όμως για εκείνες τις χώρες στις οποίες έχουμε πελάτες και τα ονόματα τους ξεκινάνε από Α? Με αυτά που γνωρίζουμε μέχρι τώρα θα ήταν κάπως δύσκολο να υλοποιήσουμε αυτό το query. Όμως εδώ έρχεται η SQL να μας βοηθήσει παρέχοντας μια ακόμα λέξη που είναι η LIKE. Με το LIKE μπορούμε να συγκρίνουμε είτε πολλαπλούς χαρακτήρες οποιασδήποτε μορφής χρησιμοποιώντας το σύμβολο ( % ) ή να συγκρίνουμε ένα χαρακτήρα χρησιμοποιώντας το σύμβολο ( _ ). Με άλλα λόγια ψάχνουμε να βρούμε εκείνα τα δεδομένα που ικανοποιούν κάποιο μοτίβο ή pattern όπως αλλιώς αναφέρεται. Η γενική δομή ενός τέτοιου query μπορεί να έχει την εξής μορφή:
Πριν όμως δούμε κάποια συγκεκριμένα παραδείγματα ας αναλύσουμε λίγο περισσότερο τι σημαίνουν τα σύμβολα % και _ πως χρησιμοποιούνται από το LIKE.
Όπως αναφέραμε ήδη, το % σημαίνει προσπαθούμε να βρούμε εκείνες τις λέξεις που περιέχουν κανένα, ένα ή περισσότερους χαρακτήρες από το μοτίβο που ψάχνουμε. Για παράδειγμα:
WHERE supplier_name LIKE ‘a%’ – ψάχνουμε όλους τους προμηθευτές που το όνομα τους ξεκινάει από a πεζό χωρίς να μας ενδιαφέρουν οι υπόλοιποι χαρακτήρες που ακολουθούν.
WHERE supplier_name LIKE ‘%e’ – Εδώ ψάχνουμε για εκείνους τους προμηθευτές που το τελευταίο γράμμα του ονόματός τους τελειώνει σε e πεζό.
WHERE supplier_name LIKE ‘%bob%’ – Εδώ ενδιαφερόμαστε για εκείνους τους προμηθευτές που το όνομα τους περιέχει τους χαρακτήρες bob.
WHERE supplier_name LIKE ‘A%i’ – Εδώ ψάχνουμε για εκείνους τους προμηθευτές όπου το όνομα τους ξεκινάει από Α κεφαλαίο, και το τελευταίο γράμμα είναι το i. Οι ενδιάμεσοι χαρακτήρες μπορεί να είναι οτιδήποτε.
Ας δούμε τώρα ένα πιο συγκεκριμένο παράδειγμα. Ας υποθέσουμε λοιπόν ότι θέλουμε να βρούμε όλους τους πελάτες μας που το πρώτο τους όνομα ξεκινάει από D.
Ας δούμε λίγο τώρα το άλλο σύμβολο που χρησιμοποιούμε σε συνδυασμό με το LIKE που είναι το underscore ( _ ). Το συγκεκριμένο σύμβολο αντιπροσωπεύει ένα μόνο χαρακτήρα. Κάποια γρήγορα παραδείγματα είναι τα εξής:
WHERE supplier_name LIKE ‘_a%’ – Εδώ ζητάμε ότι ο δεύτερο χαρακτήρας ζητάμε να είναι a. Πριν από το a θα υπάρχει μόνο ένας χαρακτήρας, ενώ μετά από το a μπορεί να υπάρχει οποιοσδήποτε αριθμός χαρακτήρων.
WHERE supplier_name LIKE ‘E_%_’ – Εδώ ψάχνουμε να βρούμε εκείνα τα δεδομένα όπου ο πρώτος χαρακτήρας είναι Ε ενώ μετά από το E υπάρχουν τουλάχιστον δύο ακόμα χαρακτήρες.
Τώρα που εξοικειωθήκαμε με το underscore ( _ ) ας δούμε ένα πιο συγκεκριμένο παράδειγμα. Θέλουμε λοιπόν να βρούμε ποια ονόματα εταιρειών από τους προμηθευτές περιέχουν τα γράμματα ‘or’ σαν δεύτερο και τρίτο χαρακτήρα αντίστοιχα.
Τα ονόματα των στηλών που εμφανίζονται στο αποτέλεσμα προέρχονται από τα ονόματα των στηλών του πίνακα από τα οποία προέρχονται. Πολλές φορές όμως θα θέλαμε να δώσουμε λίγο πιο επεξηγηματικά ονόματα στα ονόματα των στηλών όπως εμφανίζονται στο αποτέλεσμα. Αυτή η διαδικασία φυσικά δεν επηρεάζει ή αλλάζει τίποτα στις στήλες όπως είναι δηλωμένες στην βάση. Είναι αποκλειστικά και μόνο για λόγους reporting και κατανόησης από τον τελικό χρήστη.
Πως όμως δηλώνουμε ποιο θα είναι το καινούργιο όνομα της στήλης που θα εμφανιστεί σαν αποτέλεσμα στο SELECT query? Βάζοντας την λέξη ‘AS’ αμέσως μετά από την στήλη και δηλώνοντας το καινούργιο όνομα.
Αν νομίζετε ότι το να δώσουμε ένα ψευδώνυμο σε μια στήλη δεν είναι χρήσιμο, ας δούμε ένα συγκεκριμένο παράδειγμα που θα σας κάνει να αλλάξετε γνώμη. Θέλουμε λοιπόν να βρούμε πόσα χρήματα έχει κερδίσει η εταιρεία ανά παραγγελία αν είναι γνωστή η τιμή του προϊόντος όπως και η ποσότητα. Το πρόβλημα είναι πολύ απλό – πολλαπλασιάζουμε το untiprice με το quantity ανά παραγγελία.
Το αποτέλεσμα είναι σωστό αλλά το όνομα που έχει δώσει στη στήλη το γραφικό περιβάλλον της PostgreSQL δεν είναι και τόσο κατατοπιστικό. Με άλλα λόγια, κοιτάζοντας την στήλη με τους αριθμούς δεν θα γνωρίζουμε τι ακριβώς αντιπροσωπεύουν. Εδώ είναι λοιπόν που χρειάζεται να δώσουμε ένα ψευδώνυμο στην στήλη.
Τώρα αν θέλουμε να εμφανιστεί το όνομα της στήλης ακριβώς όπως το γράφουμε τότε δεν έχετε παρά να το βάλετε μέσα σε διπλά quotes ( “ ”).
Με τα alias που δίνουμε στις στήλες πρέπει να προσέξουμε γιατί δεν μπορούμε να χρησιμοποιήσουμε αυτά τα ονόματα μέσα στο SELECT όπου θέλουμε. Το ψευδώνυμο που δίνουμε στη στήλη μπορούμε να το χρησιμοποιήσουμε στο ORDER BY αλλά δεν μπορούμε να το χρησιμοποιήσουμε στο FROM, στο WHERE ή στο HAVING (ακόμα δεν το έχουμε μάθει).
Ας δούμε πρώτα ένα query που δεν θα δουλέψει:
Τώρα ας δούμε ένα query που δουλεύει:
Μέχρι τώρα, ζητούσαμε να δούμε όλα τα δεδομένα από έναν πίνακα. Ακόμα και όταν χρησιμοποιούμε κάποιο φίλτρο αυτό θα εφαρμοστεί σε όλα τα δεδομένα. Υπάρχουν κάποιες φορές που δεν ενδιαφερόμαστε να δούμε όλα τα δεδομένα του πίνακα, αλλά ένα μέρος των δεδομένων. Για παράδειγμα, σε μια βάση που περιέχει καταχωρήσεις χιλιάδων πελατών ενδιαφερόμαστε να δούμε μόνο τους 10 πρώτους ίσως γιατί θέλουμε να πάρουμε μια ιδέα από ένα δείγμα δεδομένων πριν εφαρμόσουμε την λογική μας σε ολόκληρο τον πίνακα. Για να περιορίσουμε το σύνολο των δεδομένων που εμφανίζονται στο τελικό αποτέλεσμα χρησιμοποιούμε την εντολή LIMIT. Η γενική δομή της εντολής είναι η εξής:
Ένα ποιο ρεαλιστικό σενάριο ίσως είναι να ζητήσουμε να βρούμε τις τρεις ποιο ακριβές παραγγελίες που έχουν υλοποιηθεί.
Ένα τελευταίο θέμα που θέλω να καλύψουμε σε αυτό το δωρεάν σεμινάριο SQL είναι το NULL. Η βάση αναγνωρίζει το null σαν κάτι άγνωστο. Δεν είναι το μηδέν, ούτε και το spacebar γιατί αυτά έχουν κάποιο αριθμό ASCII που περιγράφονται. Κατά την εισαγωγή δεδομένων εάν δεν ξέρουμε κάποια τιμή και απλά δεν την καταχωρήσουμε, η βάση θα βάλει null για το συγκεκριμένο πεδίο στον πίνακα. Τα null κατά την εισαγωγή δεδομένων θα μας απασχολήσουνε αργότερα. Για τώρα θα πρέπει να γνωρίζουμε αν ένας πίνακας περιέχει null τιμές ή όχι. Αυτός είναι ένας έλεγχος που κάνουμε συχνά πριν τρέξουμε κάποια πολύπλοκά queries στην βάση.
Για να αξιολογήσουμε σωστά εάν ένα πεδίο έχει null τιμή ή όχι μπορούμε να χρησιμοποιήσουμε την λογική IS NULL ή IS NOT NULL.
ή
Και πως συνδυάζουμε το null με την λογική ενός query? Σκεφτείτε λοιπόν ότι θέλετε να βρείτε για πόσους πελάτες δεν έχουμε καταχωρήσει την περιοχή. Με άλλα λόγια για πόσους πελάτες η τιμή της περιοχής είναι Null.