Η βιωσιμότητα στις επιχειρήσεις είναι δύσκολη χωρίς τη σωστή διαχείριση δεδομένων. Η δημιουργία ενός καλά ορισμένου συστήματος είναι απαραίτητη για τη διαχείριση των εσωτερικών και εξωτερικών λειτουργιών. Η λεπτομερής κατανόηση των επιχειρηματικών δεδομένων βοηθά στην κατανόηση της συνολικής ροής εργασίας και στη μέτρηση της απόδοσης. Επιπλέον, η χρήση βάσεων δεδομένων εξοικονομεί χρόνο και επιτρέπει την εύκολη πρόσβαση σε πληροφορίες.
Τι είναι μια βάση δεδομένων;
Μια βάση δεδομένων είναι ένα οργανωμένο σύστημα που χρησιμοποιείται για την αποθήκευση πληροφοριών με ασφαλή τρόπο. Προσφέρει κατηγοριοποίηση και επιτρέπει τη δημιουργία πινάκων για την ταξινόμηση παρόμοιων ειδών κάτω από μία ομάδα. Οι πίνακες παρέχουν επιλογές για την καταγραφή πληροφοριών σε πολλαπλές γραμμές και στήλες. Ως αποτέλεσμα, η ποιότητα και η συνέπεια των δεδομένων βελτιώνονται. Εκτός από τις δυνατότητες αποθήκευσης και εύκολης πρόσβασης, οι βάσεις δεδομένων διαδραματίζουν σημαντικό ρόλο στη διασφάλιση του απορρήτου και την ασφάλεια των συστημάτων. Είτε πρόκειται για ad hoc είτε για μέρος μιας διαδικασίας κωδικοποιημένης σε μια εφαρμογή, η ανάκτηση δεδομένων είναι μία από τις πιο κρίσιμες πτυχές της διαχείρισης βάσεων δεδομένων.
Ένα ερώτημα σε σχεσιακά DMS είναι οποιαδήποτε εντολή χρησιμοποιείται για την ανάκτηση δεδομένων από έναν πίνακα. SELECT οι δηλώσεις χρησιμοποιούνται σχεδόν πάντα σε Structured Query Language (SQL) ερωτήματα. Υπάρχουν διάφορες μέθοδοι για την ανάκτηση πληροφοριών από μια βάση δεδομένων. Γενικά, οι προγραμματιστές προτιμούν την επιλογή της γραμμής εντολών επειδή είναι γρήγορη και αποτελεσματική. Επιτρέπει την απρόσκοπτη υποβολή ερωτημάτων.
Σε αυτόν τον οδηγό, θα σας εισαγάγουμε στη MySQL και θα συζητήσουμε πώς να εργάζεστε με ερωτήματα στη MySQL. Ας ξεκινήσουμε!
Προαπαιτούμενα
Για να παρακολουθήσετε αυτό το σεμινάριο, θα χρειαστείτε τα ακόλουθα:
-
Η τελευταία έκδοση του Ubuntu είναι εγκατεστημένο στο σύστημά σας.
-
Οι χρήστες του συστήματος πρέπει να έχουν προνόμια sudo.
-
Αν αντιμετωπίζετε δυσκολία στην πρόσβαση στον λογαριασμό σας sudo, σκεφτείτε να αλλάξετε τον κωδικό πρόσβασης root της MySQL.
-
-
Η MySQL είναι εγκατεστημένη στον διακομιστή σας.
Βήμα 1 — Δημιουργία και Ρύθμιση μιας Βάσης Δεδομένων
Προτού ξεκινήσουμε και γράψουμε το πρώτο μας ερώτημα SQL, πρέπει να δημιουργήσουμε μια βάση δεδομένων και να προσθέσουμε πίνακες σε αυτήν. Μετά από αυτό, θα γεμίσουμε τους πίνακες χρησιμοποιώντας δείγματα δεδομένων. Η εργασία με βάσεις δεδομένων θα σας βοηθήσει να κατανοήσετε τη βασική ρύθμιση και να αποκτήσετε αυτοπεποίθηση στην εργασία με ερωτήματα.
Η πρακτική εμπειρία είναι ο πιο αποτελεσματικός τρόπος για να κατανοήσετε τις έννοιες και τη σημασία των βάσεων δεδομένων. Σε αυτόν τον οδηγό, θα σας καθοδηγήσουμε στη χρήση των βάσεων δεδομένων και στη σημασία τους για την επίλυση προβλημάτων του πραγματικού κόσμου. Ας δούμε ένα σενάριο για να κατανοήσουμε πώς οι βάσεις δεδομένων μπορούν να βοηθήσουν στην οργάνωση των εγγραφών με δομημένο τρόπο.
Σενάριο: Θα δημιουργήσουμε μια βάση δεδομένων όπου μια ομάδα φοιτητών πηγαίνει διακοπές για να γιορτάσει τα γενέθλιά τους. Πριν πάνε για διακοπές, σχεδιάζουν να συμμετάσχουν σε έναν φιλικό αγώνα κολύμβησης. Επίσης, κάθε φίλος στην ομάδα σχεδιάζει μια λίστα υποχρεώσεων με δραστηριότητες για να κάνει το ταξίδι του συναρπαστικό και απολαυστικό.
Πρώτα, ανοίξτε τη MySQL ως χρήστης root:
|
1 |
$ sudo mysql |
Στη συνέχεια, δημιουργήστε μια βάση δεδομένων εκτελώντας την ακόλουθη εντολή:
|
1 2 3 |
mysql> CREATE DATABASE `vacation`; Query OK, 1 row affected (0.52 sec) |
Στη συνέχεια, ας χρησιμοποιήσουμε τη βάση δεδομένων μας χρησιμοποιώντας την ακόλουθη εντολή:
|
1 |
mysql> USE vacation; |
Μετά από αυτό, θα δημιουργήσουμε πίνακες στη βάση δεδομένων μας. Ονομάστε τον πρώτο πίνακα ως celebration. Ο πίνακάς μας θα έχει στήλες για τα ονόματα των φίλων μας (name), τα τουρνουά που έχουν κερδίσει (wins) καθώς και μια στήλη για τον καλύτερο χρόνο (time):
|
1 2 3 4 5 6 7 |
mysql> CREATE TABLE celebration ( -> name varchar(50), -> wins real, -> time real -> ); Query OK, 0 rows affected (2.03 sec) |
Στη συνέχεια, θα γεμίσουμε τον πίνακά μας με δεδομένα:
|
1 2 3 4 5 6 7 8 9 |
mysql> INSERT INTO celebration (name, wins, time) VALUES('Austin', '4', '15.5'), ('Ivan','7','9'), ('Aisha','10','5'), ('Zane','13','7.5'); Query OK, 4 rows affected (0.29 sec) Records: 4 Duplicates: 0 Warnings: 0 |
Στη συνέχεια, δημιουργήστε έναν άλλο πίνακα στη βάση δεδομένων μας για να αποθηκεύσετε πληροφορίες σχετικά με τις αγαπημένες τους δραστηριότητες γενεθλίων. Θα δημιουργήσουμε έναν πίνακα που ονομάζεται vacation και θα έχει τις ακόλουθες στήλες:
|
Λίστα |
Λεπτομέρεια |
|
name: |
Αποθηκεύστε το όνομα κάθε φίλου. |
|
birthdate: |
Παρακολουθεί την ημερομηνία γέννησης κάθε ατόμου. |
|
activity: |
Κρατάει αρχείο με την αγαπημένη τους δραστηριότητα. |
|
Destination: |
Αποθηκεύει τις πληροφορίες για τον αγαπημένο προορισμό κάθε ατόμου. |
|
meal: |
Παρακολουθεί το αγαπημένο γεύμα ενός ατόμου. |
|
1 2 3 4 5 6 7 8 |
mysql> CREATE TABLE vacation ( name varchar(50), birthdate date, activity varchar(50), destination varchar(50), meal varchar(50) ); Query OK, 0 rows affected (0.09 sec) |
Γεμίστε τον πίνακα με δεδομένα:
|
1 2 3 4 5 6 7 8 9 10 |
mysql> CREATE TABLE vacation ( name varchar(50), birthdate date, activity varchar(50), destination varchar(50), meal varchar(50) ); Query OK, 0 rows affected (0.09 sec) Records: 4 Duplicates: 0 Warnings: 0 |
Έχετε πλέον ολοκληρώσει τη ρύθμιση της βάσης δεδομένων σας.
Βήμα 2 — Ξεκινώντας με τις δηλώσεις SELECT
Τα ερωτήματα στη SQL συνήθως ξεκινούν με SELECT. Χρησιμοποιείται στα ερωτήματα για να καθορίσει ποιες στήλες ενός πίνακα πρέπει να επιστραφούν με τα αποτελέσματα. Ένα ερώτημα πρέπει επίσης πάντα να περιλαμβάνει FROM, το οποίο χρησιμοποιείται για τον καθορισμό του πίνακα στον οποίο θα γίνει το ερώτημα.
Τα ερωτήματα ακολουθούν την παρακάτω σύνταξη:
|
1 |
mysql> SELECT column_to_select FROM table_to_select WHERE certain_conditions_apply; |
Θα χρησιμοποιήσουμε τη σύνταξη του ερωτήματος για να επιστρέψουμε τη στήλη meal από τον πίνακα vacation :
|
1 |
mysql> SELECT meal FROM vacation; |
Το αποτέλεσμά μας θα είναι το εξής:
|
1 2 3 4 5 6 7 8 9 10 |
+-------+ | meal | +-------+ | Steak | | Sushi | | Fries | | Tofu | +-------+ 4 rows in set (0.00 sec) |
Μπορείτε επίσης να επιλέξετε πολλαπλές στήλες χρησιμοποιώντας κόμμα για να τις διαχωρίσετε:
|
1 |
mysql> SELECT name, destination FROM vacation; |
Αποτέλεσμα:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+-------------+ | name | destination | +--------+-------------+ | Austin | Maldives | | Ivan | Mauritius | | Aisha | Colorado | | Zane | Bora Bora | +--------+-------------+ 4 rows in set (0.00 sec) |
Μπορείτε επίσης να χρησιμοποιήσετε έναν αστερίσκο (*) αν θέλετε να αναπαραστήσετε όλες τις στήλες του πίνακα:
|
1 |
mysql> SELECT * FROM celebration; |
Αποτέλεσμα:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------+------+ | name | wins | time | +--------+------+------+ | Austin | 4 | 15.5 | | Ivan | 7 | 9 | | Aisha | 10 | 5 | | Zane | 13 | 7.5 | +--------+------+------+ 4 rows in set (0.00 sec) |
Αν θέλετε να φιλτράρετε εγγραφές που πληρούν μια συγκεκριμένη προϋπόθεση, χρησιμοποιείτε WHERE. Οι γραμμές που δεν πληρούν την καθορισμένη προϋπόθεση απαλείφονται από τα αποτελέσματα. Ο WHERE όρος χρησιμοποιεί την ακόλουθη σύνταξη:
|
1 |
mysql> . . . WHERE column_name comparison_operator value |
Είναι ένας τελεστής σύγκρισης που ορίζει πώς πρέπει να συγκριθεί η καθορισμένη στήλη με την τιμή. Οι συνήθεις τελεστές σύγκρισης SQL περιλαμβάνουν:
|
Τελεστής |
Χρήση |
|
= |
Ισότητα |
|
!= |
Ανισότητα |
|
< |
Μικρότερο από |
|
> |
Μεγαλύτερο από |
|
<= |
Μικρότερο ή ίσο με |
|
>= |
Μεγαλύτερο ή ίσο με |
|
BETWEEN |
Ελέγχει αν η τιμή βρίσκεται εντός του δεδομένου εύρους. |
|
IN |
Ελέγχει αν η τιμή μιας γραμμής περιέχεται σε ένα σύνολο καθορισμένων τιμών. |
|
EXISTS |
Ελέγχει αν υπάρχει μια γραμμή |
|
LIKE |
Ελέγχει αν μια τιμή ταιριάζει με την καθορισμένη συμβολοσειρά |
|
IS NULL |
Ελέγχει για τιμές null |
|
IS NOT NULL |
Ελέγχει για όλες τις τιμές εκτός από NULL |
Αν θέλατε να βρείτε τον αγαπημένο προορισμό της Aisha, θα μπορούσατε να χρησιμοποιήσετε το παρακάτω ερώτημα:
|
1 |
mysql> SELECT destination FROM vacation WHERE name ='Aisha'; |
Το ερώτημα θα επιστρέψει στη συνέχεια:
|
1 2 3 4 5 6 7 |
+-------------+ | destination | +-------------+ | Colorado | +-------------+ 1 row in set (0.03 sec) |
Η SQL υποστηρίζει τη χρήση χαρακτήρων μπαλαντέρ, οι οποίοι είναι ιδιαίτερα χρήσιμοι σε WHERE ρήτρες. Τα σύμβολα ποσοστού ( %) υποδηλώνουν μηδέν ή περισσότερους άγνωστους χαρακτήρες, ενώ οι κάτω παύλες ( _) υποδηλώνουν έναν μόνο άγνωστο χαρακτήρα. Αυτά είναι χρήσιμα εάν θέλετε να βρείτε μια συγκεκριμένη καταχώριση σε έναν πίνακα αλλά δεν είστε σίγουροι για την καταχώριση.
Για παράδειγμα, αν είχατε ξεχάσει τον αγαπημένο προορισμό ενός φίλου και γνωρίζατε μόνο το γράμμα από το οποίο ξεκινά, για παράδειγμα, “m.” Μπορείτε να βρείτε το όνομα του προορισμού χρησιμοποιώντας το ακόλουθο ερώτημα:
|
1 |
mysql> SELECT destination FROM vacation WHERE destination LIKE 'm%'; |
Το ερώτημα θα επιστρέψει:
|
1 2 3 4 5 6 7 8 |
+-------------+ | destination | +-------------+ | Maldives | | Mauritius | +-------------+ 2 rows in set (0.04 sec) |
Όταν εργάζεστε με βάσεις δεδομένων, ενδέχεται να συναντήσετε στήλες ή πίνακες με σχετικά μεγάλα ή δυσανάγνωστα ονόματα. Σε αυτές τις περιπτώσεις, μπορείτε να κάνετε τα ονόματα πιο ευανάγνωστα χρησιμοποιώντας τη λέξη-κλειδί AS για να δημιουργήσετε ένα ψευδώνυμο. Τα ψευδώνυμα που δημιουργούνται με το AS ισχύουν μόνο για τη διάρκεια του ερωτήματος για το οποίο δημιουργήθηκαν:
|
1 2 3 4 5 6 7 8 9 10 11 |
mysql> SELECT name AS E, destination as D, activity as A FROM vacation; +--------+-----------+-------------------+ | E | D | A | +--------+-----------+-------------------+ | Austin | Maldives | skiing | | Ivan | Mauritius | paragliding | | Aisha | Colorado | mountain climbing | | Zane | Bora Bora | fishing | +--------+-----------+-------------------+ 4 rows in set (0.00 sec) |
Βήμα 3 — Εισαγωγή στις Συγκεντρωτικές Συναρτήσεις
Όταν εργάζεστε με δεδομένα, δεν θέλετε πάντα να βλέπετε τα ίδια τα δεδομένα. Προτιμάτε να έχετε πληροφορίες σχετικά με τα δεδομένα. Εκτελώντας ένα ερώτημα SELECT, μπορείτε να ερμηνεύσετε ή να εκτελέσετε υπολογισμούς στα δεδομένα σας χρησιμοποιώντας τη σύνταξη SQL. Αυτές αναφέρονται ως συγκεντρωτικές συναρτήσεις.
Η συνάρτηση COUNT μετράει και επιστρέφει τον αριθμό των γραμμών που πληρούν ένα συγκεκριμένο σύνολο κριτηρίων. Για παράδειγμα, αν θέλετε να μάθετε πόσοι φίλοι προτιμούν να πάνε στις Μαλδίβες, μπορείτε να χρησιμοποιήσετε το ακόλουθο ερώτημα:
|
1 |
mysql> SELECT COUNT(destination) FROM vacation WHERE destination = 'Maldives'; |
Θα επιστραφούν τα ακόλουθα αποτελέσματα:
|
1 2 3 4 5 6 7 |
+--------------------+ | COUNT(destination) | +--------------------+ | 1 | +--------------------+ 1 row in set (0.06 sec) |
MIN χρησιμοποιείται για την εύρεση της μικρότερης τιμής μέσα σε μια καθορισμένη στήλη:
|
1 |
mysql> SELECT MIN(wins) FROM celebration; |
Το ερώτημα θα εμφανίσει:
|
1 2 3 4 5 6 7 |
+-----------+ | MIN(wins) | +-----------+ | 4 | +-----------+ 1 row in set (0.02 sec) |
MAX χρησιμοποιείται για την εύρεση της μεγαλύτερης αριθμητικής τιμής σε μια δεδομένη στήλη:
|
1 |
mysql> SELECT MAX(wins) FROM celebration; |
Το αναμενόμενο αποτέλεσμα είναι:
|
1 2 3 4 5 6 7 |
+-----------+ | MAX(wins) | +-----------+ | 13 | +-----------+ 1 row in set (0.03 sec) |
Τόσο η συνάρτηση MIN όσο και η MAX μπορούν να χρησιμοποιηθούν σε αριθμητικά και αλφαβητικά δεδομένα. Όταν εφαρμόζεται σε μια στήλη τιμών συμβολοσειράς, η συνάρτηση MIN επιστρέφει την πρώτη τιμή αλφαβητικά.
Η συνάρτηση MIN επιστρέφει την πρώτη τιμή αλφαβητικά:
|
1 |
mysql> SELECT MIN(name) FROM celebration; |
Ορίστε ποιο θα είναι το αποτέλεσμα:
|
1 2 3 4 5 6 7 |
+-----------+ | MIN(name) | +-----------+ | Aisha | +-----------+ 1 row in set (0.00 sec) |
Η συνάρτηση MAX επιστρέφει την τελευταία τιμή αλφαβητικά:
|
1 |
mysql> SELECT MAX(name) FROM celebration; |
Αυτό θα είναι το αποτέλεσμα:
|
1 2 3 4 5 6 7 |
+-----------+ | MAX(name) | +-----------+ | Zane | +-----------+ 1 σειρά σε σύνολο (0.00 δευτ.) |
Βήμα 4 — Διαχείριση αποτελεσμάτων ερωτημάτων
Ένας άλλος δημοφιλής όρος που χρησιμοποιείται είναι ο GROUP BY όρος. Χρησιμοποιείται κατά την εκτέλεση μιας συγκεντρωτικής συνάρτησης σε μια στήλη αλλά σε σχέση με αντίστοιχες τιμές σε μια άλλη:
|
1 |
mysql> SELECT COUNT(name), activity FROM vacation GROUP BY activity; |
Το αποτέλεσμα θα είναι:
|
1 2 3 4 5 6 7 8 9 10 |
+-------------+-------------------+ | COUNT(name) | activity | +-------------+-------------------+ | 1 | σκι | | 1 | αλεξίπτωτο πλαγιάς | | 1 | ορεινή αναρρίχηση | | 1 | ψάρεμα | +-------------+-------------------+ 4 σειρές σε σύνολο (0.04 δευτ.) |
Για να ταξινομήσετε τα αποτελέσματα του ερωτήματος, χρησιμοποιήστε τον ORDER BY όρο. Οι αριθμητικές τιμές ταξινομούνται σε αύξουσα σειρά από προεπιλογή, ενώ οι τιμές κειμένου ταξινομούνται αλφαβητικά. Το παρακάτω ερώτημα εμφανίζει τις στήλες name και birthdate, αλλά ταξινομεί τα αποτελέσματα κατά birthdate:
|
1 |
mysql> SELECT name, birthdate FROM vacation ORDER BY birthdate; |
Το αποτέλεσμα θα είναι το εξής:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------------+ | name | birthdate | +--------+------------+ | Zane | 1996-01-01 | | Aisha | 1999-07-24 | | Austin | 2002-01-07 | | Ivan | 2010-12-18 | +--------+------------+ 4 σειρές σε σύνολο (0.04 δευτ.) |
Το αποτέλεσμα είναι σε αύξουσα σειρά· για να ταξινομήσετε σε φθίνουσα σειρά, κλείστε το ερώτημα με τη λέξη DESC:
|
1 |
mysql> SELECT name, birthdate FROM vacation ORDER BY birthdate DESC; |
Ρίξτε μια ματιά στο αποτέλεσμα:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------------+ | name | birthdate | +--------+------------+ | Ivan | 2010-12-18 | | Austin | 2002-01-07 | | Aisha | 1999-07-24 | | Zane | 1996-01-01 | +--------+------------+ 4 σειρές σε σύνολο (0.00 δευτ.) |
Ο HAVING όρος προστέθηκε στη SQL για να παρέχει παρόμοια λειτουργικότητα με τον WHERE όρο, ενώ παράλληλα είναι συμβατός με συγκεντρωτικές συναρτήσεις. Η διαφορά μεταξύ αυτών των δύο όρων είναι ότι ο WHERE αναφέρεται σε μεμονωμένες εγγραφές και ο HAVING αναφέρεται σε ομαδοποιημένες εγγραφές. Για το σκοπό αυτό, ο όρος GROUP BY πρέπει να είναι παρών όποτε χρησιμοποιείται ένας όρος HAVING:
|
1 |
mysql> SELECT COUNT(name), activity FROM vacation GROUP BY activity HAVING COUNT(name) >= 1; |
Το ερώτημα θα εμφανίσει:
|
1 2 3 4 5 6 7 8 |
+-------------+-------------------+ | COUNT(name) | activity | +-------------+-------------------+ | 1 | σκι | | 1 | αλεξίπτωτο πλαγιάς | | 1 | ορεινή αναρρίχηση | | 1 | ψάρεμα | +-------------+-------------------+ |
Το COUNT είναι 1 σε όλα επειδή δεν υπάρχουν δύο φίλοι που να τους αρέσει η ίδια δραστηριότητα.
Βήμα 5 — Ερώτημα σε πολλαπλούς πίνακες
Ο JOIN όρος μπορεί να χρησιμοποιηθεί σε ένα αποτέλεσμα ερωτήματος για το συνδυασμό σειρών από δύο ή περισσότερους πίνακες. Αυτό επιτυγχάνεται εντοπίζοντας μια σχετική στήλη μεταξύ των πινάκων και ταξινομώντας κατάλληλα το αποτέλεσμα.
SELECT δηλώσεις που περιλαμβάνουν έναν JOIN όρο ακολουθούν την παρακάτω σύνταξη:
|
1 2 3 |
mysql> SELECT table1.column1, table2.column2 mysql> FROM table1 mysql> JOIN table2 ON table1.related_column=table2.related_column; |
Αν θέλατε να αγοράσετε σε καθέναν από τους φίλους σας ένα τρόπαιο για τις νίκες τους κατά την κολύμβηση στα γενέθλιά τους, θα μπορούσατε να δημιουργήσετε ένα ερώτημα που θα συνενώσει και τους δύο πίνακες για να σας βοηθήσει να βρείτε όλες τις πληροφορίες που θέλετε με ένα μόνο ερώτημα:
|
1 2 3 |
mysql> SELECT celebration.name, celebration.wins, vacation.birthdate FROM celebration JOIN vacation ON celebration.name=vacation.name; |
Το αποτέλεσμα θα είναι:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------+------------+ | name | wins | birthdate | +--------+------+------------+ | Austin | 4 | 2002-01-07 | | Ivan | 7 | 2010-12-18 | | Aisha | 10 | 1999-07-24 | | Zane | 13 | 1996-01-01 | +--------+------+------------+ 4 rows in set (0.00 sec) |
Αυτή είναι μια εσωτερική JOIN ρήτρα. Αυτό συμβαίνει επειδή επιλέγει όλες τις εγγραφές που έχουν αντίστοιχες τιμές και στους δύο πίνακες και τις εκτυπώνει σε ένα σύνολο αποτελεσμάτων. Οι εγγραφές που δεν ταιριάζουν με το ερώτημα δεν περιλαμβάνονται. Μπορούμε να συμπεριλάβουμε μια νέα σειρά στους πίνακές μας που δεν αντιστοιχεί σε καμία καταχώριση:
|
1 2 3 4 |
mysql> INSERT INTO celebration(name,wins,time) VALUES('Ella', '1', '120'); Query OK, 1 row affected (0.01 sec) |
|
1 2 3 4 |
mysql> INSERT INTO celebration(name,wins,time) VALUES('Ella', '1', '120'); Query OK, 1 row affected (0.01 sec) |
Στη συνέχεια, εκτελέστε ξανά τη SELECT δήλωση με τη JOIN ρήτρα:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> SELECT celebration.name, celebration.wins, vacation.birthdate -> FROM celebration -> JOIN vacation ON celebration.name=vacation.name; +--------+------+------------+ | name | wins | birthdate | +--------+------+------------+ | Austin | 4 | 2002-01-07 | | Ivan | 7 | 2010-12-18 | | Aisha | 10 | 1999-07-24 | | Zane | 13 | 1996-01-01 | +--------+------+------------+ 4 rows in set (0.00 sec) |
Επειδή ο πίνακας celebration δεν έχει καταχώριση για τον Peter και ο πίνακας vacation δεν έχει καταχώριση για την Ella, αυτές οι εγγραφές απουσιάζουν.
Μπορούμε να επιστρέψουμε όλες τις εγγραφές από έναν από τους πίνακες χρησιμοποιώντας μια εξωτερική JOIN ρήτρα. Αυτή μπορεί να είναι είτε μια LEFT JOIN ή μια RIGHT JOIN. Μια LEFT JOIN επιστρέφει όλες τις εγγραφές από τον αριστερό πίνακα και μόνο τις αντίστοιχες εγγραφές από τον δεξιό πίνακα. Ο αριστερός πίνακας στο πλαίσιο των εξωτερικών συνδέσεων είναι αυτός που αναφέρεται από τη FROM ρήτρα, και ο δεξιός πίνακας είναι οποιοσδήποτε πίνακας αναφέρεται μετά τη δήλωση JOIN statement.
Εκτελέστε ξανά το ερώτημα αλλά χρησιμοποιήστε μια LEFT JOIN ρήτρα:
|
1 2 3 |
mysql> SELECT celebration.name, celebration.wins, vacation.birthdate FROM celebration LEFT JOIN vacation ON celebration.name=vacation.name; |
Η εντολή θα επιστρέψει όλες τις εγγραφές από τον αριστερό πίνακα ( celebration) ακόμη και αν δεν έχει αντίστοιχη εγγραφή στον δεξιό πίνακα. Όταν δεν υπάρχει αντίστοιχη εγγραφή στον δεξιό πίνακα, επιστρέφεται ως NULL:
|
1 2 3 4 5 6 7 8 9 10 11 |
+--------+------+------------+ | name | wins | birthdate | +--------+------+------------+ | Austin | 4 | 2002-01-07 | | Ivan | 7 | 2010-12-18 | | Aisha | 10 | 1999-07-24 | | Zane | 13 | 1996-01-01 | | Ella | 1 | NULL | +--------+------+------------+ 5 rows in set (0.00 sec) |
Αυτή είναι τώρα η RIGHT JOIN ρήτρα:
|
1 2 3 |
mysql> SELECT celebration.name, celebration.wins, vacation.birthdate FROM celebration RIGHT JOIN vacation ON celebration.name=vacation.name; |
Όλες οι τιμές από τον δεξιό πίνακα θα επιστραφούν (vacation). Επειδή η birthdate του Peter είναι καταχωρισμένη στον δεξιό πίνακα και όχι στον αριστερό πίνακα, οι στήλες name και wins θα επιστρέψουν NULL τιμές σε αυτές τις σειρές:
|
1 2 3 4 5 6 7 8 9 10 11 |
+--------+------+------------+ | name | wins | birthdate | +--------+------+------------+ | Austin | 4 | 2002-01-07 | | Ivan | 7 | 2010-12-18 | | Aisha | 10 | 1999-07-24 | | Zane | 13 | 1996-01-01 | | NULL | NULL | 1991-05-03 | +--------+------+------------+ 5 γραμμές σε σύνολο (0.01 δευτ.) |
Μπορείτε να χρησιμοποιήσετε τη UNION πρόταση αντί για JOIN για να κάνετε ερώτημα σε εγγραφές από πολλούς πίνακες. Ο UNION τελεστής διαφέρει από την JOIN πρόταση στο ότι συνδυάζει τα αποτελέσματα δύο δηλώσεων SELECT σε μία μόνο στήλη αντί να εκτυπώνει αποτελέσματα από πολλούς πίνακες ως μοναδικές στήλες χρησιμοποιώντας μία μόνο δήλωση SELECT.
Μπορείτε να εκτελέσετε αυτό το ερώτημα για να το δείξετε:
|
1 |
mysql> SELECT name FROM celebration UNION SELECT name FROM vacation; |
Το ερώτημα καταργεί τις διπλότυπες εγγραφές. Αυτή είναι η προεπιλεγμένη συμπεριφορά του UNION τελεστή:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
+--------+ | name | +--------+ | Austin | | Ivan | | Aisha | | Zane | | Ella | | Peter | +--------+ 6 γραμμές σε σύνολο (0.00 δευτ.) |
Για να επιστρέψετε όλες τις εγγραφές (συν τα διπλότυπα) χρησιμοποιήστε τον UNION ALL τελεστή:
|
1 |
mysql> SELECT name FROM celebration UNION ALL SELECT name FROM vacation; |
Έξοδος:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
+--------+ | name | +--------+ | Austin | | Ivan | | Aisha | | Zane | | Ella | | Austin | | Ivan | | Aisha | | Zane | | Peter | +--------+ 10 γραμμές σε σύνολο (0.00 δευτ.) |
Τα υποερωτήματα είναι μια άλλη μέθοδος για την υποβολή ερωτημάτων σε πολλούς πίνακες. Τα υποερωτήματα είναι ερωτήματα που περικλείονται μέσα σε ένα άλλο ερώτημα (επίσης γνωστά ως εσωτερικά ή εμφωλευμένα ερωτήματα). Αυτά είναι χρήσιμα όταν θέλετε να συγκρίνετε τα αποτελέσματα ενός ερωτήματος με τα αποτελέσματα μιας ξεχωριστής συγκεντρωτικής συνάρτησης.
Θα χρησιμοποιήσουμε το παράδειγμα της προσπάθειας να βρούμε ποιος φίλος έχει κερδίσει περισσότερα τουρνουά κολύμβησης από την Ella. Αντί να κάνετε ερώτημα για το πόσους αγώνες έχει κερδίσει η Ella και στη συνέχεια να εκτελέσετε ένα άλλο ερώτημα για να δείτε ποιος έχει κερδίσει περισσότερα παιχνίδια από αυτό, μπορείτε να υπολογίσετε και τα δύο με ένα μόνο ερώτημα:
|
1 2 3 4 |
mysql> SELECT name, wins FROM celebration -> WHERE wins > ( -> SELECT wins FROM celebration WHERE name = 'Ella' -> ); |
Το ερώτημα θα επιστρέψει:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------+ | name | wins | +--------+------+ | Austin | 4 | | Ivan | 7 | | Aisha | 10 | | Zane | 13 | +--------+------+ 4 γραμμές σε σύνολο (0.06 δευτ.) |
Αν θέλατε να πάτε τους φίλους σας σε μια εκδρομή έκπληξη, μπορείτε να χρησιμοποιήσετε ένα ερώτημα για να δείτε ποιος έχει τις περισσότερες νίκες και να επιστρέψετε τον προορισμό του:
|
1 2 3 4 |
mysql> SELECT name, destination, activity, meal -> FROM vacation -> WHERE name = ( SELECT name FROM celebration -> WHERE wins = (SELECT MAX(wins) FROM celebration)); |
Το ερώτημα θα επιστρέψει:
|
1 2 3 4 5 6 7 |
+------+-------------+----------+------+ | name | destination | activity | meal | +------+-------------+----------+------+ | Zane | Bora Bora | fishing | Tofu | +------+-------------+----------+------+ 1 γραμμή σε σύνολο (0.00 δευτ.) |
Αυτή η δήλωση περιέχει ένα υποερώτημα μέσα σε ένα υποερώτημα.
Συμπέρασμα
Η δημιουργία ερωτημάτων είναι μία από τις πιο κοινές εργασίες στη διαχείριση βάσεων δεδομένων. Υπάρχουν διάφορα εργαλεία διαχείρισης βάσεων δεδομένων όπως το phpMyAdmin και το pgAdmin που μπορείτε να χρησιμοποιήσετε για να εργαστείτε με ερωτήματα και να οπτικοποιήσετε τα αποτελέσματά τους. Ωστόσο, η δήλωση SELECT από τη γραμμή εντολών είναι η πιο προτιμώμενη επιλογή λόγω της ευκολίας χρήσης της και του εξαιρετικού ελέγχου που παρέχει.
Επιπλέον, υπάρχουν πολλοί οδηγοί για βάσεις δεδομένων που μπορείτε να εξερευνήσετε από το blog:
- SQLite vs MySQL vs. PostgreSQL: Σύγκριση Συστημάτων Διαχείρισης Σχεσιακών Βάσεων Δεδομένων
- Γρήγορες Λύσεις για την Επισκευή Κατεστραμμένων Πινάκων στη MySQL: Ένας Οδηγός
- Πώς να Εγκαταστήσετε τη MySQL στο Centos 7
- Χρήστης MySQL — Δημιουργία και Εκχώρηση Δικαιωμάτων
- Ρύθμιση Αναπαραγωγής στη MySQL στο Ubuntu
Καλή υπολογιστική!
Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.