mysql_sql — συγκεντρωτικός οδηγός — DedSec Project
mysql_sql — συγκεντρωτικός οδηγός MySQL SQL Βασική ιδέα Η MySQL SQL λειτουργεί σε σχεσιακούς πίνακες με vendor-specific συναρτήσεις· οι εγγυήσεις transactions εξαρτώνται και από το storage…
MySQL SQL
Βασική ιδέα
Η MySQL SQL λειτουργεί σε σχεσιακούς πίνακες με vendor-specific συναρτήσεις· οι εγγυήσεις transactions εξαρτώνται και από το storage engine.
Μικρό εκπαιδευτικό απόσπασμα
SELECT 2 + 3 AS total;
Άσκηση βασισμένη στη συγκεκριμένη συμπεριφορά
Φτιάξε δοκιμαστικό πίνακα με nullable στήλη και σύγκρινε COUNT(*) με COUNT(column) μετά από NULL.
Διάγνωση και όρια
Το SQL mode και το collation επηρεάζουν comparisons και μη έγκυρες τιμές· έλεγξε @@sql_mode.
Κάνε την άσκηση με πραγματικά δοκιμαστικά δεδομένα και με έκδοση MySQL_SQL που ταιριάζει στον κώδικα. Σημείωσε μία αρχική πρόβλεψη και την πραγματική έξοδο. Για περίπλοκο ή μη διαθέσιμο runtime, παρουσίασε τη στατική ανάλυση ως τέτοια, όχι ως επιτυχημένη εκτέλεση. Δοκίμασε ξεχωριστά την κανονική περίπτωση και μία οριακή τιμή, χωρίς πραγματικά προσωπικά ή παραγωγικά δεδομένα.
Εμβάθυνση
Σχεδίασε μια δεύτερη ανεξάρτητη εφαρμογή του ίδιου μηχανισμού και περιέγραψε ποια συγκεκριμένη παραδοχή πρέπει να αλλάξει. Αν χρειάζεται διαφορετικό λειτουργικό σύστημα ή host application, γράψε ρητά τη διαφορά και τι μπορεί να εξεταστεί offline από το κινητό.
MySQL_SQL — Αναλυτικός οδηγός εξάσκησης
Ξεκίνησε από αληθινή σύνταξη
Το αρχικό παράδειγμα της MySQL SQL είναι η μικρότερη αφετηρία. Διάβασε τη σειρά των πράξεων και τον τρόπο εμφάνισης, έπειτα επιβεβαίωσέ το στο σωστό περιβάλλον. Μην θεωρείς ότι η σύνταξη άλλης γλώσσας έχει ίδια σημασία.
SELECT CONCAT('Hello, ', 'Ada', '!') AS greeting;
Περιβάλλον εκτέλεσης: Run in a MySQL client.. Έλεγξε έκδοση compiler/interpreter πριν τροποποιήσεις τον κώδικα και κράτησε την αρχική έξοδο. Δούλεψε σε προσωρινό κατάλογο, μακριά από πραγματικά δεδομένα.
Οδηγούμενο εργαστήριο
Φτιάξε πίνακα visits, ομαδοποίησε scores ανά city και σύγκρινε EXPLAIN με/χωρίς index στο φίλτρο πόλης. Μέτρησε σε χιλιάδες γραμμές, όχι τρεις.
Δοκιμές ορίων
Τα indexes επιβαρύνουν εγγραφές και δεν επιλέγονται πάντοτε από optimizer. Χρησιμοποίησε bound parameters αντί SQL concatenation.
Προχωρημένη αποστολή
Φτιάξε ξεχωριστό αρχείο για το παραπάνω εργαστήριο και πειραματίσου με μία αλλαγή σε σειρά, σχήμα, τύπο, scope ή περιβάλλον, ανάλογα με τη MySQL SQL. Καθόρισε invariant και σύγκρινε αναμενόμενη με πραγματική έξοδο. Αν κάτι διαφέρει, απομόνωσε το ελάχιστο παράδειγμα πριν μεγαλώσεις το πρόγραμμα.
MySQL_SQL — Διαδρομή ουσιαστικής εξάσκησης
Πίνακας λογαριασμών για ελεγχόμενη μεταφορά
Μια μεταφορά ποσού ανάμεσα σε δύο εγγραφές χρειάζεται atomicity. Δύο ανεξάρτητα UPDATE σε autocommit mode μπορούν να αφήσουν το dataset σε μερικώς ενημερωμένη κατάσταση αν το δεύτερο βήμα αποτύχει.
CREATE TABLE accounts (
id BIGINT PRIMARY KEY,
balance DECIMAL(12,2) NOT NULL
) ENGINE=InnoDB;
INSERT INTO accounts VALUES (1,100.00),(2,20.00);
START TRANSACTION;
UPDATE accounts SET balance=balance-10 WHERE id=1;
UPDATE accounts SET balance=balance+10 WHERE id=2;
COMMIT;
Με αυτή την ελεγχόμενη είσοδο, η αναμενόμενη κατάσταση μετά το commit είναι 90.00 και 30.00. Επισήμανε όμως ότι το παράδειγμα δεν εμποδίζει αρνητικό balance ούτε επαληθεύει πως οι εγγραφές υπάρχουν. Μια πραγματική υπηρεσία χρειάζεται κανόνες επαλήθευσης, locking strategy και rollback σε αποτυχία.
Τι σημαίνει isolation
Στη MySQL InnoDB η isolation level επηρεάζει visibility και concurrency. Έλεγξε ποια transaction isolation χρησιμοποιείς πριν συζητήσεις repeatable reads ή locking. Το SELECT ... FOR UPDATE μπορεί να βοηθήσει όταν η απόφαση μεταφοράς εξαρτάται από την τρέχουσα τιμή balance· δεν είναι αντικατάστατο σωστού χειρισμού deadlocks.
Παραμετροποίηση
Όταν application code δέχεται id ή ποσό από χρήστη, χρησιμοποίησε prepared statements με bound values αντί για concatenation SQL strings. Αυτό διαχωρίζει δεδομένα από SQL syntax. Το ότι το πεδίο εισόδου δηλώθηκε numeric στη φόρμα δεν είναι server-side προστασία.
Ελεγχόμενες αποτυχίες
Σε test-only βάση δημιούργησε περίπτωση όπου το destination id απουσιάζει και αξιολόγησε τον αριθμό επηρεασμένων γραμμών πριν το commit. Αφαίρεσε προσωρινά το COMMIT και δώσε ROLLBACK για να βεβαιωθείς ότι κανένα υπόλοιπο δεν μεταβλήθηκε.
Παραδοτέο
Δώσε SQL script που επαναφέρει αρχική κατάσταση μεταξύ tests, αποτελέσματα σε δύο sessions υπό concurrency και MySQL version. Διαχώρισε ACID προϋποθέσεις από business invariants, επειδή μία επιτυχημένη transaction μπορεί να έχει λογικά λανθασμένη συμπεριφορά.
MySQL SQL — Τεχνικά σημεία και συχνές παγίδες
Τεχνική γνώση
- Οι διάλεκτοι SQL διαφέρουν σε συναρτήσεις, τύπους και κλειδώματα.
- Οι συναλλαγές, τα ευρετήρια και οι κανόνες σύγκρισης κειμένου επηρεάζουν αποτέλεσμα και επιδόσεις.
- Πέρασε τιμές με parameters οδηγού αντί για σύνθεση εισόδου χρήστη σε SQL.