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:
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.
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.
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:
SELECT * FROM EMP;
SELECT DISTINCT DEPTNO FROM DEPT;
SELECT DEPTNO, ENAME FROM EMP WHERE JOB = 'CLERK' ORDER BY JOB DESC;
SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE ENAME LIKE 'S%';
SELECT ENAME, JOB, COMM FROM EMP WHERE COMM IS NULL;
SELECT E.EMPNO, E.ENAME, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
SELECT DEPTNO, DNAME FROM EMP WHERE NOT EXISTS (SELECT DEPTNO FROM EMP);
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:
Aceste tipuri pot fi abreviate dupa cum urmeaza :
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.
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:
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)]
SELECT ENAME, SAL*1.1 FROM EMP
SELECT EMPNO, ENAME, JOB FROM EMP WHERE EMPNO = 7369;
SELECT ENAME, HIREDATE, DEPTNO FROM EMP WHERE JOB = "MANAGER" ORDER BY ENAME;
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.