# Μάθετε SQL – Ένα σεμινάριο με παραδείγματα κώδικα

Η σύνταξη της SQL βασίζεται στη **σχεσιακή άλγεβρα**, γεγονός που διαφοροποιεί αυτή τη γλώσσα προγραμματισμού από άλλες γλώσσες. Η εξοικείωση με τη σύνταξη μέσω πρακτικών παραδειγμάτων μπορεί να σας βοηθήσει να μάθετε αποτελεσματικά τη SQL.

## Τι είναι η σύνταξη SQL;

Στην προγραμματιστική, ο όρος «σύνταξη» αναφέρεται στον **τρόπο με τον οποίο γράφεται μια γλώσσα προγραμματισμού**. Η σύνταξη καθορίζει τις βασικές δομές του κώδικα και τον τρόπο με τον οποίο αυτές συνδέονται μεταξύ τους. Η κατανόηση της σύνταξης αποτελεί βασική προϋπόθεση για την ανάγνωση και τη σύνταξη κώδικα σε γλώσσες προγραμματισμού.

Οι σημαντικότερες συντακτικές δομές της SQL είναι **οι εντολές SQL, οι οποίες μπορεί επίσης να περιλαμβάνουν ρήτρες**. Και οι δύο αναφέρονται συνήθως ως «εντολές SQL», αν και, από τεχνική άποψη, αυτό δεν είναι απολύτως ακριβές. Ωστόσο, αυτές δεν είναι οι μόνες συντακτικές δομές της SQL. Παρακάτω θα βρείτε έναν πίνακα που σας παρέχει μια γενική εικόνα των συντακτικών δομών της SQL.

<table>
  <thead>
    <tr>
      <th><strong>Όρος SQL</strong></th>
      <th><strong>Επεξήγηση</strong></th>
      <th><strong>Παράδειγμα</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Δήλωση</td>
      <td>Δίνει εντολή στο DBMS να εκτελέσει μια ενέργεια· τελειώνει με ερωτηματικό</td>
      <td>`CREATE TABLE People;`</td>
    </tr>
    <tr>
      <td>Ρήτρα</td>
      <td>Τροποποιεί μια δήλωση· μπορεί να εμφανιστεί μόνο μέσα σε δηλώσεις</td>
      <td>`WHERE, HAVING`</td>
    </tr>
    <tr>
      <td>Έκφραση</td>
      <td>Επιστρέφει μια τιμή κατά την αξιολόγηση</td>
      <td>`6 * 7`</td>
    </tr>
    <tr>
      <td>Αναγνωριστικό</td>
      <td>Όνομα αντικειμένου βάσης δεδομένων, μεταβλητής ή διαδικασίας· μπορεί να είναι προσδιορισμένο ή μη προσδιορισμένο</td>
      <td>`dbname.tablename / tablename`</td>
    </tr>
    <tr>
      <td>Προτάση</td>
      <td>Έκφραση που αποτιμάται σε `TRUE, FALSE` ή `UNKNOWN`</td>
      <td>`Age < 42`</td>
    </tr>
    <tr>
      <td>Ερώτηση</td>
      <td>Ειδική δήλωση· επιστρέφει το σύνολο των εγγραφών που βρέθηκαν</td>
      <td>`SELECT Name FROM People WHERE Age < 42;`</td>
    </tr>
    <tr>
      <td>Συνάρτηση</td>
      <td>Επεξεργάζεται μία ή περισσότερες τιμές· συνήθως δημιουργεί μια νέα τιμή</td>
      <td>`UPPER('text') -- returns 'TEXT'`</td>
    </tr>
    <tr>
      <td>Σχόλιο</td>
      <td>Χρησιμοποιείται για να σχολιάσει κώδικα SQL· αγνοείται από το RDBMS</td>
      <td>`-- Comment up to end of line / /*multiline comment if necessary*/`</td>
    </tr>
  </tbody>
</table>

Note Οι εντολές SQL όπως SELECT και CREATE TABLE συνήθως γράφονται με κεφαλαία. Ωστόσο, η SQL δεν κάνει διάκριση μεταξύ κεφαλαίων και μικρών γραμμάτων. Η χρήση κεφαλαίων στις εντολές αποτελεί απλώς μια ευρέως διαδεδομένη σύμβαση.

## Πώς εκτελείται ο κώδικας SQL;

Ο κώδικας SQL υπάρχει ως πηγαίος κώδικας σε αρχεία κειμένου. Ο κώδικας αποκτά ζωή μόνο μέσα σε ένα κατάλληλο περιβάλλον εκτέλεσης. Ο πηγαίος κώδικας διαβάζεται από έναν **διερμηνέα SQL** και μετατρέπεται σε ενέργειες ενός RDBMS. Υπάρχουν δύο βασικές προσεγγίσεις σε αυτό το πλαίσιο:

**1. Εκτέλεση κώδικα SQL**διαδραστικά Σε αυτή την προσέγγιση, ο κώδικας SQL εισάγεται ή αντιγράφεται απευθείας σε ένα παράθυρο κειμένου. Ο κώδικας SQL εκτελείται και εμφανίζεται το αποτέλεσμα. Μπορείτε να τροποποιήσετε τον κώδικα και να τον εκτελέσετε ξανά. Η γρήγορη εναλλαγή μεταξύ επεξεργασίας κώδικα και εμφάνισης αποτελεσμάτων καθιστά αυτή την προσέγγιση ιδανική για την εκμάθηση και τη δημιουργία σύνθετων ερωτημάτων. **2. Εκτέλεση κώδικα SQL ως**σενάριο Σε αυτή την προσέγγιση, ένα ολόκληρο αρχείο πηγαίου κώδικα που περιέχει κώδικα SQL εκτελείται γραμμή προς γραμμή. Εάν είναι απαραίτητο, η ανατροφοδότηση αποστέλλεται στον χρήστη μόνο στο τέλος της εκτέλεσης. Αυτή η προσέγγιση είναι η πιο κατάλληλη για την αυτοματοποίηση διαδικασιών και για την εισαγωγή αντιγράφων ασφαλείας βάσεων δεδομένων MySQL με το MySQL dump.

<table>
  <thead>
    <tr>
      <th><strong>Διεπαφή</strong></th>
      <th><strong>Περιγραφή</strong></th>
      <th><strong>Παραδείγματα</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Διεπαφή γραμμής εντολών (CLI)</td>
      <td>Διεπαφή βασισμένη σε κείμενο· ο κώδικας SQL εισάγεται και εκτελείται, το αποτέλεσμα εμφανίζεται σε κείμενο</td>
      <td>mysql, psql, mysqlsh</td>
    </tr>
    <tr>
      <td>Γραφική διεπαφή χρήστη (GUI)</td>
      <td>Ο κώδικας SQL εισάγεται σε παράθυρο κειμένου και/ή δημιουργείται ως απόκριση στην αλληλεπίδραση του χρήστη. Ο κώδικας SQL εκτελείται και το αποτέλεσμα εμφανίζεται ως πίνακες</td>
      <td>phpMyAdmin, MySQL Workbench, HeidiSQL</td>
    </tr>
    <tr>
      <td>Διεπαφή προγραμματισμού εφαρμογών (API)</td>
      <td>Επιτρέπει την άμεση επικοινωνία με ένα RDBMS. Ο κώδικας SQL περιλαμβάνεται και εκτελείται ως συμβολοσειρά στον κώδικα της γλώσσας προγραμματισμού. Τα αποτελέσματα διατίθενται ως δομές δεδομένων για περαιτέρω χρήση</td>
      <td>PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API</td>
    </tr>
  </tbody>
</table>

## Πώς να δημιουργήσετε ένα σύστημα διαχείρισης προϊόντων χρησιμοποιώντας SQL

Ο ευκολότερος τρόπος για να μάθετε μια γλώσσα προγραμματισμού είναι να γράψετε και να εκτελέσετε τον κώδικα μόνοι σας. Σε αυτό το σεμινάριο, θα **δημιουργήσουμε μια μίνι βάση δεδομένων και θα εκτελέσουμε ερωτήματα σε αυτήν**. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε τον [διαδικτυακό διερμηνέα SQL](https://sql.js.org/examples/GUI/ "sql.js demo: Online SQL interpreter") από τον ιστότοπο *sql.js*. Για να ακολουθήσετε το σεμινάριο, μεταβείτε στον ιστότοπο και αντικαταστήστε τον κώδικα SQL που έχει ήδη εισαχθεί με τον κώδικα από τα παραδείγματά μας. Εκτελέστε τον κώδικα τμηματικά για να εμφανιστούν τα αποτελέσματα.

### Δημιουργία βάσης δεδομένων SQL

Σε αυτό το παράδειγμα, θα δημιουργήσουμε ένα **σύστημα διαχείρισης** εμπορικών **προϊόντων** για ένα κατάστημα. Αυτές είναι οι απαιτήσεις:

- Υπάρχουν διάφορα προϊόντα και διαθέτουμε μια συγκεκριμένη ποσότητα από κάθε προϊόν σε απόθεμα.
- Το πελατολόγιό μας περιλαμβάνει πολλούς πελάτες.
- Οι παραγγελίες που υποβάλλονται από τους πελάτες μπορεί να περιλαμβάνουν διάφορα προϊόντα.
- Για κάθε παραγγελία, αποθηκεύουμε την ημερομηνία της παραγγελίας και τα στοιχεία του ατόμου που την υποβάλλει, καθώς και τα προϊόντα που παραγγέλθηκαν και την ποσότητα που παραγγέλθηκε.

Αυτές οι απαιτήσεις μετατρέπονται σε μια **αφηρημένη περιγραφή και στη συνέχεια σε κώδικα SQL**:

1. Δημιουργία μοντέλου
2. Ορισμός σχήματος
3. Εισαγωγή εγγραφών δεδομένων
4. Ορισμός ερωτημάτων

### Δημιουργία μοντέλου οντοτήτων και σχέσεων

Το πρώτο βήμα πραγματοποιείται σε χαρτί ή με ειδικά εργαλεία μοντελοποίησης. Συλλέγουμε πληροφορίες σχετικά με το σύστημα που πρόκειται να **μοντελοποιήσουμε, προκειμένου να προσδιορίσουμε τις οντότητες και τις σχέσεις**. Αυτό το βήμα συχνά υλοποιείται με τη μορφή διαγράμματος οντοτήτων-σχέσεων (ER).

Ποιες οντότητες υπάρχουν και πώς συνδέονται μεταξύ τους; **Οι οντότητες είναι κατηγορίες αντικειμένων**. Στο παράδειγμά μας με το σύστημα διαχείρισης προϊόντων, οι οντότητες είναι τα προϊόντα, οι πελάτες και οι παραγγελίες. Για κάθε οντότητα απαιτείται ένας πίνακας. Λόγω των ιδιαιτεροτήτων του σχεσιακού μοντέλου, προστίθενται επιπλέον πίνακες για την αποτύπωση των σχέσεων. Η κατανόηση αυτού του γεγονότος και η σωστή εφαρμογή του απαιτούν εμπειρία.

Ένα βασικό ερώτημα που πρέπει να απαντηθεί είναι πώς συνδέονται μεταξύ τους οι οντότητες. Εδώ πρέπει να λάβουμε υπόψη **και τις δύο κατευθύνσεις μιας σχέσης** και να κάνουμε διάκριση μεταξύ **ενικού και πληθυντικού**. Ακολουθεί ένα παράδειγμα με αυτοκίνητα και ιδιοκτήτες αυτοκινήτων:

1. Ένας ιδιοκτήτης μπορεί ενδεχομένως να έχει στην κατοχή του περισσότερα από ένα αυτοκίνητα.
2. Ένα αυτοκίνητο μπορεί να ανήκει μόνο σε έναν ιδιοκτήτη.

Αναδύονται**τρία πιθανά μοντέλα σχέσεων** μεταξύ των δύο οντοτήτων:

<table>
  <thead>
    <tr>
      <th><strong>Σχέση</strong></th>
      <th><strong>Οντότητες</strong></th>
      <th><strong>Από τα αριστερά</strong></th>
      <th><strong>Από τα δεξιά</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Σχέση 1:1</td>
      <td>Αυτόματο:δείκτης</td>
      <td>Ένα αυτοκίνητο μπορεί να έχει μόνο έναν δείκτη.</td>
      <td>Ένας δείκτης μπορεί να ανήκει μόνο σε ένα αυτοκίνητο.</td>
    </tr>
    <tr>
      <td>Σχέση 1:n</td>
      <td>Ιδιοκτήτης:αυτοκίνητο</td>
      <td>Ένας ιδιοκτήτης μπορεί ενδεχομένως να έχει πολλά αυτοκίνητα.</td>
      <td>Ένα αυτοκίνητο μπορεί να ανήκει μόνο σε έναν ιδιοκτήτη.</td>
    </tr>
    <tr>
      <td>Σχέση m:n</td>
      <td>Αυτοκίνητο:δρόμος</td>
      <td>Ένα αυτοκίνητο μπορεί να κυκλοφορεί σε πολλούς δρόμους.</td>
      <td>Πολλά αυτοκίνητα μπορούν να κινούνται σε έναν δρόμο.</td>
    </tr>
  </tbody>
</table>

### Εφαρμογή προϊόντων

Πρώτα, θα δημιουργήσουμε τον πίνακα «products». Για να το κάνουμε αυτό, πρέπει να ορίσουμε ένα σχήμα, να εισαγάγουμε εγγραφές δεδομένων και, για δοκιμαστικούς σκοπούς, να εκτελέσουμε μερικές απλές ερωτήσεις.

#### Ορισμός σχήματος

Η βασική εντολή SQL για τον ορισμό πινάκων βάσεων δεδομένων είναι η CREATE TABLE. Αυτή η εντολή σας επιτρέπει να **δημιουργήσετε έναν πίνακα με ένα όνομα και να καθορίσετε τις ιδιότητες των στηλών**. Ταυτόχρονα, ορίζονται οι τύποι δεδομένων και, αν χρειαστεί, οι περιορισμοί στις τιμές που θα αποθηκευτούν:

```sql
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );
```

Note Χρησιμοποιούμε την εντολή DROP TABLE IF EXISTS πριν ορίσουμε τον πίνακα. Αυτό διαγράφει τυχόν υπάρχοντα πίνακα και επιτρέπει την εκτέλεση του ίδιου κώδικα SQL πολλές φορές χωρίς να προκαλεί μηνύματα σφάλματος.

#### Προσθήκη συνόλων δεδομένων

Τώρα, θα δημιουργήσουμε μερικές **δοκιμαστικές εγγραφές**. Θα χρησιμοποιήσουμε την εντολή SQL INSERT INTO καθώς και τη συνάρτηση VALUES για να συμπληρώσουμε τα πεδία:

```sql
INSERT INTO Products VALUES (10, 'ABC Product', 74, 1050);
INSERT INTO Products VALUES (20, 'KLM Product', 23, 750);
INSERT INTO Products VALUES (30, 'XYZ Product', 104, 350);
```

#### Ορισμός ερωτημάτων

Για **να ελέγξουμε την κατάσταση του πίνακα «Προϊόντα»**, θα γράψουμε ένα απλό ερώτημα. Χρησιμοποιούμε την εντολή SELECT FROM και εμφανίζουμε ολόκληρο τον πίνακα:

```sql
SELECT * FROM Products;
```

Τώρα, θα γράψουμε ένα ερώτημα λίγο πιο σύνθετο, το οποίο υπολογίζει τη **συνολική αξία των προϊόντων που έχουμε σε απόθεμα**:

```sql
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;
```

### Δημιουργία επιπλέον πινάκων

Στη συνέχεια, θα **δημιουργήσουμε τους υπόλοιπους πίνακες που χρειαζόμαστε**. Θα ακολουθήσουμε τα ίδια βήματα που ακολουθήσαμε για τον πίνακα «Προϊόντα». Πρώτα, δημιουργούμε τον πίνακα «Πελάτες»:

```sql
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );
```

Στη συνέχεια, εισάγουμε εγγραφές δεδομένων για δύο δείγματα πελατών:

```sql
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');
```

Για να δούμε αν πέτυχε, θα εμφανίσουμε τον πίνακα πελατών:

```sql
SELECT * FROM Customers;
```

Το επόμενο βήμα είναι να δημιουργήσουμε τον πίνακα «Orders»:

```sql
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );
```

Τώρα, θα **εισαγάγουμε τρεις δείγματα παραγγελιών αγοράς**. Για την πρώτη τιμή των εγγραφών, θα ορίσουμε ένα αναγνωριστικό ως πρωτεύον κλειδί. Η δεύτερη τιμή αφορά τα αναγνωριστικά υφιστάμενων πελατών, τα οποία λειτουργούν ως ξένα κλειδιά. Στη συνέχεια, αποθηκεύουμε την ημερομηνία της παραγγελίας:

```sql
INSERT INTO Orders VALUES (1000, 100, '2022-05-03');
INSERT INTO Orders VALUES (1001, 100, '2022-05-04');
INSERT INTO Orders VALUES (1002, 200, '2022-05-08');
```

Για να το δοκιμάσουμε, θα εκτελέσουμε τις εντολές:

```sql
SELECT * FROM Orders;
```

Τέλος, χρειαζόμαστε έναν πίνακα για τα **προϊόντα που περιλαμβάνονται σε μια παραγγελία, μαζί με την ποσότητά τους**. Πρόκειται για μια σχέση m:n, καθώς μια παραγγελία μπορεί να περιλαμβάνει πολλά προϊόντα και ένα προϊόν μπορεί να εμφανίζεται σε πολλές παραγγελίες. Θα ορίσουμε έναν πίνακα που θα περιέχει τα αναγνωριστικά των παραγγελιών και των προϊόντων ως ξένα κλειδιά:

```sql
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );
```

Τώρα, θα εισαγάγουμε μερικά προϊόντα που έχουν παραγγελθεί. Θα επιλέξουμε τους κωδικούς των παραγγελιών και των προϊόντων έτσι ώστε να υπάρχει μια παραγγελία με δύο προϊόντα και μια άλλη παραγγελία με ένα μόνο προϊόν:

```sql
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);
```

Για να το ελέγξουμε αυτό, θα εκδώσουμε τα προϊόντα που παραγγέλθηκαν:

```sql
SELECT * FROM OrderItems;
```

### Σύνταξη σύνθετων ερωτημάτων

Αν έχετε εκτελέσει όλα τα αποσπάσματα κώδικα που παρουσιάστηκαν μέχρι τώρα, θα πρέπει να έχετε κατανοήσει τη δομή της δοκιμαστικής βάσης δεδομένων μας. Τώρα ας προχωρήσουμε σε πιο σύνθετες ερωτήσεις που αναδεικνύουν τη δύναμη της SQL. Αρχικά, ας **γράψουμε μια ερώτηση που συγχωνεύει δεδομένα που βρίσκονται κατανεμημένα σε πολλούς πίνακες**. Θα χρησιμοποιήσουμε μια εντολή SQL JOIN για να ενώσουμε τους πίνακες που περιέχουν τα δεδομένα πελατών και τις παραγγελίες. Κατά τη διαδικασία αυτή, θα ονομάσουμε τις στήλες και θα ορίσουμε ένα αντίστοιχο αναγνωριστικό πελάτη ως συνθήκη JOIN. Λάβετε υπόψη ότι χρησιμοποιούμε προσδιορισμένους αναγνωριστικούς για να διακρίνουμε τις στήλες των δύο πινάκων:

```sql
SELECT customers.customer_name as 'Customer', customers.customer_id, orders.order_id, orders.order_date AS 'Date' FROM Customers JOIN Orders ON Orders.customer_id = Customers.customer_id ORDER BY Customers.customer_id;
```

Τώρα, θα χρησιμοποιήσουμε μια άλλη εντολή JOIN για να υπολογίσουμε το **συνολικό κόστος των προϊόντων που έχουν παραγγελθεί**:

```sql
SELECT OrderItems.order_id, OrderItems.orderitem_id AS 'Order Item', Products.product_name AS 'Product', Products.price AS 'Unit Price', OrderItems.count AS 'Count', (OrderItems.count * Products.price) AS 'Total' FROM OrderItems JOIN Products ON OrderItems.product_id = Products.product_id;
```

Tip Θέλετε να μάθετε περισσότερα για [το τι είναι η SQL](https://www.ionos.com/el-gr/digitalguide/diakomistis/rythmiseis/eisagogi-stin-sql-me-paradeigmata/) ή χρειάζεστε βοήθεια για να λύσετε ένα πρόβλημα που σχετίζεται με τη γλώσσα βάσεων δεδομένων; Ή μήπως απλώς θέλετε να διευρύνετε τις γνώσεις σας σχετικά με την SQL; Όποια και αν είναι η περίπτωση, μπορείτε να βρείτε μια σειρά από άρθρα για την SQL και το MySQL στον Ψηφιακό Οδηγό μας:

- Εκπαιδευτικό υλικό για το MySQL
- MariaDB έναντι MySQL
- Πώς να εγκαταστήσετε και να χρησιμοποιήσετε το MariaDB/MySQL
- Σύνδεση σε βάση δεδομένων MySQL/MariaDB με PHP σε διακομιστή cloud που λειτουργεί με Linux
- Επίλυση του σφάλματος «Too many connections» (Πάρα πολλές συνδέσεις) του MySQL/MariaDB
- Πώς να επαναφέρετε τον κωδικό πρόσβασης root του MySQL/MariaDB


This is a markdown version of: [https://www.ionos.com/el-gr/digitalguide/diakomistis/rythmiseis/eisagogi-stin-sql-me-paradeigmata/](https://www.ionos.com/el-gr/digitalguide/diakomistis/rythmiseis/eisagogi-stin-sql-me-paradeigmata/) for AI/LLM consumption.