Ένα από τα μεγαλύτερα οφέλη από τη χρήση σχεσιακών βάσεων δεδομένων όπως η MySQL είναι ότι η σχεσιακή δομή σας επιτρέπει να αποθηκεύετε και να ερωτάτε εύκολα πληροφορίες σε πολλούς πίνακες.
Ας εξερευνήσουμε πώς να ανακτήσουμε ακριβώς τα δεδομένα που θέλετε από πολλούς πίνακες βάσης δεδομένων και τις διάφορες διαθέσιμες συνδέσεις που σας επιτρέπουν να τραβήξετε τα ακριβή αποτελέσματα που θέλετε.
Αρχικοποίηση δείγματος βάσης δεδομένων
Αυτό δεν απαιτείται, αλλά εάν θέλετε να ακολουθήσετε τα παραδείγματα σε αυτό το άρθρο, μπορείτε να προετοιμάσετε ένα δείγμα βάσης δεδομένων τοπικά με τις παρακάτω εντολές τερματικού:
κλώνος git https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampledb
mysql> SELECT COUNT (*) ΑΠΟ πελάτες;
Θα πρέπει να λάβετε ένα αποτέλεσμα δηλώνοντας ότι υπάρχουν 2000 σειρές στο οι πελάτες τραπέζι.
Προεπιλογή / Είσοδος INNER
Η προεπιλεγμένη ένωση που χρησιμοποιείται μέσα Βάσεις δεδομένων MySQL ονομάζεται ένωση INNER και είναι η πιο κοινή και ευθεία προς τα εμπρός. Αυτή η ένωση επιστρέφει όλες τις εγγραφές για τις οποίες υπάρχουν αντίστοιχες εγγραφές και στους δύο πίνακες και απορρίπτει όλες τις άλλες εγγραφές.
Η Java παρέχει JDBC ως μέρος του Java SDK. Σε αυτό το άρθρο, ας δούμε τις λεπτομέρειες της σύνδεσης σε μια βάση δεδομένων MySQL και την εκτέλεση ερωτημάτων με αυτήν.
Για παράδειγμα, εάν θέλετε να δείτε τα ονόματα και τα επώνυμα του πελάτη, συν το ποσό και την ημερομηνία παραγγελίας για όλες τις παραγγελίες μεγαλύτερες από 1000 $, θα μπορούσατε να χρησιμοποιήσετε την ακόλουθη δήλωση SQL:
ΕΠΙΛΕΓΩ
c.id, c.first_name, c.last_name, o.amount, o.created_at
ΑΠΟ
πελάτες c, παραγγελίες o
ΠΟΥ
o.customer_id = c.id AND o.amount> = 1000;
Μερικές σημειώσεις σχετικά με το παραπάνω ερώτημα:
- Επιλέγονται πέντε διαφορετικές στήλες, τρεις από τον πίνακα πελατών και δύο από τον πίνακα παραγγελιών.
- Εντός της ρήτρας FROM, καθορίζονται οι δύο πίνακες, αλλά επιτίθενται με τα γράμματα "c" και "o". Αυτά απλώς καθορίζουν ψευδώνυμα μέσα σε SQL, μπορεί να είναι οτιδήποτε θέλετε και χρησιμοποιούνται για να συντομεύσετε το ερώτημα SQL.
- ο o.customer_id = c.id είναι η συνένωση του ερωτήματος και διασφαλίζει τη σωστή συσχέτιση μεταξύ πελατών και παραγγελιών.
Ένας διαφορετικός και τεχνικά πιο συντακτικός σωστός τρόπος για να γράψετε το ίδιο ερώτημα είναι παρακάτω:
ΕΠΙΛΕΓΩ
c.id, c.first_name, c.last_name, o.amount, o.created_at
ΑΠΟ
πελάτες c INNER JOIN παραγγελίες o
ΕΠΙ
customer_id = c.id
ΠΟΥ
o. ποσό> = 1000;
Το παραπάνω ερώτημα τείνει να είναι λίγο πιο εύκολο να διαβαστεί, καθώς μπορείτε εύκολα να δείτε την ένωση μεταξύ των πελατών και του πίνακα παραγγελιών. Ωστόσο, για όλες τις προθέσεις, αυτά τα δύο ερωτήματα είναι τα ίδια και θα παράγουν ακριβώς τις ίδιες εγγραφές.
ΑΡΙΣΤΕΡΑ Συμμετέχει
Οι αριστερές συνδέσεις θα επιστρέψουν όλες τις εγγραφές από τον αριστερό πίνακα που ταιριάζουν επίσης με εγγραφές από το δεξί πίνακα και θα απορρίψουν όλες τις άλλες εγγραφές. Για παράδειγμα, ίσως θέλετε να δείτε το συνολικό ποσό των πωλήσεων για κάθε προϊόν στη βάση δεδομένων, μπορείτε να δοκιμάσετε να χρησιμοποιήσετε ένα ερώτημα όπως:
ΕΠΙΛΕΓΩ
p.name, άθροισμα (item.amount) AS tamount
ΑΠΟ
Παραγγελίες_items item LEFT JOIN προϊόντα σελ
ΕΠΙ
item.product_id = p.id
GROUP BY item.product_id ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ tamount DESC
Αυτό έχει ως αποτέλεσμα μια ωραία προβολή δύο στηλών που δείχνει το όνομα του προϊόντος με το συνολικό ποσό πωλήσεων και λειτουργεί όπως αναμενόταν. Το ερώτημα πέρασε από όλα τα προϊόντα στον πίνακα παραγγελιών_στοιχείων, τα ένωσε σε εγγραφές στον πίνακα προϊόντων και επέστρεψε το συνολικό ποσό πωλήσεων καθενός.
ΔΕΞΙΑ Συμμετέχει
Χρησιμοποιώντας το παραπάνω παράδειγμα, λάβετε υπόψη το γεγονός ότι το παραπάνω ερώτημα επέστρεψε μόνο 19 εγγραφές, ενώ υπάρχουν συνολικά 22 προϊόντα στη βάση δεδομένων. Αυτό οφείλεται στο γεγονός ότι το ερώτημα ξεκίνησε με τον πίνακα orders_items και το ένωσε στον πίνακα προϊόντων και Δεδομένου ότι ορισμένα προϊόντα δεν έχουν παραγγελθεί ποτέ, δεν υπάρχουν εγγραφές αυτών των προϊόντων εντός των παραγγελιών_στοιχείων τραπέζι.
Τι θα συμβεί εάν θέλετε να λάβετε μια λίστα με όλα τα προϊόντα με ποσά πωλήσεων, συμπεριλαμβανομένων προϊόντων που δεν έχουν παραγγελθεί; Δοκιμάστε μια σωστή ένωση με το ακόλουθο ερώτημα:
ΕΠΙΛΕΓΩ
p.name, άθροισμα (item.amount) AS tamount
ΑΠΟ
Στοιχεία παραγγελίας_items RIGHT JOIN προϊόντα σελ
ΕΠΙ
item.product_id = p.id
GROUP BY p.id ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ tamount DESC
Αυτό είναι καλύτερο και το ερώτημα επιστρέφει τώρα τα 22 πλήρη προϊόντα με τρία από αυτά να έχουν ένα ποσό μηδενικό. Αυτό συμβαίνει επειδή, αντί να χρησιμοποιεί τις παραγγελίες_τιμήματα ως τον κύριο πίνακα που ενώνεται με τον πίνακα προϊόντων, η δεξιά ένωση αναστρέφει την παραγγελία και ενώνει τον πίνακα προϊόντων στον πίνακα παραγγελίες.
Πολλαπλές συνδέσεις σε ένα ερώτημα
Μερικές φορές πρέπει να ενώσετε τρία ή περισσότερα τραπέζια μαζί για να λάβετε ένα συγκεκριμένο σύνολο αποτελεσμάτων.
Για παράδειγμα, ίσως θέλετε μια λίστα με όλους τους πελάτες που έχουν αγοράσει το φούρνο μικροκυμάτων (αναγνωριστικό προϊόντος # 1), συμπεριλαμβανομένου του ονόματος και της ημερομηνίας παραγγελίας τους. Αυτό απαιτεί ένα SELECT σε τρεις πίνακες που μπορούν να γίνουν χρησιμοποιώντας δύο συνδέσεις με το ακόλουθο ερώτημα:
ΕΠΙΛΕΓΩ
c.first_name, c.last_name, o.amount, o.created_at
ΑΠΟ
πελάτες c INNER JOIN παραγγελίες o
ΕΠΙ
c.id = o.customer_id ΕΙΣΑΓΩΓΗ ΕΓΓΡΑΦΕΙΤΕ_στοιχείο
ΕΠΙ
item.order_id = o.id
ΠΟΥ
item.product_id = 1 ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ o.created_at;
Αυτό το ερώτημα επιστρέφει και τις 426 παραγγελίες του φούρνου μικροκυμάτων και λειτουργεί όπως αναμένεται. Πρώτα ταιριάζει με όλους τους πελάτες στις αντίστοιχες παραγγελίες τους, και στη συνέχεια με περαιτέρω ερωτήματα που προκύπτουν από αντιστοίχιση όλων των παραγγελιών με μόνο εκείνες στον πίνακα παραγγελιών_είδων που περιέχουν το προϊόν μικροκυμάτων (id # 1).
Ποτέ μην χρησιμοποιείτε υπο-ερωτήματα με ρήτρες IN
Ως γρήγορο sidenote, με κάθε κόστος θα πρέπει πάντα να αποφεύγετε τη χρήση δευτερευόντων ερωτημάτων με τα ερωτήματα SQL όπως:
SELECT first_name, last_name FROM πελάτες WHERE id IN (SELECT customer_id FROM παραγγελίες WHERE status = 'εγκεκριμένο' ΚΑΙ ποσό <100);
Ερωτήματα όπως παραπάνω είναι πολύ αναποτελεσματικά, χρησιμοποιούν μεγάλο αριθμό πόρων και πρέπει να αποφεύγονται όσο το δυνατόν περισσότερο. Αντ 'αυτού, χρησιμοποιήστε τις κατάλληλες συνδέσεις όπως περιγράφονται στις παραπάνω ενότητες. Για παράδειγμα, το παραπάνω ερώτημα πρέπει να ξαναγραφεί ως:
ΕΠΙΛΟΓΗ c.first_name, c.last_name ΑΠΟ πελάτες c c ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ παραγγελιών o ON O.customer_id = c.id ΠΟΥ ΕΙΝΑΙ o.status = 'εγκεκριμένο' ΚΑΙ o. ποσό <100;
Εξοικονομήστε χρόνο με το SQL
Αυτό το άρθρο ελπίζει να σας δείξει τη δύναμη των σχεσιακών βάσεων δεδομένων όπως η MySQL και πώς να δημιουργήσετε Ερωτήματα SQL που ανακτούν εγγραφές από πολλούς πίνακες σε ένα ερώτημα χρησιμοποιώντας συνδέσεις, επιτρέποντάς σας να ανακτήσετε τα ακριβή αποτελέσματα που θέλετε.
Έχετε μάθει τρεις διαφορετικές συνδέσεις στο SQL, πώς να ψευδώνετε ονόματα στηλών και πινάκων, να χρησιμοποιείτε πολλές συνδέσεις σε ένα ερώτημα και γιατί πρέπει να αποφεύγετε τα υπο-ερωτήματα. Ποτέ μην προσπαθείτε ξανά να προσπαθήσετε να συντάξετε χειροκίνητα διαφορετικά σύνολα δεδομένων σε ένα και αρχίστε να χρησιμοποιείτε συνδέσεις για να εντυπωσιάσετε τους συναδέλφους σας και να εξοικονομήσετε χρόνο.
Τα Έγγραφα Google είναι πλέον εργοστάσιο παραγωγής γραφείου. Με τη βοήθεια αυτών των πρόσθετων, μπορείτε να κάνετε τα Έγγραφα Google σας να φαίνονται όμορφα και κομψά.
- Προγραμματισμός
- SQL
- βάση δεδομένων
Εγγραφείτε στο Newsletter μας
Εγγραφείτε στο ενημερωτικό δελτίο μας για τεχνικές συμβουλές, κριτικές, δωρεάν ebook και αποκλειστικές προσφορές!
Ένα ακόμη βήμα…!
Επιβεβαιώστε τη διεύθυνση email σας στο email που μόλις σας στείλαμε.