Βάσεις δεδομένων, χωρίς μυστήριο

Το πρώτο σου χρήσιμο ερώτημα

21 min
What you'll learn
  • να γράφεις ερωτήματα με ρητή λίστα στηλών μετά το SELECT και φίλτρο γραμμών μέσω του WHERE
  • να μεταφράζεις μια επιχειρηματική ερώτηση σε SQL ακολουθώντας τη διαδρομή: οντότητα → FROM, περιορισμοί → WHERE (με AND), έξοδος → SELECT, σειρά → ORDER BY
  • να εξηγείς γιατί το SELECT * είναι κακή πρακτική στα επιχειρησιακά ερωτήματα
  • να ελέγχεις ένα ερώτημα λέγοντάς το φωναχτά: αν η αφήγηση ταιριάζει με την αρχική ερώτηση, το ερώτημα είναι σωστό ως προς το νόημα

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

Διαλέγουμε τις στήλες και τις γραμμές που χρειαζόμαστε

Το να παίρνεις τα πάντα με το * είναι βολικό στην πρώτη γνωριμία, αλλά στην πραγματική δουλειά μοιάζει με το να κουβαλάς ολόκληρη την αποθήκη στο ταμείο. Συνήθως χρειάζεσαι συγκεκριμένα πεδία: γράψε τα ένα-ένα, χωρισμένα με κόμμα, μετά το SELECT.

Με τις γραμμές ισχύει το ίδιο: αντί για ολόκληρη τη βιτρίνα, διάλεξε μόνο το τμήμα που χρειάζεσαι μέσω του WHERE. Για παράδειγμα, ας ζητήσουμε από το «Kotomarket» μόνο τα προϊόντα της κατηγορίας Βιβλία:

Ένας δόκιμος στενεύει με κεχριμπαρένια ακτίνα-φίλτρο μια ολογραφική βιτρίνα: μέσα από την ακτίνα περνούν μόνο λίγες γραμμές-κάψουλες με βιβλία
Μια ακριβής ερώτηση στο αρχείο: το SELECT ονομάζει τις στήλες που χρειάζεσαι, το WHERE αφήνει να περάσουν μόνο οι γραμμές που χρειάζεσαι.

Choosing the columns and rows you need

Grabbing everything with * is convenient for a first look, but in real work it’s like hauling the entire warehouse up to the checkout. Usually you need specific fields: list them, comma-separated, after SELECT.

It’s the same with rows: instead of the whole storefront, pick only the segment you need via WHERE. For example, let’s ask Kotomarket for only the products in the Books category:

Ποια βιβλία υπάρχουν στη βιτρίνα και πόσο κοστίζουν:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Από την επιχειρηματική ερώτηση στο ερώτημα

Οι πραγματικές ερωτήσεις δεν φτάνουν στον αρχειοθέτη σε SQL: «ποια βιβλία είναι φθηνότερα από χίλια πεντακόσια;», «ποια ηλεκτρονικά είναι ακριβότερα από 5000;». Η μετάφραση ακολουθεί πάντα την ίδια διαδρομή:

  1. Οντότητα → πίνακας. Για τι ρωτάμε: για προϊόντα, αγοραστές, παραγγελίες; Τα «Βιβλία φθηνότερα από 1500» αφορούν προϊόντα, άρα FROM products.
  2. Περιορισμοί → WHERE. Κάθε συνθήκη της ερώτησης γίνεται ξεχωριστή συνθήκη στο φίλτρο: κατηγορία «Βιβλία», τιμή κάτω από 1500.
  3. Τι να δείξουμε → SELECT. Τι θέλει να δει ο άνθρωπος στην απάντηση; Την ονομασία και την τιμή. Αυτές απαριθμούμε, τα υπόλοιπα είναι θόρυβος.
  4. Μορφή της απάντησης → ORDER BY. Το «από τα φθηνά προς τα ακριβά» είναι ταξινόμηση κατά τιμή.
-- «Ποια βιβλία είναι φθηνότερα από 1500 και πόσο κοστίζουν, από τα φθηνά προς τα ακριβά;»
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Πολλές συνθήκες ενώνονται με τη λέξη AND — τους τελεστές του φίλτρου θα τους δούμε λεπτομερώς στο επόμενο κεφάλαιο.

Κράτα και την αντίστροφη συνήθεια ενός καλού αρχειοθέτη: διάβασε το έτοιμο ερώτημα φωναχτά σαν φράση. «Από τα προϊόντα πάρε τα βιβλία φθηνότερα από 1500, δείξε ονομασία και τιμή, ταξινόμησε κατά τιμή» — αν η αφήγηση ταιριάζει με την αρχική ερώτηση, το ερώτημα είναι σωστό ως προς το νόημα. Αν στην αφήγηση ξεπρόβαλαν «όλες οι στήλες» ή «όλη η βιτρίνα», γύρνα πίσω και στένεψέ το.

Interview question

Ερώτηση συνέντευξης: γιατί το SELECT * θεωρείται κακή πρακτική στα επιχειρησιακά ερωτήματα;

Δυνατή απάντηση: πρώτον, φέρνει περιττά δεδομένα: το δίκτυο και η μνήμη ξοδεύονται σε στήλες που δεν χρειάζονται, και η βάση χάνει τη δυνατότητα να απαντήσει μόνο από το ευρετήριο (index-only scan· τα ευρετήρια — Κεφάλαιο 10). Δεύτερον, κάνει το ερώτημα εύθραυστο: όταν προστίθενται ή μετονομάζονται στήλες, σπάνε οι αναφορές και ο κώδικας που βασίζεται στη σύνθεση και τη σειρά των στηλών. Η ρητή λίστα στηλών είναι το συμβόλαιο του ερωτήματος· το SELECT * ταιριάζει το πολύ στη διαδραστική εξερεύνηση δεδομένων.

Check yourself
Τι θα επιστρέψει το ερώτημα SELECT name FROM products WHERE category = 'Книги';

The index has been read: you know what’s in the five tables and which threads stitch them together. QUERY dims the map, and the next clearance level lights up on the holopanel — the reading terminal.

QUERY: Remember the cardinal property of this place: the archive answers only well-formed questions. From the next clearance on, we learn to ask precisely.