Βασικές εντολές Sql

Γενικές συζητήσεις για SQL και SQL Servers (RDBMS)

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από mrpc » 15 Μάιος 2005 20:22

Ότι γλώσσα και να χρησιμοποιούμε για να συνδεθούμε σε μια βάση δεδομένων σε περιβάλλον web, σίγουρα εκτός από καλή γνώση της γλώσσας αυτής, θα πρέπει να έχουμε και κάποιες, έστω και βασικές γνώσεις, σχετικά με την SQL, δηλαδή τη γλώσσα που χρησιμοποιούν οι βάσεις δεδομένων.
Αν και υπάρχει ένα κοινό πρότυπο, (κυρίως) λόγω των διαφορών στις δυνατότητες κάθε βάσης δεδομένων, κάθε βάση χρησιμοποιεί τη δική της εκδοχή της SQL. Για παράδειγμα αν κάνετε export ένα sql script από τον Microsoft SQL Server και προσπαθήσετε να το εισάγετε σε MySQL Server, 90% δε θα δουλέψει.
Για αυτό και για το παρακάτω tutorial θα μιλήσω για τη MySQL που είναι η πιο διαδεδομένη, τουλάχιστον σε αυτό το forum. Είναι η βάση που χρησιμοποιούν οι περισσότερες εφαρμογές σε PHP.
Κατ' αρχήν θεωρώ δεδομένο το ότι ξέρουμε πως πάνω – κάτω είναι η δομή μιας βάσης δεδομένων. Παρ' όλα αυτά θα αναφέρω μερικά πράγματα.
Μια βάση αποτελείται κυρίως από πίνακες (tables), οι οποίοι αποτελούνται από πεδία.
Για παράδειγμα αν θέλουμε να φτιάξουμε μια βάση δεδομένων τηλεφωνικό κατάλογο, χρειαζόμαστε έναν πίνακα, έστω 'thlefwna', οποίος θα αποτελείται από τα πεδία που χρειαζόμαστε, έστω 'onoma', 'epwnymo', 'thlefwno', που το καθένα από αυτά θα αποθηκεύει αντίστοιχα όνομα, επώνυμο και τηλέφωνο.
Έπειτα αρχίζουμε και εισάγουμε εγγραφές στον πίνακά μας και όταν χρειάζεται τραβάμε τα δεδομένα μας.
Για να καταλάβετε καλύτερα τη λειτουργία μιας βάσης, προτείνω την εγκατάσταση του phpmyadmin και τη δημιουργία μιας βάσης δεδομένων.
Θα χρειαστεί έτσι κι αλλιώς για να εκτελέσετε τα παραδείγματα που έχουμε παρακάτω.
H SQL είναι λοιπόν η γλώσσα που χρησιμοποιούμε για να κάνουμε ερωτήματα (queries) στη βάση μας και να 'τραβάμε' τα δεδομένα που θέλουμε, ή να τα αλλάζουμε/διαγράφουμε/εισάγουμε.
Για αρχή όμως θα φτιάξουμε τον ενδεικτικό πίνακα που λέγαμε παραπάνω σε μία νέα βάση δεδομένων, χρησιμοποιώντας το phpmyadmin και εξηγώντας λίγο τις λειτουργίες του.
Ανοίγουμε το phpmyadmin και στην αρχική σελίδα του, εκεί που λέει Δημιουργία Νέας Βάσης, εισάγουμε το όνομα της βάσης μας, έστω 'thlefwna', και πατάμε 'δημιουργία'.
Θα δούμε ότι εκτελέστηκε η SQL εντολή

Κώδικας: Επιλογή όλων

CREATE DATABASE `thlefwna` ; 
Η σύνταξη είναι πολύ απλή, λέει στη MySQL "Φτιάξε τη βάση δεδομένων 'τηλέφωνα'". Όπως βλέπετε τα ονόματα των βάσεων, των πινάκων και γενικά τα δεδομένα σε μια εντολή SQL συνηθίζεται να είναι μέσα σε εισαγωγικά ' ', για να μην μπλέκουν με τις εντολές της SQL και τις λέξεις κλειδιά της. Επίσης μετά από κάθε εντολή SQL σε ένα SQL Script, υπάρχει το ερωτηματικό ;. Αυτό συμβαίνει για να ξεχωρίζει η μία εντολή από την άλλη. Πολλές φορές όμως θέλουμε να εκτελέσουμε μόνο μια εντολή SQL, μέσω κάποιας γλώσσας προγραμματισμού, όπως η PHP. Σε αυτή την περίπτωση πολλές φορές οι εντολές που τελειώνουν σε ; δεν εκτελούνται για να αποφύγουμε προβλήματα ασφαλείας SQL Injection.
Στην επόμενη σελίδα του phpmyadmin πρέπει να φτιάξουμε τον πρώτο μας πίνακα.
Κάπου λέει Δημιουργία νέου πίνακα στη βάση thlefwna.
Κάτω ακριβώς έχει 2 πεδία. Στο Όνομα εισάγουμε το όνομα του πίνακά μας, έστω thlefwna (πάλι).
Εκεί που λέει Πεδία εισάγουμε τον αριθμό πεδίων που θα έχει ο πίνακάς μας. Εκεί εισάγουμε τον αριθμό 3 και πατάμε το κουμπί εκτέλεση.
Στην επόμενη σελίδα μας ρωτάει πληροφορίες για αυτά τα 3 πεδία ώστε να δημιουργήσει τον πίνακα. Αυτά που χρειάζεται είναι το όνομα του κάθε πεδίου, ο τύπος των δεδομένων που θα περιέχεται σε κάθε πεδίο (π.χ. Αριθμοί, κείμενο), το μήκος τους (π.χ. 5 χαρακτήρες), και κάποιες επιπλέον παράμετροι που είναι προαιρετικές.
Στο πρώτο πεδίο θα βάλουμε όνομα: onoma, τύπος: varchar, μήκος:20
στο δεύτερο epwnymo, varchar, 20
και στο τρίτο thlefwno, varchar, 20.
Ο τύπος δεδομένων varchar σημαίνει ότι θα εισάγουμε αλφαριθμητικούς χαρακτήρες, οι οποίοι όμως δεν ξέρουμε πόσοι θα είναι. Απλά ορίζουμε ότι θα είναι μέχρι 20 (το μήκος που ορίζουμε δηλαδή) σε κάθε πεδίο.
Πατάμε αποθήκευση.
Θα δούμε ότι εκτελέστηκε η εντολή

Κώδικας: Επιλογή όλων

CREATE TABLE `thlefwna` (
`onoma` VARCHAR( 20 ) NOT NULL ,
`epwnymo` VARCHAR( 20 ) NOT NULL ,
`thlefwno` VARCHAR( 20 ) NOT NULL 
); 
Πάλι η σύνταξή της είναι πολύ απλή. Φτιάξε τον πίνακα 'thlefwna'. Στην παρένθεση ορίζονται τα πεδία του, χωρισμένα με κόμματα, και σε κάθε πεδίο ορίζονται και οι παράμετροι του.
Το NOT NULL σημαίνει ότι το πεδίο δεν θα δέχεται μηδενικές τιμές.

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

Κώδικας: Επιλογή όλων

INSERT INTO `όνομα πίνακα` ( `όνομα πεδίου` , `όνομα πεδίου` , `όνομα πεδίου` ) 
VALUES (
'τιμή', 'τιμή', 'τιμή'
);
Ουσιαστικά η εντολή είναι χωρισμένη σε 3 μέρη.
Στην αρχή λέμε "Τοποθέτησε στον πίνακα 'όνομα πίνακα΄"
στην πρώτη παρένθεση δίνουμε τα ονόματα των πεδίων όπου στα οποία θα εισάγουμε δεδομένα
στην δεύτερη παρένθεση, έπειτα από το VALUES Δηλαδή (που σημαίνει τιμές), δίνουμε τις τιμές για τα πεδία που ορίσαμε, με την σειρά που τα δώσαμε στην πρώτη παρένθεση.
Για παράδειγμα:

Κώδικας: Επιλογή όλων

INSERT INTO `thlefwna` ( `onoma` , `epwnymo` , `thlefwno` ) 
VALUES (
'Γιάννης', 'Γλαρός', '123-345634324'
);
Θα φτιάξει μια εγγραφή με το όνομα Γιάννης, το επώνυμο Γλαρός και το τηλέφωνο 123-34564324.
Ας βάλουμε μερικές ακόμα εγγραφές για να έχουμε να παίζουμε:

Κώδικας: Επιλογή όλων

INSERT INTO `thlefwna` ( `onoma` , `epwnymo` , `thlefwno` ) 
VALUES (
'Γιάννης', 'Παπαδόπουλος', '123123123123'
);
INSERT INTO `thlefwna` ( `onoma` , `epwnymo` , `thlefwno` ) 
VALUES (
'Γιάννης', 'Πάστης', '112423123123'
);
INSERT INTO `thlefwna` ( `onoma` , `epwnymo` , `thlefwno` ) 
VALUES (
'Κώστας', 'Παπαδόπουλος', '1232312312123'
);
INSERT INTO `thlefwna` ( `onoma` , `epwnymo` , `thlefwno` ) 
VALUES (
'Γιώργος', 'Γλαρός', '1231231231-23'
);
INSERT INTO `thlefwna` ( `onoma` , `epwnymo` , `thlefwno` ) 
VALUES (
'Γιάννης', 'Σκλάβος', '122353523-23123'
);
INSERT INTO `thlefwna` ( `onoma` , `epwnymo` , `thlefwno` ) 
VALUES (
'Γιάνννης', 'Παπαδόπουλος', '123'
);
Ας αρχίσουμε τώρα να τραβάμε τα δεδομένα μας. Η εντολή που χρησιμοποιούμε είναι η SELECT, ;ίσως η πιο βασική εντολή σε μια web εφαρμογή,
Η σύνταξή της είναι η εξής:

Κώδικας: Επιλογή όλων

SELECT ονομα πεδίου, ονομα πεδίου FROM `όνομα πίνακα`
και προερετικά την ακολουθούν οι
WHERE (συνθήκες)
LIMIT (αριθμός εγγραφών)
και ένα σωρό άλλες παράμετροι, που δεν θα αναλύσουμε εδώ.
Ας τρέξουμε μια απλή εντολή για να πάρουμε όλα μας τα δεδομένα.

Κώδικας: Επιλογή όλων

SELECT onoma, epwnymo, thlefwno FROM `thlefwna`
Απλό ε;
Ας δοκιμάσουμε κάτι άλλο.

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna`
Μας φέρνει το ίδιο αποτέλεσμα. Με τον χαρακτήρα * παίρνουμε το αποτέλεσμα από όλα τα πεδία, αντί να τα γράφουμε ένα – ένα. Θα μπορούσαμε όμως να γράψουμε το παρακάτω:

Κώδικας: Επιλογή όλων

SELECT epwnymo FROM `thlefwna`
Θα μας επιστρέψει όλα τα επώνυμα του πίνακα.
Γενικά είναι αρχή να προσπαθούμε να τραβάμε από έναν πίνακα μόνο τα δεδομένα που μας χρειάζονται, για πολλούς λόγους. Κατ' αρχήν για ταχύτητα, όταν έχουμε να κάνουμε με μεγάλες βάσεις. Αν τραβάμε περισσότερα πράγματα από όσα μας χρειάζονται επιβαρύνουμε άδικα το σύστημα.
Μέχρι εδώ τα πράγματα ήταν πολύ απλά.
Ας δοκιμάσουμε τώρα να φιλτράρουμε λίγο τα δεδομένα μας. Θα χρησιμοποιήσουμε την παράμετρο WHERE.
Η σύνταξή της είναι WHERE `όνομα πεδίου` = 'τιμή'
αντί για = μπορούμε να βάλουμε > ή < κλπ
άλλη σύνταξη είναι WHERE `όνομα πεδίου` LIKE `τιμή`
Για παράδειγμα αν θέλουμε να πάρουμε όλες τις εγγραφές που το όνομα είναι Γιάννης, δίνουμε την παρακάτω εντολή:

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna` WHERE `onoma` = 'Γιάννης'
Αν θέλουμε να έχουμε περισσότερα WHERE, τα χωρίζουμε με AND ή OR. Π.χ.

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna` WHERE `onoma` = 'Γιάννης' AND `epwnymo` = 'Γλαρός'
ας δοκιμάσουμε και το OR:

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna` WHERE `onoma` = 'Γιάννης' OR `epwnymo` = 'Γλαρός'
τι έγινε εδώ;
η AND λέει ότι πρέπει να τιρούνται όλες οι συνθήκες στο WHERE, ενώ η OR λέει ότι να τιρίται έστω και μία.
Δοκιμάστε επίσης το

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna` WHERE `onoma` = 'Γιάννης' OR `onoma` = 'Γιώργος'
Τέλος υπάρχει άλλη μια χρήσιμη παράμετρος. Η LIMIT.
H σύνταξή της είναι LIMIT χ, ψ
Ουσιαστικά λέει στην SELECT να επιστρέψει ψ εγγραφές αρχίζοντας από την εγγραφή χ.
Για παράδειγμα:

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna` LIMIT 0, 5
θα φέρει τις πρώτες 5 εγγραφές, ενώ η

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna` LIMIT 5, 5
θα φέρει τις υπόλοιπες. Πολύ χρήσιμο αν θέλουμε να εμφανίζουμε τα αποτελέσματά μας σε πολλές σελίδες.
Ένα τελευταίο παράδειγμα:

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna` WHERE `onoma` = 'Γιάννης' OR `onoma` = 'Γιώργος' LIMIT 5
Εδώ έχουμε σύνταξη της μορφής LIMIT αριθμός εγγραφών, χωρίς να ορίσουμε από που ξεκινάει. Θα αρχίσει από το 0 που είναι default.

Επίσης υπάρχει και η WHERE ... LIKE ... που χρειάζεται σε πιο σύνθετες αναζητήσεις.
Εδώ θα αναφέρω 3 απλά παραδείγματα.

Κώδικας: Επιλογή όλων

SELECT * FROM `thlefwna` WHERE `onoma` LIKE '%νν%';
SELECT * FROM `thlefwna` WHERE `onoma` LIKE '%ς';
SELECT * FROM `thlefwna` WHERE `onoma` LIKE 'Γ%';
Στην πρώτη γραμμή παίρνουμε όλα τα δεδομένα που στο όνομα περιέχεται το `νν`.
Στη δεύτερη παίρνουμε όλα τα δεδομένα που το όνομα τελειώνει με ς
και στην τρίτη παίρνουμε όλα τα δεδομένα που το όνομα αρχίζει με Γ.

Στην τελευταία εγγραφή έχω κάνει επίτηδες ένα ορθογραφικό λάθος. Αντί για Γιάννης έχω γράψει Γιάνννης.
Έτσι θα μάθουμε και την εντολή UPDATE.
Η σύνταξή της είναι η

Κώδικας: Επιλογή όλων

UPDATE `όνομα πίνακα` SET `όνομα πεδίου` = 'τιμή' WHERE `όνομα πεδίου` = 'τιμή'
αυτή πηγαίνει στον επιλεγμένο πίνακα και ορίζει στο πεδίο που ορίζουμε στη SET την τιμή σε αυτό που επιλέγουμε. Αυτό θα γίνει σε όλες τις εγγραφές που θα βρει με βάση τις συνθήκες του WHERE.
Για να αλλάξουμε το λάθος μας θα δώσουμε:

Κώδικας: Επιλογή όλων

UPDATE `thlefwna` SET `onoma` = 'Γιάννης' WHERE `onoma` = 'Γιάνννης'
Μια τελευταία εντολή που θα πρέπει όμως να χρησιμοποιούμε με προσοχή είναι η DELETE.
Η σύνταξή της είναι η παρακάτω:

Κώδικας: Επιλογή όλων

DELETE FROM `όνομα πεδίου` WHERE συνθήκες
Για παράδειγμα αν θέλουμε να σβήσουμε την εγγραφή Γιάννης Σκλάβος, για να μη λέει δηλαδή και ότι τον φακελώνουμε :p θα δώσουμε το παρακάτω:

Κώδικας: Επιλογή όλων

DELETE FROM `thlefwna` WHERE `onoma` = 'Γιάννης' AND `epwnymo` = 'Σκλάβος' AND `thlefwno` = '122353523-23123' LIMIT 1 ;
Θα δείτε ότι χρησιμοποιούμε και την LIMIT. Για να είμαστε 100% ότι θα σβήσουμε μόνο μια εγγραφή. Αυτό χρειάζεται σε μεγάλους πίνακες που δεν ξέρουμε πόσες εγγραφές πληρούν τα ίδια κριτήρια. Τη LIMIT μπορούμε επίσης να τη χρησιμοποιήσουμε και με την UPDATE.
Αυτά για την ώρα.
Άλλη μέρα θα μάθουμε inner joins κλπ.

Άβαταρ μέλους
EkLekTos
WebDev Moderator
Δημοσιεύσεις: 7421
Εγγραφή: 07 Απρ 2005 15:44
Τοποθεσία: Inside the Effects
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από EkLekTos » 15 Μάιος 2005 20:47

Πολύ καλό... :yea: :victory: :clap: :yea: :victory: :clap: :yea: :victory: :clap:
* Apple Technical Support Specialist *
* Apple Sales & Product Professional Certificate since 2011 * Εικόνα
Follow me @Twitter

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27626
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από cordis » 15 Μάιος 2005 23:24

ωραίος! :P
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Βασικές εντολές Sql

Δημοσίευση από skeftomilos » 16 Μάιος 2005 01:07

Πολύ καλό, ειδικά για μένα που έχω μαύρα μεσάνυχτα από MySQL. Αλήθεια, είναι σωστό ότι η MySQL είναι θηλυκού γένους? Στη εισαγωγική σελίδα του www.mysql.com αναφέρεται ως The MySQL database server, δηλαδή ο διακομιστής MySQL. Άρα νομίζω ότι το σωστό είναι ο MySQL, κι επίσης σωστό η MySQL database.
:P
Τα queries απ' ό,τι βλέπω δεν διαφέρουν από τα αντίστοιχα για MS Access. Το μόνο που δεν έχει αντίστοιχο σε καμία περίπτωση είναι το CREATE DATABASE. Στην Access δεν έχει νόημα γιατί ένα αρχείο mdb είναι πάντα μία βάση δεδομένων και αντίστροφα.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
EkLekTos
WebDev Moderator
Δημοσιεύσεις: 7421
Εγγραφή: 07 Απρ 2005 15:44
Τοποθεσία: Inside the Effects
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από EkLekTos » 16 Μάιος 2005 02:07

skeftomilos έγραψε:Πολύ καλό, ειδικά για μένα που έχω μαύρα μεσάνυχτα από MySQL.
Mπορεί στη MySQL να έχεις μαύρα μεσάνυχτα αλλά σε JavaScripts Άσπρα Πρωινά :wink: :wink: :kaloe: :kaloe:
* Apple Technical Support Specialist *
* Apple Sales & Product Professional Certificate since 2011 * Εικόνα
Follow me @Twitter

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από mrpc » 16 Μάιος 2005 02:22

skeftomilos έγραψε:Αλήθεια, είναι σωστό ότι η MySQL είναι θηλυκού γένους? Στη εισαγωγική σελίδα του www.mysql.com αναφέρεται ως The MySQL database server, δηλαδή ο διακομιστής MySQL. Άρα νομίζω ότι το σωστό είναι ο MySQL, κι επίσης σωστό η MySQL database.
:P
Μάλλον λέμε η mysql κατά το η βάση δεδομένων.
Από την άλλη συνήθως λέμε ο microsoft sql server, ο διακομιστής.
Δεν ξέρω... καλό θέμα για συζήτηση :D :D :D :D :D :D :D

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από Rapid-eraser » 16 Μάιος 2005 20:50

basika ta parapavo pou avefere o mrpc eivai gevika gia SQL kai oxi eksidikebmeva paradigmata gia mysql

gia tnv akribia oti avefere briskovte sto protipo SQL99

n mysql os epitoplisto akolou8ei kata grama afto to protipo me tis dikes tis paralages.

episis egw protimo to n mysql giati ipovoo to
n basi-dedomevwv mysql ara mou bgevei gevous 8ilikou :P
ektos aftou rixveis kai kaveva p#&t$o gia va bgaleis akri stnv basi ... ara dikeologimeva gevous 8ilikou axxaxaax

episis va aveferoume oti iparxouve dio tipoi basewv
aftoi pou eivai kata to protipo ACID kai aftoi pou dev eivai :P
8a egrafa kai egw gia joins kai subqueries pou eivai to forte mou alla 8a to grapso se greeklish opote 8a paei strafi :P ara perimevoume tov mrpc xaxaax


n movi mou evstasi sta grafomeva tou mrpc eivai merika paradigmata pou dev exouve kali efarmogi tis sql px

to UPDATE `thlefwna` SET `onoma` = 'Γιάννης' WHERE `onoma` = 'Γιάνννης'

eivai megisto sfalma va pame va kavoume eva where clause eksisovovtas strings .

afto eivai ka8ara 8ema kavovikopiisis tis basis bebea kai eivai eva akoma megalo kefaleo stis database.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από mrpc » 16 Μάιος 2005 21:20

Rapid-eraser έγραψε:8a egrafa kai egw gia joins kai subqueries pou eivai to forte mou alla 8a to grapso se greeklish opote 8a paei strafi :P ara perimevoume tov mrpc xaxaax
Γράψε εσύ να κάνω εγώ τη μετάφραση ;)

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από mrpc » 16 Μάιος 2005 21:36

Rapid-eraser έγραψε:eivai megisto sfalma va pame va kavoume eva where clause eksisovovtas strings .

afto eivai ka8ara 8ema kavovikopiisis tis basis bebea kai eivai eva akoma megalo kefaleo stis database.
Μπορείς να το εξηγήσεις λίγο αυτό;
Ξέρω βέβαια ότι συνήθως για UPDATE και DELETE χρησιμοποιούμε κάποιο unique id, αλλά σκοπός μου στο tutorial ήταν απλά να δείξω τις εντολές.
Πέρα από τη χρήση του UID υπάρχει και άλλος λόγος για να μην χρησιμοποιεί κανείς where clause σε strings?

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27626
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από cordis » 17 Μάιος 2005 01:19

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

κανονικοποιημένος ο πίνακάς σου θα ήταν έτσι:

Κώδικας: Επιλογή όλων

CREATE TABLE `atoma` &#40; 
`atomo_id` mediumint&#40;8&#41; unsigned NOT NULL auto_increment,
`onoma` VARCHAR&#40; 50 &#41; NOT NULL , 
`epwnymo` VARCHAR&#40; 50 &#41; NOT NULL , 
PRIMARY KEY  &#40;`atomo_id`&#41;
&#41;;

CREATE TABLE `thlefwna` &#40; 
`tel_id` mediumint&#40;8&#41; unsigned NOT NULL auto_increment,
`atomo_id` mediumint&#40;8&#41;,
`thlefwno` VARCHAR&#40; 20 &#41; NOT NULL , 
 PRIMARY KEY  &#40;`tel_id`&#41;
&#41;;
Όπου ο thlefwna έχει foreign key το atomo_id στον atoma

κι έτσι θα μπορείς να έχεις πολλά τηλέφωνα για κάθε άτομο...
αλλά και για να ξεχωρίζεις τι τύπου τηλέφωνο είναι το κάθε ένα μπορείς να προσθέσεις και αυτό...

Κώδικας: Επιλογή όλων

CREATE TABLE `thlefwna_typos` &#40; 
`tel_type_id` mediumint&#40;8&#41; unsigned NOT NULL auto_increment,
`tel_type_descr` VARCHAR&#40; 50 &#41; NOT NULL , 
 PRIMARY KEY  &#40;`tel_id`&#41;
&#41;;
και να κάνεις τον thlefona έτσι...

Κώδικας: Επιλογή όλων

CREATE TABLE `thlefwna` &#40; 
`tel_id` mediumint&#40;8&#41; unsigned NOT NULL auto_increment,
`atomo_id` mediumint&#40;8&#41;,
`tel_type_id` mediumint&#40;8&#41;,
`thlefwno` VARCHAR&#40; 20 &#41; NOT NULL , 
 PRIMARY KEY  &#40;`tel_id`&#41;
&#41;;
τώρα ο thlefwna έχει foreign key και το tel_type_id στον thlefwna_typos

ας τους γεμίσουμε...

Κώδικας: Επιλογή όλων

INSERT INTO `thlefwna_typos` &#40;`tel_type_id`, `tel_type_descr`&#41; VALUES &#40;1, 'Σπίτι'&#41;;
INSERT INTO `thlefwna_typos` &#40;`tel_type_id`, `tel_type_descr`&#41; VALUES &#40;2, 'Δουλειά'&#41;;
INSERT INTO `thlefwna_typos` &#40;`tel_type_id`, `tel_type_descr`&#41; VALUES &#40;3, 'Κινητό'&#41;;

Κώδικας: Επιλογή όλων

INSERT INTO `atoma` &#40; `atomo_id`,`onoma`, `epwnymo` &#41; VALUES &#40;1, 'Γιάννης', 'Σκλάβος'&#41;;
INSERT INTO `atoma` &#40; `atomo_id`,`onoma`, `epwnymo` &#41; VALUES &#40;2, 'Γιώργος', 'Γλαρός'&#41;;
ας βάλουμε και μερικά τηλέφωνα...

Κώδικας: Επιλογή όλων

INSERT INTO `thlefwna` &#40; `tel_id`,`atomo_id`,`tel_type_id`,`thlefwno`&#41; VALUES &#40;null, 1, 1, '3244412341'&#41;;
και βάλαμε το τηλέφωνο του σπιτιού του 1ου ατόμου...

Κώδικας: Επιλογή όλων

INSERT INTO `thlefwna` &#40; `tel_id`,`atomo_id`,`tel_type_id`,`thlefwno`&#41; VALUES &#40;null, 1, 3, '32112341'&#41;;
και βάλαμε το κινητό του πρώτου ατόμου....

Κώδικας: Επιλογή όλων

INSERT INTO `thlefwna` &#40; `tel_id`,`atomo_id`,`tel_type_id`,`thlefwno`&#41; VALUES &#40;null, 2, 2, '2341'&#41;;
και βάλαμε το τηλέφωνο της δουλειάς του 2ου ατόμου...

Κώδικας: Επιλογή όλων

INSERT INTO `thlefwna` &#40; `tel_id`,`atomo_id`,`tel_type_id`,`thlefwno`&#41; VALUES &#40;null, 2, 3, '7989'&#41;;
και βάλαμε το κινητό του δεύτερου ατόμου....


στους πίνακες `atoma` και `thlefwna_typos` έκανα force τα ids για να βλέπουμε τι έχουμε, αλλά στον πίνακα `thlefwna` άφησα να δουλέψει το auto_increment μιας και δε μας ενδιαφέρει τι id θα βάλει...

για να εμφανίσουμε όλα τα τηλέφωνα δεν έχουμε παρά να κάνουμε...

Κώδικας: Επιλογή όλων

SELECT a.onoma, a.epwnymo, tp.tel_type_descr, t.thlefwna
FROM atoma a, thlefwna_typos tp, thlefwna t
WHERE t.tel_type_id = tp.tel_type_id
 AND t.atomo_id = a.atomo_id 
και πάνω σε αυτήν την δομή πινάκων μπορούμε να βασιστούμε και σε πολλά άλλα... μπορούμε πολύ εύκολα να προσθέσουμε διευθύνσεις... ραντεβού... γενέθλια, γιορτές και επετείους... τι βιβλία τους έχουμε δανείσει... :P ότι μπορούμε να φανταστούμε...
κι αυτό γιατί πάντοτε όταν ξεκινάμε να φτιάχνουμε μια βάση δεδομένων, όσο μικρή κι αν είναι, θα πρέπει να κοιτάμε μπροστά...

* τα SQL απλά τα έγραψα καθώς έγραφα και το κείμενο... δεν τα έχω τσεκάρει.. :P
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από mrpc » 17 Μάιος 2005 03:07

Το tutorial εξελίσεται ;)

Άβαταρ μέλους
xultimatex
Honorary Member
Δημοσιεύσεις: 2505
Εγγραφή: 26 Ιούλ 2003 13:02
Τοποθεσία: Ξάνθη
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από xultimatex » 18 Μάιος 2005 23:14

Κι επειδή είναι tutorial και πρέπει να έχουμε απορίες ρωτώ:
1)Τι κάνει το mediumint( 8 ) και τί το auto_increment;
2)Στο τελευταίο κομμάτι κώδικα αντι να έχει onoma έχει a.onoma. Τι δείχνει αυτός ο χαρακτήρας μπροστά;
3)Εγώ έχω μια σελίδα στην οποία θέλω να βάλω ένα παρόμοιο script. Πως θα δημιουργήσω αυτόν τον πίνακα σ'εκείνη τη βάση;
:arrow: Αν προσπαθείς πολύ για να πετύχεις κάτι, ίσως το κάνεις με λάθος τρόπο...

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27626
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Βασικές εντολές Sql

Δημοσίευση από cordis » 19 Μάιος 2005 01:33

mediumint είναι ο τύπος της κολόνας... δηλ. αριθμητικό -8388608 - 8388607
http://dev.mysql.com/doc/mysql/en/numer ... rview.html

με το auto increment λέμε στην mySQL ότι σε αυτήν την κολόνα εάν δεν βάζουμε εμείς κάποιον αριθμό θα πρέπει να βάζει μόνη της έναν αύξοντα αριθμό που θα είναι +1 από τον μεγαλύτερο που έχει χρησιμοποιηθεί σε αυτήν την κολόνα. (στην 3.χ ήταν από τον μεγαλύτερο που υπάρχει εκείνη την στιγμή στον πίνακα)
http://dev.mysql.com/doc/mysql/en/examp ... ement.html

το a είναι το alias που χρησιμοποίησα για την πίνακα atoma ώστε να μην τον γράφω ολόκληρο και να κερδίσω χρόνο.. (κάτι που τελικά γύρισε μπούμερανκ... γιατί τώρα γράφω πολύ περισσότερα για να εξηγήσω γιατί το έκανα έτσι... :P :P) έτσι αντί να γράφω atoma.atomo_id για να πω στην mySQL ότι θέλω την κολόνα atomo_id από τον πίνακα atoma και όχι από τον πίνακα thlefwna που υπάρχει κι εκεί...

το select για να είναι τελείος σωστό θα έπρεπε να έχει και το AS, αλλά και χωρίς αυτό δεν έχει κανένα πρόβλημα η mySQL.

Κώδικας: Επιλογή όλων

SELECT a.onoma, a.epwnymo, tp.tel_type_descr, t.thlefwna 
FROM atoma AS a, thlefwna_typos AS tp, thlefwna AS t 
WHERE t.tel_type_id = tp.tel_type_id 
 AND t.atomo_id = a.atomo_id
http://dev.mysql.com/doc/mysql/en/select.html
http://dev.mysql.com/doc/mysql/en/legal-names.html
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Βασικές εντολές Sql

Δημοσίευση από Akis_gr49 » 30 Μάιος 2008 01:25

Λίγο πιο ολοκηρωμένο το ερώτημα:

Κώδικας: Επιλογή όλων

SELECT atoma.onoma, atoma.epwnymo, thlefwna_typos.tel_type_descr, thlefwna.thlefwna
FROM atoma AS atoma, thlefwna_typos AS thlefwna_typos, thlefwna AS thlefwna
WHERE thlefwna.tel_type_id = thlefwna_typos.tel_type_id
 AND thlefwna.atomo_id = atoma.atomo_id

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Βασικές εντολές Sql

Δημοσίευση από Akis_gr49 » 30 Μάιος 2008 11:30

Παιδιά καλημέρα,

Έστω ότι έχω χιλιάδες τηλέφωνα μέσα στην βάση μου.
Πως θα αποτρέψω μια διπλοεγγραφή; Δηλαδή να περάσω στην βάση καταλάθος, τον ίδιο χρήστη με το ίδιο τηλέφωνο ίδιου τύπου;

INSERT INTO `thlefwna` ( `tel_id`,`atomo_id`,`tel_type_id`,`thlefwno`) VALUES (null, 1, 3, '32112341');

Ευχαριστώ.

Απάντηση

Επιστροφή στο “Βάσεις Δεδομένων και SQL - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης