Μαθήματα › Αποφάσεις με βάση τα δεδομένα: Από την ερώτηση στην απάντηση
Το πρώτο σας πραγματικό ερώτημα στις παραγγελίες της Alpenkorb
Μάθημα 5 από 8 · 13 λ
Το σχήμα κάθε ερωτήματος
Έχετε εκτελέσει μικρά ερωτήματα στα πρώτα τέσσερα εργαστήρια. Αυτό το μάθημα βάζει τα κομμάτια σε σειρά, επειδή σχεδόν κάθε ερώτημα ανάλυσης έχει τον ίδιο σκελετό.
SELECT columns or calculations FROM table WHERE conditions on rows ORDER BY sort columns LIMIT number of rows;
Η SQL εκτελεί τις ρήτρες με διαφορετική σειρά από αυτή που τις γράφετε. Πρώτα το FROM επιλέγει τον πίνακα, μετά το WHERE αφαιρεί γραμμές, μετά το SELECT υπολογίζει τις στήλες, μετά το ORDER BY ταξινομεί και το LIMIT κόβει. Γι' αυτό το WHERE δεν μπορεί να φιλτράρει με βάση ένα όνομα που δημιουργείτε στο SELECT, ενώ το ORDER BY μπορεί να ταξινομήσει με βάση αυτό.
Φίλτρα που ταιριάζουν με την επιχείρηση
Η Lena θέλει να μάθει αν οι κωδικοί έκπτωσης οδηγούν σε μεγαλύτερα καλάθια. Στον πίνακα orders, το discount_code περιέχει κωδικούς όπως WELCOME10 για μια πρώτη παραγγελία ή AFFILIATE15 από συνεργαζόμενους ιστότοπους, και είναι κενό όταν δεν χρησιμοποιήθηκε κωδικός. Στην SQL μια κενή τιμή είναι NULL, που σημαίνει άγνωστη, και χρειάζεται τη δική της δοκιμή.
SELECT order_id, order_date, source, discount_code, net_amount FROM orders WHERE status = 'delivered' AND discount_code IS NOT NULL AND order_date >= '2026-01-01' ORDER BY net_amount DESC LIMIT 3;
Το discount_code = NULL δεν θα επέστρεφε καμία γραμμή. Η σύγκριση οτιδήποτε με το άγνωστο δίνει άγνωστο, και το WHERE κρατά μόνο τις γραμμές όπου η συνθήκη είναι true. Χρησιμοποιήστε αντ' αυτού IS NULL και IS NOT NULL.
- Το
ANDαπαιτεί κάθε συνθήκη, τοORτουλάχιστον μία. Όταν τα συνδυάζετε, προσθέστε παρενθέσεις:WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel'). - Το
INείναι μια σύντομη μορφή για πολλάOR:region IN ('Bern', 'Basel'). - Οι συγκρίσεις κειμένου χρειάζονται μονά εισαγωγικά και την ακριβή ορθογραφία. Οι περιφέρειες γράφονται
'Zurich','Geneva'και'St. Gallen'.
Τρία μικρά λάθη προκαλούν τα περισσότερα αποτυχημένα πρώτα ερωτήματα. Οι τιμές κειμένου χρησιμοποιούν μονά εισαγωγικά: στη DuckDB το "delivered" σε διπλά εισαγωγικά σημαίνει μια στήλη με όνομα delivered, και το ερώτημα αποτυγχάνει. Οι ημερομηνίες γράφονται ως κείμενο σε μορφή ISO, '2026-01-01', την οποία η DuckDB συγκρίνει σωστά με μια στήλη ημερομηνίας. Και ένα κόμμα που λείπει ή περισσεύει ανάμεσα σε στήλες παράγει ένα σφάλμα σύνταξης κοντά στην επόμενη λέξη.
Η παγίδα του status
Ο πίνακας orders περιέχει κάθε παραγγελία που έχει γίνει ποτέ, συμπεριλαμβανομένων 67 ακυρωμένων και 80 επιστραμμένων. Το net_amount τους παραμένει συμπληρωμένο, επειδή το ποσό ήταν γνωστό όταν έγινε η παραγγελία. Αν ξεχάσετε το status = 'delivered', τα έσοδα βγαίνουν πολύ υψηλά. Στο πρώτο τρίμηνο του 2026 αυτό το λάθος μετατρέπει τα CHF 37'107.20 σε CHF 38'787.67. Το σφάλμα δεν κατανέμεται ούτε ομοιόμορφα: οι ακυρώσεις και οι επιστροφές είναι πιο συχνές σε ορισμένες πηγές από άλλες.
Τι έδειξε η ερώτηση για τις εκπτώσεις; Στο πρώτο τρίμηνο του 2026, 90 από τις 648 παραδοθείσες παραγγελίες χρησιμοποίησαν κωδικό. Η μέση αξία τους ήταν CHF 57.16, έναντι CHF 57.28 για παραγγελίες χωρίς κωδικό. Με αυτά τα στοιχεία, οι κωδικοί δεν οδηγούν σε μεγαλύτερα καλάθια. Μπορεί ακόμη να κερδίζουν νέους πελάτες, κάτι που είναι διαφορετική ερώτηση και χρειάζεται διαφορετικό ερώτημα. Πριν εμπιστευτείτε οποιοδήποτε αποτέλεσμα, συγκρίνετε το πλήθος γραμμών του με έναν αριθμό που ήδη γνωρίζετε: το εργαστήριο στο μάθημα 2 επέστρεψε 648 παραδοθείσες παραγγελίες για αυτό το τρίμηνο, οπότε ένα φίλτρο στο ίδιο τρίμηνο δεν μπορεί ποτέ να επιστρέψει περισσότερες.
SELECT * FROM orders LIMIT 10, προσθέστε ένα φίλτρο, εκτελέστε το, ελέγξτε τον αριθμό γραμμών, μετά προσθέστε το επόμενο. Ένα μεγάλο ερώτημα γραμμένο μονομιάς και εκτελεσμένο μία φορά κρύβει τα λάθη του.WHERE discount_code = NULL δεν επιστρέφει καμία γραμμή;Συνδέσου για να απαντήσεις και να παρακολουθήσεις την πρόοδό σου.
Σύνδεση