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.
BogSoft 1999