Department of Computer Science University of Cyprus EPL342 Databases Lecture 12: SQL DDL I SQL Data Definition Language (Chapter 8.1, Elmasri-Navathe 5ED) + ΤransactSQL Reference Guide http://msdn.microsoft.com/en-us/library/bb510741.aspx Demetris Zeinalipour http://www.cs.ucy.ac.cy/courses/epl342 12-1
Πεξηερόκελν Γηάιεμεο Οινθιήξσζε Δηάιεμεο 11 (Μεηαηξνπή ΕΕR) Εηζαγσγή ζηελ SQL Τύπνη Δεδνκέλσλ ηεο SQL 1999 Αξηζκνί, Σπκβνινζεηξέο, Γπαδηθέο Αθνινπζίεο, Λνγηθνί Τύπνη, Ηκεξνκελίεο & Ώξα, Φξνλόζεκα, θ.α. TSQL: Σπλαξηήζεηο Ηκεξνκελίαο, Απηόκαηε Αύμεζε Τηκήο, Υπνινγηδόκελα Γλσξίζκαηα, Δμεηδηθεπκέλνη Τύπνη Οξηζκόο Δεδνκέλσλ (CREATE/DROP/ALTER) Γεκηνπξγία Σρήκαηνο θαη Πηλάθσλ Πεξηνξηζκνί (CONSTRAINTS) Οληόηεηαο, Αλαθνξηθήο Αθεξαηόηεηαο, Ολνκαζία, Δληνιέο Δλεξγνπνίεζεο Αλαθνξάο, Πξνζσξηλή Απελεξγνπνίεζε Πεξηνξηζκώλ 12-2
Δηζαγσγή ζηε SQL Σηηο πξνεγνύκελεο ελόηεηεο κειεηήζακε κηα ηππηθή γιώζζα ΒΓ, ηελ Σρεζηαθή Άιγεβξα, ε νπνία ζηεξίδεηαη πάλσ ζην Σρεζηαθό Μνληέιν. Σε απηή ηελ ελόηεηα ζα κειεηήζνπκε κηα πξαγκαηηθή γιώζζα βάζεσλ δεδνκέλσλ ηελ SQL (Structured Query Language) ε νπνία ζηεξίδεηαη ηόζν πάλσ ζηε Σρεζηαθή Άιγεβξα όζν θαη πάλσ ζηνλ Λνγηζκό Πιεηάδσλ. Σπγθεθξηκέλα ζα κειεηήζνπκε ηελ SQL ζε δπν βαζηθέο ελόηεηεο: Γλώζζα Οπιζμού Δεδομένων (Data Definition Language, SQL-DDL) Γιώζζα Δπεμεξγαζίαο Δεδομένων (Data Manipulation Language, SQL-DML) 12-3
Δηζαγσγή ζηελ SQL (Παξαδείγκαηα DDL/DML) Παξάδεηγκα Γλώζζαρ Οπιζμού Δεδομένων (Data Definition Language, SQL-DDL) CREATE TABLE DEPARTMENT ( DNAME VARCHAR(10) NOT NULL, DNUMBER INTEGER NOT NULL, MGRSSN CHAR(9), MGRSTARTDATE CHAR(9) ); Παπάδειγμα Γλώζζαρ Επεξεπγαζίαρ Δεδομένων (Data Manipulation Language, DML) SELECT D.MGRSSN, D.MGRSTARTDATE, FROM DEPARTMENT AS D WHERE DNUMBER = 10; 12-4
Ιζηνξία ηεο SQL 1969: Το Σσεζιακό Μονηέλο ηος Edgar F. Codd ςλοποιείηαι από ηη βάζη IBM System R 1970: Ο Donald D. Chamberlin θαη ν Raymond F. Boyce, επηζηήκνλεο ηεο IBM Almaden, δεκηνπξγνύλ ηελ πξώηε έθδνζε ηεο SQL ε όπνηα νλνκάδεηαη SEQUEL. Τν όλνκα αιιάδεη αξγόηεξα ζε SQL εθόζνλ ην όλνκα SEQUEL ήηαλ θαηνρπξσκέλν ζε θάπνηα εηαηξεία θαηαζθεπήο αεξνπιάλσλ ζηελ Αγγιία. Τελ ίδηα ρξνληά ε Relational Software, Inc., επεξεαζκέλν από ηνπο Codd, Chamberlin, and Boyce, θηηάρλεη ηελ βάζε δεδνκέλσλ Oracle γηα θξαηηθέο ππεξεζίεο ησλ ΗΠΑ. 1985: H ΙΒΜ κάνει ηην SQL Παηένηα (US Pat. 4,506,326). Οη πην επηηπρεκέλεο πξνζπάζεηεο ηππνπνίεζεο SQL (ANSI 1986) SQL1 (ANSI 1989) SQL2 ή SQL92 (ANSI 1992) SQL3 ή SQL99 (ANSI 1999) (+OLAP, XML, object-relational etc.) Πξόηππα πνπ έκεηλαλ θπξίσο ζηηο ζπζηάζεηο: SQL 2003 θαη SQL 2008 12-5
Τύπνη Γεδνκέλσλ ηεο SQL:1999 Σε απηή ηελ ελόηεηα ζα κειεηήζνπκε ηνπο βαζηθνύο ηύπνπο δεδνκέλσλ ηεο ANSI SQL:1999. Σηα πιαίζηα ηνπ εξγαζηεξίνπ έρεηε κειεηήζεη ήδε αξθεηνύο εμεηδηθεπκέλνπο ηύπνπο δεδνκέλσλ πνπ νξίδνληαη ζηα πιαίζηα ηεο TSQL-DDL (π.ρ., money, image=varbinary(max), text, θηι.) TSQL 2008 Reference: http://technet.microsoft.com/en-us/library/bb510741.aspx O SQL Server έρεη πεξηζζόηεξνπο από 32 ηύπνπο δεδνκέλσλ! ANSI SQL:1999 Τύπνη Αξηζκεηηθνί Τύπνη: Numeric, Decimal, INT, FLOAT, REAL, θηι. Αιθαξηζκεηηθνί (Σπκβνινζεηξέο) Τύπνη: CHAR, VARCHAR, CLOB, NCHAR, NVARCHAR, NCLOB, θηι. Δπαδηθέο Αθνινπζίεο: BIT, BLOB. Λνγηθνί Τύπνη: BOOLEAN. Ηκεξνκελίεο & Ώξα θαη Φξνλόζεκα: DATE, TIME, TIMESTAMP. Δεκηνπξγία Εμεηδηθεπκέλσλ Τύπσλ: CREATE DOMAIN. 12-6
Τύπνη Γεδνκέλσλ ηεο SQL (Αξηζκεηηθνί Τύπνη) Αθέξαηνη αξηζκνί: Γύν ηύπνη δεθαδηθώλ αθεξαίσλ αξηζκώλ κε δηαθνξεηηθό εύξνο: INTEGER (ή INT), SMALLINT θαη ΤΙΝΥΙΝΤ Τν εύξνο ησλ αξηζκεηηθώλ ηύπσλ εμαξηάηαη από ηελ πινπνίεζε εάλ θαη ζπλήζσο είλαη 32 bits, 16 bits θαη 8 bits αληίζηνηρα. Ο SQLServer ππνζηεξίδεη ην BIGINT ην νπνίν είλαη 64 bits. Πξαγκαηηθνί Αξηζκνί (Real Numbers): 3 ηύπνη θηλεηήο ππνδηαζηνιήο: FLOAT[(precision)], REAL ( Float(24)), θαη DOUBLE PRECISION ( Float(53)) Οη ρξήζηεο κπνξνύλ λα θαζνξίζνπλ ηελ αθξίβεηα ηνπ FLOAT όρη όκσο απηή ηνπ REAL ή DOUBLE PRECISION Αλαπαξάζηαζε δεθαδηθή ή επηζηεκνληθή (π.ρ., 0.1 ή 1.0E-1) Δεθαδηθνί Αξηζκνί 3 ηύπνη δεθαδηθήο κνξθήο (όινη ππνδειώλνπλ ην ίδην ηύπν ζηε πξάμε): DECIMAL(i,j), DEC(i,j) ή NUMERIC(i,j) (π.ρ., i=3,j=2 111.20) i = αθξίβεηα (# όισλ ησλ ςεθίσλ εθηόο ηεο ππνδηαζηνιήο i=18 default) j = θιίκαθα (# ησλ δεθαδηθώλ ςεθίσλ. j=0 ην default) Σηνλ SQL EPL342: Server Databases δελ ππάξρεη - Demetris Zeinalipour ε έλλνηα (University ησλ unsigned of Cyprus) αξηζκώλ. 12-7
Τύπνη Γεδνκέλσλ ηεο SQL (Σπκβνινζεηξέο) Μηα Σπκβνινζεηξά (Αιθαξηζκεηηθή Αθνινπζία) είλαη κηα ζεηξά από εκηςπώζιμοςρ (printable) ραξαθηήξεο νη νπνίνη δειώλνληαη κε κνλά εηζαγσγηθά: Hello SQL πποαιπεηικό Τύπνη Σπκβνινζεηξώλ: Σταθερού μήκοσς n: CHAR[(n)] ή CHARACTER[(n)] Η πξνθαζνξηζκέλε ηηκή ηνπ n είλαη 1, αληηπξνζσπεύνληαο έλα κνλό ραξαθηήξα, δει., CHAR ή CHARACTER αληηπξνζσπεύεη έλα ραξαθηήξα Οι σαπακηήπερ πος δεν αξιοποιούνηαι μένοςν κενοί (space padding) ενώ οι κενοί σαπακηήπερ δεν λαμβάνοςν μέπορ ζε ζςγκπίζειρ (δεν ιζσύει για εξ. εθαπμογέρ) Μεταβλητού μήκοσς, μέγιστοσ μεγέθοσς n: VARCHAR[(n)] ή CHAR VARYING[(n)] Μεγάινπ Μήθνπο (Character Large OBject CLOB): TEXT (deprecated ζα αθαηξεζεί από κειινληηθή έθδνζε ηεο MSSQL) Πξνζδηνξίδεη κεγάιεο αθνινπζίεο (π.ρ., θείκελα ή κεγάιεο πεξηγξαθέο) κέρξη 2 ή 4 GB (ηα αληηθείκελα απηά απνζεθεύνληαη ζπλήζσο εθηόο βάζεο δεδνκέλσλ) Πάλσ ζε απηά ηα πεδία δελ είλαη ζπλήζσο δπλαηό λα γίλνπλ ζπγθξίζεηο. Σηνλ SQL Server λα νξίδεηαη σο VARCHAR(MAX) => δελ είλαη deprecated Φαξαθηήξεο UNICODE γηα αλαπαξάζηαζε Ξέλσλ Γισζζώλ: NATIONAL CHARACTER[(n] ή ΝCHAR(N) NATIONAL VARYING CHARACTER[(n)] ή NVARCHAR(N) NATIONAL LARGE CHARACTER OBJECT[(n)] ή NCLOB(N) 12-8
Τύπνη Γεδνκέλσλ ηεο SQL (Δπαδηθέο Αθνινπζίεο) Τα Bit strings είλαη ζεηξέο από δπαδηθά ςεθία (0 ή 1) ή NULL. (TRUE=1, FALSE=0 ή NULL) Τύπνη Bit Strings Σταθερού μήκοσς n: BIT[(n)] Μεταβλητού μήκοσς, μέγιστοσ μεγέθοσς n: VARBIT[(n)] ή BIT VARYING[(n)] Μεγάινπ Μήθνπο (Binary Large OBject BLOB): Αληίζηνηρα κε ην CLOB αιιά ρσξίο ξεηή θσδηθνπνίεζε Η πξνθαζνξηζκέλε ηηκή ηνπ n είλαη 1. O SQL server απνζεθεύεη ηα bits ζε byte (π.ρ., 3bit = 1Byte, 9b=2B, ) Μεηνλεθηήκαηα Κάπνηεο πινπνηήζεηο (π.ρ., Oracle) δελ ππνζηεξίδνπλ bit-strings νπόηαλ ζπλίζηαηαη ε ρξήζε Char(1)=Y N Γελ επηηξέπεηαη ε ρξήζε επξεηεξίσλ πάλσ από bit strings π.ρ., EPL342: επξεηήξην Databases θαηαθεξκαηηζκνύ - Demetris Zeinalipour πνπ λα βξίζθεη (University γξήγνξα of Cyprus) ηνπο EMPLOYEE 12-9
Οη ηύπνη δεδνκέλσλ Ηκεξνκελίαο θαη Ώξαο πξνζηεζήθαλ ζηελ SQL2 Τξεηο ηύπνη ρξνλνινγηθώλ δεδνκέλσλ Ηκεξνκελία (DATE) Ώξα (TIME) Τύπνη Γεδνκέλσλ ηεο SQL (Ηκεξνκελία θαη Ώξα) Φξνλόζεκν (TIMESTAMP) Πέξα από απηνύο ηνπο ηύπνπο ε έλλνηα ηεο Ώξαο/Ηκεξνκελίαο ζηηο πεξηζζόηεξεο πινπνηήζεηο ππνζηεξίδεηαη θαη ππό ηελ κνξθή ζπλαξηήζεσλ όπσο ζα δνύκε ζηε ζπλέρεηα. 12-10
Τύπνη Γεδνκέλσλ ηεο SQL (Ηκεξνκελία θαη Ώξα) Τύπνο Δεδνκέλσλ DATE Εμ νξηζκνύ κνξθή (Default format): YYYY-MM-DD Εύξνο: 0001-01-01 έσο 9999-12-31 Αθξίβεηα: Ηκέξαο Ηκεξνιόγην: Γξεγνξηαλό DEFAULT ηηκή: 1900-01-01 Μέγεζνο: 3 bytes ζηνλ SQL Server) 3 bytes (16Μ days = 45K years) Δάλ ήηαλ 2bytes (65K days = 180 years) Παξάδεηγκα CREATE TABLE DEPARTMENT (... MGRSTARTDATE DATE NOT NULL DEFAULT 1900-01-01 ); 12-11
Τύπνη Γεδνκέλσλ ηεο SQL (Ηκεξνκελία θαη Ώξα) Τύπνο Δεδνκέλσλ TIME [(precision)] Εμ νξηζκνύ κνξθή: hh:mm:ss[.nnnnnnn] Εύξνο: 00:00:00.0000000 εσο 23:59:59.9999999 Αθξίβεηα: 100 nanoseconds (almost microsec.) DEFAULT ηηκή: 00:00:00 Μέγεζνο: 5 bytes (ζηνλ SQL Server) Τύπνο Δεδνκέλσλ TIMESTAMP[(precision)] Σπλδπάδεη ηελ ώξα καδί καδί ηελ εκεξνκελία Σηνλ SQL Server 2008 νλνκάδεηαη datetime2 (YYYY- MM-DD hh:mm:ss[.nnnnnnn]) Υπάξρνπλ θαη ηα datetime (YYYY-MM-DD hh:mm:ss[.nnn] - millisecond) θαη smalldatetime (YYYY-MM-DD hh:mm:ss - second) 12-12
Τύπνη Γεδνκέλσλ ηεο SQL (Ηκεξνκελία θαη Ώξα) Εξειδικεςμένοι Τύποι SQL Server 2008 http://msdn.microsoft.com/en-us/library/ms187752.aspx Data type Format Range Accuracy Storage size (bytes) time hh:mm:ss[.nnnnn nn] 00:00:00.0000000 through 23:59:59.9999999 100 nanoseconds 3 to 5 date YYYY-MM-DD smalldatetime YYYY-MM-DD hh:mm:ss datetime YYYY-MM-DD hh:mm:ss[.nnn] 0001-01-01 through 9999-12-31 1900-01-01 through 2079-06-06 1753-01-01 through 9999-12-31 1 day 3 1 minute 4 0.00333 second 8 datetime2 YYYY-MM-DD hh:mm:ss[.nnnnn nn] 0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999 100 nanoseconds 6 to 8 0001-01-01 00:00:00.0000000 through 9999-12-31 YYYY-MM-DD datetimeoffset hh:mm:ss[.nnnnn 100 nanoseconds 8 to 10 nn] [+ -]hh:mm 23:59:59.9999999 (in EPL342: Databases - Demetris UTC) Zeinalipour (University of Cyprus) 12-13