Documente Academic
Documente Profesional
Documente Cultură
IA.03.1. Generaliti
n 1992 ANSI (American National Standards Institute) a definitivat varianta standard a unui
limbaj destinat sistemelor de gestiune a bazelor de date denumit Structured Query Language,
prescurtat SQL (pronunai "es-q-el"). Frazele SQL permit crearea, actualizarea, interogarea i
distrugerea bazelor de date relaionale. Dei toate sistemele de gestiune de baze de date folosesc
SQL, adesea ele implementeaz i funcii care nu exist n standard.
SQL este un limbaj declarativ. Spre deosebire de un limbaj procedural, un astfel de limbaj
este constituit din comenzi, de multe ori foarte complexe, care se execut imediat. Practic o sesiune
de lucru n SQL este constituit dintr-o succesiune de cicluri, fiecare coninnd scrierea unei
comenzi, trimiterea ei spre serverul de baze de date, executarea ei i afiarea imediat a rezultatului
produs.
Comenzile pot fi salvate individual n vederea executrii ulterioare. Ele pot fi de asemenea
memorate n fiiere de comenzi care pot fi lansate n execuie printr-o singur comand dup care se
execut automat.
INFORMATIC*I*
SQL pot fi introduse pe mai multe linii, marcarea sfritului introducerii unei comenzi realizndu-se
printr-un caracter '/'.
Introducerea comenzilor SQL poate fi realizat ns i folosind o interfa grafic. Pentru aceasta se
lanseaz n execuie aplicaia Oracle SQL Developer i se realizeaz conectarea la serverul de baze
de date Oracle XE.
INFORMATIC*I*
n orice moment al lucrului cu Oracle SQL Developer se poate iniia o sesiune de lucru cu
interpretorul SQL selectnd butonul SQL :
Aplicaia va solicita precizarea conexiunii care va fi folosit dup care va afia interfaa
specific.
-3-
INFORMATIC*I*
Observaie : Unele comenzi SQL, respectiv cele care modific date sau tabele din baza date
necesit dup executare apsarea butonului Commit. Pentru a evita problemele cauzate de
eventualele pene (hardware, reea etc.) care ar putea interveni pe timpul executrii unor astfel de
comenzi, serverele de baze de date implementeaz conceptul de tranzacie. De fiecare dat cnd
este lansat o comand care modific date din baz este iniiat automat o tranzacie. Dac operaia
asupra bazei este reuit modificarea devine efectiv prin executarea comenzii commit. n caz de
eroare se execut comanda roll back, care va aduce baza de date n starea iniial, efectul comenzii
SQL date fiind anulat.
Commit
Comenzile introduse n fereastra SQL Commands pot fi terminate prin ';', '/' sau se poate
chiar omite caracterul terminal. Astfel pentru suprimarea tabelului cafea se poate scrie:
drop table cafea;
sau pur i simplu
drop table cafea
efectul fiind acelai.
Comenzile SQL pot fi memorate individual apsnd butonul Save:
Comenzile memorate pot fi readuse n fereastra aplicaiei prin deschiderea fiierului n care
au fost salvate (File / Open) dup care pot fi reexecutate.
-4-
INFORMATIC*I*
inaltime number(3)
sau,
inaltime number(3,0)
Pentru numere care au o parte ntreag i una zecimal se scrie:
pret NUMBER(7,2)
nsemnnd reprezentarea cmpului pret folosind 7 poziii zecimale, ultimele dou fiind folosite
pentru partea real.
Exemple:
Numr
Declaraie
Valoare memorat
123.89
NUMBER
123.89
123.89
NUMBER(3)
123.89
NUMBER(6,2)
123.89
123.89
NUMBER(6,1)
123.9
124
-5-
INFORMATIC*I*
NUMBER(3)
eroare (depire)
123.89
NUMBER(4,2)
eroare (depire)
Tip dat
12-MAR-2007
DATE
2007-02-01 01:02:04.1234
TIMESTAMP
Val. memorat
INFORMATIC*I*
deoarece n locul unei cutri sistematice a articolului, n tot fiierul, se va putea cuta n fisierul de
index din memorie, folosind un algoritm de cutare binar. Folosind acest algoritm de exemplu
gsirea unui articol ntr-un fiier de index (ordonat) avnd 65000 articole necesit maximum 16
operaii de tip comparare de valori.
Crearea tabelelor poate fi ns realizat mai uor folosind Oracle SQL Developer, aa cum
s-a procedat deja. n cazul n care trebuie impuse restricii asupra cmpurilor (declararea cheii
primare, declararea unor chei strine sau impunerea indexrii dup unul sau mai multe cmpuri)
fraza SQL corespunztoare va deveni din ce n ce mai complicat, recurgerea la intefaa grafic
fiind practic obligatorie.
Obs. n fraza SQL afiat denumirile cmpurilor, constrngerilor sau denumirea tabelului apar ntre
ghilimele. Aceast scriere permite folosirea de denumiri coninnd spaii (de evitat!). Dac denumirile nu
pot da natere la confuzii, ghilimelele pot fi omise.
-7-
INFORMATIC*I*
Din cele prezentate se observ diversitatea modatitilor de scriere a unei comenzi SQL. Pentru a
limita volumul de cunotine legate de sintaxa limbajului, n cele ce urmeaz comenzile vor fi realizate i
testate folosind interfaa grafic afiat de Oracle SQL Developer.
Observaie : Aa cum s-a vzut deja, interfaa permitegrafic utilizat permite afiarea comenzilor de
creare a tabelelor create. Deoarece n timpul realizrii unei baze de date se pot produce incidente mergnd
pn la distrugerea serverului Oracle XE, este bine s se creeze copii ale domeniului (schemei) pe care se
lucreaz (folosind procedura cunoscut deja). Se pot ns salva separat, ntr-un fiier text avnd extensia .sql
numai comenzile de descriere a tabelelor bazei de date. Executarea acestui fiier de comenzi va realiza
refacerea tabelelor, fr repopularea lor cu date.
Ordinea n care se execut comenzile de creare a tabelelor bazei este important deoarece crearea
unui tabel care conine chei strine nu poate fi realizat naintea crerii tabelului referit.
Suprimarea unui tabel se realizeaz folosind comanda DROP TABLE. Sintaxa comenzii este:
DROP TABLE Nume_tabel
Pentru a da comanda de tergere a unui tabel folosind interfaa grafic se selecteaz n meniul
contextual afiat la selectarea tabelului Table / Drop :
INFORMATIC*I*
Dup selectarea tabului Query Builder se aduc n zona grafic tabelele din care se selecteaz
informaii (trire cu mouse-ul, drag & drop), ca n imagine.
Observaie: Dac ntre tabelele selectate exist relaii, ca n exemplul din figur
(ANGAJATI.ID_ANGAJAT = COPII.ID_PARINTE), aplicaia va simboliza aceasta printr-o linie.
La capetele liniei apar simbolurile 1 i indicnd o legtur de tip 1 la n.
Cmpurile care trebuie s fie incluse n mulimea de selecie se indic tot prin selectare cu
mouse-ul, ca n figur :
cmpuri incluse n
mulimea de selecie
-9-
INFORMATIC*I*
Pentru a vedea comanda SELECT se selecteaz tabul Worksheet sau se apas butonul SQL
din panoul Query Result :
- 10 -
INFORMATIC*I*
Dup indicarea cmpurilor folosite la sortare se poate folosi Sort Type pentru a modifica
sensul acesteia (ASCENDING sau DESCENDING). n cazul n care se folosesc mai multe cmpuri,
acestea sunt separate prin virgul.
SELECT * FROM Angajati ORDER BY salar DESC, Nume ASC, Prenume ASC
SELECT nume, prenume FROM angajati WHERE nume = 'Pop'
- 11 -
INFORMATIC*I*
Egal
>
Mai mare
<
Mai mic
>=
<=
<> sau !=
Diferit de
LIKE
*Vezi nota
Exemple suplimentare:
SELECT * FROM angajati WHERE nume = 'Popescu' AND
prenume='Mihai'
SELECT * FROM angajati WHERE nume = 'Popescu' OR nume='Mihai'
SELECT * FROM angajati WHERE nume = 'Popescu' AND prenume
IN('Ioan','Vasile','Grigore')
Clauza IN specific o mulime creia trebuie s-i aparin cmpul specificat (prenume).
SELECT * FROM angajati WHERE nume = 'Popescu' AND data_nasterii
BETWEEN '12-MAY-1968' AND '29-MAY-1980'
Clauza BETWEEN permite definirea unui interval cruia trebuie s-i aparin cmpul
specificat (data_nasterii).
Clauza DISTINCT permite realizarea unei mulimi de selecie care conine nregistrri
distincte, care difer prin cel puin o valoare a unui cmp. De exemplu :
SELECT DISTINCT Localitate FROM angajati
- 12 -
INFORMATIC*I*
MIN
MAX
SUM
AVG
COUNT
COUNT DISTINCT
Exemplul 2:
SELECT Sectie, MAX(salar) as Sal_Max FROM Angajati
GROUP BY Sectie
Se pot ns aplica aceleai funcii i ntregului fiier, fr gruparea articolelor, caz n
care mulimea de selecie va conine o singur nregistrare:
SELECT AVG(salar) FROM Angajati
SELECT AVG(salar) FROM Angajati WHERE functie='Zidar'
SELECT COUNT(*) FROM Cititor
- 13 -
INFORMATIC*I*
Clauza HAVING servete la precizarea unui filtru care se aplic grupurilor de articole,
dac este prezent clauza GROUP BY.
Exemplu:
SELECT Sectie, AVG(Salar) FROM Angajati GROUP BY Sectie HAVING
AVG(Salar) > 500
Dac n fraza SELECT lipsete clauza GROUP BY, folosirea clauzei HAVING nu se
justific, ea avnd acelai efect ca i clauza WHERE.
O situaie aparte prezint comenzile SELECT care nu realizeaz o mulime de selecie ci un
calcul matematic. n acest caz from nume_tabel va fi nlocuit prin from dual, ca n exemplul
urmtor:
Cuvntul rezervat dual astfel folosit permite respectarea sintaxei comenzii SELECT.
b. Selectarea din mai multe tabele
Principial o baz de date relaional presupune repartizarea datelor n mai multe tabele.
Aa cum s-a vzut deja, acest mod de stocare permite eliminarea informaiilor redondante. Pentru a
gsi articolele dintr-un tabel n relaie cu nregistrri din alt tabel trebuie ns inclus n frazele
SELECT condiia de legtur dintre cele dou tabele. Reprezentarea grafic reprezentnd tabelele
bazei de date i relaiile dintre ele poart numele de diagram E-R (entiti-relaii, eng. entityrelationship). Exemplu fundamental:
- 14 -
INFORMATIC*I*
Legturile dintre tabele pot fi impuse i folosind clauza WHERE, ca n exemplul urmtor:
SELECT Edituri.Nume, Carti.Titlu, Carti.Anul
Nume='Minerva' AND Edituri.CodE=Carti.CodE
FROM
Edituri,
Carti
WHERE
A doua condiie coninut n clauza WHERE este cea care leag tabelele Edituri i Carti.
Folosind JOIN, exemplul anterior poate fi scris astfel:
SELECT Edituri.Nume, Carti.Titlu, Carti.Anul
FROM Edituri INNER JOIN Carti ON Edituri.CodE=Carti.CodE
WHERE Nume='Minerva'
Clauza JOIN este ns singura soluie ntr-o alt situaie, respectiv cnd ntr-un tabel se
accept pentru o cheie strin valori nule. Un exemplu simplu este cel al tabelelor Angajati i Soi
prezentate n continuare.
- 15 -
INFORMATIC*I*
Dintre angajaii din primul tabel doi sunt cstorii, n cazul lor ID_SOT are valori nenule.
Dac se dorete realizarea unei mulimi de selecie care s cuprind angajaii, iar pentru cei
cstorii numele i prenumele soului/soiei, fraza SELECT ar putea fi urmtoarea:
SELECT Angajati.Nume, Angajati.Prenume,Soti.Nume_prenume
FROM Angajati, Soti WHERE Angajati.ID_SOT=SOTI.ID_SOT
Rezultat:
Rezultatul nu este probabil cel dorit deoarece prin condiia pus sunt exclui din mulimea
de selecie angajaii necstorii.
Soluia este oferit de clauza LEFT OUTER JOIN:
SELECT Angajati.Nume, Angajati.Prenume,Soti.Nume_prenume
FROM Angajati LEFT OUTER JOIN Soti on Angajati.ID_SOT=SOTI.ID_SOT
Rezultatul va cuprinde toate liniile din primul tabel iar pentru liniile din primul tabel care
au corespondent n al doilea tabel, va include i informaiile corespunztoare din al doilea tabel.
- 16 -
INFORMATIC*I*
Similar se poate folosi clauza RIGHT OUTER JOIN pentru includerea tuturor
nregistrrilor din al doilea tabel i selectarea din primul doar a celor care satisfac relaia de
legtur.
Observaie: Pentru a impune n Query Builder tipul de clauz JOIN dorit se selecteaz cu
butonul drept al mouse-ului linia care unete cele dou tabele i se indic folosind meniul
contextual, soluia dorit.
Limbajul SQL permite nlocuirea unei mulimi care contribuie la selecie printr-o alt fraz
SELECT, ca n exemplul urmtor.
SELECT Edituri.Nume, Carti.Titlu, Carti.Anul FROM Edituri, Carti WHERE
Nume='Minerva' AND Edituri.CodE=Carti.CodE AND Titlu.Data IN (SELECT Data FROM
Carti WHERE Data BETWEEN '12-MAY-1975' AND '29-MAY-1980')
Utilizarea parametrilor
SQL permite ca la scrierea comenzii SELECT s se foloseasc parametrii.
acestora sunt cerute ntr-o fereastr separat, n momentul executrii interogrii.
Exemplu :
SELECT * from ANGAJATI WHERE id_angajat > :valoare
- 17 -
Valorile
INFORMATIC*I*
Rezultat:
INFORMATIC*I*
IA.03.9. Aplicaii
1. Introducei cteva comenzi SQL, folosind i opiunea de salvare a acestor comenzi:
toi autorii n ordine alfabetic, afind toate cmpurile tabelului;
select * from autori order by nume asc
numele i prenumele autorilor n ordine alfabetic;
select nume, prenume from autori order by nume asc
titlurile crilor din bibliotec;
- 19 -
INFORMATIC*I*
cod_carte
from
carti
where
- 20 -
INFORMATIC*I*
- 21 -
INFORMATIC*I*
SELECT CARTI.TITLU,
AUTORI.NUME || ' ' || AUTORI.PRENUME AS NUME_AUTOR,
EDITURI.NUME AS EDITURA
FROM CARTI
INNER JOIN AUTCARTI ON CARTI.COD_CARTE = AUTCARTI.COD_CARTE
INNER JOIN AUTORI ON AUTORI.COD_AUT = AUTCARTI.COD_AUTOR
INNER JOIN EDITURI ON EDITURI.COD_EDIT = CARTI.COD_EDIT
ORDER BY CARTI.TITLU
SELECT CARTI.TITLU,
AUTORI.NUME || ' ' || AUTORI.PRENUME as Autor,
CITITORI.NUME || ' ' || CITITORI.PRENUME AS Cititor,
IMPRUMUT.DATA_IMPRUMUT
FROM CARTI INNER JOIN AUTCARTI
ON CARTI.COD_CARTE = AUTCARTI.COD_CARTE
INNER JOIN AUTORI
ON AUTORI.COD_AUT = AUTCARTI.COD_AUTOR
INNER JOIN IMPRUMUT
ON CARTI.COD_CARTE = IMPRUMUT.COD_CARTE
INNER JOIN CITITORI
ON CITITORI.COD_CIT = IMPRUMUT.COD_CIT
WHERE IMPRUMUT.DATA_IMPRUMUT < '01 feb 2012'
- 22 -
INFORMATIC*I*
- 23 -