Sunteți pe pagina 1din 7

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 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. Lansat iniial 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 instruciuni ale acestuia. Caracteristicile adugate standardului se numesc extensii. De ex, n standard sunt specificate 6 tipuri diferite de date pentru o BD SQL. n multe implementri, aceast list este completat cu o diversitate de extensii. Fiecare implementare se numete dialect. Dialectul ACCSES 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 BD instruciuni de manipulate a datelor: adaug, terge, modific nregistrri instruciuni de selecie a datelor, care permit consultarea BD 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 instruciuni 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 BD. 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 ex, 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 ex: 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 BD. 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 5.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 BD 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 BD. 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 BD. DROP DATABASE nume_bd terge BD. 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.

5.3 5.3.1

Instruciuni pentru selecia datelor

Cereri de interogare simple Instruciunile de selecie reprezint una din categoriile cele mai importante ale limbajului SQL ACCESS. 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. 5.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]]; Obs: SQL ACCESS accept scrierea fr specificarea explicit a lui OUTER. 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

5.4 Instruciuni pentru manipularea datelor Foarte utile n exploatarea unei BD, aceste instruciuni se implementeaz prin interogrile de aciune. Este necesar o mare precauie n utilizarea lor deoarece aciunile sunt ireversibile, putnd influiena inclusiv integritatea referenial a BD. 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 doile 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.