SQL

                                                 5.  LIMBAJUL SQL 


5.1  Prezentare generală
SQL (Structured Query Language) este în prezent, unul din cele mai puternice limbaje 
structurate pentru interogarea bazelor de date relaţionale. 
Pronunţia oficială: „si-q-el”. Neoficial, „si-quel”. 
 Este un limbaj neprocedural şi declarativ, deoarece utilizatorul descrie cedate vrea să
obţină, fără a fi nevoie să stabilească modalităţile 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 aplicaţii, fiind orientat pe mulţimi. Foarte frecvent, este utilizat în administrarea 
bazelor de date client/server, aplicaţia client fiind cea care genereazăinstrucţiunile SQL. 
Lansat iniţial de IBM. 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 instrucţiuni ale acestuia. 


Caracteristicile adăugate standardului se numesc extensii. De ex, în standard sunt 
specificate 6 tipuri diferite de date pentru o BD SQL. În multe implementări, aceastălistăeste 
completatăcu o diversitate de extensii.Fiecare implementare se numeşte dialect. Dialectul 
ACCSES conţine unele particularităţi, fiind conceput mai mult pentru crearea interogărilor de 
selecţie. 
Există3 metode de bazăprivind implementarea limbajului SQL: 
−  apelare directă(Direct Invocation): constăîn introducerea instrucţiunilor direct de la 
prompter 
−  modulară(Modul Language): foloseşte proceduri apelate de programele aplicaţie 
−  încapsulată(Embedded SQL): conţine instrucţiuni încapsulate în codul de program 
Instrucţiunile SQL pot fi grupate în: 
‰  instrucţiuni de definirea datelor, care permit descrierea structurii BD 
‰  instrucţiuni de manipulatea datelor: adaugă, şterge, modificăînregistrări 
‰  instrucţiuni de selecţiea datelor, care permit consultarea BD 
‰  instrucţiuni de procesarea tranzacţiilor 
‰  instrucţiuni de control al cursorului
‰  instrucţiuni pivind controlul accesului la date
În limbajul SQL standardizat de ISO nu se folosesc termenii formali de relaţie, atribut, 
tuplu, ci tabel, coloană, rând. 
Scrierea comenzilor SQL
O instrucţiuni SQL este formatădin cuvinte rezervate şi cuvinte definite de utilizator. 
Cuvintele rezervate constituie partea fixă şi se scriu exactcum este necesar. Cuvintele definite de 
utilizator reprezintădenumirile diverselor obiecte din BD. 
Deşi standardul nu o cere, majoritatea dialectelor cer terminator de instrucţiune(„;”). 
Majoritatea componentelor nu sunt sensibile la tipul de litere (excepţie importantă: când 
datele au caracter literal, de ex, dacăse stocheazănumele „POPA” şi cautăm „Popa”, nu vom 
găsi înregistrarea respectivă). 
Deşi SQL este un limbaj cu format liber, o instrucţiune este mai lizibilădacăse 
utilizează indentarea şi alinierea. De ex: 
•  fiecare clauzădintr-o instrucţiune trebuie săînceapăpe o linie nouă
•  începutul fiecărei clauzesăfie aliniat cu începutul celorlalte 
•  dacăo clauzăare mai multe părţi, fiecare partetrebuie săaparăpe câte o linie separată
şi trebuie indentatăfaţăde începutul clauzei 
Convenţii de notarefolosite în definirea instrucţiunilor: 
•  majusculepentru cuvintele rezervate 
•  litere micipentru cuvinte definite de utilizator 
•  bara verticală |indicăposibilitatea alegerii dintre mai multe variante 
•  acoladele { }indicăun element necesar 
•  parantezele drepte [ ]indicăun element opţional 
•  punctele de suspensie ...indicăo repetare opţionalăa unui articol, de 0 sau mai multe ori 
IdentificatoriiSQL sunt utilizaţi pentru a numi obiecte din BD. Pentru caracterele utilizate, 
standardul ISO permite A...Z, a...z, 0...9, _. Restricţiiimpuse 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 conţine spaţii libere 
5.2  Instrucţiuni pentru definirea datelor 
Teoretic, comenzile pentru definirea datelor fac parte din modulul corespunzător 
componentei DDL din SGBD. Totuşi, în majoritatea implementărilor SQL comenzile de definire 
a datelor sunt prelucrate de acelaşi interpretor care rezolvă  şi interogările şi operaţiile de 
manipulare a datelor. Componentele DML şi DDL ale SGBD sunt implementate în acelaşi 
modul software. 
CREATE DATABASE nume_bd
Creazăo bazăde date. Majoritatea SGBD permit crearea unei BD print-un simplu clicde mouse. 
Există  şi posibilitatea folosirii acestei instrucţiuni, dar mult mai greoi. Comanda nu e 
standardizată, ACCESS nici nu o acceptă. 
CREATE TABLE nume_tabel 
(câmp1 tip_dată[NOT NULL], 
 câmp2 tip_dată[NOT NULL], 
 câmp3 tip_dată[NOT NULL]...) 
Creazăun tabel şi defineşte structura unei înregistrări precum şi tipurile de date asociate 
câmpurilor. Numele tabelului trebuie săfie unic în BD. Clauza NOT NULL aratăcăîn câmpul 
respectiv nu se memoreazăvalori de tip NULL. 
ALTER TABLE nume_tabel 
ADD nume_câmp tip_dată
Adaugăun câmp la un tabel existent. Ştergerea unui câmp nu este posibilă. 
DROP TABLE nume_tabel 
Şterge complet un tabel din BD. 
DROP DATABASE nume_bd 
Şterge BD. Existăînsăo multitudine de restricţii stabilite de administratorul sistemului privind 
aceastăoperaţie. Multe versiuni SQL nu includ aceastăinstrucţiune, stregerea făcându-se din 
comenzi de mouse. 
5.3  Instrucţiuni pentru selecţia datelor 
5.3.1  Cereri de interogare simple 
Instrucţiunile de selecţiereprezintăuna din categoriile cele mai importante ale 
limbajului SQL ACCESS. Indiferent dacăsunt cereri simple sau complexe, cuvântul cheie este 
SELECT. Pentru cererile de interogare simple, sintaxa instrucţiunii este: 
SELECT [domeniu] listă_selecţie 
FROM nume_tabel1, nume_tabel2,… 
[WHERE criteriu_selecţie] 
[ORDER BY câmpuri_criteriu [ASC|DESC]]; 
‰  Domeniu
Specificăo opţiune de includeresau eliminaredin rezultatul selecţiei, a înregistrărilor care 
conţin duplicate. Opţiunile posibile sunt: 
ALLcere includerea tuturor înregistrărilor care îndeplinesc condiţiile impuse. 
Cum instrucţiunile SELECT tabel şi SELECT ALLtabel au acelaşi rezultat practic, 
calificativul ALL este rar folosit. 
DISTINCTcere eliminarea înregistrărilor care conţin duplicate în câmpurile 
selectate, afişând numai o apariţie a acesteia. 
DISTINCTROWcere eliminarea înregistrărilor care conţin duplicate în 
ansamblul lor, nu numai în câmpurile selectate, afişând numai o apariţie a 
acesteia. 
‰  Listă_selecţiecuprinde câmpurile care dorim săaparăîn tabelul cu rezultatele interogării. 
Similar cu Field… Show…din grila de proiectare QBE. 
‰  Clauza FROMspecificănumele tabeluluisau tabelelor pe care se face cererea de 
interogare. Pentru mai multe tabele, numele acestora se separăcu „,”. Pe lângătabele, ca 
sursăde informaţii pot apare şi interogărideja create.
‰  ClauzaWHEREcere numai înregistrările care îndeplinesc criteriul de selecţie specificat. 
Criteriul de selecţie este o expresie care conţine obligatoriu şi un operator adecvattipului de 
datăal câmpului respectiv. Clauza WHERE este opţională.
‰  ClauzaORDER BYcere ordonarea în mod crescător (ASC) sau descrescător (DESC) a 
rezultatelor interogării. Ordonarea este opţională şi se poate face dupăunul sau mai multe 
câmpuri_criteriu.
5.3.2  Cereri de interogare complexe 
Sunt acele interogări în care apar funcţiile agregat, asocierilesau combinările. 
Funcţiile agregat (de grup)
Permit construirea unor interogări complexe, prin careutilizatorul cere gruparea înregistrărilor 
care au câmpuri cu aceeaşi valoare, în scopul efectuării unor calcule. În standardul ISO sunt 
definite 5 funcţii de grup: 
COUNTreturneazănumărul de valori dintr-o coloanăspecificată
SUMreturneazăsuma valorilor dintr-o coloanăspecificată
AVGreturneazămedia valorilor dintr-o coloanăspecificată
MINreturneazăcea mai micăvaloare dintr-o coloanăspecificată 
MAXreturneazăcea mai mare valoare dintr-o coloanăspecificată
Sintaxa instrucţiunii: 
SELECT [domeniu] funcţie_agregat(nume_câmp) AS alias [,listă_selecţie] 
FROM nume_tabel1, nume_tabel2,… 
GROUP BY câmp_de_grupare 
[HAVING criteriu_de_grupare] 
[ORDER BY câmpuri_criteriu [ASC|DESC]]; 
Elementele noi de sintaxă: 
‰  AS aliasasociazăun pseudonim rezultatului funcţiei agregat 
‰  ClauzaGROUP BYprecizează  câmpulsau câmpuriledupăcare se face gruparea 
înregistrărilor. Echivalentul acestei clauze în macheta graficăQBE îl reprezintărândul Total. 
‰  ClauzaHAVINGconţine criteriul care va fi aplicat câmpului argumental funcţiei agregat. 
Spre deosebire de WHERE, care acţioneazăînainte de grupareaînregistrărilor, HAVING
acţioneazădupădefinireaacesteia. 
Asocierile (interogările JOIN)
Limbajul SQL oferăposibilitatea de a grupa şi folosi date din tabele diferite. Operaţiile de 
asociere induse de clauzaJOINau ca rezultat producerea tuturor combinaţiilor posibile, pentru 
conţinutul informaţional al fiecărui tabel. Noile înregistrări care rezultăîn urma joncţiunii sunt 
disponibile pentru selecţiile următoare. La o asociere pot participa mai mult de 2 tabele. 
Existămai multe categorii de joncţiuni: 
•  CROSS (încrucişată) – rar folosită
•  ECHIVALENTĂ(echijoncţiune) – cea mai folosită– presupune folosirea 
clauzeiWHEREasociatăcu o egalitate dorită
•  NEECHIVALENTĂ(non echijoncţiune) - rar folosită- presupune folosirea 
clauzei WHEREasociatăcu orice alt operator de comparare, în afarăde „=” 
Sintaxa instrucţiunii pentru joncţiunile echivalente şi neechivlente este: 
SELECT [domeniu] listă_selecţie 
FROM nume_tabel1, nume_tabel2,… 
[WHERE criteriu_de_asociere] 
[ORDER BY câmpuri_criteriu [ASC|DESC]]; 
Deoarece în instrucţiunile SQL care descriu joncţiuni se utilizeazăcâmpuri care fac parte din 
tabele diferite, trebuie specificat numele tabelului de care aparţin, folosind sintaxa 
nume_tabel.nume_câmp 
fărăspaţii înainte sau dupăpunct. 
După modul de asociere a înregistrărilordin tabele, joncţiunile pot fi: 
•  internesau INNER JOINdeterminăo asociere a înregistrărilor din tabele, 
astfel încât sărezulte un număr total de înregistrări egal cu  produsul
numărului de înregistrări din fiecare tabel 
•  externe de stângasau LEFT OUTER JOIN
•  externe de dreapta sau RIGHT OUTER JOIN
Echivalentul QBE al acestor categorii de joncţiuni este alegerea opţiunilor 1, 2, sau 3 din caseta 
Join Properties. 
Sintaxa instrucţiunii: 
SELECT [domeniu] listă_selecţie 
FROM nume_tabel1 
{INNER|LEFT OUTER|RIGHTOUTER} JOIN nume_tabel2 
ON criteriu_de_asociere 
[{INNER|LEFT OUTER|RIGHTOUTER} JOIN nume_tabel3 
ON criteriu_de_asociere]… 
[WHERE criteriu_selecţie] 
[ORDER BY câmpuri_criteriu [ASC|DESC]]; 
Obs: SQL ACCESS acceptăscrierea fărăspecificarea explicităa lui OUTER. 
Semnificaţia elementelor noi: 
‰  JOINspecificătabelul care va fi asociat (nume_tabel2, nume_tabel3) celui din clauza 
FROM 
‰  ONaratăîntre ce câmpuri trebuie săexiste relaţia pe care se bazeazăjoncţiunea. Criteriul 
de asociere conţine obligatoriu operatorul „=”. 
Combinările (interogările UNION)
 Când utilizatorul doreşte săvadărezultatele mai multor interogări SELECT în acelaşi 
timp, prin combinarea ieşirilor lor, se poate utiliza facilitatea UNION. De remarcat cănu există
echivalent QBE pentru aceastăinstrucţiune. 
Sintaxa generalăpentru interogările UNION este: 
SELECT listă_câmpuri FROM nume_tabel1 
 UNION SELECT listă_câmpuri FROM nume_tabel2 
[GROUP BY câmp_de_grupare] 
[HAVING criteriu_de_agregare] 
 [UNION SELECT listă_câmpuri FROM nume_tabel3 
[GROUP BY câmp_de_grupare] 
[HAVING criteriu_de_agregare]] 
[UNION …] 
  [ORDER BY câmpuri_criteriu [ASC|DESC]]; 
Existămai multe restricţii pentru instrucţiunile care generezăinterogările UNION, şi anume: 
•  Numărul câmpurilor din lista de câmpuri din fiecare instrucţiune SELECT şi UNION 
SELECT trebuie săfie aceeaşi 
•  Secvenţa de nume din fiecare listăde câmpuri trebuie săcorespundăunor intrări identice 
•  Este permisăutilizarea doar o datăa clauzei ORDER BY, dupăultima instrucţiune 
UNION SELECT 
Exemple: 
SELECT nume, prenume, vârstăFROM Colaboratori2001 
 UNION SELECT nume, prenume, vârstăFROM Colaboratori2002 
ORDER BY nume; 
SELECT nume, prenume, vârstăFROM Colaboratori2001 
GROUP BY categoria 
HAVING categoria=”student” 
 UNION SELECT nume, prenume, vârstăFROM Colaboratori2002 
GROUP BY categoria 
HAVING categoria=”student” 
5.4  Instrucţiuni pentru manipularea datelor 
Foarte utile în exploatarea unei BD, aceste instrucţiuni se implementeazăprin interogările 
de acţiune. Este necesarăo mare precauţie în utilizarea lor deoarece acţiunile sunt ireversibile, 
putând influienţa inclusiv integritatea referenţialăa BD. 
Cele mai importante sunt: CREATE, INSERT, UPDATE şi DELETE. 
‰  Interogările de acţiune tip CREATEduc la generarea unui nou tabel pornind de la structura 
şi conţinutul unor tabele deja existente. Se foloseşte instrucţiunea SELECT ... INTO
SELECT [domeniu] (câmp1,câmp2...) 
INTO tabel_nou 
FROM tabel_sursa 
[WHERE criteriu_de_adăugare]; 
‰  Interogările de acţiune tip INSERTsunt folosite pentru adăugarea de înregistrări dintr-un 
tabel în altul. Existădouăforme ale instrucţiunii şi anume: 
•  INSERT ... VALUES 
•  INSERT ... SELECT 
a). In primul caz se adaugă o singurăînregistrare într-un tabel, menţionându-se câmpurile şi 
valorile acestora. Se utilizeazăpentru operaţii simple, care presupun lucrul cu un număr redus de 
înregistrări. 
INSERT INTO nume_tabel (câmp1, câmp2...) 
 VALUES (valoare1, valoare2...);  Reguli: 
•  valorile din clauza VALUES vor avea aceeaşi naturăcu câmpurile din clauza INTO 
•  mărimea valorii va fi < dimensiunea câmpului 
•  corespondenţăîntre câmp1 şi valoare1, etc. 
•  Dacăun câmp are specificaţia NOT NULL, este obligatorie introducerea unei valori 
pentru aceasta 
b). În al doile caz, este posibil săse copieze mai multe înregistrăridintr-un tabel în unul sau mai 
multe tabele. 
INSERT INTO tabel_destinaţie (câmp1, câmp2...) 
 SELECT [domeniu] câmp1, câmp2...  FROM tabel_sursă
WHERE criteriu_de_adăugare; 
Reguli: 
•  aceleaşi ca mai sus 
•  numărul şi natura câmpurilor din clauza INTOsăfie aceleaşi cu cele returnate de 
instrucţiunea SELECT
•  dacănu se introduce WHERE, toate înregistrările din tabel_sursăvor fi adăugate în 
tabel_destinaţie
‰  Interogările de acţiune tip DELETE şterg parţial sau total înregistrările dintr-un tabel. Nu se 
foloseşte pentru ştergerea de valori din câmpuri individuale, ci acţioneazăasupra înregistrării 
în totalitatea ei. Dacăse şterg toate înregistrările, structura de tabel rămâne, ea putând fi 
eliminatănumai cu DROP TABLE. 

0 comentarii:

Trimiteți un comentariu