Ενότητα 5: Εισαγωγή στις Βάσεις Δεδομένων

Διασύνδεση με PHP | MySQL | phpMyAdmin

5.1 Αντικειμενοστραφής Προγραμματισμός στη PHP

🔹 1️⃣ Τι είναι "αντικειμενοστραφής προγραμματισμός" (Object-Oriented Programming – OOP);

Είναι τρόπος γραφής προγράμματος όπου οργανώνουμε τον κώδικα σαν "αντικείμενα" που:

👉 Δηλαδή:

Αντί να έχουμε σκόρπιες μεταβλητές και συναρτήσεις, τα μαζεύουμε όλα σε ένα "πακέτο" που λέγεται αντικείμενο.

🔹 2️⃣ Πρώτο βήμα: φτιάχνουμε το "σχέδιο" (την κλάση)

Μια κλάση (class) είναι το σχέδιο που λέει πώς θα μοιάζουν αυτά τα αντικείμενα.

📘 Παράδειγμα:

<?php class Student { public $name; // χαρακτηριστικό (property) public $age; // χαρακτηριστικό public function sayHello() { // μέθοδος (function μέσα στην κλάση) echo "Γεια, είμαι ο/η " . $this->name . " και είμαι " . $this->age . " χρονών.<br>"; } } ?>

💡 Τι είναι το $this;

Το $this είναι μια ειδική μεταβλητή της PHP που χρησιμοποιείται μέσα σε μια κλάση, και αναφέρεται στο τρέχον αντικείμενο (instance) αυτής της κλάσης.

🧠 Σκέψου το έτσι:

Η class Student είναι σαν "φόρμα μαθητή" — έχει πεδία (όνομα, ηλικία) και ενέργεια (να πει γεια).

🔹 3️⃣ Δεύτερο βήμα: φτιάχνουμε ένα αντικείμενο (δηλαδή έναν πραγματικό φοιτητή)

Χρησιμοποιούμε τη δεσμευμένη λέξη new.

📘 Παράδειγμα:

<?php $st = new Student(); // φτιάχνω έναν "πραγματικό" φοιτητή ?>

🔹 4️⃣ Τρίτο βήμα: γεμίζουμε το αντικείμενο με δεδομένα

Για να "μπω μέσα" στο αντικείμενο και να αλλάξω ή να δω κάτι, χρησιμοποιώ τον τελεστή -> (διαβάζεται "βελάκι").

📘 Παράδειγμα:

<?php $st = new Student(); // Δημιουργώ αντικείμενο $st->name = "Μαρία"; // Βάζω τιμή στο όνομα $st->age = 22; // Βάζω τιμή στην ηλικία ?>

📘 Σαν να λέμε:

"Η φοιτήτρια Μαρία είναι 22 ετών."

🔹 5️⃣ Τέταρτο βήμα: βλέπουμε τα περιεχόμενα

Μπορούμε να χρησιμοποιήσουμε echo για να δούμε τι έχει μέσα το αντικείμενο:

<?php // Εμφανίζει το κείμενο "Το όνομα είναι: " και μετά την τιμή της μεταβλητής name του αντικειμένου $st echo "Το όνομα είναι: " . $st->name . "<br>"; // Εμφανίζει το κείμενο "Η ηλικία είναι: " και μετά την τιμή της μεταβλητής age του αντικειμένου $st echo "Η ηλικία είναι: " . $st->age . "<br>"; ?>

🧾 Αποτέλεσμα:

Το όνομα είναι: Μαρία
Η ηλικία είναι: 22

🔹 6️⃣ Πέμπτο βήμα: χρησιμοποιούμε μια "ενέργεια" (μέθοδο)

Μέσα στην κλάση έχουμε τη μέθοδο sayHello(). Την καλούμε έτσι:

<?php $st->sayHello(); // εκτελεί τη μέθοδο της κλάσης ?>

🧾 Αποτέλεσμα:

Γεια, είμαι ο/η Μαρία και είμαι 22 χρονών.

📘 Τι συμβαίνει;

Εδώ η PHP βλέπει το $this->name μέσα στη μέθοδο και καταλαβαίνει ότι μιλάει για το name αυτού του αντικειμένου (της Μαρίας).

🔹 7️⃣ Παράδειγμα πλήρους κώδικα

Ας τα ενώσουμε όλα:

<?php class Student { public $name; public $age; public function sayHello() { echo "Γεια, είμαι ο/η " . $this->name . " και είμαι " . $this->age . " χρονών.<br>"; } } // Φτιάχνω αντικείμενο $st = new Student(); // Γεμίζω με δεδομένα $st->name = "Μαρία"; $st->age = 22; // Εμφανίζω τιμές echo "Το όνομα είναι: " . $st->name . "<br>"; echo "Η ηλικία είναι: " . $st->age . "<br>"; // Καλώ τη μέθοδο $st->sayHello(); ?>

🧾 Αποτέλεσμα:

Το όνομα είναι: Μαρία
Η ηλικία είναι: 22
Γεια, είμαι ο/η Μαρία και είμαι 22 χρονών.

🔹 8️⃣ Παράδειγμα με δύο αντικείμενα

Αν θέλεις να έχεις δύο αντικείμενα της ίδιας κλάσης (Student), μπορείς να το επεκτείνεις έτσι:

<?php class Student { public $name; public $age; public function sayHello() { echo "Γεια, είμαι ο/η " . $this->name . " και είμαι " . $this->age . " χρονών.<br>"; } } // Δημιουργώ το πρώτο αντικείμενο $st1 = new Student(); $st1->name = "Μαρία"; $st1->age = 22; // Δημιουργώ το δεύτερο αντικείμενο $st2 = new Student(); $st2->name = "Γιάννης"; $st2->age = 25; // Εμφάνιση τιμών echo "Το όνομα είναι: " . $st1->name . "<br>"; echo "Η ηλικία είναι: " . $st1->age . "<br>"; $st1->sayHello(); echo "<br>"; echo "Το όνομα είναι: " . $st2->name . "<br>"; echo "Η ηλικία είναι: " . $st2->age . "<br>"; $st2->sayHello(); ?>

🧾 Αποτέλεσμα:

Το όνομα είναι: Μαρία
Η ηλικία είναι: 22
Γεια, είμαι ο/η Μαρία και είμαι 22 χρονών.

Το όνομα είναι: Γιάννης
Η ηλικία είναι: 25
Γεια, είμαι ο/η Γιάννης και είμαι 25 χρονών.

5.2 Τι είναι οι Βάσεις Δεδομένων;

Μια βάση δεδομένων (Database) είναι ένα οργανωμένο σύνολο δεδομένων που αποθηκεύονται και διαχειρίζονται ηλεκτρονικά. Οι βάσεις δεδομένων χρησιμοποιούνται για την αποθήκευση, οργάνωση και ανάκτηση πληροφοριών με αποδοτικό τρόπο.

🎯 Γιατί χρειαζόμαστε βάσεις δεδομένων;

  • Οργάνωση: Τα δεδομένα είναι δομημένα και εύκολα προσβάσιμα
  • Ασφάλεια: Προστασία και έλεγχος πρόσβασης στα δεδομένα
  • Αποδοτικότητα: Γρήγορη αναζήτηση και ανάκτηση δεδομένων
  • Ακεραιότητα: Διατήρηση της συνοχής και της ορθότητας των δεδομένων
  • Πολλαπλοί χρήστες: Πολλοί χρήστες μπορούν να προσπελάσουν τα δεδομένα ταυτόχρονα

Παραδείγματα χρήσης βάσεων δεδομένων

Εφαρμογή Τι αποθηκεύεται
🛒 E-shop Προϊόντα, πελάτες, παραγγελίες, τιμολόγια
📱 Social Media Χρήστες, posts, φωτογραφίες, σχόλια, likes
🏦 Τράπεζα Λογαριασμοί, συναλλαγές, πελάτες
🎓 Πανεπιστήμιο Φοιτητές, μαθήματα, βαθμολογίες
🏥 Νοσοκομείο Ασθενείς, ιατρικό ιστορικό, ραντεβού

5.3 Τύποι Βάσεων Δεδομένων

Σχεσιακές Βάσεις Δεδομένων (SQL)

Οι σχεσιακές βάσεις δεδομένων αποθηκεύουν τα δεδομένα σε πίνακες (tables) με γραμμές και στήλες. Είναι οι πιο δημοφιλείς και χρησιμοποιούν τη γλώσσα SQL (Structured Query Language) για την επικοινωνία.

📊 Δημοφιλείς SQL Βάσεις

  • MySQL / MariaDB - Πιο δημοφιλής για web
  • PostgreSQL - Ισχυρή και open source
  • Oracle Database - Enterprise λύση
  • Microsoft SQL Server - Windows περιβάλλον
  • SQLite - Ελαφριά, για mobile apps

🌐 Βάσεις NoSQL

  • MongoDB - Document-based
  • Redis - Key-value store
  • Cassandra - Wide-column store
  • Neo4j - Graph database

Στο μάθημα μας θα επικεντρωθούμε στη MySQL!

Αναλυτικά: NoSQL Βάσεις - Είδη & Χαρακτηριστικά

💡 Τι σημαίνει NoSQL;

Οι NoSQL βάσεις αποθηκεύουν τα δεδομένα όπως τα χρειάζεται η εφαρμογή, όχι όπως τα ορίζει ένα άκαμπτο σχήμα. Αυτό τις κάνει πολύ χρήσιμες σε web apps, big data και real-time συστήματα.

Σε NoSQL βάσεις, ορίζεις εσύ τη δομή των δεδομένων ανάλογα με τις ανάγκες σου. Είναι σαν να έχεις ένα "κουτί JSON" όπου βάζεις ό,τι πεδία θες.

1. MongoDB

Χαρακτηριστικά:

  • Αποθηκεύει δεδομένα σε JSON-like έγγραφα (BSON - Binary JSON)
  • Ευέλικτο σχήμα - Κάθε έγγραφο μπορεί να έχει διαφορετικά πεδία
  • Καλό για ημι-δομημένα δεδομένα
  • Πολύ δημοφιλής σε MEAN/MERN stack (MongoDB, Express, Angular/React, Node.js)
// Παράδειγμα εγγράφου MongoDB (JSON format) { "_id": "507f1f77bcf86cd799439011", "name": "Γιώργος Παπαδόπουλος", "email": "gpapad@uop.gr", "age": 20, "courses": ["Web Programming", "Databases", "Algorithms"], "address": { "city": "Τρίπολη", "zipcode": "22100" } }

Πότε να χρησιμοποιήσεις MongoDB: Content management systems, catalogs, user profiles, real-time analytics

2. Redis

Χαρακτηριστικά:

  • Εξαιρετικά γρήγορη - Αποθηκεύει δεδομένα στη μνήμη (RAM)
  • Απλή δομή: Κλειδί → Τιμή
  • Ιδανική για caching, sessions, counters, leaderboards
  • Υποστηρίζει δομές όπως: strings, lists, sets, hashes
// Παραδείγματα Redis commands SET "user:1000:name" "Γιώργος" GET "user:1000:name" // → "Γιώργος" INCR "page:views" // → Αυξάνει counter κατά 1 EXPIRE "session:abc123" 3600 // → Λήγει μετά από 1 ώρα

Πότε να χρησιμοποιήσεις Redis: Session storage, real-time counters, queues, pub/sub messaging, temporary data

3. Cassandra

Χαρακτηριστικά:

  • Διανεμημένη αρχιτεκτονική - Χωρίς single point of failure
  • Ανθεκτική σε σφάλματα - Replication σε πολλούς nodes
  • Ιδανική για μεγάλα δεδομένα (Big Data)
  • Υψηλή διαθεσιμότητα και linear scalability
  • Χρησιμοποιεί CQL (Cassandra Query Language) - μοιάζει με SQL
-- Παράδειγμα Cassandra CQL CREATE TABLE users ( user_id UUID PRIMARY KEY, name TEXT, email TEXT, login_timestamps LIST<TIMESTAMP>, metadata MAP<TEXT, TEXT> ); INSERT INTO users (user_id, name, email) VALUES (uuid(), 'Γιώργος', 'gpapad@uop.gr');

Πότε να χρησιμοποιήσεις Cassandra: Time series data, IoT applications, recommendations engines, fraud detection (χρησιμοποιείται από Netflix, Apple, Instagram)

4. Neo4j

Χαρακτηριστικά:

  • Βασίζεται σε κόμβους και σχέσεις (nodes & edges/relationships)
  • Ιδανική για δεδομένα με πολλές διασυνδέσεις
  • Χρησιμοποιεί τη γλώσσα Cypher για queries
  • Πολύ γρήγορη σε graph traversals (διάσχιση γράφων)
// Παράδειγμα Cypher query // Δημιουργία κόμβων και σχέσεων CREATE (george:Person {name: 'Γιώργος', age: 20}) CREATE (maria:Person {name: 'Μαρία', age: 21}) CREATE (george)-[:FRIENDS_WITH]->(maria) // Εύρεση φίλων των φίλων MATCH (george:Person {name: 'Γιώργος'}) -[:FRIENDS_WITH]->()-[:FRIENDS_WITH]->(fof) RETURN fof.name

Πότε να χρησιμοποιήσεις Neo4j: Social networks, recommendation systems, fraud detection, knowledge graphs, network topology (χρησιμοποιείται από LinkedIn, Airbnb, eBay)

SQL vs NoSQL: Πότε τι;

📊 Χρησιμοποίησε SQL όταν:

  • Τα δεδομένα σου είναι δομημένα και σταθερά
  • Χρειάζεσαι ACID transactions (ακρίβεια)
  • Έχεις πολύπλοκες σχέσεις μεταξύ πινάκων
  • Χρειάζεσαι σύνθετα joins & queries
  • Παραδείγματα: Banking, ERP, CRM, e-commerce

🌐 Χρησιμοποίησε NoSQL όταν:

  • Τα δεδομένα σου είναι ημι-δομημένα ή unstructured
  • Χρειάζεσαι horizontal scaling (πολλοί servers)
  • Έχεις μεγάλο όγκο δεδομένων (Big Data)
  • Χρειάζεσαι ευελιξία στο schema
  • Παραδείγματα: Social media, IoT, real-time analytics, content management

5.4 Η MySQL / MariaDB

Η MySQL είναι ένα ανοιχτού κώδικα σύστημα διαχείρισης σχεσιακών βάσεων δεδομένων (RDBMS). Είναι η πιο δημοφιλής επιλογή για web εφαρμογές και συνδυάζεται τέλεια με την PHP.

Η MariaDB είναι ένα fork της MySQL με πλήρη συμβατότητα και επιπλέον χαρακτηριστικά. Πολλές φορές χρησιμοποιούνται εναλλακτικά.

ℹ️ MySQL στο σύγχρονο web

Η MySQL χρησιμοποιείται από μεγάλες εταιρείες όπως:

  • Facebook - Εκατομμύρια χρήστες
  • YouTube - Τεράστιος όγκος δεδομένων
  • Twitter - Real-time δεδομένα
  • WordPress - Millions of websites

Βασικές Έννοιες MySQL

🔑 Ορολογία Βάσης Δεδομένων

  • Database (Βάση): Συλλογή από πίνακες
  • Table (Πίνακας): Δομή που κρατά δεδομένα σε γραμμές και στήλες
  • Row (Γραμμή/Εγγραφή): Μια μεμονωμένη καταχώρηση στον πίνακα
  • Column (Στήλη/Πεδίο): Μια κατηγορία δεδομένων στον πίνακα
  • Primary Key: Μοναδικό πεδίο που ταυτοποιεί κάθε εγγραφή
  • Foreign Key: Πεδίο που συνδέει δύο πίνακες

5.5 Χρήση του phpMyAdmin

Το phpMyAdmin είναι ένα δωρεάν εργαλείο διαχείρισης MySQL μέσω web interface. Είναι το πιο δημοφιλές εργαλείο για διαχείριση βάσεων δεδομένων χωρίς να χρειάζεται να γράφουμε SQL εντολές.

🌐 Πρόσβαση στο phpMyAdmin

Αν χρησιμοποιείτε XAMPP, WAMP ή MAMP:

  • URL: http://localhost/phpmyadmin
  • Username (προεπιλογή): root
  • Password (προεπιλογή): (κενό - χωρίς password)

Βήμα 1: Δημιουργία Βάσης Δεδομένων

📝 Οδηγίες για νέα βάση δεδομένων

  1. Ανοίξτε το phpMyAdmin στο http://localhost/phpmyadmin
  2. Κάντε κλικ στην καρτέλα "Databases" (ή "Βάσεις δεδομένων") στην κορυφή
  3. Στο πεδίο "Create database" γράψτε: school_db
  4. Από το dropdown "Collation" επιλέξτε: utf8mb4_general_ci (για υποστήριξη ελληνικών)
  5. Κάντε κλικ στο κουμπί "Create"

⚠️ Σημαντικό για Ελληνικά

Για να υποστηρίζονται σωστά τα ελληνικά και τα emojis, πάντα επιλέγετε:

  • Collation: utf8mb4_general_ci ή utf8mb4_unicode_ci
  • Αυτό εξασφαλίζει σωστή αποθήκευση και εμφάνιση των ελληνικών χαρακτήρων

Βήμα 2: Δημιουργία Πίνακα

🔧 Δημιουργία πίνακα students

  1. Κάντε κλικ στη βάση school_db από την αριστερή στήλη
  2. Θα δείτε τη φράση "No tables found in database"
  3. Στο πεδίο "Create table" γράψτε: students
  4. Στο πεδίο "Number of columns" γράψτε: 5
  5. Κάντε κλικ "Go"

Ορισμός Στηλών (Columns)

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

Name Type Length/Values Index A_I Null Default
id INT (κενό) PRIMARY (άδειο) (κενό)
name VARCHAR 100 (κενό) (άδειο) (άδειο) (κενό)
email VARCHAR 100 UNIQUE (άδειο) (άδειο) (κενό)
age INT (κενό) (κενό) (άδειο) NULL
created_at DATETIME (κενό) (κενό) (άδειο) (άδειο) CURRENT_TIMESTAMP

📖 Επεξήγηση πεδίων

  • Name: Το όνομα της στήλης
  • Type: Ο τύπος δεδομένων (INT, VARCHAR, DATETIME, κλπ)
  • Length/Values: Το μέγιστο μήκος (για VARCHAR)
  • Index: PRIMARY για primary key, UNIQUE για μοναδικές τιμές
  • A_I (Auto Increment): Αυτόματη αύξηση για το ID
  • Null: Αν επιτρέπεται να είναι κενό το πεδίο
  • Default: Η προεπιλεγμένη τιμή της στήλης. Αναλυτικά τι σημαίνουν οι επιλογές:
    • None ➜ Δεν υπάρχει προεπιλεγμένη τιμή. Αν δεν δοθεί τιμή κατά την εισαγωγή (INSERT), το πεδίο θα παραμείνει κενό (ή θα δώσει σφάλμα αν δεν επιτρέπονται κενές τιμές).
    • As defined: ➜ Μπορείς να ορίσεις εσύ χειροκίνητα μια συγκεκριμένη προεπιλεγμένη τιμή (π.χ. '0', 'Active', '2025-11-05' κ.λπ.). Δηλαδή, το "as defined" σημαίνει "όπως έχει οριστεί από εσένα".
    • NULL ➜ Αν δεν δοθεί τιμή κατά την εισαγωγή, η στήλη θα πάρει την τιμή NULL (δηλαδή «χωρίς τιμή»).
    • CURRENT_TIMESTAMP ➜ Αυτή η επιλογή χρησιμοποιείται συνήθως σε πεδία τύπου TIMESTAMP ή DATETIME. Όταν γίνει νέα εγγραφή, η προεπιλεγμένη τιμή θα είναι η τρέχουσα ημερομηνία και ώρα.

⚙️ Επεξήγηση Attributes (Χαρακτηριστικά)

  • BINARY ➜ Κάνει τη σύγκριση/αποθήκευση δεδομένων case-sensitive (διακρίνει κεφαλαία-πεζά).
  • UNSIGNED ➜ Δεν επιτρέπει αρνητικές τιμές (π.χ. INT μόνο από 0 και πάνω).
  • UNSIGNED ZEROFILL ➜ Όπως το UNSIGNED, αλλά γεμίζει με μηδενικά (π.χ. 00042 αντί 42).
  • on update CURRENT_TIMESTAMP ➜ Σε TIMESTAMP/DATETIME πεδία, ενημερώνει αυτόματα τη στήλη με την τρέχουσα ημερομηνία-ώρα κάθε φορά που αλλάζει η γραμμή (UPDATE).

Μετά τη συμπλήρωση, κάντε κλικ στο κουμπί "Save" στο κάτω μέρος της σελίδας.

Βήμα 3: Εισαγωγή Δεδομένων (Insert)

➕ Προσθήκη εγγραφής

  1. Κάντε κλικ στον πίνακα students από την αριστερή στήλη
  2. Κάντε κλικ στην καρτέλα "Insert" στην κορυφή
  3. Συμπληρώστε τα πεδία:
    • id: (αφήστε κενό - θα συμπληρωθεί αυτόματα)
    • name: Γιώργος Παπαδόπουλος
    • email: gpapad@uop.gr
    • age: 20
    • created_at: (αφήστε κενό - θα συμπληρωθεί αυτόματα)
  4. Κάντε κλικ "Go" για να αποθηκεύσετε

💡 Tip: Πολλαπλές εγγραφές

Για να προσθέσετε πολλές εγγραφές μαζί, στο κάτω μέρος της σελίδας Insert υπάρχει το πεδίο "Continue insertion with...". Αλλάξτε το σε 5 για να εμφανιστούν 5 φόρμες ταυτόχρονα!

Βήμα 4: Προβολή Δεδομένων (Browse)

👁️ Εμφάνιση όλων των εγγραφών

  1. Κάντε κλικ στον πίνακα students
  2. Κάντε κλικ στην καρτέλα "Browse"
  3. Θα δείτε όλες τις εγγραφές σε μορφή πίνακα
  4. Μπορείτε να:
    • ✏️ Edit: Επεξεργασία της εγγραφής
    • 🗑️ Delete: Διαγραφή της εγγραφής

Βήμα 5: Εκτέλεση SQL Queries

Μπορείτε να εκτελέσετε οποιαδήποτε SQL εντολή χειροκίνητα!

⚡ Εκτέλεση SQL

  1. Κάντε κλικ στη βάση school_db από την αριστερή στήλη
  2. Κάντε κλικ στην καρτέλα "SQL" στην κορυφή
  3. Γράψτε το SQL query σας, για παράδειγμα:

Θεωρία: Το SELECT Query

Το SELECT είναι η πιο σημαντική εντολή στη SQL. Χρησιμοποιείται για να ανακτήσουμε δεδομένα από τη βάση.

1) Βασικό SELECT (όλες οι στήλες, όλα τα rows)

SELECT * FROM students;

📖 Επεξήγηση

  • SELECT * → Φέρνει όλες τις στήλες
  • FROM students → Από ποιον πίνακα
  • Το * σημαίνει "όλα" (wildcard)

2) Επιλογή συγκεκριμένων στηλών

SELECT id, name, email FROM students;

📖 Επεξήγηση

  • Φέρνει μόνο τις στήλες που γράφεις
  • Διαχωρίζεις τις στήλες με κόμμα ,
  • Πιο γρήγορο από το SELECT * γιατί μεταφέρει λιγότερα δεδομένα

3) SELECT με WHERE (φιλτράρισμα)

-- Φοιτητές άνω των 20 ετών SELECT * FROM students WHERE age >= 20;
-- Συγκεκριμένο email SELECT name, age FROM students WHERE email = 'gpapad@uop.gr';

📖 Τελεστές στο WHERE

  • = → Ίσο
  • != ή <> → Διάφορο
  • > → Μεγαλύτερο
  • >= → Μεγαλύτερο ή ίσο
  • < → Μικρότερο
  • <= → Μικρότερο ή ίσο

4) SELECT με ORDER BY (ταξινόμηση)

-- Ταξινόμηση από το A στο Ω SELECT * FROM students ORDER BY name ASC;
-- Ταξινόμηση από μεγάλη προς μικρή ηλικία SELECT * FROM students ORDER BY age DESC;

📖 Επεξήγηση

  • ASC → Ascending (αύξουσα σειρά) - από μικρό σε μεγάλο
  • DESC → Descending (φθίνουσα σειρά) - από μεγάλο σε μικρό
  • Προεπιλογή είναι ASC αν δεν το γράψεις

5) SELECT με LIMIT (περιορισμός αποτελεσμάτων)

-- Τους πρώτους 5 φοιτητές SELECT * FROM students LIMIT 5;
-- Τους 3 μεγαλύτερους σε ηλικία SELECT * FROM students ORDER BY age DESC LIMIT 3;

📖 Επεξήγηση

  • LIMIT → Περιορίζει τον αριθμό των αποτελεσμάτων
  • Χρήσιμο για pagination (σελιδοποίηση)
  • Συνδυάζεται συχνά με ORDER BY

6) Σύνθετο παράδειγμα

-- Βρες τους 10 νεότερους φοιτητές με ηλικία πάνω από 18 SELECT name, email, age FROM students WHERE age > 18 ORDER BY age ASC LIMIT 10;

🔍 Σειρά εκτέλεσης SQL

  1. FROM → Διάλεξε τον πίνακα
  2. WHERE → Φίλτραρε τα rows
  3. SELECT → Διάλεξε τις στήλες
  4. ORDER BY → Ταξινόμησε
  5. LIMIT → Περιόρισε τα αποτελέσματα

Θεωρία: INSERT, UPDATE, DELETE

📘 INSERT – Προσθήκη νέου φοιτητή

INSERT INTO students (name, email, age) VALUES ('Eleni Pappa', 'epappa@uop.gr', 22);

💡 Σημαντικό

  • Δεν γράφεις id (μπαίνει αυτόματα λόγω AUTO_INCREMENT)
  • Το created_at γεμίζει μόνο του (CURRENT_TIMESTAMP)

🟡 UPDATE – Ενημέρωση στοιχείων φοιτητή

UPDATE students SET age = 23 WHERE id = 5;

⚠️ ΠΡΟΣΟΧΗ

Πάντα βάλε WHERE, αλλιώς αλλάζει όλους τους φοιτητές!

➕ Ενημέρωση πολλών πεδίων μαζί

UPDATE students SET name = 'Eleni Papadopoulou', email = 'epapadopoulou@uop.gr' WHERE id = 5;

🔴 DELETE – Διαγραφή φοιτητή

DELETE FROM students WHERE id = 3;

⚠️ ΠΡΟΣΟΧΗ ΠΑΛΙ

Αν γράψεις DELETE FROM students; χωρίς WHERE, θα σβήσει ΟΛΟΥΣ τους φοιτητές!

✨ Extra — Διαγραφή με βάση άλλο πεδίο

DELETE FROM students WHERE email = 'epappa@uop.gr';

💡 Συνοψιστικός πίνακας

Εντολή Λειτουργία Παράδειγμα
INSERT Προσθήκη νέας γραμμής INSERT INTO students (name, email, age) VALUES ('Maria', 'maria@uop.gr', 21);
UPDATE Ενημέρωση υπάρχουσας εγγραφής UPDATE students SET age = 24 WHERE id = 2;
DELETE Διαγραφή εγγραφής DELETE FROM students WHERE id = 4;

Δοκίμασε τα παρακάτω queries στο phpMyAdmin:

-- Ανάκτηση φοιτητών άνω των 20 ετών SELECT * FROM students WHERE age >= 20;
-- Ενημέρωση email UPDATE students SET email = 'new_email@uop.gr' WHERE id = 1;
-- Προσθήκη πολλών εγγραφών INSERT INTO students (name, email, age) VALUES ('Μαρία Κωνσταντίνου', 'mkons@uop.gr', 21), ('Νίκος Αθανασίου', 'nathas@uop.gr', 19);

Μετά από κάθε query, κάντε κλικ "Go" για εκτέλεση!

Βήμα 6: Αναζήτηση (Search)

🔍 Εύρεση συγκεκριμένων εγγραφών

  1. Κάντε κλικ στον πίνακα students
  2. Κάντε κλικ στην καρτέλα "Search"
  3. Συμπληρώστε τα πεδία που θέλετε να αναζητήσετε
  4. Για παράδειγμα, στο πεδίο age βάλτε: >= 20
  5. Κάντε κλικ "Go"

Βήμα 7: Export (Εξαγωγή Δεδομένων)

Το Export χρησιμεύει για να πάρετε backup της βάσης σας ή να τη μεταφέρετε σε άλλο server.

💾 Export βάσης δεδομένων

  1. Κάντε κλικ στη βάση school_db από την αριστερή στήλη
  2. Κάντε κλικ στην καρτέλα "Export" στην κορυφή
  3. Επιλέξτε μέθοδο:
    • Quick: Γρήγορο export με προεπιλεγμένες ρυθμίσεις (SQL format)
    • Custom: Προσαρμοσμένες ρυθμίσεις
  4. Κάντε κλικ "Go"
  5. Το αρχείο school_db.sql θα κατέβει στον υπολογιστή σας

Βήμα 8: Import (Εισαγωγή Δεδομένων)

Το Import χρησιμοποιείται για να ανεβάσετε ένα backup ή να φορτώσετε μια βάση από άλλο server.

📤 Import βάσης δεδομένων

  1. Δημιουργήστε πρώτα μια νέα βάση (π.χ. school_db_restore)
  2. Κάντε κλικ στη νέα βάση
  3. Κάντε κλικ στην καρτέλα "Import"
  4. Κάντε κλικ "Choose File" και επιλέξτε το αρχείο .sql
  5. Κάντε κλικ "Go"
  6. Περιμένετε να ολοκληρωθεί η εισαγωγή

⚠️ Προσοχή στο μέγεθος αρχείων

Το phpMyAdmin έχει όριο στο μέγεθος των αρχείων που μπορείτε να ανεβάσετε (συνήθως 2MB - 8MB). Για μεγαλύτερα αρχεία, πρέπει να:

  • Αλλάξετε το upload_max_filesize στο php.ini
  • Ή χρησιμοποιήστε το command line: mysql -u root database_name < file.sql

Χρήσιμες Λειτουργίες phpMyAdmin

🔧 Structure (Δομή)

  • Δείτε τη δομή του πίνακα
  • Προσθέστε/διαγράψτε στήλες
  • Αλλάξτε τύπους δεδομένων
  • Ορίστε indexes

📊 Operations

  • Μετονομάστε πίνακα
  • Αντιγράψτε πίνακα
  • Αλλάξτε collation
  • Βελτιστοποίηστε πίνακα

📈 Privileges (Δικαιώματα)

  • Διαχείριση χρηστών
  • Ορισμός δικαιωμάτων
  • Δημιουργία νέων χρηστών
  • Αλλαγή passwords

⚙️ More (Περισσότερα)

  • Designer: Οπτικός σχεδιασμός σχέσεων
  • Tracking: Παρακολούθηση αλλαγών
  • Console: SQL console

Συντομεύσεις Πληκτρολογίου

Πλήκτρα Λειτουργία
Ctrl + Enter Εκτέλεση SQL query
Ctrl + S Αποθήκευση αλλαγών
Tab Autocomplete SQL keywords

💡 Bonus Tips

  • Theme: Πηγαίνετε Settings → Main panel → Theme για να αλλάξετε το θέμα
  • SQL History: Το phpMyAdmin κρατά ιστορικό των SQL queries σας
  • Bookmarks: Αποθηκεύστε συχνά χρησιμοποιούμενα queries
  • Query by example: Δημιουργήστε queries οπτικά χωρίς SQL

Παράδειγμα: Πίνακας Φοιτητών

students
🔑 id (Primary Key)
name (VARCHAR)
email (VARCHAR)
age (INT)
created_at (DATETIME)
id name email age created_at
1 Γιώργος Παπαδόπουλος gpapad@uop.gr 20 2025-01-15 10:30:00
2 Μαρία Κωνσταντίνου mkons@uop.gr 21 2025-01-16 14:20:00
3 Νίκος Αθανασίου nathas@uop.gr 19 2025-01-17 09:15:00

5.6 Χρήση MySQL μέσω Terminal (Command Line)

Εκτός από το phpMyAdmin, μπορείς να χρησιμοποιήσεις τη MySQL απευθείας από το terminal (γραμμή εντολών). Αυτό είναι χρήσιμο για:

Βήμα 1: Σύνδεση στη MySQL

💻 Άνοιγμα MySQL Terminal

Windows (XAMPP):

  1. Άνοιξε το XAMPP Control Panel
  2. Κάνε κλικ στο κουμπί "Shell"
  3. Γράψε την εντολή παρακάτω

Mac/Linux:

  1. Άνοιξε το Terminal
  2. Γράψε την εντολή παρακάτω
mysql -u root -p

ℹ️ Σημείωση για Password

Σε local εγκατάσταση (XAMPP/MAMP), συνήθως το password είναι κενό. Απλά πάτησε Enter όταν το ζητήσει.

Όταν συνδεθείς επιτυχώς, θα δεις:

Welcome to the MySQL monitor. mysql>

Το mysql> σημαίνει ότι είσαι μέσα και μπορείς να γράψεις SQL εντολές!

Βήμα 2: Χρήσιμες Εντολές Terminal

Εντολή Τι κάνει
SHOW DATABASES; Εμφανίζει όλες τις βάσεις δεδομένων
USE database_name; Επιλέγει μια βάση για δουλειά
SHOW TABLES; Εμφανίζει όλους τους πίνακες στη βάση
DESCRIBE table_name; Δείχνει τη δομή ενός πίνακα
EXIT; ή QUIT; Έξοδος από το MySQL terminal

Βήμα 3: Δημιουργία Βάσης Δεδομένων

CREATE DATABASE school_db;

Για να δεις αν δημιουργήθηκε:

SHOW DATABASES;

Θα δεις λίστα με όλες τις βάσεις, συμπεριλαμβανομένης της school_db.

Τώρα επίλεξε τη βάση για να δουλέψεις μέσα της:

USE school_db;

Θα δεις: Database changed

Βήμα 4: Δημιουργία Πίνακα

CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE, age INT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP );

💡 Tip: Δες τη δομή του πίνακα

Για να δεις τη δομή του πίνακα που μόλις δημιούργησες:

DESCRIBE students;

Αυτό θα σου δείξει όλες τις στήλες, τους τύπους τους, και τα constraints!

Βήμα 5: Εισαγωγή Δεδομένων (INSERT)

-- Εισαγωγή ενός φοιτητή INSERT INTO students (name, email, age) VALUES ('Γιώργος Παπαδόπουλος', 'gpapad@uop.gr', 20);

Θα δεις: Query OK, 1 row affected

-- Εισαγωγή πολλών φοιτητών INSERT INTO students (name, email, age) VALUES ('Μαρία Κωνσταντίνου', 'mkons@uop.gr', 21), ('Νίκος Αθανασίου', 'nathas@uop.gr', 19);

Θα δεις: Query OK, 2 rows affected

Βήμα 6: Ανάκτηση Δεδομένων (SELECT)

-- Ανάκτηση όλων των φοιτητών SELECT * FROM students;

Θα δεις έναν πίνακα με όλους τους φοιτητές!

-- Ανάκτηση συγκεκριμένων στηλών SELECT name, email FROM students;
-- Ανάκτηση με συνθήκη SELECT * FROM students WHERE age >= 20;
-- Ανάκτηση με ταξινόμηση SELECT * FROM students ORDER BY name ASC;
-- Περιορισμός αποτελεσμάτων SELECT * FROM students LIMIT 10;

Βήμα 7: Ενημέρωση Δεδομένων (UPDATE)

-- Ενημέρωση της ηλικίας ενός φοιτητή UPDATE students SET age = 22 WHERE id = 1;

Θα δεις: Query OK, 1 row affected

-- Ενημέρωση πολλών πεδίων UPDATE students SET name = 'Γιώργος Π.', email = 'gp@uop.gr' WHERE id = 1;

Βήμα 8: Διαγραφή Δεδομένων (DELETE)

-- Διαγραφή ενός φοιτητή DELETE FROM students WHERE id = 3;

Θα δεις: Query OK, 1 row affected

-- ΠΡΟΣΟΧΗ: Διαγραφή όλων των εγγραφών! DELETE FROM students;

⚠️ Προσοχή στις εντολές UPDATE και DELETE!

Οι εντολές UPDATE και DELETE χωρίς WHERE θα επηρεάσουν όλες τις εγγραφές στον πίνακα! Πάντα να ελέγχετε τις συνθήκες σας πριν εκτελέσετε αυτές τις εντολές.

Βήμα 9: Χρήσιμα Bonus Tips

🎯 Pro Tips για Terminal

  • History: Πάτα το βέλος πάνω για να δεις προηγούμενες εντολές
  • Πολυγραμμικές εντολές: Μπορείς να γράψεις μια εντολή σε πολλές γραμμές. Η MySQL περιμένει μέχρι να δει ;
  • Clear screen: Γράψε \c για να ακυρώσεις μια εντολή
  • Help: Γράψε HELP; ή \h για βοήθεια

Import SQL αρχείου

Για να κάνεις import ένα .sql αρχείο από το terminal:

mysql -u root -p school_db < backup.sql

Export βάσης δεδομένων

Για να κάνεις export μια βάση:

mysqldump -u root -p --single-transaction --set-gtid-purged=OFF mpardis > /Users/gmpardis/dump.sql

💡 Πότε να χρησιμοποιείς Terminal;

  • phpMyAdmin: Καλύτερο για beginners, οπτική διαχείριση, γρήγορες αλλαγές
  • Terminal: Καλύτερο για automation, scripts, μεγάλα imports/exports, server administration

5.7 Διασύνδεση PHP με MySQL

Η PHP προσφέρει δύο κύριους τρόπους για σύνδεση με MySQL:

Στο μάθημα μας θα χρησιμοποιήσουμε κυρίως MySQLi για την απλότητά της.

Μέθοδος 1: MySQLi (Object-Oriented)

Σύνδεση με τη Βάση

<?php // Στοιχεία σύνδεσης $servername = "localhost"; $username = "root"; $password = ""; $database = "school_db"; // Δημιουργία σύνδεσης $conn = new mysqli($servername, $username, $password, $database); // Έλεγχος σύνδεσης if ($conn->connect_error) { die("Η σύνδεση απέτυχε: " . $conn->connect_error); } echo "Επιτυχής σύνδεση με τη βάση δεδομένων!"; // Κλείσιμο σύνδεσης (στο τέλος του script) $conn->close(); ?>

💡 Το $conn είναι αντικείμενο!

Εδώ, το $conn είναι αντικείμενο της κλάσης mysqli, και μπορείς να χρησιμοποιήσεις τις μεθόδους του, όπως:

  • $conn->query() — για να εκτελέσεις ένα SQL ερώτημα
  • $conn->close() — για να κλείσεις τη σύνδεση

Πλήρες Παράδειγμα: Εισαγωγή Δεδομένων

<?php // Σύνδεση με τη βάση $conn = new mysqli("localhost", "root", "", "school_db"); if ($conn->connect_error) { die("Σφάλμα σύνδεσης: " . $conn->connect_error); } // Δεδομένα για εισαγωγή $name = "Ελένη Δημητρίου"; $email = "edimitriou@uop.gr"; $age = 22; // SQL query $sql = "INSERT INTO students (name, email, age) VALUES ('$name', '$email', $age)"; if ($conn->query($sql) === TRUE) { echo "Ο φοιτητής προστέθηκε επιτυχώς!"; echo "<br>Το ID του νέου φοιτητή είναι: " . $conn->insert_id; } else { echo "Σφάλμα: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>

Κατανόηση της SQL INSERT Εντολής

Ο παραπάνω κώδικας περιέχει μια εντολή SQL (Structured Query Language) που χρησιμοποιείται για να εισάγει (insert) μια νέα εγγραφή (δηλαδή μια νέα γραμμή δεδομένων) μέσα σε έναν πίνακα της βάσης δεδομένων.

Ας το αναλύσουμε βήμα-βήμα:

$sql = "INSERT INTO students (name, email, age) VALUES ('$name', '$email', $age)";

🔍 Ανάλυση της Εντολής

  • 🔹 $sql = "..." Αποθηκεύεις την εντολή SQL μέσα σε μια μεταβλητή PHP που λέγεται $sql.
  • 🔹 INSERT INTO students (...) Αυτό λέει στη βάση δεδομένων: "Πρόσθεσε μια νέα εγγραφή μέσα στον πίνακα students."
  • 🔹 (name, email, age) Αυτά είναι τα ονόματα των στηλών του πίνακα στα οποία θέλεις να προσθέσεις δεδομένα.
  • 🔹 VALUES ('$name', '$email', $age) Εδώ δίνεις τις τιμές που θα μπουν σε αυτές τις στήλες. Οι μεταβλητές $name, $email και $age προέρχονται από τον κώδικά σου (π.χ. από μια φόρμα HTML).

📘 Παράδειγμα

Αν:

$name = "Maria"; $email = "maria@example.com"; $age = 20;

Τότε η εντολή SQL θα γίνει:

INSERT INTO students (name, email, age) VALUES ('Maria', 'maria@example.com', 20);

Αυτό προσθέτει μια νέα γραμμή στη βάση δεδομένων students με τα δεδομένα της Μαρίας.

⚠️ Σημαντικό: SQL Injection

Αν χρησιμοποιείς έτσι τις μεταβλητές ('$name', '$email', κ.λπ.), ο κώδικάς σου είναι ευάλωτος σε SQL injection (δηλαδή κάποιος μπορεί να εισάγει κακόβουλο SQL κώδικα μέσα από τη φόρμα).

👉 Ο σωστός τρόπος: Prepared Statements

Χρησιμοποίησε prepared statements με mysqli ή PDO:

$stmt = $conn->prepare("INSERT INTO students (name, email, age) VALUES (?, ?, ?)"); $stmt->bind_param("ssi", $name, $email, $age); $stmt->execute();

🔥 Ασκήσεις Εμπέδωσης

  1. Δημιουργήστε μια βάση με όνομα library_db και πίνακα books με τα πεδία: id, title, author, year, isbn
  2. Γράψτε SQL queries για:
    • Εισαγωγή 5 βιβλίων
    • Ανάκτηση όλων των βιβλίων
    • Ανάκτηση βιβλίων μετά το 2000
    • Ενημέρωση του έτους ενός βιβλίου
    • Διαγραφή ενός βιβλίου
  3. Δημιουργήστε PHP script που:
    • Συνδέεται με τη βάση library_db
    • Εμφανίζει όλα τα βιβλία σε HTML table
  4. Προσθέστε φόρμα για εισαγωγή νέου βιβλίου με validation