Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Limbajul sql - reguli sql, tipuri de date sql, instructiuni sql de definire a bazei de date, instructiuni sql de manipulare a bazei de date

LIMBAJUL SQL



1.     Generalitati


Limbajul structurat de interogare SQL (Structured Query Language) este limbajul standard pentru bazele de date (BD) relationale definit de ANSI in 1986 si adoptat ulterior ca standard international de catre ISO (1992). Peste o suta de sisteme de gestiune a bazelor de date (SGBD) accepta recunosc limbajul SQL.

Ca orice limbaj de baze de date, SQL permite:

Crearea bazei de date relationale si structurarea relatiilor prin componenta sa de definire a datelor (DDL)



Efectuarea operatiilor elementare asupra BD (inserare, stergere, modificare a datelor) si a interogarilor asupra BD, prin componenta de manipulare a datelor (DML)

Limbajul SQL contine comenzi de definire si regasire a datelor (CREATE TABLE, SELECT TABLE, DELETE, INSERT etc.) dar nu contine instructiuni pentru controlul fluxului datelor (IF THEN ELSE, GO TO, DO etc.).

SQL este un limbaj neprocedural cu format liber deoarece precizeaza ce rezultate sunt necesare si nu procedura prin care se obtin acestea.

Prima implementare comerciala a unui SGBD relational bazat pe SQL a fost realizata de corporatia ORACLE. Ulterior au aparut sute de produse de BD bazate pe SQL si dialecte ale acestuia.

SQL ca standard pentru BD a fost inclus ca si componenta in arhitecturile de aplicatii de BD dezvoltate de marile firme producatoare de soft, cum este IBM, si adopta pentru prelucrarea informatiilor in sistemul federal al SUA.

Grupul de acces SQL lucreaza pentru realizarea interoperabilitatii dintre limbajul SQL si alte SGBD disparate.

Imbunatatirea SQL se face prin definirea de noi componente precum standardul de acces la BD de la distanta (RDA - Remote Data Access) si sistemul de dictionare de resurse informationale (IRDS - Information Resource Dictionarz System). Alte imbunatatiri includ suportul pentru BD distribuite in retea, programarea orientata-obiect si acceptarea extensiilor definite de catre utilizator.


2.     reguli SQL


Limbajul SQL foloseste termenii de tabele, coloane si randuri in locul celor de relatii, atribute si inregistrari.

O instructiune SQL include cuvinte rezervate si cuvinte definite de utilizator pentru a denumi tabelele, atributele, indexurile etc., nefiind sensibila la formatul literei (majuscula sau litera mica). Totusi SQL devine sensibil la formatul literelor (case sensitive) in cazul inregistrarilor din BD, adica doua inregistrari "CLIENT" si "Client" sunt tratate distinct.

Regulile sau conventiile adoptate in mod universal pentru scrierea instructiunilor SQL pot fi sintetizate astfel:

a.     Fiecare clauza a unei instructiuni trebuie scrisa pe o linie noua, cu separare prin virgula.

b.     Daca o clauza are mai multe parti, fiecare dintre acestea este scrisa pe o linie noua si indentata pentru a indica relatia cu linia superioara.

c.      Majusculele sunt utilizate pentru cuvintele rezervate (SELECT, INSERT, DELETE, GRANT etc.).

d.     Literele mici sunt folosite pentru termenii proprii utilizatorului (denumiri de tabele, coloane, campuri etc.).

e.     Bara verticala | semnifica operatia logica "SAU" adica alegerea dintre doua sau mai multe optiuni.

f.      Acoladele indica un element necesar.

g.     Parantezele patrate indica un element optional.

h.     Punctele de suspensie () specifica o repetare optionala a unui articol din BD, de zero sau de mai multe ori.

i.       In practica, se creeaza mai intai structura BD prin definirea tabelelor si stabilirea formatului datelor, precum si definirea drepturilor de acces ale utilizatorilor, dupa care se trece la popularea BD.

j.       Fiecare instructiune se incheie prin caracterul "punct si virgula".

k.     Valorile, in general, sunt scrise intre paranteze rotunde, separate prin virgule.

l.       Valorile literale sunt incadrate de apostroafe.


In instructiunile SQL apar diversi identificatori care respecta urmatoarele constrangeri:

a.     Lucreaza cu setul de caractere prestabilit de ISO: litere mari (A . Z), litere mici (a . z), cifre (0 . 9) si liniuta de subliniere (_ underscore).

b.     Sa nu depaseasca lungimea maxima impusa (tipic, 128 de caractere)

c.      Sa inceapa cu o litera si nu cu alt caracter (cifra, alt semn etc.)

d.     Sa nu contina spatii libere.


3.     TIPURI DE DATE SQL


ISO defineste cinci tipuri de date scalare:

I. caracter

CHAR, VARCHAR [lungime]

II. bit

BIT, BIT VARYING [lungime]

III. numeric:

exact:              

NUMERIC [precizie [, scala]]

DECIMAL sau DEC [precizie [, scala]]

INTEGER sau INT

SMALL INTEGER sau SMALLINT

aproximativ:

FLOAT [precizia]

REAL

DOUBLE PRECISSION

IV. data si ora                             

DATE

TIME [precizie_ora] [WITH TIME ZONE]

TIMESTAMP [precizie_ora] [WITH TIME ZONE]

V. interval

INTERVAL camp_data_ora }


Parametrii unui tip de date se scriu intre paranteze rotunde dupa cuvantul care il defineste. Precizia se exprima ca numar de cifre din mantisa (partea intreaga). Scala se exprima ca numar de cifre din exponent (numar de zecimale). Numarul de cifre din campul principal este separat prin virgula de numarul de zecimale prin care se exprima o valoare.



Se poate impune si conditia ca obligatoriu un camp sa fie completat, folosind termenul-cheie NOT NULL. Este cazul cheii primare dintr-o relatie sau a unei chei alternative.

Campurile din instructiunea INTERVAL sunt de forma:

YEAR|MONTH|DAY|HOUR|MINUTE [precizie]

Exemplu:

Instructiunea SQL:

INTERVAL YEAR(1) TO MONTH

semnifica un interval de la 0 ani si 0 luni (timpul prezent) la 9 ani si 11 luni. Numarul de ani poate fi scris in acest caz cu o singura cifra.



4.     INSTRUCTIUNI SQL DE DEFINIRE A BAZEI DE DATE


Instrutiunile de creare, modificare si distrugere a structurilor din BD sunt urmatoarele:

CREATE DATABASE DROP DATABASE

CREATE TABLE ALTER TABLE DROP TABLE

CREATE DOMAIN ALTER DOMAIN DROP DOMAIN

CREATE SCHEMA DROP SHEMA

CREATE VIEW DROP VIEW

CREATE INDEX DROP INDEX


Formatul de baza dat de ISO al instructiunii de creare a unui tabel in BD este urmatorul:


CREATE TABLE nume_tabel



[ON UPDATE actiune_referentiala]

[ON DELETE actiune_referentiala]



EXEMPLU:

CREATE TABLE agenti(

cod_agent DEC(3,0) NOT NULL UNIQUE,

nume VARCHAR(20) NOT NULL,

prenume         VARCHAR(20) NOT NULL,

cnp                    DEC(13,0) NOT NULL,

filiala                 VARCHAR(10),

salariu                            DEC(5,2),

vechime SMALLINT DEFAULT 0

PRIMARY KEY (cod_agent));


CREATE TABLE proprietati(

cod_proprietate DEC(5,0) NOT NULL UNIQUE,

zona VARCHAR(20) NOT NULL,

tip VARCHAR(10) NOT NULL,

pret INT,

cod_agent DEC(3,0),

cod_proprietar DEC(6,0) NOT NULL,

PRIMARY KEY (cod_proprietate),

FOREIGN KEY (cod_agent) REFERENCES agenti ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (cod_proprietar) REFERENCES proprietari);


Observatii:

1.       Tipul datelor poate fi declarat separat sub forma unui domeniu de valori si utilizat pentru mai multe variabile de acelasi tip:

CREATE DOMAIN nume_domeniu AS tip_de_date

[DEFAULT optiune_prestabilita]

[CHECK (conditie)];

La crearea tabelului se specifica in locul tipului datelor, numele domeniului scris cu majuscule.

2.       Instructiunea DROP elimina articole din BD si poate avea doua optiuni:

DROP ARTICOL nume_articol [RESTRICT|CASCADE]

Optiunea RESTRICT nu va permite stergerea articolului daca de acesta depind alte date din BD. Se evita astfel pierderea de date.

Optiunea CASCADE este una extrema care determina stergerea acelui articol din BD precum si a tuturor datelor care depindeau de acesta. Este utila pentru actualizarea structurii BD dupa o perioada mai lunga de timp sau atunci cand se reproiecteaza aceasta.

3.       Indexul este o structura care ofera acces accelerat la inregistrarile din BD pe baza valorilor dintr-una sau mai multe coloane ale unui tabel, imbunatatind astfel performantele de interogare:

CREATE [UNIQUE] INDEX nume_index

ON nume_tabel (coloana [ASC|DESC] [, .])

Utilizarea indexurilor trebuie facuta cu oarecare rezerve intrucat solicita mai multe resurse din partea serverului de BD.

4.       Pentru modificarea structurii de coloane a unui tabel deja creat, se foloseste instructiunea:

ALTER TABLE nume_tabel

[ADD [COLUMN] nume_coloana tip_de_date [NOT NULL] [UNIQUE]

[DEFAULT optiune_prestabilita] [CHECK (conditie)]

[DROP [COLUMN] nume_coloana [RESTRICT | CASCADE]]

[ADD [CONSTRAINT [nume_constrangere]] definitie_constrangere]

[DROP CONSTRAINT nume_constrangere [RESTRICT | CASCADE]]

[ALTER [COLUMN] SET DEFAULT optiune_ prestabilita]

[ALTER [COLUMN] DROP DEFAULT]



5.     INSTRUCTIUNI SQL DE MANIPULARE A BAZEI DE DATE


Instructiunile de manipulare a datelor din BD sunt urmatoarele:

SELECT              pentru interogarea BD;

INSERT              pentru introducere de noi inregistrari in BD;

UPDATE pentru reactualizarea BD;

DELETE pentru stergerea de inregistrari din BD.

Fiecare dintre aceste instructiuni contine dupa cuvantul-cheie de definitie diverse clauze cu multiple optiuni. De aceea le vom studia pe fiecare in parte.


5.1 INSTRUCTIUNEA SELECT


Instructiunea SELECT de interogare a BD are forma urmatoare:


SELECT [DISTINCT|ALL]

FROM nume_tabel_sau_vedere [alias] [,.]

[WHERE conditie]

[GROUP BY lista_de_coloane] [HAVING conditie]

[ORDER BY lista_de coloane];


Exemplu:



SELECT *

FROM agenti

WHERE filiala = centru

Rezultatul acestei comenzi SQL va fi afisarea tuturor inregistrarilor din tabelul "agenti" corespunzatoare filialei "centru".


Cuvantul-cheie DISTINCT elimina in cadrul interogarii eventualele dubluri din BD.

In expresiile incluse in comenzile SQL se folosesc operatori scalari si functii specifice:

operatorii aritmetici:               +,-,*,/

functia de lungime:                  BIT_LENGTH, OCTET_LENGTH, CHAR_LENGTH

operatorul de transformare a tipului de date:                           CAST(tip1 AS tip2)

concatenarea de siruri:

identificarea utilizatorului curent: USER

identificarea sesiunii: SESSION_USER

identificarea sistemului:         SYSTEM_USER

scrierea cu litere mici: LOWER

scrierea cu majuscule: UPPER

data sau timp curent: CURRENT_TIME,CURRENT_DATE, CURRENT_TIMESTAMP.

Limbajul SQL mai accepta cinci functii de grup care se aplica pe o coloana intreaga si genereaza o singura valoare:

COUNT numarare

SUM                  sumare

AVG                   calculul valorii medii

MIN                   deducerea valorii minime

MAX                  deducerea valorii maxime.

Optiunea GROUP BY permite gruparea inregistrarilor cu aceleasi valori pe coloanele precizate in lista de coloane si aplicarea functiilor de grup pe aceste grupuri.

O instructiune SELECT integrata in alta interoare SELECT intr-o clauza WHERE sau HAVING se numeste subinterogare.

Pentru a selecta date din mai multe tabele, in cadrul clauzelor WHERE si HAVING, se folosesc operatiile cu multimi: UNION, INTERSECT, EXCEPT.

Clauza WHERE poate fi urmata de unul din urmatoarele 5 predicate:

Compararea valorilor folosind operatorii de comparare (=, <, >, <=, >=, <> ISO, !=) si/sau operatorii logici (AND, OR, NOT);

Testarea domeniului de valori al unei expresii (BETWEEN/NOT BETWEEN);

Testarea apartenentei la o multime de valori (IN/ NOT IN);

Corespondenta la un anumit model (LIKE/NOT LIKE);

Testarea conditiei de null (IS NULL/IS NOT NULL).

Testele LIKE/NOT LIKE folosesc simbolul "procent" (%) pentru reprezentarea unui sir de zero sau mai multe caractere si caracterul "liniuta de subliniere" pentru reprezentarea oricarui caracter singular.

Exemplu: Clauza:

WHERE nume='A%'

selecteaza toate inregistrarile al caror nume incepe cu litera A.

Clauza ORDER BY poate ordona inregistrarile crescator sau descrescator, alfabetic sau numeric, pe baza uneia sau a mai mutor coloane. Prima coloana constituie cheia majora de sortare, iar urmatoarele sunt chei minore de sortare.



5.2 INSTRUCTIUNEA INSERT


Instructiunea INSERT de introducere a uneia sau a mai multor inregistrari in BD foloseste urmatoarele doua formate:

I. INSERT INTO nume_tabel [(lista_de_coloane)]

VALUES (lista_de_valori);

II. INSERT INTO nume_tabel [(lista_de_coloane)]

SELECT .;

Cel de al doilea format reprezinta o instructiune combinata INSERT . SELECT deci poate folosi toate clauzele instructiunii SELECT pentru copierea mai multor inregistrari din tabele ale BD printr-o singura comanda SQL.


Exemple:

INSERT INTO agenti (nume, prenume, cnp, filiala)

VALUES ('popescu', 'marius', '1900102111111', 'iasi');


INSERT INTO personal

VALUES ('ionescu', 'max', '1900102111111', 'iasi', '0');



5.3 INSTRUCTIUNEA UPDATE


Pentru actualizarea datelor din BD se foloseste instructiunea UPDATE cu urmatorul format:


UPDATE nume_tabel

SET coloana_1 = valoarea_1[, coloana_2 = valoarea_2 .]

[WHERE conditie];


Exemplu:

Pentru majorarea cu 5% a salariilor tuturor agentilor cu vechime de minimum 3 ani se scrie comanda SQL:

UPDATE agenti

SET salariu = salariu*1,05

WHERE vechime >= 3;



5.4 INSTRUCTIUNEA DELETE


Pentru stergerea unor inregistrari din BD se foloseste instructiunea DELETE cu urmatorul format:

DELETE FROM nume_tabel

[WHERE conditie];



6.     VEDERI


Prin definitie, o vedere este o relatie virtuala produsa la cerere prin operatii relationale, folosind relatiile existente in baza de date.

O vedere este creata prin instructiunea CREATE VIEW:

CREATE VIEW nume_vedere [(nume_coloana [, .])]

AS SELECT [WITH [CASCADED|LOCAL] CHECK OPTION];

Pentru a crea vederea, utilizatorul trebuie sa aiba drepturi de interogare (SELECT) asupra tuturor tabelelor implicate in subselectie si drepturi de utilizare (USAGE) asupra tuturor coloanelor solicitate.



O vedere care restrange accesul la inregistrarile selectate dintr-unul sau mai multe tabele fara restrictionarea coloanelor, se numeste vedere orizontala.

O vedere verticala restrange accesul la anumite atribute (coloane) dintr-unul sau mai multe tabele. De exemplu, salariile sunt confidentiale si nu pot fi vizualizate de catre agenti intr-o vedere verticala. Acest lucru devine posibil intr-o vedere orizontala care ii permite fiecaruia sa citeasca propria inregistrare din BD.

Instructiunea CREATE VIEW se combina cu instructiunea SELECT si cu clauzele acesteia.


Exemplu

Managerul agentiei doreste sa cunoasca proprietatile gestionate de toti agentii, fara detalii specifice legate de cnp, salariu etc. Presupunem ca in BD exista un tabel "agenti" si un tabel "proprietati":

Agenti (cnp, nume, prenume, filiala, salariu, vechime);

Proprietati (nr_proprietate, zona, tip, suprafata, pret, adresa, cod_proprietar, cnp)

Vederea este creata prin comanda:

CREATE VIEW agenti_proprietati

AS SELECT nr_proprietate, nume_agent, prenume_agent, filiala

FROM agenti.nume, agenti.prenume, agenti.filiala, proprietati.nr_proprietate

WHERE agenti.cnp = proprietati.cnp

GROUP BY agenti.filiala;


O vedere este reactualizabila daca SGBD este capabil sa urmareasca orice rand sau coloana pana la relatia-sursa.

Vederile pot fi folosite pentru a crea noi vederi.

O vedere care face apel la mai multe tabele se numeste vedere unificata.

O vedere care utilizeaza clauza GROUP BY se mai numeste si vedere grupata.

Distrugerea unei vederi se face prin instructiunea:

DROP VIEW nume_vedere [RESTRICT CASCADE]

Optiunea CASCADE determina stergerea tuturor vederilor bazate pe vederea eliminata.

Inregistrarile dintr-o vedere care in urma reactualizarii BD sau inserarii de noi date satisfac sau nu mai satisfac clauza WHERE vor intra sau vor iesi din acea vedere, fiind numite si randuri migratoare.  Clauza WITH CHECK OPTION migrarea unui rand in afara vederii, ceea ce asigura o mai buna securitate a datelor incluse in vedere decat in tabelele BD.



7.     TRANZACTII


ISO defineste un model de tranzactii bazat pe doua instructiuni SQL: COMMIT (executare) si ROLLBACK (revenire).

Tranzactia este o unitate logica de lucru care contine una sau mai multe comenzi SQL.

Initierea tranzactiei poate fi facuta de catre o persoana sau un program printr-o comanda de initiere de tip SELECT; INSERT; UPDATE.

Pana la completarea tranzactiei, efectele ei nu sunt vizibile.

Incheierea tranzactiei se poate realiza in unul din urmatoarele 4 moduri:

a.     Prin instructiunea COMMIT, modificarile din BD sunt permanente.

b.     Prin instructiunea ROLLBACK, se abandoneaza modificarile initiate si BD ramane nemodificata.

c.      Finalizarea cu succes a programului incheie tranzactia si modificarile au efect chiar daca nu s-a executat instructiunea COMMIT.

d.     Abandonarea tranzactiei fara rularea instructiunii ROLLBACK atunci cand se termina anormal programul respectiv.


Formatul unei tranzactii este urmatorul:

SET TRANSACTION

[READ ONLY |READ WRITE] |

[ISOLATION LEVEL READ UNCOMMITTED | READ UNCOMMITTED |

REPEATABLE READ | SERIALIZABLE];



8.     CONTROLUL ACCESULUI


Limbajul SQL foloseste doua instructiuni pentru controlul accesului la BD: GRANT si REVOKE.

Mecanismul de securitate al BD se bazeaza pe conceptele de:

a.       identificator de autorizatie

b.      posesiune

c.       privilegiu.

Fiecarui utilizator la BD i se aloca un identificator de autorizatie, asociat cu o parola, utilizat pentru a determina drepturile de acces ale acestuia la obiectele din BD.

Fiecare obiect din BD este proprietatea celui care l-a creat (drept de posesiune).

In clauza AUTHORIZATION din schema careia ii apartine obiectul apare identificatorul proprietarului.

Prin privilegii se inteleg actiunile care ii sunt permise unui utilizator al BD:

SELECT

INSERT              [(nume_coloana [, ])]

UPDATE [(nume_coloana [, ])]

DELETE

REFERENCES [(nume_coloana [, ])]

USAGE


Formatul instructiunii GRANT este urmatorul:

GRANT

ON nume_obiect

TO

[WITH GRANT OPTION]


Cuvantul cheie PUBLIC ii desemneaza pe toti utilizatorii BD.

Clauza WITH GRANT OPTION permite transmiterea privilegiilor spre alti utilizatori.


Formatul instructiunii REVOKE este urmatorul:

REVOKE [GRANT OPTION FOR]

ON nume_obiect

FROM [RESTRICT CASCADE]


Optiunea GRANT OPTION FOR permite retragerea separata a drepturilor acordate altor utilizatori prin clauza WITH GRANT OPTION.