ANEXA E

Crearea Obiectelor unei Baze de Date

Instructiunea CREATE este utilizata pentru crearea tabelelor si a altor obiecte ca de exemplu INDEX-uri, DOMAIN, VIEWS. Restrictiile pot fi specificate de asemeni le createa tabelelor ( restricttile sunt implementate la nivelul bazei de date).



        CREATE TABLE EMP
        ( EMPNO INTEGER (A) NOT NULL,
        ENAME CHAR (10),
        JOB CHAR (10),
        MGR INTEGER (4),
        HIREDATE DATE,
        SAL INTEGER (7,2),
        COMM INTEGER (7,2),
        DEPTNO INTEGER (2) NOT NULL );

Cand se creaza tabela se poate specifica optional domeniul pentru coloana respectiva. In plus, constrangerile pot fi specificate ca aplicandu-se asupra valorilor unei coloane sau saupra intregii tabele. Restrictiile pot specifica faptul ca coloanele contin numai anumite valori, valori unice sau nu pot fi nule. Restrictiile sunt implementate in cadrul bazei de date.

Comanda pentru tabela ALTER permite eliminarea unor coloane individuale.



        ALTER TABLE EMP
        DROP MGR;


Comanda DROP este utilizata pentu a elimina alte obiecte din baza de date.

De exemplu :


        DROP TABLE DEPT;
        DROP VIEW SALARY;

INGRES/SQL

INGRES/SQL este un produs al Relational Technology Inc. (RTI). SQL utilizat de INGRES este acelasi din punct de vedere sintactic ca cel utili zat de alti producatori. Majoritatea exemplelor de comenzi date pana acum se pot rula si sub INGRES.Oricum, INGRES/SQL nu are operatorul LIKE.

INGRES suporta caractere speciale pentru utilizarea in comparatii ( in special operatorii de egalitate ) pentru a indica potrivirile partiale intr-un sir de caractere. Caractere care permit identificari pestiale sunt :



        *    identifica orice sir de 0 sau mai multe caractere
        ?    identifica orice caracter
        [..] identifica oricare din caracterele dintre parantezele patrate

INGRES permite ca oricare din aceste caractere speciale sa poata fi folosite singular sau in combinatie pentru a specifica criteriul de identi ficare partiala:

ename='*'
identifica orice valoare in "ename"
ename='E*'
identifica orice valoare care incepe cu "E"
ename='*ein'
identifica orice valoare care se termina cu "ein"
ename='*[aeiou]*'
identifica orice valoare care are cel putin o vocala
ename='Br??'
identifica orice sir de 5 caractere care incepe cu "Br"

Semnificatia speciala a acestor caractere poate fi eliminata in comparatii de predicate prin caracterul "backslash" (\). Astfel "\*" se refera la caracterul asterisc. Oricum, atunci cand se fac atribuiri cu caractere speciale nu trebiue tratate cu specificatiile pentru ndetificarea partiala:


        jtitle='**accountant**'

Deoarece fragmentul de mai sus asigneaza "**accountant**" coloanei "jtitle", stelutele nu necesita o tratare speciala cu backslash. Dar pentru a extrage o valoare asignata astfel este necesara sintaxa urmatoare :


        job.title='\*\*accountant\*\*'

Specificatiile de identificare patriala pot fi utilizate impreuna cu predicatele "between" si "in".

INGRES nu accepta valori NULL. Daca nu se completeaza cu o valoare la inserarea unei coloane atunci INGRES va depozita o valoare implicita in acel camp. In functie de tipul datei dintr-o coloana valoarea impicita poate fi 0 sau spatii.

Tipurile de date disponibile in INGRES/SQL par a fi cea mai mare di ferenta fata de majoritatea variantelor de SQL.

Tipurile de date sunt :


  c1 - c255               character         Un sir de 1..255 caractere
  vchar(1) - vchar(2000)  vchar             Un sir de 1..2000 caractere
  integer1                intreg de 1 byte  -128 .. 127
  integer2 (smallint)     intreg pe 2 bytes -32,768 .. 32,767
  integer4(integer)       intreg pe 4 bytes -2,147,483,648 .. 2,147,483,647
  float4                  real pe 4 bytes   -10**78 .. 10**75 precizie
                                            7 zecimale
  float8(float)           real pe 8 bytes   -10**78 .. 10**75 precizie
                                            15 zecimale
  date                    data (12 byte)    1-ian-1582 .. 31-dec-2382 (pentru
                                            date absolute si -800 ani la 800
                                            ani (ptr. intervale de timp)
  money                   money8(byte)      #-99999999999999.99 ..
                                            #99999999999999.99


Destinatiile smallint, float, integer pot fi utilizate in locul notatiei integer2, float8, integer4 respectiv.

Astfel pentru a crea tabela EMP:



        CREATE TABLE EMP
        ( EMPNO INTEGER2,
        ENAME VCHAR(10),
        JOB VCHAR (20),
        MGR INTEGER2,
        SAL MONEY,
        COMM MONEY,
        DEPTNO INTEGER1);

        Tabelele SALGRADE si DEPT por fi create dupa cum urmeaza :

        CREATE TABLE SALGRADE           CREATE TABLE DEPT
        ( GRADE INTEGER1,               ( DEPTNO INTEGER1,
        LOSAL MONEY,                    DNAME VCHAR(10),
        HISAL MONEY);                   LOC VCHAR(10));

Comanda pentru utilizarea tabelelor este aceeasi ca cea a altor producatori (instructiunea INSERT). Instructiunea DROP poate fi utilizata pentru a elimina obiecte din baza de date.

Vedere de ansamblu

O scurta vedere de ansamblu asupra SQL implementat in 3 RDBMS-uri -DB2, Rdbs si Ingres.

SQL este limbajul standard pentru RDBMS-uri si toate RDBMS-urile majore suporta cateva forme ale SQL.

Acest apendice furnizeaza o scurta vedere de ansamblu a SQL-ului imple- mentat in RDBMS de catre trei furnizori proeminenti de RDBMS -DB2 al lui IBM, Rdb al DEC si Ingres al lui Relational Technology . Informatia prezentata nu intentioneaza sa fie o comparatie cuprinzatoare a acestor produse . Intentia mea este sa arat ca , de cand toate RDBS-urile majore suporta SQL va puteti transfera priceperea pe care ati capatat-o in SQL de la un RDBMS la altul.

DB2

Database 2 ( DB2 ) este RDBMS-ul IBM-ului pentru mediul MVS.

Implementarea DB2 a SQL-ului este identica cu SQL-ul ORACLE-ului . Intr-adevar SQL-ul folosit pentru DB2 (si SQL/DS-RDBMS-ul IBM-ului pentru DOS/USE si mediul de operare VM/SP) a format modelul pentru limbajul SQL . Reamintiti-va ca limbajul SQL a fost dezvoltat de IBM pentru prototipul lor RDBMS-System R , dar ORACLE a intodus prima implementare comerciala posibila a SQL-ului.

Sintaxa declaratiei SELECT

Clauzele de baza ale declaratiei SELECT sunt listate mai jos:


 SELECT  [ALL/DISTINCT] { [Tabela articol(e)/expr [alias] }

 FROM tabela(e) [alias]

 [WHERE predicat]

 [AND predicat]

 [OR predicat]

 GROUP BY coloana(e) ]

 [HAVING predicat]

 [ORDER BY coloana(e)]

Cateva exemple simple de comenzi SQL urmeaza:

EXEMPLE:

  1.   SELECT *
                   FROM EMP;
     
  2.   SELECT DISTINCT DEPTNO
                   FROM DEPT;
     
  3.   SELECT DEPTNO, ENAME
                   FROM  EMP
                   WHERE JOB =  'CLERK'
                   ORDER BY JOB DESC;
     
  4.   SELECT EMPNO, ENAME, JOB, SAL
                   FROM EMP
                   WHERE ENAME LIKE 'S%';
     
  5.   SELECT ENAME, JOB, COMM
                   FROM EMP
                   WHERE COMM IS NULL;
     
  6.   SELECT E.EMPNO, E.ENAME, D.DNAME
                   FROM EMP E, DEPT D
                   WHERE E.DEPTNO = D.DEPTNO;
     
  7.   SELECT DEPTNO, DNAME
                   FROM EMP
                   WHERE NOT EXISTS
                   (SELECT DEPTNO
                   FROM EMP);
     
  8.   SELECT SUM(SAL), DEPTNO
                   FROM EMP
                   GROUP BY DEPTNO
                   HAVING SUM(SAL) 3500;
     

Ceea ce este mai sus , este doar un specimen simplu al comenzilor SQL care pot fi scrise folosind SQL-ul lui DB2. Un rand intins ,de alti operatori este suportat de DB2; operatori de comparatie, operatori booleeni (AND, OR, NOT) , operatori speciali (EXISTS, IN, BETWEEN, LIKE, IS), operatorul pe multime UNION, etc...

DB2 nu suporta direct JOIN-ul extern. Deasemenea, operatorii INTERSECTION si DIFFERENCE nu sunt suportati direct (operatorul UNINO ALL poate fi folosit pentru a construi aceste trasaturi).

DB2 furnizeaza un numar de operatori si functii care pot fi folositi in constructia expresiilor. Unele dintre aceste functii si operatori sunt rezu- mate mai jos.

 Operator/functie                     Descriere
 ----------------                     ---------

 +,-,*,/                              Adunare, scadere, inmultire, impartire.
                                      Pot fi folositi cu date, timpi si
                                      timestamp-uri.

 ||                                   Concatenare-folosit pentru a alatura 2
                                      siruri de caractere sau 2 siruri grafi-
                                      ce.

 CHAR                                 Converteste o data, timp sau timestamp
                                      in reprezentarea sirului sau de carac-
                                      tere.

 DATE                                 Converteste o valoare scalara intr-o
                                      data.

 DAY/MONTH/YEAR                       Extrage portiunea de zi, luna sau an
                                      dintr-o data sau timestamp.

 DAYS                                 Converteste o data sau un timestamp
                                      intr-un numar de zile.

 DIGITS                               Converteste un numar intr-un sir de
                                      caractere.

 HOUR/MINUTE/SECOND                   Extrage portiunea de ore, minute,se-
                                      cunde din timp sau timestamp.

 LENGTH                               Calculeaza lungimea unei valori in oc-
                                      teti.

 SUBSTR                               Extrage un subsir dintr-un sir.

 VALUE                                Converteste un null intr-o valoare ne-
                                      nula.

 COUNT/AVG/                           Functii combinate
 MAX/MIN/SUM

DB2 nu suporta bogatul set de functii care sunt posibile cu ORACLE. Vezi capitolele 4, 5 si 6.

Intentia de aici, nu este de a furniza o comparatie de unu la unu a diferen- telor si asemanarilor intre si SQL-ul ORACLE-ului. Mai degraba, telul este de a arata ca, cunostintele dumneavoastra de SQL pot fi transferate de la un RDBMS la altul.

Crearea obiectelor bazei de date

Comanda CREATE TABLE are in esenta aceeasi sintaxa ca si SQL-ul ORACLE-ului, oricum DB2 are ceva tipuri de date suplimentare:

Integer
Cuvant intreg binar, 31 biti si semn
Smallint
Jumatate de cuvant intreg binar, 15 biti si semn
Decimal (n,m)
Numar zecimal impachetat, n cifre si semn (0Float(n)
Character(n)
Sir de caractere de 8 biti de lungime fixa (0 Varchar(n)
Lungimea variabila a celui de mai sus
Graphic(n)
Sir de caractere de 16 biti de lungime fixa (0 Vargraphic(n)
Lungimea variabila a celui de mai sus
Date
Data reprezentata ca o secventa de 8 cifre zecimale fara semn impachetate (yyyymmdd), ocupand 4 octeti, valorile permise sunt in domeniul 1 Ianuarie AD pana la 31 Decembrie 9999 AD.
Time
Timpul, reprezentat ca o secventa de 6 cifre zecimale fara semn impachetate (hhmmss), o- cupand 3 octeti, valorile permise fiind in domeniul miezul noptii pana la miezul noptii. De exemplu : 000000 pana la 240000
Timestap
Combinatie de data si timp, reprezentata ca o secventa de 20 de cifre fara semn impache- tate(yyyymmddhhmmssnnnnnn),ocupand 10 octeti, valorile permise fiind in domeniul 00010101000000000000 pana la 99991231240000000000

Aceste tipuri pot fi abreviate dupa cum urmeaza :

Int
pentru Integer
Decimal(n)
pentru Decimal(n,0)
Decimal
pentru Decimal(5)
Dec
pentru Decimal
Float
pentru Float(53)
Real
pentru Float(21)
Double Precision
pentru Float(53)
Character
pentru Character(1)
Char
pentru Character
Long Varchar
pentru Varchar(n)
Graphic
pentru Graphic(1)
Long Vargraphic
pentru Vargraphic(n)

Cand creati tabele, puteti specifica daca Null-urile sunt permise sau nu in acelasi mod ca si ORACLE SQL cu o exceptie. DB2 permite declaratia NOT NULL WITH DEFAULT. Aceasta inseamna ca o valoare nu este ceruta pentru aceasta coloana si va fi inlocuita cu o valoare nula.

Zero pentru campuri numarice
Blank-uri pentru campuri cu siruri de lungime fixa
Gol (siruri de lungime zero) pentru campuri cu siruri de lungime variabila.Valoarea lui CURRENT DATE sau CURRENT TIME sau CURRENT TIMESTAMP ,cat mai potrivit.

Deci, pentru a crea o tabela EMP:


     CREATE TABLE EMP
     ( EMPNO  INTEGER NOT NULL,
     ENAME CHAR(10),
     JOB CHAR(10),
     MGR INTEGER,
     HIREDATE DATE,
     SAL DECIMAL(7,2),
     COMM DECIMAL(7,2),
     DEPTNO INTEGER NOT NULL);

Tabela DEPT si tabela SALGRADE pot fi create astfel:


  CREATE TABLE DEPT              CREATE TABLE SALGRADE
  ( DEPTNO INTEGER NOT NULL,     ( GRADE INTEGER NOT NULL,
  DNAME CHAR(15),                LOSAL INTEGER,
  LOC CHAR(15));                 HISAL INTEGER);

Comanda ALTER TABLE si comenzile DROP TABLE sunt la fel ca ale lui ORACLE. Comanda CREATE INDEX este aceeasi deasemenea.

NOTA:

Declaratia Crate Table SQL a lui ORACLE va accepta tipuri de date din DB2 si SQL/DS, si le converteste intern in tipuri de date ORACLE, dupa cum urmeaza:

DB2 SQL/DS
ORACLE
SMALLINT
NUMBER(38)
INTEGER
NUMBER(38)
DECIMAL(M,N)
NUMBER(M,N)
FLOAT
NUMBER
VARCHAR(N)
CHAR(N)
LONG VARCHAR
LONG

Nu exista tipuri de date ORACLE care sa corespunda pentru GRAPHIC, VARGRAPHIC si LONG VARGRAPHIC.

VAX Rdb/VMS

Rdb este RDBMS al lui DEC, care lucreaza in mediul VMS.

Urmeaza sintaxa pentru VAX SQL :


      SELECT [DISTINCT]/[Tabela.] coloana/expr [alias]
      FROM tabela(e) [alias]
      [WHERE conditie]
      [AND conditie]
      [OR conditie]
      [GROUP BY coloana(e)]
      [HAVING conditie]
      [ORDER BY coloana(e)]

Exemple:
  1.   SELECT ENAME, SAL*1.1 FROM EMP 
  2.   SELECT EMPNO, ENAME, JOB FROM EMP
                    WHERE EMPNO = 7369;
      
  3.   SELECT ENAME, HIREDATE, DEPTNO FROM EMP
                    WHERE JOB = "MANAGER"
                    ORDER  BY ENAME;
      
  4.   SELECT DEPTNO, JOB FROM EMP
                    WHERE ENAME LIKE "% S%";
      

    Dupa cum puteti vedea, sintaxa lui VAX SQL este foarte similara cu DB2 si ORACLE SQL. Operatorul EXISTS ca si [NOT] NULL, [NOT] BETWEEN, ALL, opera- tori booleeni, JOIN-uri, subcereri, etc sunt toate suportate.Functiile COUNT, SUM, AVG, MIN, MAX, sunt deasemenea furnizate.