# Εργασία με Δεδομένα: Σχεσιακές Βάσεις Δεδομένων |![ Σκίτσο από [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/05-RelationalData.png)| |:---:| | Εργασία με Δεδομένα: Σχεσιακές Βάσεις Δεδομένων - _Σκίτσο από [@nitya](https://twitter.com/nitya)_ | Πιθανότατα έχετε χρησιμοποιήσει στο παρελθόν ένα υπολογιστικό φύλλο για να αποθηκεύσετε πληροφορίες. Είχατε ένα σύνολο από γραμμές και στήλες, όπου οι γραμμές περιείχαν τις πληροφορίες (ή δεδομένα) και οι στήλες περιέγραφαν τις πληροφορίες (μερικές φορές ονομάζονται μεταδεδομένα). Μια σχεσιακή βάση δεδομένων βασίζεται σε αυτή τη βασική αρχή των στηλών και γραμμών σε πίνακες, επιτρέποντάς σας να έχετε πληροφορίες κατανεμημένες σε πολλούς πίνακες. Αυτό σας δίνει τη δυνατότητα να εργάζεστε με πιο σύνθετα δεδομένα, να αποφεύγετε την επανάληψη και να έχετε ευελιξία στον τρόπο εξερεύνησης των δεδομένων. Ας εξερευνήσουμε τις έννοιες μιας σχεσιακής βάσης δεδομένων. ## [Κουίζ πριν τη διάλεξη](https://ff-quizzes.netlify.app/en/ds/quiz/8) ## Όλα ξεκινούν από τους πίνακες Μια σχεσιακή βάση δεδομένων έχει ως πυρήνα της τους πίνακες. Όπως και με το υπολογιστικό φύλλο, ένας πίνακας είναι μια συλλογή από στήλες και γραμμές. Η γραμμή περιέχει τα δεδομένα ή τις πληροφορίες με τις οποίες θέλουμε να εργαστούμε, όπως το όνομα μιας πόλης ή την ποσότητα βροχόπτωσης. Οι στήλες περιγράφουν τα δεδομένα που αποθηκεύουν. Ας ξεκινήσουμε την εξερεύνησή μας δημιουργώντας έναν πίνακα για την αποθήκευση πληροφοριών σχετικά με πόλεις. Θα μπορούσαμε να ξεκινήσουμε με το όνομά τους και τη χώρα τους. Θα μπορούσατε να τα αποθηκεύσετε σε έναν πίνακα όπως ο παρακάτω: | Πόλη | Χώρα | | -------- | ------------- | | Τόκιο | Ιαπωνία | | Ατλάντα | Ηνωμένες Πολιτείες | | Όκλαντ | Νέα Ζηλανδία | Παρατηρήστε ότι τα ονόματα των στηλών **Πόλη**, **Χώρα** και **Πληθυσμός** περιγράφουν τα δεδομένα που αποθηκεύονται, και κάθε γραμμή έχει πληροφορίες για μία πόλη. ## Οι περιορισμοί της προσέγγισης ενός πίνακα Πιθανότατα, ο παραπάνω πίνακας σας φαίνεται αρκετά οικείος. Ας προσθέσουμε κάποια επιπλέον δεδομένα στη βάση δεδομένων μας που αναπτύσσεται - την ετήσια βροχόπτωση (σε χιλιοστά). Θα επικεντρωθούμε στα έτη 2018, 2019 και 2020. Αν προσθέταμε αυτά τα δεδομένα για το Τόκιο, θα μπορούσε να μοιάζει κάπως έτσι: | Πόλη | Χώρα | Έτος | Ποσότητα | | ----- | ------- | ---- | -------- | | Τόκιο | Ιαπωνία | 2020 | 1690 | | Τόκιο | Ιαπωνία | 2019 | 1874 | | Τόκιο | Ιαπωνία | 2018 | 1445 | Τι παρατηρείτε στον πίνακά μας; Ίσως παρατηρήσετε ότι επαναλαμβάνουμε το όνομα και τη χώρα της πόλης ξανά και ξανά. Αυτό θα μπορούσε να καταναλώσει αρκετό αποθηκευτικό χώρο και είναι σε μεγάλο βαθμό περιττό να έχουμε πολλαπλά αντίγραφα. Εξάλλου, το Τόκιο έχει μόνο ένα όνομα που μας ενδιαφέρει. Εντάξει, ας δοκιμάσουμε κάτι άλλο. Ας προσθέσουμε νέες στήλες για κάθε έτος: | Πόλη | Χώρα | 2018 | 2019 | 2020 | | -------- | ------------- | ---- | ---- | ---- | | Τόκιο | Ιαπωνία | 1445 | 1874 | 1690 | | Ατλάντα | Ηνωμένες Πολιτείες | 1779 | 1111 | 1683 | | Όκλαντ | Νέα Ζηλανδία | 1386 | 942 | 1176 | Ενώ αυτό αποφεύγει την επανάληψη των γραμμών, προσθέτει μερικές άλλες προκλήσεις. Θα έπρεπε να τροποποιούμε τη δομή του πίνακά μας κάθε φορά που υπάρχει ένα νέο έτος. Επιπλέον, καθώς τα δεδομένα μας αυξάνονται, η χρήση των ετών ως στηλών θα κάνει πιο δύσκολη την ανάκτηση και τον υπολογισμό τιμών. Γι' αυτό χρειαζόμαστε πολλούς πίνακες και σχέσεις. Διαχωρίζοντας τα δεδομένα μας, μπορούμε να αποφύγουμε την επανάληψη και να έχουμε μεγαλύτερη ευελιξία στον τρόπο που εργαζόμαστε με αυτά. ## Οι έννοιες των σχέσεων Ας επιστρέψουμε στα δεδομένα μας και ας καθορίσουμε πώς θέλουμε να τα διαχωρίσουμε. Γνωρίζουμε ότι θέλουμε να αποθηκεύσουμε το όνομα και τη χώρα για τις πόλεις μας, οπότε αυτό πιθανότατα θα λειτουργήσει καλύτερα σε έναν πίνακα. | Πόλη | Χώρα | | -------- | ------------- | | Τόκιο | Ιαπωνία | | Ατλάντα | Ηνωμένες Πολιτείες | | Όκλαντ | Νέα Ζηλανδία | Αλλά πριν δημιουργήσουμε τον επόμενο πίνακα, πρέπει να βρούμε πώς να αναφερόμαστε σε κάθε πόλη. Χρειαζόμαστε κάποια μορφή αναγνωριστικού, ID ή (σε τεχνικούς όρους βάσεων δεδομένων) πρωτεύον κλειδί. Ένα πρωτεύον κλειδί είναι μια τιμή που χρησιμοποιείται για να αναγνωρίσει μια συγκεκριμένη γραμμή σε έναν πίνακα. Ενώ αυτό θα μπορούσε να βασίζεται σε μια τιμή (θα μπορούσαμε να χρησιμοποιήσουμε το όνομα της πόλης, για παράδειγμα), θα πρέπει σχεδόν πάντα να είναι ένας αριθμός ή άλλος αναγνωριστικός δείκτης. Δεν θέλουμε το ID να αλλάζει ποτέ, καθώς αυτό θα έσπαγε τη σχέση. Στις περισσότερες περιπτώσεις, το πρωτεύον κλειδί ή ID θα είναι ένας αυτόματα παραγόμενος αριθμός. > ✅ Το πρωτεύον κλειδί συχνά συντομογραφείται ως PK ### πόλεις | city_id | Πόλη | Χώρα | | ------- | -------- | ------------- | | 1 | Τόκιο | Ιαπωνία | | 2 | Ατλάντα | Ηνωμένες Πολιτείες | | 3 | Όκλαντ | Νέα Ζηλανδία | > ✅ Θα παρατηρήσετε ότι χρησιμοποιούμε τους όρους "id" και "πρωτεύον κλειδί" εναλλάξ κατά τη διάρκεια αυτού του μαθήματος. Οι έννοιες αυτές ισχύουν και για τα DataFrames, τα οποία θα εξερευνήσετε αργότερα. Τα DataFrames δεν χρησιμοποιούν την ορολογία "πρωτεύον κλειδί", ωστόσο θα παρατηρήσετε ότι λειτουργούν με παρόμοιο τρόπο. Με τον πίνακα πόλεων μας δημιουργημένο, ας αποθηκεύσουμε τη βροχόπτωση. Αντί να επαναλαμβάνουμε τις πλήρεις πληροφορίες για την πόλη, μπορούμε να χρησιμοποιήσουμε το ID. Θα πρέπει επίσης να διασφαλίσουμε ότι ο νεοδημιουργημένος πίνακας έχει μια στήλη *id*, καθώς όλοι οι πίνακες πρέπει να έχουν ένα ID ή πρωτεύον κλειδί. ### βροχόπτωση | rainfall_id | city_id | Έτος | Ποσότητα | | ----------- | ------- | ---- | -------- | | 1 | 1 | 2018 | 1445 | | 2 | 1 | 2019 | 1874 | | 3 | 1 | 2020 | 1690 | | 4 | 2 | 2018 | 1779 | | 5 | 2 | 2019 | 1111 | | 6 | 2 | 2020 | 1683 | | 7 | 3 | 2018 | 1386 | | 8 | 3 | 2019 | 942 | | 9 | 3 | 2020 | 1176 | Παρατηρήστε τη στήλη **city_id** στον νεοδημιουργημένο πίνακα **βροχόπτωση**. Αυτή η στήλη περιέχει τιμές που αναφέρονται στα IDs στον πίνακα **πόλεις**. Σε τεχνικούς όρους σχεσιακών δεδομένων, αυτό ονομάζεται **ξένο κλειδί**. Μπορείτε απλά να το σκεφτείτε ως μια αναφορά ή έναν δείκτη. Το **city_id** 1 αναφέρεται στο Τόκιο. > [!NOTE] Το ξένο κλειδί συχνά συντομογραφείται ως FK ## Ανάκτηση δεδομένων Με τα δεδομένα μας χωρισμένα σε δύο πίνακες, ίσως αναρωτιέστε πώς τα ανακτούμε. Αν χρησιμοποιούμε μια σχεσιακή βάση δεδομένων όπως MySQL, SQL Server ή Oracle, μπορούμε να χρησιμοποιήσουμε μια γλώσσα που ονομάζεται Δομημένη Γλώσσα Ερωτημάτων ή SQL. Η SQL (μερικές φορές προφέρεται "σίκουελ") είναι μια τυποποιημένη γλώσσα που χρησιμοποιείται για την ανάκτηση και τροποποίηση δεδομένων σε μια σχεσιακή βάση δεδομένων. Για να ανακτήσετε δεδομένα, χρησιμοποιείτε την εντολή `SELECT`. Στον πυρήνα της, επιλέγετε τις στήλες που θέλετε να δείτε **από** τον πίνακα στον οποίο περιέχονται. Αν θέλατε να εμφανίσετε μόνο τα ονόματα των πόλεων, θα μπορούσατε να χρησιμοποιήσετε το εξής: ```sql SELECT city FROM cities; -- Output: -- Tokyo -- Atlanta -- Auckland ``` Το `SELECT` είναι όπου παραθέτετε τις στήλες και το `FROM` είναι όπου παραθέτετε τους πίνακες. > [NOTE] Η σύνταξη της SQL δεν κάνει διάκριση πεζών-κεφαλαίων, που σημαίνει ότι το `select` και το `SELECT` είναι το ίδιο. Ωστόσο, ανάλογα με τον τύπο της βάσης δεδομένων που χρησιμοποιείτε, οι στήλες και οι πίνακες μπορεί να κάνουν διάκριση πεζών-κεφαλαίων. Ως αποτέλεσμα, είναι καλή πρακτική να αντιμετωπίζετε τα πάντα στον προγραμματισμό σαν να κάνουν διάκριση πεζών-κεφαλαίων. Όταν γράφετε ερωτήματα SQL, η κοινή σύμβαση είναι να γράφετε τις λέξεις-κλειδιά με κεφαλαία γράμματα. Το παραπάνω ερώτημα θα εμφανίσει όλες τις πόλεις. Ας φανταστούμε ότι θέλουμε να εμφανίσουμε μόνο τις πόλεις της Νέας Ζηλανδίας. Χρειαζόμαστε κάποια μορφή φίλτρου. Η λέξη-κλειδί της SQL για αυτό είναι το `WHERE`, ή "όπου κάτι είναι αληθές". ```sql SELECT city FROM cities WHERE country = 'New Zealand'; -- Output: -- Auckland ``` ## Συνένωση δεδομένων Μέχρι τώρα έχουμε ανακτήσει δεδομένα από έναν μόνο πίνακα. Τώρα θέλουμε να συνδυάσουμε τα δεδομένα από τους πίνακες **πόλεις** και **βροχόπτωση**. Αυτό γίνεται με τη *συνένωση* τους. Ουσιαστικά θα δημιουργήσετε μια σύνδεση μεταξύ των δύο πινάκων και θα αντιστοιχίσετε τις τιμές από μια στήλη κάθε πίνακα. Στο παράδειγμά μας, θα αντιστοιχίσουμε τη στήλη **city_id** στον πίνακα **βροχόπτωση** με τη στήλη **city_id** στον πίνακα **πόλεις**. Αυτό θα αντιστοιχίσει την τιμή της βροχόπτωσης με την αντίστοιχη πόλη. Ο τύπος συνένωσης που θα εκτελέσουμε ονομάζεται *εσωτερική* συνένωση, που σημαίνει ότι αν οποιαδήποτε γραμμή δεν αντιστοιχεί με τίποτα από τον άλλο πίνακα, δεν θα εμφανιστεί. Στην περίπτωσή μας, κάθε πόλη έχει δεδομένα βροχόπτωσης, οπότε όλα θα εμφανιστούν. Ας ανακτήσουμε τη βροχόπτωση για το 2019 για όλες τις πόλεις μας. Θα το κάνουμε αυτό σε βήματα. Το πρώτο βήμα είναι να συνενώσουμε τα δεδομένα υποδεικνύοντας τις στήλες για τη σύνδεση - **city_id** όπως τονίστηκε προηγουμένως. ```sql SELECT cities.city rainfall.amount FROM cities INNER JOIN rainfall ON cities.city_id = rainfall.city_id ``` Έχουμε τονίσει τις δύο στήλες που θέλουμε και το γεγονός ότι θέλουμε να συνενώσουμε τους πίνακες μέσω της **city_id**. Τώρα μπορούμε να προσθέσουμε τη δήλωση `WHERE` για να φιλτράρουμε μόνο το έτος 2019. ```sql SELECT cities.city rainfall.amount FROM cities INNER JOIN rainfall ON cities.city_id = rainfall.city_id WHERE rainfall.year = 2019 -- Output -- city | amount -- -------- | ------ -- Tokyo | 1874 -- Atlanta | 1111 -- Auckland | 942 ``` ## Περίληψη Οι σχεσιακές βάσεις δεδομένων βασίζονται στον διαχωρισμό των πληροφοριών σε πολλούς πίνακες, οι οποίοι στη συνέχεια συνδυάζονται για εμφάνιση και ανάλυση. Αυτό παρέχει υψηλό βαθμό ευελιξίας για την εκτέλεση υπολογισμών και άλλες επεξεργασίες δεδομένων. Είδατε τις βασικές έννοιες μιας σχεσιακής βάσης δεδομένων και πώς να εκτελέσετε μια συνένωση μεταξύ δύο πινάκων. ## 🚀 Πρόκληση Υπάρχουν πολλές σχεσιακές βάσεις δεδομένων διαθέσιμες στο διαδίκτυο. Μπορείτε να εξερευνήσετε τα δεδομένα χρησιμοποιώντας τις δεξιότητες που μάθατε παραπάνω. ## Κουίζ μετά τη διάλεξη ## [Κουίζ μετά τη διάλεξη](https://ff-quizzes.netlify.app/en/ds/quiz/9) ## Ανασκόπηση & Αυτομελέτη Υπάρχουν αρκετοί πόροι διαθέσιμοι στο [Microsoft Learn](https://docs.microsoft.com/learn?WT.mc_id=academic-77958-bethanycheum) για να συνεχίσετε την εξερεύνηση της SQL και των εννοιών σχεσιακών βάσεων δεδομένων. - [Περιγραφή εννοιών σχεσιακών δεδομένων](https://docs.microsoft.com//learn/modules/describe-concepts-of-relational-data?WT.mc_id=academic-77958-bethanycheum) - [Ξεκινήστε να κάνετε ερωτήματα με Transact-SQL](https://docs.microsoft.com//learn/paths/get-started-querying-with-transact-sql?WT.mc_id=academic-77958-bethanycheum) (Το Transact-SQL είναι μια έκδοση της SQL) - [Περιεχόμενο SQL στο Microsoft Learn](https://docs.microsoft.com/learn/browse/?products=azure-sql-database%2Csql-server&expanded=azure&WT.mc_id=academic-77958-bethanycheum) ## Εργασία [Τίτλος Εργασίας](assignment.md) --- **Αποποίηση ευθύνης**: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.