Sunteți pe pagina 1din 21

Capitolul 6.

Access SQL

6.1 Prezentare generală


SQL (Structured Query Language) este în prezent, unul din cele mai puternice limbaje
structurate pentru interogarea bazelor de date relaţionale.
Este un limbaj neprocedural şi declarativ, deoarece utilizatorul descrie ce date 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 definire a datelor, care permit descrierea structurii BD
instrucţiuni de manipulate a datelor: adaugă, şterge, modifică înregistrări
instrucţiuni de selecţie a datelor, care permit consultarea BD
instrucţiuni de procesare a 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 tabela, 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 exact cum 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ă).

1
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 clauze să fie aliniat cu începutul celorlalte
• dacă o clauză are mai multe părţi, fiecare parte trebuie să apară pe câte o linie
separată şi trebuie indentată faţă de începutul clauzei

Convenţii de notare folosite în definirea instrucţiunilor:


• 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 opţional
• punctele de suspensie ... indică o repetare opţională a unui articol, de 0 sau mai multe
ori

Identificatorii SQL sunt utilizaţi pentru a numi obiecte din BD. Pentru caracterele utilizate,
standardul ISO permite A...Z, a...z, 0...9, _. Restricţii 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 conţine spaţii libere

6.2.Instrucţiuni pentru definirea datelor


Teoretic, comenzile pentru definirea datelor fac parte din modulul corespunzător
componentei LDD 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 clic de
mouse. Există şi posibilitatea folosirii acestei instrucţiuni, dar mult mai greoi. Comanda nu e
standardizată, ACCESS nici nu o acceptă.

CREATE TABLE nume_tabela


(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 o tabelă existentă. Ştergerea unui câmp nu este posibilă.

2
DROP TABLE nume_tabel
Şterge complet o 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, stergerea
făcându-se din comenzi de mouse.

6.3. Instrucţiuni pentru selecţia datelor


Cereri de interogare simple

Instrucţiunile de selecţie reprezintă 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 includere sau eliminare din rezultatul selecţiei, a înregistrărilor care
conţin duplicate. Opţiunile posibile sunt:
ALL cere includerea tuturor înregistrărilor care îndeplinesc condiţiile impuse.
Cum instrucţiunile SELECT tabel şi SELECT ALL tabel au acelaşi rezultat
practic, calificativul ALL este rar folosit.
DISTINCT cere eliminarea înregistrărilor care conţin duplicate în câmpurile
selectate, afişând numai o apariţie a acesteia.
DISTINCTROW cere 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ţie cuprinde câmpurile care dorim să apară în tabelul cu rezultatele interogării.
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 lângă tabele, ca
sursă de informaţii pot apare şi interogări deja create.
Clauza WHERE cere numai înregistrările care îndeplinesc criteriul de selecţie specificat.
Criteriul de selecţie este o expresie care conţine obligatoriu şi un operator adecvat
tipului de dată al câmpului respectiv. Clauza WHERE este opţională.
Clauza ORDER BY cere 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.

Cereri de interogare complexe

Sunt acele interogări în care apar funcţiile agregat, asocierile sau combinările.

3
Funcţiile agregat (de grup)
Permit construirea unor interogări complexe, prin care utilizatorul 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:
COUNT returnează numărul 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 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 alias asociază un pseudonim rezultatului funcţiei agregat
Clauza GROUP BY precizează câmpul sau câmpurile după care se face gruparea
înregistrărilor. Echivalentul acestei clauze în macheta grafică QBE îl reprezintă rândul
Total.
Clauza HAVING conţine criteriul care va fi aplicat câmpului argument al funcţiei
agregat. Spre deosebire de WHERE, care acţionează înainte de gruparea înregistrărilor,
HAVING acţionează după definirea acesteia.

Asocierile (interogările JOIN)


Limbajul SQL oferă posibilitatea de a grupa şi folosi date din tabele diferite. Operaţiile de
asociere induse de clauza JOIN au 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
clauzei WHERE asociată cu o egalitate dorită
• NEECHIVALENTĂ (non echijoncţiune) - rar folosită - presupune folosirea
clauzei WHERE asociată 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]];

4
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

După modul de asociere a înregistrărilor din tabele, joncţiunile pot fi:


• interne sau INNER JOIN determină 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ânga sau 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|RIGHT OUTER} JOIN nume_tabel2
ON criteriu_de_asociere
[{INNER|LEFT OUTER|RIGHT OUTER} 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:
JOIN specifică tabelul care va fi asociat (nume_tabel2, nume_tabel3) celui din clauza
FROM
ON arată î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:

5
• 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”

6.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 CREATE duc 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 INSERT sunt 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). 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

6
b). Este posibil să se copieze mai multe înregistrări dintr-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 INTO să 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.

DELETE FROM nume_tabel


[WHERE criteriu_de_ştergere];

Ca şi instrucţiunea INSERT, operaţia de ştergere a înregistrărilor dintr-o tabelă poate duce la


probleme de integritate referenţială în alte tabele.
Exemplu:

DELETE *
FROM Vânzări;
DELETE *
FROM Angajaţi
WHERE Vârsta>60;

Interogărilede acţiune tip UPDATE pot introduce înregistrări noi şi pot modifica valorile
câmpurilor din înregistrări existente.

UPDATE nume_tabel
SET nume_câmp1=valoare1 [,nume_câmp2=valoare2]...
[WHERE criteriu_de_actualizare];

Ca şi în celelalte locuri unde apare clauza WHERE, restricţionarea se poate accentua folosind
şi operatori logici.

Exemplu:
UPDATE Comunicaţii
SET Reţea=”Orange”
WHERE Reţea=”Dialog” AND Data>#12.12.2001;

7
6.5. Cereri de interogare imbricate
Scrierea unei interogări în cadrul alteia duce la apariţia unei subinterogări, setul de
rezultate obţinute de la aceasta constituind argument pentru prima interogare.

SELECT lista_câmpuri
FROM tabel1
WHERE tabel1.nume_câmp=
(SELECT nume_câmp
FROM tabel2
WHERE criteriu_de_selecţie);
Cele două tabele trebuie să aibă un câmp comun (nume_câmp) care va reprezenta câmpul de
legătură ce stă la baza construirii subinterogării.

6.6. Exemple

A.Selectarea coloanelor unei tabele


Cea mai simplă interogare a unei baze de date este selectarea unor coloane dintr-o tabelă.
Acestă interogare corespunde instrucţiunii SELECT următoare

SELECT nume_coloana_1, nume_coloana_2, …, nume_coloana_k


FROM nume_tabela;

unde nume_coloana_i este numele unei coloane din tabelă. Când selectăm coloane din
mai multe tabele, forma generală a numelor coloanelor unei tabele este

nume_tabela.nume_coloana

deoarece numele coloanelor din diverse tabele pot coincide. Atributul nume_coloana al
obiectului nume_tabela este accesat cu operatorul punct.

Dacă vrem să selectăm toate coloanele tabelei, instrucţiunea SELECT are forma

SELECT *
FROM nume_tabela;

In exemplele următoare vom utiliza tabela PROIECT_ANGAJAT de mai jos.


Tabela conţine angajaţii ce lucrează la diverse proiecte ale unei firme, cu salariul orar,
SAL_ORA şi numărul de ore prestate la proiect, ORE.
Cheia primară a tabelei este formată din câmpurile ID_PRJ şi ID_ANG.
Câmpurile NUME_ANGAJAT şi DPT_ANG sunt de tip text, celelalte de tip numeric.

PROIECT_ANGAJAT

ID_PRJ ID_ANG NUME_ANGAJAT DPT_ANG SAL_ORA ORE

8
Proiectarea tabelei este cea din Figura 6.1.

Figura 6.1. Proiectarea tabelei PROIECT_ANGAJAT.


Tabela cu date este cea din Figura 6.2.

Figura 6.2. Tabela cu date PROIECT_ANGAJAT.


In firmă există trei departamente, Informatica, Support, Documentare.
Numele lor se va introduce cu o casetă combinată (Combo Box).

B.Selectare liniilor unei tabele ce satisfac anumite criterii


Selectarea coloanelor liniilor unei tabele ce satisfac anumite criterii se face cu
instrucţiunea SELECT cu clauza WHERE care conţine criteriile de selecţie.

Instrucţiunea are forma:

SELECT nume_coloana_1, nume_coloana_2, …, nume_coloana_k


FROM nume_tabela
WHERE conditie
ORDER BY nume_coloana_1 [ASC | DESC] [, nume_coloana_2 [ASC
| DESC] …];

Condiţia din clauza WHERE este o expresie booleană ce are ca argumente


nume_coloana_1, nume_coloana_2, …, nume_coloana_k.
O linie a tabelei este selectată când condiţia din clauza WHERE are valoarea adevărat.

9
Dacă vrem să selectăm toate coloanele liniilor unei tabele ce îndeplinesc o condiţie,
instrucţiunea SELECT are forma
SELECT *
FROM nume_tabela
WHERE conditie
ORDER BY nume_coloana_1 [ASC | DESC] [, nume_coloana_2 [ASC
| DESC] …];

Access permite să creăm formulare grafice corespunzătoare acestei instrucţiuni.


Elementele acestor formulare sunt traduse de Access într-o instrucţiune SELECT care
este executată pentru a obţine tabela rezultat.
Atributul nume_coloana al obiectului nume_tabela este accesat cu operatorul punct.
Această formă generală se utilizează atunci când selectăm coloane din mai multe tabele,
după cum se va vedea în capitolele următoare, deoarece anumite coloane din diverse
tabele pot avea aceleaşi nume şi doar forma generală a nume_coloana le poate distinge.

In cazul instrucţiunii SELECT, când se selectează date dintr-o singură tabelă, în numele
coloanei se poate omite numele tabelei.

C.Crearea unui formular de interogare

Fie tabela PROIECT_ANGAJAT

ID_PRJ ID_ANG NUME_ANGAJAT DPT_ANG SAL_ORA ORE

Vom exemplifica crearea unui formular corespunzând instrucţiunii

SELECT ID_ANG, NUME_ANGAJAT, DPT_ANG, SAL_ORA


FROM PROIECT_ANGAJAT
WHERE NUME_DEPARTAMENT = ‘Informatica’;

Semnificaţia acestor opţiuni este cea din Tabelul 1.


Opţiune Instrucţiunea SQL
SELECT
SELECT
CREATE TABLE
UPDATE
INSERT
DELETE
Tabelul 1. Opţiunile de creare a unui formular de interogare.

D.Condiţii compuse
In următorul exemplu vom selecta angajaţii de la departamentele Suport şi Documentare
din tabela PROIECT_ANGAJAT cu instrucţiunea SELECT de mai jos.

10
SELECT ID_ANG, NUME_ANGAJAT, DPT_ANG, SAL_ORA
FROM PROIECT_ANGAJAT
WHERE DPT_ANG = ‘Documentare’ OR DPT_ANG = ‘Suport’;

Condiţia din clauza WHERE se completează în celulele DPT_ANG din liniile Criteria
şi or. Formularul corespunzătoare acestei interogări este:

Figura 6.3. Forma pentru selectarea angajaţilor departamentelor Documentare şi Suport.


Instrucţiunea SELECT generată de Access din formularul creat mai sus este:

Figura 6.4 Instrucţiunea SELECT corespunzătoare formei din Figura .


Tabela rezultat este urmatoarea :

11
Figura 6.5. Tabela rezultat

Clauza WHERE a instrucţiunii SELECT conţine o condiţie care este o expresie booleană.
Expresiile booleene sunt constituite din expresii relaţionale separate de operatorii
booleeni AND, OR şi NOT. In cazul cel mai simplu, o expresie booleană este constituită
dintr-o singură expresie relaţională.

Expresiile relaţionale sunt constituite din expresii aritmetice separate de operatorii


relaţionali <, <=, >, >= , = şi <> şi operatorul Between … And … care testează dacă o
valoare este cuprinsă într-un interval.

In unele cazuri avem nevoie să comparăm un şir de caractere cu elementele unei coloane
care sunt şiruri de caractere, ca în interogarea din Figura . Sirurile de caractere sunt scrise
între ghilimele. O operaţie ce se poate efectua asupra şirurilor este concatenarea.

Operatorul de concatenare este &. Pentru a testa dacă un şir de caractere corespunde unui
şablon se utilizează operatorul LIKE, vezi o lucrare anterioară.

Expresiile aritmetice au ca termeni numere, atributul numeric respectiv (coloana


numerică din tabelă) şi operatorii aritmetici +, -, * şi / pentru numere reale şi +, -, \ şi
Mod pentru numere întregi. Priorităţile operatorilor sunt cele cunoscute. Termenii
expresiilor aritmetice pot fi grupaţi în paranteze rotunde.
Exemplu. Să testăm dacă atributul SAL_ORA al tabelei PROIECT_ANGAJAT din
exemplele anterioare este cuprins între valorile 40 şi 60. Condiţia se poate scrie în mai
multe feluri:
>= 40 AND <= 60
>=30+10 AND <= 60
>=(30+10) AND <= 60
BETWEEN 40 AND 60
NOT < 40 AND NOT > 60

In a doua expresie am folosit expresia 30+10 în loc de 40 pentru a sublinia că în


expresiile relaţionale putem utiliza expresii aritmetice oricât de complicate. In expresia a
treia am utilizat paranteze rotunde. Ultima condiţie este arătată în Figura .

12
Expresia booleană ce reprezintă condiţia din clauza WHERE se poate scrie direct în
câmpurile Criteria şi or sau se poate crea cu aplicaţia Expression Builder, ca într-o
lucrare anterioară.
Implicit, în fereastra de proiectare există o singură linie or. Se pot adăuga mai multe linii
or cu un clic pe linia or existentă şi apoi clic pe meniul Insert  Rows.
Liniile or se pot şterge cu un clic pe linie şi apoi clic pe meniul Edit  Delete Rows.

Figura 6.6. Exemplu de condiţie compusă.


Uneori este dificil de a scrie condiţia, deoarece spaţiul din celulă este prea mic. Se poate
afişa o fereastră în care să se introducă expresia cu clic pe celulă, apoi se apasă tastele
Shift + F2 şi se afişază fereastra :

Figura 6.7. Afişarea unei ferestre pentru introducerea unei expresii.

13
Pentru a lansa aplicaţia Expression Builder se procedează astfel:
1. se afişează meniul contextual al coloanei formularului cu un clic cu butonul drept pe
coloana pentru care vrem să creăm condiţia;
2. clic pe opţiunea Build ce afişează caseta Expression Builder cu care se crează
expresia dorită.

Figura 6.8. Meniu contextual al unei coloane a formularului.


O altă posibilitate de a lansa aplicaţia Expression Builder este cu clic pe butonul Build,
, al barei de instrumente.
In partea din stânga jos a casetei Expression Builder sunt afişate pe lângă funcţii,
constante, operatori şi tabelele, formularele şi alte obiecte din baza de date, ale căror
elemente se pot utiliza în expresii.

Figura 6.9.Caseta Expression Builder.

14
Opţiunea Table Names afişează sau ascunde linia Table din formular ce afişază numele
tabelelor.

E.Reuniunea tabelelor
Una dintre operaţiile ce se pot aplica asupra tabelelor rezultat este reuniunea acestor
tabele. Pentru reuniune, liniile tabelelor trebuie să aibe aceleaşi coloane. Reuniunea
tabelelor se face cu instrucţiunea SQL UNION cu forma:

SELECT coloane
FROM nume_tabela_1
UNION
SELECT coloane
FROM nume_tabela_2;

Pentru exemplificare, vom considera tabela SITUATIE_FINANCIARA de mai jos, ce


conţine datele financiare pe anii trecuţi ale unei intreprinderi

SITUATIE_FINANCIARA

AN VENITURI CHELTUIELI PROFIT_BRUT IMPOZIT PROFIT_NET

şi tabela DATE_CONTABILE cu datele financiare pe anul curent

DATE_CONTABILE

AN VENITURI CHELTUIELI PROFIT_BRUT IMPOZIT PROFIT_NET

Vom crea o tabelă ce reuneşte liniile celor două tabele în felul următor:
1. se afişază fereastra Database; în partea stângă, se selectează opţiunea Queries; în
partea dreaptă se afişază opţiunile existente, Create query by using wizard şi Create
query in Design view şi interogările (Queries) existente,
2. clic pe opţiunea Create query in Design View care afişază caseta Show Table; clic
pe butonul Close
3. clic pe meniul Query  SQL Specific, şi în submeniul afişat, clic pe opţiunea Union.

15
Figura 6.10. Meniul Query. Opţiunea Union.
4. se afişază caseta de text din Figura , în care se introduce instrucţiunea UNION

Figura 6.11. Instrucţiunea UNION.

5. clic pe butonul Run, , al barei de instrumente şi se obţine tabela rezultat.

F.Utilizarea funcţiilor de agregare SQL în interogări


Instrucţiunea SELECT poate utiliza câteva funcţii standard SQL pentru a face suma
valorilor unei coloane, calculul valorii medii, minime sau maxime a unei coloane, etc.
Aceste funcţii sunt cele din Tabelul 2.

Funcţia Semnificaţia
AVG Valoarea medie
MIN Valoarea minimă
MAX Valoarea maximă
SUM Suma valorilor din coloană
VAR Dispersia
STD Abaterea medie pătratică
Tabelul 2. Funcţii SQL pentru agregarea datelor în instrucţiunea SELECT.

Cea mai simplă interogare a unei baze de date cu utilizarea acestor funcţii este aplicarea
lor asupra unor coloane dintr-o tabelă. Acestă interogare corespunde instrucţiunii
SELECT următoare:

16
SELECT funcţie(nume_coloana_1), funcţie(nume_coloana_2), …,
funcţie(nume_coloana_k)
FROM nume_tabela;

In acest caz nu s-a precizat numele coloanelor din tabela rezultat a interogării, şi aplicaţia
atribuie acestor coloane nişte nume standard. Instrucţiunea SELECT are şi o formă în
care putem atribui coloanelor tabelei rezultat ce nume dorim. Această formă este

SELECT funcţie(nume_coloana_1) AS nume_1,


funcţie(nume_coloana_2) AS nume_2, …,
funcţie(nume_coloana_k) AS nume_k
FROM nume_tabela;

Vom exemplifica utilizarea acestor funcţii la tabela VANZARI, proiectată în Figura .


Tabela cu date este cea din Figura .

Figura 6.12. Proiectarea tabelei VANZARI.

Figura 6.13. Tabela VANZARI.


Vom calcula suma vânzărilor pe fiecare an. Procedura este următoarea:
1. se afişază fereastra de proiectare a interogării

17
Figura 6.14. Fereastra de proiectarea interogării.
2. se selectează prima celulă din linia Fields cu un clic,
3. clic pe butonul Build, , al barei de instrumente, care lansează aplicaţia
Expression Builder din Figura ; se selectează în fereastra stângă opţiunea Functions
 Built-In Functions, în fereastra din mijloc se selectează SQL Aggregate, iar în
fereastra din dreapta funcţia Sum; clic pe butonul Paste şi în fereastra superioară
apare expresia Sum(“expr”) pentru care trebuie să completăm argumentul expr,

Figura 6.15. Fereastra aplicaţiei Expression Builder.


4. selectăm argumentul “expr” al funcţiei Sum cu un clic, ca în Figura ,

18
Figura 6.16. Selectarea argumentului unei expresii.
5. selectăm apoi tabela VANZARI în fereastra din stânga cu clic pe opţiunea Tables 
VANZARI; în acest moment în fereastra din mijloc apar câmpurile tabelei; clic pe
câmpul VANZARI_2001 şi se generează expresia din fereastra superioară din Figura ;
numele coloanei este introdus ca [nume_tabela].[nume_coloana], adică
[VANZARI]![VANZARI_2001],

Figura 6.17. Expresia pentru însumarea unei coloane.


6. se repetă paşii de mai sus şi pentru celelalte coloane; linia Field este cea din Figura ,

19
Figura 6.18. Fereastra de proiectare.
Expresia din prima celulă a liniei Field este cea din Figura . Numele coloanei atribuit de
aplicaţia Expression Builder este Expr1.

Figura 6.19. Expresia primei coloane a interogării.

7. clic pe butonul Run , , al barei de instrumente şi tabela rezultat este cea din Figura .

Figura 6.20.Tabela rezulatat a interogării.


După cum se observă, coloanele tabelei rezultat au numele Expr1, …, Expr4, atribuite de
aplicaţia Expression Builder. Acest caz corespunde primei forme a instrucţiunii SELECT
prezentate în acest paragraf.

SELECT funcţie(nume_coloana_1), funcţie(nume_coloana_2), …,


funcţie(nume_coloana_k)
FROM nume_tabela;

20
Modificăm Expr1 în celula liniei Field în AN 2001, şi la fel numele celorlalte coloane
pentru a fi mai semnificative. Tabela rezultat este :

Figura 6.21. Modificarea numelui coloanei tabelei rezultat.

Figura 6.22. Tabela rezultat a interogării.


Acest caz corespunde celei dea doua forme a instrucţiunii SELECT

SELECT funcţie(nume_coloana_1) AS nume_1,


funcţie(nume_coloana_2) AS nume_2, …,
funcţie(nume_coloana_k) AS nume_k
FROM nume_tabela;

Instrucţiunea SELECT este:

Figura 6.23. Instrucţiunea SELECT a interogării.

21

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