Sunteți pe pagina 1din 10

CAPITOLUL III

LIMBAJE SQL

3.1 Prezentare general


SQL (Structured Query Language) este n prezent, unul din cele mai
puternice limbaje structurate pentru interogarea bazelor de date relaionale.
Pronunia oficial: si-q-el. Neoficial, si-quel.
Este un limbaj neprocedural i declarativ, deoarece utilizatorul
descrie ce date vrea s obin, fr a fi nevoie s stabileasc modalitile de
a ajunge la datele respective. Nu poate fi considerat un limbaj de programare
sau unul de sistem, ci mai degrab face parte din categoria limbajelor de
aplicaii, fiind orientat pe mulimi. Foarte frecvent, este utilizat n
administrarea bazelor de date client/server, aplicaia client fiind cea care
genereaz instruciunile SQL.
A fost lansat iniial de IBM i standardizat prima dat de ANSI, apoi ISO.
Actualmente, ISO 92. Pentru c exist o standardizare a limbajului SQL,
multe SGBD (Oracle, Access, Sybase) recunosc principalele instruciuni ale
acestuia. Caracteristicile adugate standardului se numesc extensii. De
exemplu, n standard sunt specificate 6 tipuri diferite de date pentru o baz
de date SQL. n multe implementri, aceast list este completat cu o
diversitate de extensii. Fiecare implementare se numete dialect. Dialectul
ACCESS conine unele particulariti, fiind conceput mai mult pentru crearea
interogrilor de selecie.
Exist 3 metode de baz privind implementarea limbajului SQL:
apelare direct (Direct Invocation): const n introducerea
instruciunilor direct de la prompter
modular (Modul Language): folosete proceduri apelate de
programele aplicaie
ncapsulat (Embedded SQL): conine instruciuni ncapsulate n
codul de program
Instruciunile SQL pot fi grupate n:
instruciuni de definire a datelor, care permit descrierea
structurii bazei de date
instruciuni de manipulare a datelor: adaug, terge, modific
nregistrri
instruciuni de selecie a datelor, care permit consultarea bazei
de date
instruciuni de procesare a tranzaciilor
instruciuni de control al cursorului
instruciuni pivind controlul accesului la date
n limbajul SQL standardizat de ISO nu se folosesc termenii formali de
relaie, atribut, tuplu, ci tabel, coloan, rnd.

Scrierea comenzilor SQL


O instruciune SQL este format din cuvinte rezervate i cuvinte
definite de utilizator. Cuvintele rezervate constituie partea fix i se scriu
exact cum este necesar. Cuvintele definite de utilizator reprezint denumirile
diverselor obiecte din baza de date.
Dei standardul nu o cere, majoritatea dialectelor cer terminator de
instruciune (;).
Majoritatea componentelor nu sunt sensibile la tipul de litere (excepie
important: cnd datele au caracter literal, de exemplu, dac se stocheaz
numele POPA i cautm Popa, nu vom gsi nregistrarea respectiv).
Dei SQL este un limbaj cu format liber, o instruciune este mai
lizibil dac se utilizeaz indentarea i alinierea. De exemplu:
fiecare clauz dintr-o instruciune trebuie s nceap pe o linie
nou;
nceputul fiecrei clauze s fie aliniat cu nceputul celorlalte;
dac o clauz are mai multe pri, fiecare parte trebuie s apar
pe cte o linie separat i trebuie indentat fa de nceputul clauzei.
Convenii de notare folosite n definirea instruciunilor:
majuscule pentru cuvintele rezervate;
litere mici pentru cuvinte definite de utilizator;
bara vertical | indic posibilitatea alegerii dintre mai multe
variante;
acoladele { } indic un element necesar;
parantezele drepte [ ] indic un element opional;
punctele de suspensie ... indic o repetare opional a unui
articol, de 0 sau mai multe ori.
Identificatorii SQL sunt utilizai pentru a numi obiecte din baza de
date. Pentru caracterele utilizate, standardul ISO permite A...Z, a...z, 0...9, _.
Restricii impuse identificatorilor:
nu poate fi mai lung de 128 caractere (majoritatea dialectelor au o
limit mult mai joas)
trebuie s nceap cu o liter
nu poate conine spaii libere
3.2 Instruciuni pentru definirea datelor
Teoretic, comenzile pentru definirea datelor fac parte din modulul
corespunztor componentei DDL din SGBD. Totui, n majoritatea
implementrilor SQL comenzile de definire a datelor sunt prelucrate de
acelai interpretor care rezolv i interogrile i operaiile de manipulare a
datelor. Componentele DML i DDL ale SGBD sunt implementate n acelai
modul software.
CREATE DATABASE nume_bd
Creaz o baz de date. Majoritatea SGBD permit crearea unei baze de
date print-un simplu clic de mouse. Exist i posibilitatea folosirii acestei
instruciuni, dar mult mai greoi. Comanda nu e standardizat, ACCESS nici nu
o accept.
CREATE TABLE nume_tabel
(cmp1 tip_dat [NOT NULL],
cmp2 tip_dat [NOT NULL],
cmp3 tip_dat [NOT NULL]...)
Creaz un tabel i definete structura unei nregistrri precum i
tipurile de date asociate cmpurilor. Numele tabelului trebuie s fie unic n
baza de date. Clauza NOT NULL arat c n cmpul respectiv nu se
memoreaz valori de tip NULL.
ALTER TABLE nume_tabel
ADD nume_cmp tip_dat
Adaug un cmp la un tabel existent. tergerea unui cmp nu este
posibil.
DROP TABLE nume_tabel
terge complet un tabel din baza de date.
DROP DATABASE nume_bd
terge baza de date. Exist ns o multitudine de restricii stabilite de
administratorul sistemului privind aceast operaie. Multe versiuni SQL nu
includ aceast instruciune, stregerea fcndu-se din comenzi de mouse.

3.3 Instruciuni pentru selecia datelor


3.3.1 Cereri de interogare simple
Instruciunile de selecie reprezint una din categoriile cele mai
importante ale limbajului SQL. Indiferent dac sunt cereri simple sau
complexe, cuvntul cheie este SELECT. Pentru cererile de interogare simple,
sintaxa instruciunii este:
SELECT [domeniu] list_selecie
FROM nume_tabel1, nume_tabel2,
[WHERE criteriu_selecie]
[ORDER BY cmpuri_criteriu [ASC|DESC]];
Domeniu
Specific o opiune de includere sau eliminare din rezultatul
seleciei, a nregistrrilor care conin duplicate. Opiunile posibile sunt:
ALL cere includerea tuturor nregistrrilor care ndeplinesc condiiile
impuse. Cum instruciunile SELECT tabel i SELECT ALL tabel au
acelai rezultat practic, calificativul ALL este rar folosit.
DISTINCT cere eliminarea nregistrrilor care conin duplicate n
cmpurile selectate, afind numai o apariie a acesteia.
DISTINCTROW cere eliminarea nregistrrilor care conin duplicate
n ansamblul lor, nu numai n cmpurile selectate, afind numai o
apariie a acesteia.
List_selecie cuprinde cmpurile care dorim s apar n tabelul cu
rezultatele interogrii.Similar cu Field Show din grila de proiectare
QBE.
Clauza FROM specific numele tabelului sau tabelelor pe care se
face cererea de interogare. Pentru mai multe tabele, numele acestora
se separ cu ,. Pe lng tabele, ca surs de informaii pot apare i
interogri deja create.
Clauza WHERE cere numai nregistrrile care ndeplinesc criteriul de
selecie specificat. Criteriul de selecie este o expresie care conine
obligatoriu i un operator adecvat tipului de dat al cmpului respectiv.
Clauza WHERE este opional.
Clauza ORDER BY cere ordonarea n mod cresctor (ASC) sau
descresctor (DESC) a rezultatelor interogrii. Ordonarea este
opional i se poate face dup unul sau mai multe cmpuri_criteriu.

3.3.2 Cereri de interogare complexe


Sunt acele interogri n care apar funciile agregat, asocierile sau
combinrile.
Funciile agregat (de grup)
Permit construirea unor interogri complexe, prin care utilizatorul cere
gruparea nregistrrilor care au cmpuri cu aceeai valoare, n scopul
efecturii unor calcule. n standardul ISO sunt definite 5 funcii de grup:
COUNT returneaz numrul de valori dintr-o coloan specificat
SUM returneaz suma valorilor dintr-o coloan specificat
AVG returneaz media valorilor dintr-o coloan specificat
MIN returneaz cea mai mic valoare dintr-o coloan specificat
MAX returneaz cea mai mare valoare dintr-o coloan specificat
Sintaxa instruciunii:
SELECT [domeniu] funcie_agregat(nume_cmp) AS alias
[,list_selecie]
FROM nume_tabel1, nume_tabel2,
GROUP BY cmp_de_grupare
[HAVING criteriu_de_grupare]
[ORDER BY cmpuri_criteriu [ASC|DESC]];
Elementele noi de sintax:
AS alias asociaz un pseudonim rezultatului funciei agregat
Clauza GROUP BY precizeaz cmpul sau cmpurile dup care se
face gruparea nregistrrilor. Echivalentul acestei clauze n macheta
grafic QBE l reprezint rndul Total.
Clauza HAVING conine criteriul care va fi aplicat cmpului
argument al funciei agregat. Spre deosebire de WHERE, care
acioneaz nainte de gruparea nregistrrilor, HAVING acioneaz
dup definirea acesteia.
Asocierile (interogrile JOIN)
Limbajul SQL ofer posibilitatea de a grupa i folosi date din tabele diferite.
Operaiile de asociere induse de clauza JOIN au ca rezultat producerea
tuturor combinaiilor posibile, pentru coninutul informaional al fiecrui
tabel. Noile nregistrri care rezult n urma jonciunii sunt disponibile pentru
seleciile urmtoare. La o asociere pot participa mai mult de 2 tabele.

Exist mai multe categorii de jonciuni:

CROSS (ncruciat) rar folosit


ECHIVALENT (echijonciune) cea mai folosit presupune folosirea
clauzei WHERE asociat cu o egalitate dorit
NEECHIVALENT (non echijonciune) - rar folosit - presupune folosirea
clauzei WHERE asociat cu orice alt operator de comparare, n afar
de =.
Sintaxa instruciunii pentru jonciunile echivalente i neechivlente este:
SELECT [domeniu] list_selecie
FROM nume_tabel1, nume_tabel2,
[WHERE criteriu_de_asociere]
[ORDER BY cmpuri_criteriu [ASC|DESC]];
Deoarece n instruciunile SQL care descriu jonciuni se utilizeaz
cmpuri care fac parte din tabele diferite, trebuie specificat numele tabelului
de care aparin, folosind sintaxa
nume_tabel.nume_cmp
fr spaii nainte sau dup punct.
Dup modul de asociere a nregistrrilor din tabele, jonciunile pot fi:
interne sau INNER JOIN determin o asociere a nregistrrilor din
tabele, astfel nct s rezulte un numr total de nregistrri egal cu
produsul numrului de nregistrri din fiecare tabel
externe de stnga sau LEFT OUTER JOIN
externe de dreapta sau RIGHT OUTER JOIN
Echivalentul QBE al acestor categorii de jonciuni este alegerea opiunilor 1,
2, sau 3 din caseta Join Properties. Sintaxa instruciunii:
SELECT [domeniu] list_selecie
FROM nume_tabel1
{INNER|LEFT OUTER|RIGHT OUTER} JOIN
nume_tabel2
ON criteriu_de_asociere
[{INNER|LEFT OUTER|RIGHT OUTER} JOIN
nume_tabel3
ON criteriu_de_asociere]
[WHERE criteriu_selecie] [ORDER BY cmpuri_criteriu
[ASC|DESC]];

Semnificaia elementelor noi:


JOIN specific tabelul care va fi asociat (nume_tabel2, nume_tabel3)
celui din clauza FROM
ON arat ntre ce cmpuri trebuie s existe relaia pe care se bazeaz
jonciunea. Criteriul de asociere conine obligatoriu operatorul =.
Combinrile (interogrile UNION)
Cnd utilizatorul dorete s vad rezultatele mai multor interogri SELECT n
acelai timp, prin combinarea ieirilor lor, se poate utiliza facilitatea UNION.
De remarcat c nu exist echivalent QBE pentru aceast instruciune.
Sintaxa general pentru interogrile UNION este:
SELECT list_cmpuri FROM nume_tabel1
UNION SELECT list_cmpuri FROM nume_tabel2
[GROUP BY cmp_de_grupare]
[HAVING criteriu_de_agregare]
[UNION SELECT list_cmpuri FROM nume_tabel3
[GROUP BY cmp_de_grupare]
[HAVING criteriu_de_agregare]]
[UNION ]
[ORDER BY cmpuri_criteriu [ASC|DESC]];

Exist mai multe restricii pentru instruciunile care generez


interogrile UNION, i anume: Numrul cmpurilor din lista de cmpuri din
fiecare instruciune SELECT i UNION SELECT trebuie s fie aceeai
Secvena de nume din fiecare list de cmpuri trebuie s corespund unor
intrri identice Este permis utilizarea doar o dat a clauzei ORDER BY,
dup ultima instruciune UNION SELECT Exemple:

SELECT nume, prenume, vrst FROM Colaboratori2001


UNION SELECT nume, prenume, vrst FROM Colaboratori2002
ORDER BY nume;

SELECT nume, prenume, vrst FROM Colaboratori2001


GROUP BY categoria
HAVING categoria=student
UNION SELECT nume, prenume, vrst FROM Colaboratori2002
GROUP BY categoria
HAVING categoria=student
3.4 Instruciuni pentru manipularea datelor
Foarte utile n exploatarea unei baze de date, aceste instruciuni se implementeaz prin
interogrile de aciune. Este necesar o mare precauie n utilizarea lor deoarece aciunile sunt
ireversibile, putnd influena inclusiv integritatea referenial a bazei de date.
Cele mai importante sunt: CREATE, INSERT, UPDATE i DELETE.
Interogrile de aciune tip CREATE duc la generarea unui nou tabel pornind de la
structura i coninutul unor tabele deja existente. Se folosete instruciunea SELECT ...
INTO

SELECT [domeniu] (cmp1,cmp2...)


INTO tabel_nou
FROM tabel_sursa
[WHERE criteriu_de_adugare];

Interogrile de aciune tip INSERT sunt folosite pentru adugarea de nregistrri dintr-un
tabel n altul. Exist dou forme ale instruciunii i anume:
INSERT ... VALUES
INSERT ... SELECT

a). In primul caz se adaug o singur nregistrare ntr-un tabel, menionndu-se cmpurile i
valorile acestora. Se utilizeaz pentru operaii simple, care presupun lucrul cu un numr redus de
nregistrri.

INSERT INTO nume_tabel (cmp1, cmp2...)


VALUES (valoare1, valoare2...);

Reguli:
valorile din clauza VALUES vor avea aceeai natur cu cmpurile din clauza INTO
mrimea valorii va fi < dimensiunea cmpului
coresponden ntre cmp1 i valoare1, etc.
dac un cmp are specificaia NOT NULL, este obligatorie introducerea unei valori pentru
aceasta

b). n al doilea caz, este posibil s se copieze mai multe nregistrri dintr-un tabel n unul sau
mai multe tabele.
INSERT INTO tabel_destinaie (cmp1, cmp2...)
SELECT [domeniu] cmp1, cmp2...
FROM tabel_surs
WHERE criteriu_de_adugare;

Reguli:
aceleai ca mai sus
numrul i natura cmpurilor din clauza INTO s fie aceleai cu cele returnate de
instruciunea SELECT
dac nu se introduce WHERE, toate nregistrrile din tabel_surs vor fi adugate n
tabel_destinaie

Interogrile de aciune tip DELETE terg parial sau total nregistrrile dintr-un tabel. Nu
se folosete pentru tergerea de valori din cmpuri individuale, ci acioneaz asupra
nregistrrii n totalitatea ei. Dac se terg toate nregistrrile, structura de tabel rmne,
ea putnd fi eliminat numai cu DROP TABLE.

DELETE FROM nume_tabel


[WHERE criteriu_de_tergere];

Ca i instruciunea INSERT, operaia de tergere a nregistrrilor dintr-o tabel poate duce la


probleme de integritate referenial n alte tabele.
Exemplu:
DELETE *
FROM Vnzri
DELETE *
FROM Angajai
WHERE Vrsta>60

Interogrile de aciune tip UPDATE pot introduce nregistrri noi i pot modifica valorile
cmpurilor din nregistrri existente.

UPDATE nume_tabel
SET nume_cmp1=valoare1 [,nume_cmp2=valoare2]...
[WHERE criteriu_de_actualizare];

Ca i n celelalte locuri unde apare clauza WHERE, restricionarea se poate accentua folosind i
operatori logici.
Exemplu:
UPDATE Comunicaii
SET Reea=Orange
WHERE Reea=Dialog AND Data>#12.12.2001;

5.5 Cereri de interogare imbricate


Scrierea unei interogri n cadrul alteia duce la apariia unei subinterogri, setul de
rezultate obinute de la aceasta constituind argument pentru prima interogare.

SELECT lista_cmpuri
FROM tabel1
WHERE tabel1.nume_cmp=
(SELECT nume_cmp
FROM tabel2
WHERE criteriu_de_selecie);

Cele dou tabele trebuie s aib un cmp comun (nume_cmp) care va reprezenta cmpul de
legtur ce st la baza construirii subinterogrii.

S-ar putea să vă placă și