sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Getting Started : Writing T-SQL (Part 2)

Fivi Panopoulou - Sotiris Karras
Sunday 26 April 2015

Αφού είδαμε στο προηγούμενο post αυτής της σειράς πώς φτιάχνουμε την βάση και τους πίνακές μας, σε αυτό το post θα βάλουμε δεδομένα σε αυτούς τους πίνακες και θα δούμε τα DML statements. Αυτά τα statements είναι τα εξής:

  • INSERT,   για να προσθέσουμε εγγραφές σε έναν πίνακα.
  • SELECT,   για να πάρουμε τα δεδομένα από τους πίνακές μας
  • UPDATE, για να τροποποιήσουμε τις εγγραφές μας
  • DELETE,   για να διαγράψουμε εγγραφές

Έχοντας δημιουργήσει τη βάση και τους πίνακες μας, θέλουμε αρχικά να βάλουμε δεδομένα σε αυτούς. Πρώτα θα εισάγουμε συγγραφείς και κατηγορίες. Ξεκινάμε από αυτά, διότι απαιτείται για ένα βιβλίο που θα θελήσουμε να εισάγουμε στον πίνακα Books να υπάρχει η αντίστοιχη εγγραφή για το είδος του και τον συγγραφέα του στους πίνακες Genres και Authors. Η απαίτηση αυτή προκύπτει από τα foreign key constraints που έχουμε στον πίνακα Books και από το ότι οι στήλες GenreId και AuthorId δεν επιτρέπεται να έχουν NULL τιμές.

Η εισαγωγή των δεδομένων επιτυγχάνεται με τα παρακάτω insert statements, ενώ στην συνέχεια βλέπουμε τα δύο select statements με τα οποία μπορούμε να δούμε τα δεδομένα που έχουν μετα την εισαγωγή οι πίνακες μας.

 

USE BookCave;
GO

-- Insert Authors
INSERT INTO Authors (Firstname,Lastname) VALUES (N'STEPHEN',N'KING');
INSERT INTO Authors (Firstname,Lastname) VALUES (N'KEN',N'FOLLETT');
INSERT INTO Authors (Firstname,Lastname) VALUES (N'STIEG',N'LARSSON');


-- Insert Genres
INSERT INTO Genres (Description) VALUES 
(N'HORROR'), 
(N'HISTORICAL NOVELS'),
(N'CRIME FICTION');
GO


SELECT * FROM Authors;
SELECT * FROM Genres;
GO

 

Το αποτέλεσμα των select statements είναι το παρακάτω:

 

 

 

Η προσθήκη των δεδομένων στον πίνακα των βιβλίων καθώς και το SELECT statement με το οποίο θα δούμε τα περιεχόμενα του πίνακα μετά την εισαγωγή αυτή έχουν ως εξής:

-- Insert Books
INSERT INTO Books (Title,AuthorId,GenreId,MainLanguage)VALUES 
(N'IT',1,1,'EN'),
(N'MISERY',1,3,'EN'),
(N'Η ΛΑΜΨΗ',1,1,'GR'),
(N'PILLARS OF THE EARTH',2,2,'EN'),
(N'WORLD WITHOUT END',2,2,'EN'),
(N'THE GIRL WITH THE DRAGON TATTOO',3,3,'EN');
GO

SELECT * FROM Books;
GO

Και το αποτέλεσμα:

 

Παρατηρώντας τώρα τι είναι αυτό που τρέξαμε, θα πρέπει να σταθούμε στα εξής:

  1. Στα INSERT statements αναφέρουμε τις στήλες στις οποίες θα βάλουμε τιμές και με την ίδια σειρά τις τιμές αυτών.
  2. Στις παραπάνω περιπτώσεις δεν ορίσαμε στο INSERT statement τιμή για την στήλη ID καθώς αυτή θα πάρει  αυτόματα την τιμή της μέσω του IDENTITY.
  3. Για να επιτύχει το INSERT που επιχειρούμε να κάνουμε προσέχουμε να δώσουμε τιμή για όλες  τις στήλες που έχουν ορισθεί με NOT NULL, δεν είναι IDENTITY και δεν έχουμε ορίσει DEFAULT τιμή για αυτές.
  4. Στην περίπτωση των συγγραφέων, προσθέσαμε μια μία τις εγγραφές, με ένα ξεχωριστό insert για κάθε μία, ενώ στις άλλες δύο περιπτώσεις προστέθηκαν όλες μαζί στον πίνακα, με μια μόνο εντολή insert.
  5. Στα strings βλέπουμε ένα N μπροστά, το οποίο ορίζει ότι αυτές οι τιμές που δίνουμε είναι Unicode strings, ταιριάζοντας με τον τύπο nvarchar που έχουμε ορίσει τις στήλες μας.
  6. Θα πρέπει να προσέξουμε οι τιμές των strings που δίνουμε να μην ξεπερνάνε τους maximum χαρακτήρες που ορίσαμε για την κάθε στήλη. Σε διαφορετική περίπτωση, ένα error θα εμποδίσει το insert που θα προσπαθήσουμε να κάνουμε. Για παράδειγμα, αν η στήλη του τίτλου είχε ορισθεί με τύπο nvarchar(60) αντί για nvarchar(150) και προσπαθούσαμε να εισάγουμε το παρακάτω βιβλίο:
    INSERT INTO Books (Title,AuthorId,GenreId,MainLanguage)VALUES 
    (N'AND HERE IS A VERY LARGE TITLE FOR A RANDOM BOOK THAT SHOULD FAIL INSERT',1,1,'EN');
    το αποτέλεμα θα ήταν το error: String or binary data would be truncated. The statement has been terminated. και η εγγραφή αυτή δεν θα προστεθεί στον πίνακα των βιβλίων.

Αφού έχουμε βάλει και μπορούμε να δούμε τα δεδομένα στους πίνακες, ήρθε η ώρα να δούμε τι κάνουμε αν θέλουμε να μεταβάλλουμε τις τιμές τους. Και αυτό τον σκοπό έχει το UPDATE statement. Έστω λοιπόν ότι το βιβλίο “World Without End το βιβλιοπωλείο μας το πουλάει στα ελληνικά και όχι στα αγγλικά όπως δηλώσαμε εμείς. Με το παρακάτω UPDATE ζητάμε να αλλάξει η τιμή της στήλης MainLanguage σε GR για τις εγγραφές που το Id έχει τιμή 5. Στην συνέχεια επιλέγουμε να δούμε αυτή την συγκεκριμένη εγγραφή για να βεβαιωθούμε ότι η τιμή άλλαξε όπως θέλαμε.

 

UPDATE Books
SET MainLanguage = 'GR'
WHERE Id = 5;
GO

SELECT *
FROM Books
WHERE Id = 5;
GO
 

 

Το where clause και στα δύο παραπάνω statements, λειτουργεί ως φίλτρο στις εγγραφές. Δηλαδή στην πρώτη περίπτωση μεταβάλλονται και στην δεύτερη μας επιστρέφονται σαν αποτέλεσμα μόνο οι εγγραφές για τις οποίες ικανοποιείται η συνθήκη που ορίζεται στο where clause. Φυσικά, στο παραπάνω παράδειγμα η εγγραφή είναι μια και μοναδική, καθώς η στήλη Id είναι το PRIMARY KEY.

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

UPDATE Books
SET MainLanguage = 'GR'
WHERE MainLanguage = 'EN';

Τέλος για να διαγράψουμε εγγραφές,  θα χρησιμοποιήσουμε το DELETE. Για παράδειγμα αν θέλουμε να διαγράψουμε το βιβλίο που αλλάξαμε προηγουμένως αντίστοιχα θα έπρεπε να τρέξουμε το εξής:

DELETE BOOKS
WHERE Id = 5;

 

Για να διαγράψουμε όλα τα βιβλία ενός συγγραφέα μπορούμε να γράψουμε το εξής:

 

DELETE Books
WHERE AuthorId = 1;
 

διαγράφοντας τις 3 εγγραφές για τις οποίες ισχύει αυτή η συνθήκη.

Πρέπει να σημειωθούν τα εξής:

  1. Αν παραλείψουμε το where clause στο update ή το delete τότε επηρεάζουν όλες τις εγγραφές του πίνακα. Δηλαδή, το “UPDATE BOOKS SET GenreId = 1 θα βάλει όλα τα βιβλία στην κατηγορία Horror, ενώ το “DELETE Books θα σβήσει όλο τον πίνακα των βιβλίων.
  2. Αν προσπαθούσαμε να διαγράψουμε εγγραφή από τον πίνακα Genres, θα αποτυγχάναμε λόγω των foreign key constraints του πίνακα Books. Με άλλα λόγια όσο υπάρχει βιβλίο ενός είδους στον πίνακα Books, το είδος αυτό δεν μπορεί να διαγραφεί από τον πίνακα Genres. Αντίστοιχος περιορισμός υπάρχει και για τους συγγραφείς.
  3. Το παραπάνω δεν ισχύει στην περίπτωση που στο foreign key constraint, δηλαδή στο παράδειγμά μας το FK_Books_Genres, είχε ορισθεί να γίνεται cascade on delete. Σε αυτή την περίπτωση το “DELETE Genres WHERE Id = 3;” θα είχε ως αποτέλεσμα τη διαγραφή του είδους Horror, αλλά και τη διαγραφή των βιβλίων αυτού του είδους. Αντίστοιχα και για το UPDATE των ids των συγγραφέων και των ειδών.

Comments

03 Apr 2019 @ 12:40 AM

user-gravatar

Nick Stavrou

Καλησπέρα. Γιατί σε κάθε εισαγωγή Insert Into χρησιμοποιείτε το γράμμα Ν στην αρχή?έχει σχέση με το ότι κάναμε το Primary Key Να δέχεται αυτόματα Integer values λόγω το Identity?

03 Apr 2019 @ 4:35 PM

user-gravatar

Antonios Chatzipavlis

Το Ν (το λέμε National) δεν έχει κάποια σχέση με το PK. Μπαίνει στην αρχή ενός string για να δηλώσει ότι το string αυτό είναι Unicode string.

Fivi Panopoulou

Fivi Panopoulou

Το 2007 ξεκίνησα τις σπουδές μου στη σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών στο Εθνικό Μετσόβιο Πολυτεχνείο.Κατά την διάρκεια των σπουδών μου εκεί αγάπησα τον προγραμματισμό και τα συστήματα πληροφορικής, καθώς επίσης απέκτησα το ιδιαίτερο ενδιαφέρον μου για τις βάσεις δεδομένων. Κατά την διάρκεια της διπλωματικής μου ασχολήθηκα με ζητήματα ανωνυμοποίησης δεδομένων και την ανάπτυξη σχετικού εργαλείου. Τα τελευταία χρόνια των σπουδών μου, μου δόθηκε η ευκαιρία να ασχοληθώ περισσότερο και να διευρύνω τους ορίζοντές μου ως Microsoft Student Partner και μέσω της κοινότητας Student Guru. Στα πλαίσια των κοινοτήτων αυτών, ξεκίνησα να ασχολούμαι με παρουσιάσεις αλλά και να γνωρίζω τον SQL Server. Από την πρώτη στιγμή που ασχολήθηκα μαζί του, συνειδητοποίησα πόσο ήθελα να εμβαθύνω τις γνώσεις μου σχετικά με αυτόν και τα συστήματα διαχείρισης βάσεων δεδομένων γενικότερα, πράγμα που προσπαθώ να κάνω έκτοτε. Πριν χρόνια είχα την τύχη να συμμετέχω στο πρόγραμμα mentoring, μέσω του οποίου γνώρισα τον κ. Χατζηπαυλή. Από τότε συμμετέχω στην ομάδα του SQLschool.gr.


Sotiris Karras

Sotiris Karras

Είμαι απόφοιτος της σχολής Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών του Εθνικού Μετσόβιου Πολυτεχνείου και στα ενδιαφέροντά μου συμπεριλαμβάνεται o τομέας του Knowledge and Data Engineering. Πιο συγκεκριμένα, έχω ασχοληθεί ακαδημαϊκά και ερευνητικά με τον τομέα του data privacy και data anonymity, ενώ πάθος μου είναι ό,τι έχει να κάνει με relational databases και data management. Στο παρελθόν, έχω συνεργαστεί με την Microsoft Hellas ως Microsoft Student Partner για ακαδημαϊκές δραστηριότητες και ήμουν μέρος του MVP mentoring προγράμματός της, στο οποίο είχα την τύχη να γνωρίσω τον κ. Χατζηπαυλή.

Episode

First look: SQL Database in Microsoft Fabric

image

More Episodes...

Tip

What's New in SQL Server 2022 - Episodes

More Tips...

Become a member

If you want to receive updates from us become a member to our community.

Connect

Explore

Learn


sqlschool.gr © 2010-2024 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.