Μαθήματα › Αποφάσεις με βάση τα δεδομένα: Από την ερώτηση στην απάντηση

Το πρώτο σας πραγματικό ερώτημα στις παραγγελίες της Alpenkorb

Μάθημα 5 από 8 · 13 λ

Το σχήμα κάθε ερωτήματος

Έχετε εκτελέσει μικρά ερωτήματα στα πρώτα τέσσερα εργαστήρια. Αυτό το μάθημα βάζει τα κομμάτια σε σειρά, επειδή σχεδόν κάθε ερώτημα ανάλυσης έχει τον ίδιο σκελετό.

Text
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, που σημαίνει άγνωστη, και χρειάζεται τη δική της δοκιμή.

SQL
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 δεν επιστρέφει καμία γραμμή;

Συνδέσου για να απαντήσεις και να παρακολουθήσεις την πρόοδό σου.

Σύνδεση
</>
Babala Software Netzwerk — Apps, Websites & KI-Lösungen aus Füllinsdorf BL
© 2026 Babala Özdemir · UID CHE-322.105.560 babala.ch info@babala.ch 076 792 63 50 Facebook Instagram