Capitolul 4: SQL

4.1 Limbajul SQL

Unul dintre cele mai puternice limbaje structurate pentru interogarea bazelor de date relationale îl constituie în prezent SQL (Structured Query Language). Acesta, pronuntat cel mai adesea de catre utilizatorii lui în formula abreviata "sequel", a devenit chiar un standard pentru o gama din ce în ce mai larga de sisteme de gestiune a bazelor de date. Limbajul SQL permite o comunicare complexa si rapida a utilizatorului cu bazele de date, în functie de cerintele si restrictiile acestuia. Pe lânga manipularea si regasirea datelor, se efectueaza si operatii complexe privind actualizarea si administrarea bazei de date.

Exista un anumit grad de standardizare a limbajului SQL, mai multe sisteme de gestiune a bazelor de date recunoscând principalele instructiuni ale acestuia (de exemplu: Oracle, Access, Sybase etc.). Pe plan mondial, standardul în domeniu este considerat ANSI (American National Standards Institute) SQL care are în vedere atât aspectele de definire, interogare, manipulare a datelor, procesare a tranzactiilor, cât si caracteristicile complexe privind integritatea informatiilor, cursoarele derulante sau jonctiunile externe. Multi producatori de sisteme de gestiune a bazelor de date furnizeaza propriile extensii ale limbajului SQL, asigurându-si astfel exclusivitatea.

Sistemul de gestiune a bazelor de date ACCESS 2000 accepta utilizarea limbajului de interogare SQL. Existenta tehnicii grafice QBE (Query by Example-interogare prin exemplu) permite proiectarea facila a unor interogari complexe. Informatia definita pe grila QBE va fi automat transformata într-o instructiune SQL. Dialectul ACCESS contine unele particularitati în raport de standardul ANSI SQL, fiind conceput mai mult pentru crearea interogarilor de selectie.

În acest capitol tratam în detaliu doar primele trei categorii de instructiuni, si anume cele care privesc definirea, manipularea si selectia informatiilor din bazele de date.

Pentru a putea scrie corect o instructiune SQL în ACCESS 2000 este necesara respectarea stricta a unor reguli de sintaxa. Amintim în continuare câteva dintre acestea:

4.2 Etapele crearii unei interogari

În crearea şi respectiv executarea unei interogări ACCESS 2000 construită prin utilizarea de instrucţiuni SQL se parcurg, de fiecare dată, mai multe etape de bază:

Pe ecranul calculatorului va fi afişat în final rezultatul interogării SQL; utilizatorul îl va analiza şi interpreta în funcţie de propriile cerinţe şi restricţii informaţionale.

În cazul în care cererea de interogare SQL ACCESS are erori de sintaxă sau determină obţinerea de rezultate eronate, va trebui să se revină în modul de afişare SQL View pentru a se face corecţiile necesare.

4.3 Comenzi pentru definirea datelor

Principalele comenzi SQL pentru definirea datelor sunt următoarele:

Comanda CREATE DATABASE are următoarea sintaxă: CREATE DATABASE nume_baza_de_date fiind utilizată pentru crearea unei noi baze de date.

Comanda DROP DATABASE nume_baza_de_date este utilizată pentru stergerea bazei de date.

Pentru crearea unei tabele se utilizează comanda CREATE TABLE nume_tabela (câmp1 tip_data [NOT NULL], câmp2 tip_data [NOT NULL], câmp3 tip_data [NOT NULL]...).

Printre cele mai importante tipuri de date folosite amintim: Character, Memo, Number, Integer, Decimal, Logical, Date, OLE Object etc.Numele tabelei trebuie sa fie unic în cadrul bazei de date, neputând fi unul din cuvintele rezervate. Totodata, acesta poate avea si anumite restrictii privind: numarul de caractere din care este format, utilizarea anumitor simboluri, folosirea literelor mari sau mici, natura caracterului de început etc. Aceleasi cerinte apar si pentru numele câmpurilor; în plus exista posibilitatea duplicarii lor în cadrul bazei de date, dar se pastreaza unicitatea în tabela. Clauza NOT NULL arata ca în câmpul respectiv nu se memoreaza valori de tip NULL.

Exemplu: Se creeaza tabela Vânzari cu urmatoarea structura a înregistrarii: numar (tip numeric), cod marfa (tip numeric), data vânzarii (tip data calendaristica), localitatea (tip caracter). Exemplu: Se creeaza tabela Vânzari cu urmatoarea structura a înregistrarii: numar (tip numeric), cod marfa (tip numeric), data vânzarii (tip data calendaristica), localitatea (tip caracter). În câmpul data vânzarii nu se vor memora valori de tip NULL.

CREATE TABLE VANZARI(Nr Number, Cod_m Number, Data_v Date NOT NULL, Localit Char)

Pentru modificarea structurii unui tabel se utilizează comanda ALTER TABLE cu următoarea sintaxă (simplificată): ALTER TABLE nume_tabela ADD nume_câmp tip_data. În această variantă se adaugă în structura tabelei câmpul specificat în comenda.

Exemplu: Se adaugă în tabela Personal_Vânzare un nou câmp numit Telefon: ALTER TABLE PERSONAL_VANZARE ADD Telefon Integer.

Comanda DROP TABLE nume_tabela este folosita pentru a sterge complet o tabela dintr-o baza de date (structura şi valorile asociate).

4.4 Instructiunile de selectie a datelor

Instrucţiunile de selecţie reprezintă una dintre categoriile cele mai importante ale limbajului de interogare SQL ACCESS. Indiferent daca sunt simple sau complexe, punctul de plecare îl constituie fraza SELECT, prin care se regasesc si se afiseaza informatiile dorite de utilizator.

Pentru definirea interogarilor de selectie simple se utilizeaza urmatoarea sintaxa a instructiunii SELECT:

   SELECT [domeniu] lista_selectie
   FROM nume_tabela1, nume_tabela2,...
   [WHERE criteriul_de_selectie]
   [ORDER BY câmpuri_criteriu [ASC|DESC]]
   [GROUP BY câmp_de_grupare  
      [HAVING criteriul_de_ grupare]]
.

Domeniu permite stabilirearea modalitaţii de manipulare a înregistrarilor din baza de date asupra careia se efectueaza selectia si poate fi:

Lista_selectie cuprinde toate câmpurile care vor aparea în tabela cu rezultatele interogarii. Câmpurile adaugate în rândul Field din grila Query a machetei grafice QBE, care au marcata caseta de validare Show, sunt aceleasi cu cele mentionate în lista de selectie.În scrierea interogarilor de selectie simple SQL ACCESS este posibila si folosirea functiilor totalizatoare. Cele mai importante functii din aceasta categorie sunt:

În cadrul listei de selecţie se pot defini şi alias-uri. Acestea reprezintă un pseudonim (nume) asociat unui câmp astfel : câmp AS alias. functiei agregat

Clauza FROM Specifica numele tabelei sau tabelelor care vor forma suportul interogarii. Daca în lista_selectie se includ câmpuri din mai multe tabele, în fata numelui acestora trebuie precizata tabela din care fac parte. Asa cum aratam la regulile de sintaxa, pentru separarea numelor de tabele, se utilizeaza semnul , (virgula). Trebuie sa precizam faptul ca în cadrul acestei clauze se pot mentiona pe lânga tabele, ca surse de informatii pentru interogarile SQL, si interogari care au fost deja create.

Clauza WHERE Face interogarile mai selective, specificând faptul ca vor fi afisate numai înregistrarile care îndeplinesc criteriul descris. Parametrul criteriul de selectie este o expresie care contine un operator de tip text (sir) sau numeric, în functie de tipul câmpului. Clauza WHERE este optionala si nu opereaza cu functii totalizatoare. În cadrul condiţiei din clauza WHERE apar pot fi utilizaţi operatorii : AND, OR, NOT, IN, BETWEEN, LIKE. Apelând la acestia, este posibilă construirea unor condiţii mai complexe.

Clauza ORDER BY Utilizata atunci când se doreste ca rezultatele interogarii sa fie ordonate în mod crescator (ASC) sau descrescator (DESC). Sortarea este optionala si se poate realiza dupa unul sau mai multe câmpuri_criteriu (definite drept chei de sortare). Componenta BY a clauzei nu poate sa lipseasca atunci când se doreste sortarea rezultatelor interogarii SQL ACCESS !

Clauza GROUP BY Precizeaza câmpul sau câmpurile pe baza carora se va efectua gruparea înregistrarilor. În acelasi timp, prin intermediul acestei clauze, se pot executa functiile agregate descrise în lista de selectie pentru fiecare dintre grupari (constituite pe baza câmpurilor de grupare). Echivalentul acestei clauze în macheta grafica QBE de constructie a interogarii îl reprezinta rândul Total.

Clauza HAVING Se refera la criteriul care va fi aplicat câmpului-definit ca argument al functiei agregat. Altfel spus, când se foloseste clauza GROUP BY si este necesara si o conditie, se va utiliza clauza HAVING. Spre deosebire de WHERE, care actioneaza înainte de a se efectua gruparea înregistrarilor, HAVING va opera dupa definirea acesteia. De remarcat faptul ca se admite utilizarea unei functii agregat care nu apare în lista de selectie, precum si apelarea la mai multe criterii de grupare.

O facilitate deosebit de importanta a limbajului SQL o reprezinta posibilitatea de a grupa si folosi date din tabele diferite. Operatiile de asociere induse de clauza JOIN au ca rezultat producerea tuturor combinatiilor posibile, pentru continutul informational al fiecarei tabele. Noile înregistrari care rezulta în urma jonctiunii vor deveni disponibile pentru selectiile ulterioare. La o asociere pot participa mai mult de doua tabele.

Principala modalitate de realizarea a joncţiunii este sintetizată de următoarea sintaxă:

SELECT [domeniu] lista_selectie
FROM nume_tabela1 {INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabela2
ON criteriul_de_asociere
[{INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabela3
ON criteriul_de_asociere]...
[WHERE criteriul_de_selectie]
[ORDER BY câmpuri_criteriu [ASC|DESC]]

Semnificatia elementelor de sintaxa descrise mai sus este urmatoarea:

Joncţiunile tip INNER JOIN determina o asociere a înregistrarilor din tabele, astfel încât sa rezulte un numar total de înregistrari egal cu produsul numarului de înregistrari din fiecare tabela.

Joncţiunile externe (OUTER) sunt de doua tipuri: de stânga (LEFT OUTER JOIN) si de dreapta (RIGHT OUTER JOIN), fiind destul de putin utilizate. Echivalentul QBE al acestor categorii de jonctiuni este alegerea optiunilor 1, 2 sau 3, din caseta Join Properties, care au fost explicate într-un capitol precedent.

4.5 Instructiunile pentru manipularea datelor

Cele mai importante instructiuni sunt: INSERT, UPDATE si DELETE.

Comanda INSERT se foloseste pentru adaugarea de înregistrari dintr-o tabela în alta. Prin aceasta interogare de adaugare nu se pot insera date dintr-o tabela în ea însasi; operatia ar fi totusi posibila printr-o selectare prealabila a datelor initiale într-un tabel temporar, urmata de modificarea si readucerea lor în tabelul de la care s-a plecat.

Sintaxa comenzii este următoarea:

INSERT INTO nume_tabela (câmp1, câmp2...)
VALUES (valoare1,valoare2...

În acest caz se adauga o înregistrare într-o tabela, mentionându-se câmpurile si valorile asociate acestora. Ca particularitate se remarca inserarea unei singure înregistrari la un moment dat. Prima forma a lui INSERT se utilizeaza pentru operatii simple care presupun lucrul cu un numar redus de înregistrari. Dupa lansarea în executie a interogarii apare un mesaj de avertizare privind adaugarea noii înregistrari în baza de date si caracterul ireversibil al acestei operatii.

În cadrul acestui tip de inserare a datelor trebuie sa se respecte urmatoarele reguli:

Comanda DELETE are următoarea sintaxă:
DELETE FROM nume_tabela [WHERE criteriul_de_stergere] se materializează în interogarea actiune de stergere partiala sau totala a înregistrarilor din tabele. În acelasi timp se va sterge doar continutul tabelei nu si aceasta (pentru eliminarea tabelei se va apela la instructiunea DROP TABLE).

Comanda UPDATE are următoarea sintaxă:

UPDATE nume_tabela
SET nume_câmp1 = valoare1 [,nume_câmp2 = valoare2]...
[WHERE criteriul_de_actualizare]
Aceasta are atât scopul de a insera noi înregistrari, cât si de a modifica valorile câmpurilor din înregistrarile existente. Ca si în cazul instructiunii INSERT, se va urmari daca în câmpul cu valori de actualizat sunt permise numai valori unice. Atunci când se doreste actualizarea datelor din mai multe câmpuri se foloseste virgula ca separator între câmpuri si valorile acestora. Se pot utiliza mai multe conditii WHERE apelând la operatorul logic AND pentru a limita actualizarea la înregistrari mai bine specificate.

4.6 Cereri de interogare imbricate

Scrierea unei interogari în cadrul alteia duce la aparitia unei subinterogari; setul de rezultate obtinut de la o interogare va constitui argument pentru o alta. Utilizatorul poate astfel sa creeze legaturi între mai multe interogari SQL ACCESS, pe baza unor câmpuri unice, cu rol de cautare în structura tabelelor. Subinterogarile înlocuiesc interogarile imbricate din versiunile precedente, cu performante mult îmbunatatite. Pot fi construite si prin varianta de lucru a machetei grafice QBE Access.

Cea mai simpla subinterogare are sintaxa urmatoare:

SELECT * FROM Tabela1
WHERE Tabela1.nume_ câmp =
   (SELECT nume_câmp FROM Tabela2 WHERE criteriul_de_selectie);
Tabela1 si Tabela2 vor avea un câmp comun (nume_câmp) care va reprezenta de fapt câmpul de legatura ce sta la baza construirii subinterogarii. Clauza SELECT din subinterogare va avea acelasi numar de câmpuri si de natura similara cu cele din clauza WHERE a interogarii externe.