SQL από το Μηδέν: SELECT, JOIN & WHERE
Τρέξτε τις πρώτες σας SELECT με φίλτρα και JOINs πάνω στο μοντέλο μαθημάτων-ενοτήτων.
Χωρίς πρόσφατο έλεγχο περιεχομένου. Οι εντολές και τα παραδείγματα ενδέχεται να έχουν αλλάξει από τη δημοσίευση.
Τρέξτε τις πρώτες σας SELECT με φίλτρα και JOINs πάνω στο μοντέλο μαθημάτων-ενοτήτων.
SQL από το Μηδέν: SELECT, JOIN & WHERE
Η SQL (Structured Query Language) αποτελεί τη θεμελιώδη γλώσσα διαχείρισης σχεσιακών βάσεων δεδομένων όπως η PostgreSQL. Ακόμα κι αν χρησιμοποιείτε ORMs όπως το Prisma ή το Drizzle, η κατανόηση της καθαρής SQL είναι απαραίτητη για τη διάγνωση προβλημάτων απόδοσης και τη συγγραφή αποδοτικών queries.
1. Το Νοητικό Μοντέλο: Πίνακες & Συσχετίσεις
Σε μια σχεσιακή βάση, τα δεδομένα οργανώνονται σε πίνακες (tables) με γραμμές (records) και στήλες (columns). Οι πίνακες συνδέονται μεταξύ τους μέσω Primary Keys (PK) και Foreign Keys (FK):
- Ένα μάθημα (
courses) έχει πολλές ενότητες (modules). - Μια ενότητα έχει πολλά μαθήματα (
lessons).
2. Βασική Ανάκτηση & Φιλτράρισμα: SELECT & WHERE
sql-- Επιλογή συγκεκριμένων στηλών με φιλτράρισμα και ταξινόμηση SELECT id, title, duration_minutes, is_free FROM public.lessons WHERE is_free = true AND duration_minutes <= 15 ORDER BY duration_minutes ASC LIMIT 10;
Χρήσιμοι Τελεστές στο WHERE:
=,!=,<,>: Βασικές συγκρίσειςIN ('pro', 'admin'): Έλεγχος συμμετοχής σε σύνολοILIKE '%docker%': Αναζήτηση χωρίς διάκριση πεζών/κεφαλαίωνIS NULL/IS NOT NULL: Έλεγχος κενών τιμών
3. Συσχέτιση Πινάκων με JOINs
Α. INNER JOIN (Μόνο εγγραφές που ταιριάζουν και στους δύο πίνακες)
sql-- Εμφάνιση μαθημάτων μαζί με τον τίτλο της ενότητας στην οποία ανήκουν SELECT c.title AS course_title, m.title AS module_title, l.title AS lesson_title FROM public.courses c JOIN public.modules m ON m.course_id = c.id JOIN public.lessons l ON l.module_id = m.id ORDER BY c.sort_order, m.sort_order, l.sort_order;
Β. LEFT JOIN (Όλες οι αριστερές εγγραφές, ακόμα κι αν δεν έχουν παιδιά)
sql-- Εμφάνιση όλων των χρηστών και της προόδου τους (αν υπάρχει) SELECT p.full_name, p.tier, COUNT(up.lesson_id) AS completed_lessons_count FROM public.profiles p LEFT JOIN public.user_progress up ON up.user_id = p.id AND up.completed = true GROUP BY p.id, p.full_name, p.tier;
4. Ομαδοποίηση & Συγκεντρωτικά Δεδομένα: GROUP BY & HAVING
sql-- Υπολογισμός συνολικής διάρκειας ανά ενότητα (μόνο για ενότητες άνω των 30 λεπτών) SELECT m.title AS module_title, COUNT(l.id) AS total_lessons, SUM(l.duration_minutes) AS total_duration_minutes FROM public.modules m JOIN public.lessons l ON l.module_id = m.id GROUP BY m.id, m.title HAVING SUM(l.duration_minutes) >= 30 ORDER BY total_duration_minutes DESC;
5. Μεταβολές Δεδομένων με RETURNING
Η PostgreSQL προσφέρει τη δυνατότητα RETURNING, επιτρέποντας την άμεση επιστροφή της επεξεργασμένης γραμμής χωρίς δεύτερο SELECT:
sql-- Ενημέρωση συνδρομής με άμεση επιστροφή του νέου προφίλ UPDATE public.profiles SET tier = 'pro', updated_at = NOW() WHERE email = 'alex@example.com' RETURNING id, email, tier, updated_at;