Αυτή η σειρά από posts, έχει σκοπό να βοηθήσει κάποιον να κάνει τα πρώτα του βήματα στην χρήση του Microsoft SQL Server και να κάνει μια γνωριμία με την Τransact-SQL. Αν και σε γενικές γραμμές, το SQL Server Management Studio, δίνει σε ένα νέο χρήστη μεγάλη ευκολία μέσω του γραφικού περιβάλλοντος, εδώ θα χρησιμοποιήσουμε την Transact - SQL (T-SQL) και θα κάνουμε μια αναφορά στις βασικές εντολές που έχει για να δημιουργούμε αντικείμενα και να διαχειριζόμαστε δεδομένα.
Τι είναι η T-SQL;
H SQL (Structured Query Language) είναι μια γλώσσα που σχεδιάστηκε για την διαχείριση δεδομένων σε συστήματα διαχείρισης σχεσιακών βάσεων δεδομένων (RDBMS). Το 1986 δημιουργήθηκε το πρώτο standard για αυτή την γλώσσα, το οποίο αναθεωρήθηκε και εξελίχθηκε με επόμενες εκδόσεις. Η T-SQL (Transact - SQL) είναι η υλοποίηση της Microsoft για αυτό το SQL Standard.
Κατηγορίες των Statements
Τα statements της T-SQL χωρίζονται σε τρείς μεγάλες κατηγορίες.
- Data Manipulation Language (DML) Statements
Όπως λέει και το όνομά τους είναι τα statements με τα οποία χειριζόμαστε τα δεδομένα, δηλαδή παίρνουμε τα δεδομένα που θέλουμε, εισάγουμε καινούρια, τροποποιούμε αυτά που υπάρχουν ή διαγράφουμε κάποια.
- Data Definition Language (DDL) Statements
Με αυτά τα statements δημιουργούμε, τροποποιούμε και διαγράφουμε διάφορα αντικείμενα στην βάση μάς, όπως πίνακες, views, stored procedures, functions και πολλά άλλα.
- Data Control Language (DCL) Statements
Σε αυτή την κατηγορία statements ανήκουν τα statements με τα οποία διαχειριζόμαστε τα security permissions.
Πίνακες και Σχήματα
Τα κυριότερα αντικείμενα που περιέχει μια βάση δεδομένων είναι οι πίνακες (tables). Οι πίνακες, όπως και τα περισσότερα αντικείμενα μιας βάσης, ανήκουν σε ένα σχήμα (schema). Για να αναφερθούμε σε ένα πίνακα η πλήρης σύνταξη περιέχει 4 μέρη και είναι Server.Database.DatabaseSchema.Table. Με δεδομένο ότι βρισκόμαστε ήδη στο context μιας βάσης, μπορούμε να παραλείψουμε τα 2 πρώτα μέρη της παραπάνω σύνταξης και να μας μείνει το DatabaseSchema.DatabaseObject. Αν παραλείψουμε και το μέρος του σχήματος ο SQL Server θα θεωρήσει ότι εννοούμε το default για το χρήστη μας σχήμα. Αν δεν έχει ορισθεί διαφορετικά αυτό το σχήμα είναι το σχήμα dbo, που είναι ένα pre-defined σχήμα.
Δημιουργία Βάσης και Πινάκων
Το Create Statement, όπως λέει και το όνομά του, χρησιμοποιείται για την δημιουργία των αντικειμένων. Έστω λοιπόν, ότι έχουμε το βιβλιοπωλείο «η Σπηλιά του Βιβλίου» και ξεκινάμε να φτιάξουμε μια βάση δεδομένων για αυτό. Σε αυτήν θα υπάρχουν οι υπάλληλοί του, τα προϊόντα του, οι πωλήσεις του κλπ.
Για να φτιάξουμε ένα πρώτο κομμάτι αυτής της βάσης, και συγκεκριμένα αυτό που θα κρατάει τις πληροφορίες των βιβλίων θα χρησιμοποιήσουμε τις εντολές που παρακάτω εντολές:
-- Δημιουργούμε την βάση
CREATE DATABASE [BookCave];
GO
-- Αλλάζουμε το context ώστε να βρισκόμαστε σε αυτό
-- της βάσης που δημιουργήσαμε
USE [BookCave];
-- Φτιάχνουμε έναν πίνακα Συγγραφέων
CREATE TABLE Authors
(
Id int IDENTITY NOT NULL PRIMARY KEY,
Firstname nvarchar(60) NOT NULL,
Lastname nvarchar(60) NOT NULL
);
-- Φτιάχνουμε ένεν πίνακα με κατηγορίες βιβλίων
CREATE TABLE Genres
(
Id int IDENTITY NOT NULL PRIMARY KEY,
Description nvarchar(100) NOT NULL
);
GO
-- Φτιάχνουμε έναν πίνακα για τα βιβλία
CREATE TABLE Books
(
Id int IDENTITY NOT NULL PRIMARY KEY,
Title nvarchar(150) NOT NULL,
AuthorId int NOT NULL,
GenreId int NOT NULL,
MainLanguage char(2) NOT NULL,
CONSTRAINT FK_Books_Authors FOREIGN KEY (AuthorId) REFERENCES Authors (Id),
CONSTRAINT FK_Books_Genres FOREIGN KEY (GenreId) REFERENCES Genres (Id)
);
GO
Για έναν πίνακα χρειάζεται να ορίσουμε τι στήλες θα έχει. Για κάθε στήλη ορίζουμε ένα όνομα, τι τύπου δεδομένα θα έχει (int, char,date κλπ) και αν δέχεται NULL τιμές ή όχι. Επίσης ορίζουμε ποιά από τις στήλες μας θέλουμε να είναι PRIMARY KEY.
Στον τελευταίο πίνακα με τα βιβλία, βλέπουμε πώς μπορούμε να ορίσουμε σχέσεις μεταξύ πινάκων. Αυτό γίνεται με τα foreign keys, και σε αυτό το παράδειγμα στο FK_Books_Authors δηλώνουμε ότι η στήλη AutorId του πίνακα Books αναφέρεται σε τιμές της στήλης Id του πίνακα Authors.
Αφού δεν ορίσαμε κάτι διαφορετικό οι πίνακες αυτοί ανήκουν στο σχήμα dbo.
IDENTITY
Αν θέλουμε να έχουμε ένα auto increment primary key, που να παίρνει αυτόματα μια επόμενη τιμή, χρησιμοποιούμε το keyword IDENTITY. Στην γενικότερη μορφή του αυτό είναι IDENTITY (seed,increment), καθορίζοντας ότι θέλουμε οι αριθμοί που θα δίνει στις εγγραφές μας να ξεκινάνε από τιμή seed και να αυξάνονται κατά increment. Όταν παραλείπουμε αυτούς τους αριθμούς όπως κάναμε στο παράδειγμα μας, είναι το ίδιο με το να είχαμε γράψει IDENTITY(1,1), δηλαδή ζητάμε να δίνει συνεχόμενους ακεραίους ξεκινώντας από το ένα.
DATA TYPES
H T-SQL περιλαμβάνει τις παρακάτω κατηγορίες τύπων δεδομένων:
- Exact numeric (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint)
- Approximate numeric (float, real)
- Date and time (date, datetime, datetime2, datetimeoffset, dmalldatetime, time)
- Character strings (char, text, varchar)
- Unicode character strings (nchar, nvarchar, ntext)
- Binary strings (binary, image, varbinary)
- Other data types (cursor, hierarchyid, sql_variant, table, timestamp, uniqueidentifier, xml)
Για το παράδειγμα μας, μιας που σε αρκετές στήλες έχουμε strings, αξίζει να αναφερθούμε λίγο στα character data types. Σε γενικές γραμμές, όπως φαίνεται και στα παραπάνω έχουμε έναν διαχωρισμό μεταξύ των character strings που δεν περιέχουν Unicode χαρακτήρες και αυτούς που περιέχουν Unicode χαρακτήρες και οι δεύτεροι έχουν τα ίδια ονόματα με τους πρώτους με ένα n μπροστά. Το character set που χρησιμοποιούν οι δεύτεροι είναι το UNICODE UCS-2. Ο δεύτερος διαχωρισμός, είναι το char/nchar με το varchar/nvarchar. Οι πρώτοι δύο είναι σταθερού μήκους strings, δηλαδή το nchar(2) είναι ένα unicode string 2 χαρακτήρων, ενώ οι δεύτεροι δύο είναι μεταβλητού μήκους, δηλαδή το nvarchar(60) σημαίνει ότι αυτό το string μπορεί να έχει μέχρι 60 χαρακτήρες.
Σημείωση no1: To GO δεν είναι statement της T-SQL, αλλά μια εντολή που αναγνωρίζεται από τα utilities του SQL Server όπως το sqlcmd και το SQL Server Management Studio ως εντολή που σηματοδοτεί το τέλος ενός batch.
Σημείωση no2: Προτείνεται η χρήση των semicolons (;) στο τέλος κάθε T-SQL statement. Ο λόγος για αυτό όπως δίνεται εδω και είναι ο εξής: "Although the semicolon is not required for most statements in this version of SQL Server, it will be required in a future version."