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