Sunteți pe pagina 1din 49

Baze de Date pentru Telecomunicaii

Lucrarea 1
Introducere n SQL. Instruciunea SELECT.
Expresii, condiii i operatori.

0
Cuprins

Capitolul I: Introducere in SQL2

1.1 Scurta istorie a limbajului SQL................................................................................................2


1.2 Scurta istorie a bazelor de date..............................................................................................2
1.3 Proiectarea structurii unei baze de date.................................................................................4
1.4 Un limbaj hibrid intre produse................................................................................................5
1.5 Prezentare generala a limbajului SQL.....................................................................................6
1.6 Implementari SQL uzuale........................................................................................................6
1.6 Libraria Open Database Connectivity (ODBC).........................................................................7
1.7 Limbajul SQL in programarea aplicatiilor................................................................................7

Capitolul II: Introducere in interogari: Declaratii 8

2.1 Reguli generale de sintaxa......................................................................................................8


2.2 Exemple..................................................................................................................................9
2.3 Prima interogare...................................................................................................................10
2.4 Interogari cu distinctii...........................................................................................................12

Capitolul III: Expresii, conditii si operatori 15

3.1 Expresii.................................................................................................................................15
3.2 Conditii.................................................................................................................................15
3.3 Operatori..............................................................................................................................17

Exercitiu propus 45

1
Capitolul I: Introducere in SQL

1.1 Scurta istorie a limbajului SQL


Istoria limbajului SQL incepe intr-un laborator IBM in San Jose, California, unde a
fost dezvoltat la sfarsitul anilor 70. Initialele acronimului SQL semnifica Structured Query
Language (Limbaj de Interogari Structurate), iar limbajul in sine este deseori denumit
sequel. A fost initial dezvoltat pentru sistemul DB2 al IBM, un sistem relational de
management a bazelor de date (RDBMS). SQL este un limbaj non-procedural, in contrast cu
generatia a treia de limbaje procedurale cum ar fi COBOL si C.
Caracteristica care diferentiaza un DBMS fata de un RDBMS este faptul ca RDBMS
ofera un limbaj de baze de date orientat pe seturi. Acest lucru inseamna ca limbajul SQL
proceseaza seturi de date in grupuri.
Doua organizatii de standardizare, American National Standards Institute (ANSI) si
International Standards Organization (ISO), promoveaza in prezent limbajul SQL. Standardul
ANSI-82 este standardul pentru SQL folosit in aceasta carte. Desi aceste entitati pregatesc
standarde pentru a fi adoptate de proiectanti pentru sisteme de baze de date, toate variantele
de baze de date difera de standardul ANSI mai mult sau mai putin. In plus, majoritatea
sistemelor furnizeaza extensii particulare pentru SQL care extind limbajul spre unul cu
adevarat procedural. Am folosit diverse sisteme RDBMS pentru exemplele din aceasta carte
pentru a oferi o idee asupra sistemelor de baze de date uzuale.

1.2 Scurta istorie a bazelor de date


Sistemele de baze de date stocheaza informatii in orice mediu de afaceri posibil. Pana
in ultimii cativa ani, sistemele de baze de date mari puteau functiona numai pe calculatoare
foarte puternice, care erau scumpe de cumparat si intretinut. Insa generatia actuala de statii de
lucru ieftine dar puternice permite programatorilor sa proiecteze software care mentine si
distribuie datele intr-un mod rapid si ieftin.

1.2.1 Cele 12 reguli pentru un model relational de baze de date ale lui
Dr. Codd:
Cel mai popular model de stocare a datelor este sistemul relational de baze de date,
care a fost conceput de Dr. E. F. Codd in 1970, in lucrarea lui, A Relational Model of Data
for Large Shared Data Banks. Limbajul SQL a evoluat sa utilizeze conceptele modelului
relational. Dr. Codd a definit 13 reguli pentru acest model, cunoscute in mod ciudat ca cele 12
reguli ale lui Codd:
0. Un DBMS relational trebuie sa poata sa gestioneze baze de date numai prin
capabilitatile sale relationale.
1. Regula informatiei: Toata informatia intr-o baza de date relationala
(inclusiv numele de coloane si tabele) este reprezentata explicit ca valori in
tabele.

2
2. Acces garantat: Fiecare valoare intr-o baza de date relationala este
accesibila garantat folosind o combinatie de nume de tabel, valoarea cheiei
primare si numele coloanei.
3. Suport sistematic pentru valori nule: DBMS ofera suport sistematic pentru
tratarea valorilor nule (date necunoscute sau inaplicabile), diferite de
valorile implicite si independente de orice domeniu.
4. Catalog relational activ si online: Descrierea unei baze de date si a
continutului ei este reprezentat la nivel logic ca tabele si astfel poate fi
interogat folosind limbajul de baze de date.
5. Sublimbaj de date comprehensiv: Este necesar ca macar un limbaj suportat
sa aiba o sintaxa bine definita si sa fie comprehensiv. Trebuie sa suporte
definirea si manipularea datelor, reguli de integritate, autorizare si
tranzactionare.
6. Regula de actualizare a vizionarilor: Toate vizionarile care sunt teoretic
actualizabile pot fi actualizate prin sistem.
7. Inserare, actualizare si stergere la nivel de set: DBMS suporta nu numai
recuperarea la nivel de set ci si inserari, actualizari si stergeri.
8. Independenta datelor fizice: Programele aplicatie si ad-hoc nu sunt afectate
logic cand metodele de acces fizice sau structurile de stocare sunt
modificate.
9. Independenta datelor logice: Programele aplicatie si ad-hoc nu sunt afectate
logic, pe cat posibil, cand sunt facute schimbari la structurile tabelelor.
10. Independenta integritatii: Limbajul de baze de date trebuie sa fie capabil sa
defineasca reguli de integritate. Acestea trebuie sa fie stocate in catalogul
online, si nu pot fi evitate.
11. Independenta distributiei: Programele aplicatie si ad-hoc nu sunt afectate
logic cand informatia este distribuita prima data sau este redistribuita.
12. Nesubversiune: Trebuie sa fie imposibil evitarea regulilor de integritate
definite in limbajul de baze de date prin folosirea limbajelor de nivel mai
mic.
Majoritatea bazelor de date au o relatie parinte/copil, astfel incat un nod parinte
contine indicatori de fisiere catre copiii lui.
Aceasta metoda are mai cateva avantaje si multe dezavantaje. Un avantaj este ca
structura fizica a datelor pe un disc devine neimportanta. Un programator doar stocheaza
indicicatori catre urmatoarea locatie, iar astfel datele pot fi accesate. De asemenea, datele pot
fi adaugate si sterse cu usurinta. Insa, grupuri diferite de informatie nu pot fi asociate cu
usurinta pentru a crea informatie noua. Formatul datelor pe disc nu pot fi schimbate in mod
arbitrar dupa ce baza de date a fost creata. Pentru a face acest lucru este necesara crearea unei
structuri noi de baza de date.
Idea lui Codd pentru un RDBMS foloseste concepte matematice de algebra relationala
pentru a imparti datele in seturi si subseturi asociate.
Deoarece informatia poate fi grupata in seturi distincte, Dr. Codd a organizat sistemul
de baza de date folosind acest concept. In modelul relational, datele sunt separate in seturi
care se aseamana cu structura unui tabel. Aceasta structura este formata din elemente
individuale de date denumite coloane sau campuri. Un singur set de grupuri de campuri este
cunoscut sub numele de rand sau inregistrare. De exemplu, pentru a crea o baza de date
relationala formata din date despre angajati, se poate incepe de la un tabel denumit

3
ANGAJATI care contine urmatoarele informatii: nume, prenume si titlu. Acestea formeaza
campuri in tabelul ANGAJATI:

Cele cinci randuri sunt inregistrarile din tabel. Pentru a obtine o inregistrare specifica
din aceste tabel, de exemplu Administrator IT, un utilizator ar comanda sistemul de
management al bazei de date sa obtina inregistrarile unde campul titlu este egal cu
Administrator IT. Daca DBMS-ul ar fi fost instruit sa obtina toate campurile inregistrarii,
numele, prenumele si titlul ar fi returnate utilizatorului. Un exemplu de comanda SQL care
realizeaza aceasta interogare este:
SELECT * FROM ANGAJATI
Sintaxa exacta nu este importanta momentan si va fi detaliata mai tarziu.
Deoarece diferitele elemente de date pot fi grupate in functie de relatia dintre ele (cum
de exemplu este nume fata de titlu), modelul de baza de date relational ofera proiectantului de
baze de date un grad inalt de flexibilitate in a descrie relatia dintre elementele de date. Prin
conceptele matematice de imbinare si uniune, bazele de date relationale pot obtine rapid date
din seturi (tabele) diferite care sunt returnate utilizatorului sau programului ca o colectie
imbinata de date. Aceasta proprietate permite proiectantului sa stocheze seturi de informatie
in tabele separate pentru a reduce repetitiile. Aceaste functii vor fi detaliate in capitolul al
treilea.

1.3 Proiectarea structurii unei baze de date


Cea mai importanta decizie pentru un proiectant de baze de date, dupa ce au fost alese
platforma hardware si sistemul RDBMS, este structura tabelelor. Deciziile facute la aceasta
etapa a proiectarii pot afecta performanta si programarea mai tarziu in procesul de dezvoltare.
Procesul de separare a datelor in seturi unice si distincte se numeste normalizare.

1.3.1 Decorul actual al bazelor de date


Tehnologiile de calcul au create o schimbare permanenta in felul in care firmele
lucreaza in toata lumea. Informatia care candva era stocata in depozite pline de dulapuri de
acte poate fi acum accesata instantaneu.
Pe langa dezvoltarea modelului relational de baze de date, doua tehnologii au dus la
cresterea rapida a ceea ce acum numim sisteme de baze de date client/server. Prima tehnologie
importanta a fost PC-ul. Aplicatii ieftine si usor de folosit precum Lotus 1-2-3 si Word Perfect
permiteau angajatilor (si utilizatorilor de acasa) sa creeze documente si sa gestioneze datele
rapid si precis. Utilizatorii au devenit familiari cu procesul continuu de actualizare a
sistemelor deoarece rata de schimbare era foarte rapida, chiar cu pretul tot mai mic al
sistemelor mai avansate.

4
A doua tehnologie importanta a fost reteaua locala (LAN) si integrarea acesteia in
birouri in intreaga lume. Desi utilizatorii erau obisnuiti cu conexiuni de la terminale catre un
server principal, acum fisierele puteau fi stocate local si accesate de la orice calculator
conectat la retea.
In aceasta perioada de continua schimbare si avansare a aparut un nou tip de sistem
denumit dezvoltare client/server, deoarece procesarea era impartita intre calculatoarele
client si un server de baze de date. Acest nou gen de aplicatie a reprezentat o schimbare
radicala de la programarea de aplicatii bazata pe mainframe. Printre avantajele acestui tip de
arhitectura se numara:

Costuri de mentenanta reduse


Solicitarea redusa a retelei (procesarea are loc pe serverul de baze de
date sau pe calculatorul client)
Sisteme de operare multiple care pot lucra impreuna cat timp folosesc
un protocol de retea comun
Integritatea datelor imbunatatita datorita locatiei centralizate
Acest tip de dezvoltare a aplicatiilor necesita noi abilitati de programare. Programarea
interfetei de utilizator este facuta acum pentru interfete grafice, cum sunt MS Windows, IBM
OS/2, Apple Macintosh sau sistemul Unix X-Window. Folosind SQL si o conexiune de retea,
aplicatia poate interfata cu o baza de date aflata pe un server la distanta. Puterea de procesare
sporita a hardware-ului calculatorului personal permite stocarea informatiilor critice de baze
de date pe un server relativ ieftin. In plus, acest server poate fi schimbat mai tarziu cu foarte
putine modificari la aplicatiile client.

1.4 Un limbaj hibrid intre produse


Conceptele de baza introduse aici pot fi aplicate in diverse medii. De exemplu,
aplicatia Microsoft Access care ruleaza pe un sistem de operare Windows cu un singur
utilizator, sau un server SQL cu 100 de conexiuni. Unul din cele mai mari beneficii a
limbajului SQL il constituie faptul ca este un limbaj hibrid intre platforme si produse.

1.4.1 Implementari initiale


Oracle Corporation a introdus primul RDBMS comercial care folosea limbajul SQL.
Desi versiunile originale erau dezvoltate pentru sisteme VAX/VMS, Oracle a fost printre
primii care ofereau o versiunea DOS a sistemului lor RDBMS. In anii 80 Sybase a lansat
sistemul lor RDBMS, SQL Server. Cu librarii de client pentru acces la baze de date, suport
pentru proceduri stocate si interoperabilitatea cu diferite retele, SQL Server a devenit un
produs de succes, in special in medii client/server. Una din calitatile cele mai importante ale
acestor sisteme este scalabilitatea lor intre platforme. Limbajul de programare C, combinat cu
SQL, folosit pentru Oracle pentru PC este identic cu cel folosit pe un sistem VAX.

1.4.2 Limbajul SQL si dezvoltarea aplicatiilor client/server


Folosirea procesarii client/server a limbajului SQL si a bazelor de date relationale este
uzuala in dezvoltarea aplicatiilor client/server. De asemenea, folosirea acestei tehnologii intr-o
aplicatie business pentru un utilizator permite dezvoltarea in viitor a aplicatiei.

5
1.5 Prezentare generala a limbajului SQL
Limbajul SQL este limbajul considerat standard pentru manipularea si recuperarea
datelor din bazele de date relationale. SQL permite unui utilizator sau administrator de baze
de date sa faca urmatoarele lucruri:

Modificarea structurii unei baze de date


Schimbarea setarilor de securitate la nivel de sistem
Adaugarea drepturilor de utilizator la baze de date sau tabele
Interogarea unei baze de date pentru informatii
Actualizarea continutului unei baze de date
Cea mai utilizata declaratie in SQL este declaratia SELECT, care recupereaza datele
din baza de date si le returneaza la utilizator. Exemplul tabelului ANGAJATI ilustreaza un
exemplu tipic de folosirea a declaratiei SELECT. De asemenea, limbajul SQL ofera declaratii
pentru crearea de baze de date noi, tabele, campuri si indecsi, precum si declaratii pentru
inserarea si stergerea inregistrarilor. ANSI SQL recomanda un grup principal de functii pentru
manipularea datelor. Multe sisteme de baze de date au si unelte pentru asigurarea integritatii
datelor si impunerea securitatii care permit programatorilor sa opreasca executarea unui grup
de comenzi daca exista o anumita conditie.

1.6 Implementari SQL uzuale


Aceasta sectiune introduce cateva implementari uzuale ale limbajului SQL, fiecare cu
avantajele si dezavantajele sale. In unele cazuri aceste implementari au fost dezvoltate pentru
PC si interactivitate usoara cu utilizatorul, iar altele au fost dezvoltate sa cuprinda baze de
date foarte mari (VLDB).

1.6.1 Microsoft Access


Este folosita aplicatia Microsoft Access, un DBMS pentru PC-uri, pentru a ilustra
cateva din exemplele oferite. Access e foarte usor de folosit, putand fi folosite uneltele GUI
sau introduse declaratiile SQL manual.

1.6.2 Personal Oracle7


Este folosit Personal Oracle7, ce reprezinta mediul corporativ al bazelor de date,
pentru a demonstra limbajul SQL linie de comanda si tehnicile de gestionare a bazelor de
date.
Majoritatea exemplelor sunt directionate catre un programator incepator sau fara
experienta in SQL. Vom incepe cu cele mai simple declaratii SQL si vom avansa la
gestionarea tranzactiilor si programarea procedurilor stocate. Sistemul RDBMS Oracle este
distribuit cu numeroase unelte de dezvoltare. Acesta include librarii C++ si Visual Basic care
pot conecta o aplicatie catre o baza de date Oracle. De asemenea sunt incluse unelte grafice
pentru administrarea de obiecte, utilizatori si baze de date, precum si utilitarul SQL*Loader
pentru importul si exportul datelor in Oracle.

1.6.3 Microsoft Query


Microsoft Query este o unealta de interogare utila care provine din uneltele de
dezvoltare ale sistemului de operare Windows, Visual C++ si Visual Basic. Aceasta foloseste
standardul ODBC pentru a comunica cu bazele de date. Microsoft Query transmite declaratiile
SQL unui driver, care le proceseaza inainte de a le transmite mai departe unui sistem de baze
de date.

6
1.6 Libraria Open Database Connectivity (ODBC)
ODBC este o librarie functionala proiectata pentru a oferi sistemelor de baze de date o
interfata de programare a aplicatiilor (API) comuna. Aceasta comunica cu baza de date printr-
un driver de librarii, in acelasi mod in care un sistem de operare comunica cu o imprimanta
printr-un driver de imprimanta. In functie de tipul de baze de date folosit, un driver de retea
poate fi necesar pentru conectarea la o baza de date la distanta.
Calitatea aparte a ODBC (fata de librariile Oracle sau Sybase) este aceea ca nici una
din functiile sale nu sunt specifice unui firme de baze de date. De exemplu, acelasi cod poate
fi folosit pentru a executa interogari unui tabel Microsoft Access sau unei baze de date
Informix cu foarte putine modificari. Este necesar de mentionat ca multe firme adauga
extensii particulare standardului SQL, cum ar fi extensia Transact-SQL sau PL/SQL.
ODBC a fost dezvoltat intr-un standard adoptat de multe produse, inclusiv Visual
Basic, Visual C++, FoxPro, Borland Delphi si PowerBuilder. Trebuie de asemenea considerata
utilizarea standardului ODBC care ofera proiectarea codului fara a avea in minte o baza de
data specifica, in favoarea vitezei oferite de librariile functionale specifice.

1.7 Limbajul SQL in programarea aplicatiilor


Initial, limbajul SQL a fost facut standard ANSI in 1986. Standardul ANSI din 1989
(SQL-89) defineste trei tipuri de interfatare cu SQL intr-o aplicatie:
Limbaj de modul: Foloseste proceduri in programe. Aceste proceduri
pot fi chemate de aplicatie si pot returna valori programului prin
transmiterea de parametri
SQL incorporat: Foloseste declaratii SQL incorporate in codul
programului respectiv. Aceasta metoda necesita de obicei folosirea unui
precompilator pentru a procesa declaratiile SQL. Standardul defineste
declaratii pentru Pascal, FORTRAN, COBOL si PL/1
Invocare directa: Lasata la alegerea programatorului.
Inaintea evolutiei conceptului de limbaj SQL dinamic, SQL-ul incorporat era cea mai
folosita metoda pentru utilizarea limbajului SQL intr-un program. SQL-ul incorporat foloseste
SQL static, adica declaratia SQL este compilata in aplicatie si nu poate fi schimbata in timpul
executiei. Principiul este asemenator unui compilator fata de un interpretor. Acest tip de SQL
are performante bune, insa duce lipsa de flexibilitate, si nu poate face fata oricand nevoilor
mediilor de afaceri actuale.
Standardul ANSI din 1992 (SQL-92) a extins limbajul si a devenit un standard
international. Acesta a definit trei nivele de conformitate: incepator, intermediar si complet.
Printre noile atribute se numarau urmatoarele:

Conexiunile la baze de date


Cursoarele derulante
SQL dinamic
Imbinari externe
Limbajul SQL dinamic permite pregatirea declaratiei SQL la executarea programului.
Desi performantele nu sunt la fel de ridicate, acesta permite dezvoltatorului si utilizatorului un
grad inalt de flexibilitate. Un exemplu de SQL dinamic il constituie interfetele la nivel de
apel, precum ODBC sau Sybase DB-Library.

7
Capitolul II: Introducere in interogari: Declaratii

Termenul de interogare in limbajul SQL este impropriu folosit in acest context,


deoarece acesta nu presupune neaparat o intrebare adresata bazei de date. Poate fi o comanda
care sa realizeze unul din urmatoarele lucruri:

Crearea sau stergerea unui tabel


Inserarea, modificarea sau stergerea randurilor sau a campurilor
Cautarea in mai mult tabele pentru o informatie specifica si returnarea
rezultatelor intr-o anumita ordine
Modificarea informatiilor de securitate

2.1 Reguli generale de sintaxa


Sintaxa in limbajul SQL este destul de flexibila, insa sunt anumite reguli care trebuiesc
respectate ca in orice limbaj de programare. O interogare simpla ilustreaza sintaxa de baza a
unei declaratie de selectare a datelor.
SELECT NUME, PRENUME, TITLU
FROM ANGAJATI
WHERE NUME = 'Popa';
In acest exemplu, sintaxa este scrisa cu majuscule, dar acest lucru nu este obligatoriu.
Interogarea ar functiona identic daca ar fi scrisa astfel:
select nume, prenume, titlu
from angajati
where nume = 'Popa';
Se observa faptul ca Popa este scris cu majuscula in ambele exemple. Desi folosirea
majusculelor este optionala in declaratiile SQL, referintele catre date tin cont de acest lucru.
Astfel, daca s-ar executa o interogarea cautand popa in coloana nume, nu s-ar returna nici un
rezultat.
Spatierea este o alta caracteristica optionala, urmatorul cod avand acelasi rezultat:
select nume, prenume, titlu from angajati where nume =
'Popa';
Totusi, spatierea si folosirea majusculelor sunt preferate datorita usurintei cu care pot
fi citite declaratiile. De asemenea, acestea pot fi mai usor de intretinut intr-un proiect.
O alta caracteristica importanta pe care o putem observa este punctuatia la sfarsitul
interogarii, folosind punct si virgula. Acest lucru semnifica sfarsitul interogarii.
Elementele cele mai importante din interogare sunt cuvintele cheie, cuvinte rezervate
ca fiind parte din sintaxa limbajului SQL. Acestea pot fi obligatorii sau optionale, in functie
de declaratia SQL. In acest exemplu, cuvintele cheie sunt:

8
SELECT
FROM
WHERE

2.1.1 Elementele de baza in recuperarea datelor: SELECT si FROM


Cuvintele SELECT si FROM sunt folosite mai mult decat orice altele din vocabularul
limbajului SQL, si sunt indispensabile in recuperarea datelor.
SINTAXA:
SELECT <nume coloane>
Declaratia este foarte simpla, insa ea nu functioneaza de una singura. Daca incercam
sa executam o interogare folosind doar SELECT, vom primi urmatorul raspuns:
Exemplul 2.1:

Mesajul de eroare ne atentioneaza de lipsa unui element. Acesta este clauza FROM:
SINTAXA:
FROM <nume tabel>

2.2 Exemple
Baza exemplelor o constituie schema TELECOM_1. Aceasta ilustreaza functiile de
baza a declaratiilor SELECT si FROM si se foloseste de unul din tabelele bazei de date,
tabelul ANGAJATI, pentru a recupera informatii despre clientii unei firme de telecomunicatii.

9
2.3 Prima interogare
Exemplul 2.2:

Datele de iesire arata la fel ca codul din exemplu. In genera, conventia de aliniere a
rezultatelor returnate este aceea prin care tipurile de date numerice sunt aliniate la dreapta iar
tipurile de date cu caractere sunt aliniate la stanga.
Asteriscul instructioneaza baza de date sa returneze toata coloanele asociate cu tabelul
dat in clauza FROM. Baza de date determina ordinea in care va returna coloanele.

2.3.1 Intreruperea unei declaratii SQL


In unele implementari ale limbajului SQL, folosirea semnului de punctuatie punct si
virgula semnifica sfarsitul scrierii interogarii. Altele nu folosesc acest semn, interogarea fiind
executata la apasarea unui buton.

2.3.2 Schimbarea ordinii coloanelor


In exemplul precedent s-a folosit * pentru a selecta toate coloanele dintr-un tabel,
ordinea lor fiind determinata de baza de date. Pentru a specifica o anumita ordine a
coloanelor, se poate introduce urmatoarea interogare:
Exemplul 2.3:

10
Se poate observa ca toate numele coloanelor apar in clauza SELECT. Ordinea in care
ele sunt listate este aceeasi cu care vor fi returnate in datele de iesire. Pentru a le separa se
foloseste virgula, iar la sfarsitul insiruirii lor se lasa un spatiu intre ultimul nume de coloana si
clauza care urmeaza (in acest caz, FROM). Datele de iesire sunt urmatoarele:
Un alt mod de a scrie aceeasi declaratie este:
Exemplul 2.4:

Se poate observa ca clauza FROM a fost mutata pe o linie noua. Aceasta conventie
este optionala. Datele de iesire sunt identice deoarece numai formatul declaratiei a fost
schimbat. Acum ca am stabilit ordinea coloanelor, putem specifica care din ele vrem sa
vizualizam.

2.3.3 Selectarea coloanelor individuale


Intr-un exemplu anterior, am folosit asteriscul (*) pentru a vedea toata informatia
existenta, dar acum putem sa selectam numai coloanele nume si locatie:
Exemplul 2.5:

11
Acum avem numai coloanele care dorim sa le vizualizam. Se observa scrierea o parte a
declaratiei cu majuscule si cealalta parte cu litere mici. Rezultatul nu a fost afectat de acest
lucru.

2.3.4 Selectarea unui tabel diferit


Sa presupunem ca avem un tabel denumit ABONAMENTE cu aceasta structura:

Pentru a selecta date din acest tabel trebuie sa modificam clauza FROM cu numele
acestui tabel:
Exemplul 2.6:

Cu o simpla schimbare in declaratie avem o noua sursa de date la dispozitie.

2.4 Interogari cu distinctii


Daca ne uitam la tabelul original, ABONATI, observam ca anumite date se repeta, cum
ar fi orasul abonatului:

12
Exemplul 2.7:

In acest caz, valoarea Bucuresti se repeta. Daca dorim sa vizualizam cate campuri
diferite sunt in aceasta coloana, putem folosi urmatoarea interogare:
Exemplul 2.8:

Observam ca numai 5 randuri sunt selectate. Din cauza specificatorului DISTINCT,


numai un caz din datele duplicat este returnat, deci rezultatul are un rand mai putin. ALL este
un cuvant cheie care este implicit cand folosim instructiunea SELECT simpla. In general nu
vedem folosirea acestui specificator deoarece SELECT <nume tabel> si SELECT ALL <nume
tabel> au acelasi rezultat.

13
Exemplul 2.9:

14
Capitolul III: Expresii, conditii si operatori

3.1 Expresii
Definitia unei expresii este simpla: O expresie returneaza o valoare. Sunt foarte multe
tipuri de expresii, cuprinzand tipuri de date diferite cum ar fi tipul numeric, siruri si tipul
boolean. De fapt, aproape tot ce urmeaza unei clauze (cum ar fi SELECT sau FROM) este o
expresie. In urmatorul exemplu, pret_nou este o expresie care returneaza o valoare
continuta in coloana pret_nou.
SELECT pret_nou FROM abonamente;
In urmatoarea declaratie, NUME, PRENUME, DATA_ABONARII si
ANGAJATI sunt expresii:
SELECT NUME, PRENUME, DATA_ABONARII
FROM ABONATI;
Daca ne uitam la urmatoarea expresie:
WHERE NUME = 'Popescu'
observam ca aceasta contine o conditie, NUME = ' Popescu', care este un exemplu de
expresie de tip boolean. Aceasta va fi fie adevarata (TRUE) sau falsa (FALSE), in functie de
conditia =.

3.2 Conditii
Daca dorim sa gasim un anumit element sau grup de elemente in baza de date, avem
nevoie de una sau mai multe conditii. Acestea sunt continute in clauza WHERE. In exemplul
anterior, conditia a fost
NUME = 'Popescu'
Pentru a gasi preturile mai mare de 1000 de euro al echipamentelor, conditia ar fi
PRET > 1000
Conditiile ne permit sa facem interogari selective. In general, ele contin o variabila, o
constanta si un operator de comparatie. In primul exemplu variabila este NUME, constanta
este Popescu si operatorul de comparatie este =. In al doilea exemplu, variabila este PRET,
constanta este 1000 iar operatorul de comparatie este >. Pentru a realiza interogari
conditionale, trebuie studiata clauza WHERE si operatorii.

3.2.1 Clauza WHERE


Sintaxa clauzei WHERE este:
SINTAXA:
WHERE <conditie de cautare>

15
Clauzele SELECT, FROM si WHERE sunt cele mai folosite in limbajul SQL. Clauza
WHERE permite interogarilor sa fie mai selective. Fara aceasta, orice interogare ar returna
toate inregistrarile din tabel(urile) selectate. Exemplul urmator listeaza toate inregistrarile din
tabelul ABONATI:
Exemplul 3.1:

Daca dorim sa selectam numai un anume abonat, putem folosi:


Exemplul 3.2:

Acest exemplu arata cum putem pune o conditia asupra datelor care vrem sa le
recuperam.

16
3.3 Operatori
Operatorii sunt elementele care se folosesc in interiorul unei expresii pentru a
instructiona conditiile specificate sa returneze datele intr-un anumit fel. Ei sunt impartiti in
sase categorii: aritmetici, de comparatie, de caracter, logici, de set si diversi.

3.3.1 Operatori aritmetici


Operatorii aritmetici sunt plus (+), minus (-), impartit (/), inmultit (*) si modulo (%).
Primele patru sunt cunoscute. Operatorul modulo returneaza restul intreg al unei operatii de
impartire. De exemplu
5%2=1
6%2=0
Operatorul modulo nu lucreaza cu tipuri de date care contin zecimale, cum ar fi tipul
de numere reale.
Daca folosim acesti operatori aritmetici fara paranteze, ei sunt folositi in urmatoarea
ordine: inmultire, impartire, modulo, adunare si scadere.
De exemplu, expresia 2 * 6 + 9 / 3
este egala cu 12 + 3 = 15
Insa, expresia 2 * (6 + 9) / 3
este egala cu 2 * 15 / 3 = 10
Plus (+)
Putem folosi semnul plus in mai multe feluri. Folosim urmatoarea declaratie pentru a
afisa tabelul ABONAMENTE:
Exemplul 3.3:

17
Acum, daca folosim:
Exemplul 3.4:

obtinem un pret nou prin utilizarea operatorului +.


Coloana pret_nou+0.5 nu exista in tabelul original. Limbajul SQL ne permite sa
cream coloane virtuale sau derivate prin combinarea sau modificarea coloanelor existente.
Daca rescriem declaratia originala:
Exemplul 3.5:

Rezultatul ne confirma faptul ca datele originale nu au fost schimbate, iar coloana cu


numele pret_nou+0.5 nu este permanenta. Numele ei poate fi schimbat astfel:

18
Exemplul 3.6:

Astfel am reusit sa cream o coloana cu un nume ales. Putem redenumi oricare coloana
folosind sintaxa nume_coloana alias_coloana, cu un spatiu intre cele doua nume.
De exemplu, urmatoarea interogare redenumeste coloanele astfel:
Exemplul 3.7:

Pana acum, am folosit semnul plus in doua situatii: calcularea unor date si afisarea lor,
si folosirea semnului in clauza WHERE. Folosirea operatorilor in aceasta clauza ne ofera mai
multa flexibilitate cand specificam conditii pentru recuperarea datelor.
Minus (-)
Acest operator are de asemenea doua utilizari. Prima este schimbarea semnului unui
numar. De exemplu, putem schimba datele astfel:

19
Exemplul 3.8:

A doua utilizare este operatia de scadere a doua coloane:


Exemplul 3.9:

Observam folosirea aliasului pentru afisarea unei noi coloane cu diferenta intre cele
doua preturi.
Daca folosim accidental semnul minus intr-un camp de caractere, rezultatul va fi
urmatorul:

20
Exemplul 3.10:

Mesajul de eroare poate fi diferit in functie de implementare, dar rezultatul este


acelasi.
Impartire (/)
Operatorul de impartire are o singura functie, cea evidenta. Folosind tabelul
ECHIPAMENTE, introducem urmatoarea interogare:
Exemplul 3.11:

21
Putem observa efectul injumatatirii unui pret astfel:
Exemplul 3.12:

Inmultire (*)
Operatorul de inmultire este de asemenea simplu de utilizat. Folosind acelasi tabel,
introducem:
Exemplul 3.13:

22
Schimbam interogarea pentru a realiza un discount de 20%:
Exemplul 3.14:

Modulo (MOD)
Operatorul modulo returneaza restul intreg al operatiei de impartire. In cazul tabelului
BANDA, introducem:
Exemplul 3.15:

Acum putem crea o coloana noua cu restul de banda disponibila pentru fiecare situatie:

23
Exemplul 3.16:

Unele implementari ale limbajului SQL folosesc modulo ca un simbol %.


Urmatoarea declaratie ar furniza aceleasi rezultate:
SELECT banda_disponibila, numar_abonati,
banda_disponibila % numar_abonati rest_banda
FROM banda;
Prioritatea operatorilor
Aceasta sectiune examineaza folosirea prioritatilor intr-o declaratie SELECT. Folosind
baza de date PRIORITATI, introducem:
Exemplul 3.17:

24
Folosim urmatoarea declaratie pentru a testa prioritatea operatorilor:
Exemplul 3.18:

Se poate observa ca prima si ultima coloana sunt identice. Daca am adauga inca o
coloana denumita ABON1 + ABON2 * (ABON3 / ABON4), valorile acesteia ar fi de
asemenea aceleasi.

3.3.2 Operatori de comparatie


Dupa numele lor, operatorii de comparatie compara expresiile si returneaza una din
cele trei valori : TRUE, FALSE sau Unknown (Necunoscut).
Pentru a intelege situatia returnarii valorii Unknown, trebuie sa examinam conceptul
de NULL. In bazele de date, NULL reprezinta absensta datelor intr-un camp. Acest lucru nu
inseamna ca are campul valoarea zero sau un spatiu. Daca realizam o comparatie cum ar fi
Camp = 9 iar singura valoare pentru Camp este NULL, rezultatul comparatiei va fi Unknown.
Deoarece acest rezultat este ambiguu, multe implementari ale limbajului SQL au schimbat
rezultatul Unknown in FALSE si ofera un operator special, denumit IS NULL pentru a testa
un camp pentru aceasta conditie.
Un exemplu de NULL este urmatorul. Presupunem ca o inregistrare in tabelul
ECHIPAMENTE nu contine nici o valoare pentru PRET_EUR; rezultatul interogarii va fi
urmatorul:

25
Exemplul 3.19:

Observam ca nu apare nimic in campul inregistrarii Interfata ISDN AT-AR020


pentru coloana pret_eur. NULL este evident in acest caz deoarece se afla intr-o coloana
numerica. Insa, daca NULL ar aparea in coloana cu nume, ar fi mai greu de diferentiat. pentru
a depista o valoare NULL putem folosi urmatoarea interogare:
Exemplul 3.20:

Interfata ISDN AT-AR020 este singura inregistrare a carei valoare pentru pret_eur
este NULL sau nu contine nici o valoare. Daca incercam sa folosim semnul de comparatie
=, obtinem:

26
Exemplul 3.21:

Nu au fost returnate inregistrari deoarece comparatia pret_eur = NULL returneaza


FALSE, deci rezultatul este necunoscut. In acest caz, putem folosi argumentul IS NULL in loc
de =, modificand declaratia WHERE in WHERE pret_eur IS NULL. Astfel vom obtine
toate randurile unde exista NULL.
Acest exemplu ilustreaza de asemenea atat cel mai folosit operator de comparatie,
semnul egal, cat si mediul in care sunt folositi toti operatorii de comparatie, clauza WHERE.
Egal (=)
In clauza WHERE, semnul egal este cel mai utilizat operator de comparatie. Folosit de
unul singur, acesta reprezinta un mod simplu de a selecta o valoare dintr-un set de mai multe
valori:
Exemplul 3.22:

Putem sa incercam sa folosim semnul egal pentru a gasi randul inregistrarii cu tipul de
abonament Business:

27
Exemplul 3.23:

Am obtinut rezultatul dorit. Pot fi returnate mai multe randuri daca folosim de
exemplu:
Exemplul 3.24:

Pentru a observa importanta scrierii datelor in declaratie cu sau fara majuscule (in
functie de cum au fost introduse in baza de date initial), putem folosi urmatorul exemplu:
Exemplul 3.25:

Majoritatea companiilor prefera sa stocheze datele cu majuscule pentru a pastra


concordanta datelor. De aceea este de preferat sa introducem datele fie numai cu majuscule fie
cu litere mici. Altfel pot fi intampinate dificultati in recuperarea datelor.

28
Mai mare (>) si mai mare sau egal (>=)
Operatorul mai mare (>) functioneaza astfel:
Exemplul 3.26:

Acest exemplu returneaza toate abonamentele cu pret mai mare de 15. Pentru a include
si valoarea 15, folosim:
Exemplul 3.27:

Acelasi rezultate poate fi obtinut cu declaratia pret_nou > 14. De observat este si ca nu
sunt folosite ghilimele in jurul valorii 15, deoarece acesta este un camp cu valoare numerica,
si nu necesita ghilimele.
Mai mic (<) si mai mic sau egal (<=)
Acesti operatori functioneaza dupa acelasi principiu ca si > si >= :

29
Exemplul 3.28:

In acest exemplu am folosit operatorul < pe un camp cu caractere. Acesti operatori pot
fi folositi cu orice tipuri de date, iar rezultatele variaza in functie de tipul de date folosit. Daca
folosim litere mici, obtinem:
Exemplul 3.29:

In general, valorile cu majuscule sunt sortate inaintea celor cu litere mici. Astfel,
valorile returnate, incepand cu majuscule, sunt mai mici decat extra. Pentru a include si
valoarea extra in cautarea originala, folosim:
Exemplul 3.30:

30
Inegalitati (< > sau !=)
Cand este nevoie sa gasim toate inregistrarile in afara de cateva, folosim simbolul de
inegalitate, care poate fi fie < > fie !=, in functie de modul de implementare al limbajului
SQL. De exemplu, pentru a gasi toate valorile garantarii de banda diferite de 0, scriem:
Exemplul 3.31:

Exemplul 3.32:

3.3.3 Operatori de caractere


Acesti operatori pot fi folositi pentru a manipula felul in care sirurile de caractere sunt
reprezentate, atat in datele de iesire cat si in adaugarea conditiilor.

LIKE
Acest operator este folosit pentru a selecta o anumita parte din baza de date care
corespunde unui anumit tipar, dar nu se potriveste exact pentru a folosi operatorul = (acesta
poate fi folosit dar ar dura foarte mult pentru a trece prin toate cazurile acelui tipar).
Daca dorim sa gasim numai abonamentele Business aflate in tabel, observam ca sunt
doua rezultate ale caror valoare a coloanei denumire este putin diferita. Aici putem folosi
semnul procentual %

31
Exemplul 3.33:

Observam folosirea semnului procentual % in declaratie dupa expresia LIKE. Aici,


acest semn este un caracter special, care inlocuieste orice caracter sau sir de caractere. Il
putem folosi si astfel:
Exemplul 3.34:

Aici obtinem doar valorile care se termina cu Business. Putem sa testam daca
folosirea majusculelor sau a literelor mici are importanta:
Exemplul 3.35:

32
Exemplul 3.36:

Observam ca referintele catre date fac aceasta diferentiere intre majuscule si litere
mari.
Pentru a recupera date care au o anumita valoare cu exceptia unui singur caracter,
folosim caracterul special linie jos (underscore) in tabelul cu echipamente putin modificat:
Exemplul 3.37:

Pentru a obtine toate echipamentele ale caror abrevieri incep cu litera S, introducem:
Exemplul 3.38:

Putem folosi mai multe caractere speciale intr-o singura declaratie:

33
Exemplul 3.39:

Cele doua tipuri de caractere speciale pot fi folosite impreuna. Urmatorul exemplu
returneaza toate inregistrarile care au litera t ca fiind al treilea caracter din nume:
Exemplul 3.40:

Concatenarea (||)
Acest simbol concateneaza doua siruri. Vom folosi in continuare tabelul de
ANGAJATI:
Exemplul 3.41:

34
Exemplul 3.42:

Observam ca simbolul || este folosit in loc de +. Daca folosim + pentru a concatena


sirurile, programul returneaza urmatoarea eroare:
Exemplul 3.43:

Intalnim aceasta eroare deoarece semnul + este folosit numai pentru valori numerice,
insa acest fapt poate fi diferit la fiecare implementare a limbajului SQL.
Pentru un a fi mai usor de citit, inseram o virgula intre nume si prenume astfel:
Exemplul 3.44:

35
3.3.4 Operatori logici
Acest tip de operatori separa doua sa mai multe conditii in clauza WHERE.
Presupunem ca avem acelasi tabel de angajati. Sa presupunem ca fiecare angajat are
12 zile de vacanta in fiecare an. Vom incerca sa gasim toti angajatii ale caror prenume incep
cu litera B si au mai mult de 30 de zile de vacanta nefolosite:
Exemplul 3.45:

Clauza SELECT (primele doua linii) foloseste operatori aritmetici sa determine cate
zile de vacanta mai are fiecare angajat. Pe linia a patra folosim expresia LIKE cu caracterul
special % pentru a gasi toate prenumele care incep cu litera I. Pe linia a sasea folosim
operatorul mai mare pentru a gasi toate rezultatele mai mari decat 30.
Elementul nou introdus se afla pe linia 5.
AND (SI)
AND presupun ca expresiile de pe ambele parti trebuie sa fie adevarate pentru a fi
returnat TRUE. Daca oricare expresie este falsa, operatorul AND returneaza FALSE. De
exemplu, putem gasi toti angajatii care lucreaza in companie de 3 ani sau mai putin si si-au
luat mai mult de 10 de zile de vacanta:
Exemplul 3.46:

36
Daca vrem sa aflam care angajati lucreaza in companie de macar 5 ani si si-au luat mai
mult de 50 la suta din numarul total de zile de vacanta, introducem:
Exemplul 3.47:

OR (SAU)
Putem folosi operatorul OR pentru a insuma mai multe conditii. Daca oricare din
conditii este adevarata, operatorul returneaza TRUE. Pentru a demonstra diferenta, folosim
aceeasi declaratie de mai inainte inlocuind doar operatorul logic:
Exemplul 3.48:

Numele original a ramas in lista, dar avem in plus o inregistrare. Acest nume nou a
fost adaugate in lista de rezultate deoarece a satisfacut macar o conditie.
NOT (negatie)
Daca conditia aplicata operatorului NOT este TRUE, rezultatul va fi FALSE, iar daca
conditia este FALSE, rezultatul va fi TRUE. De exemplu, folosim SELECT pentru a returna
doar numele care nu incep cu litera B:

37
Exemplul 3.49:

Operatorul NOT poate fi folosit si cu operatorul IS cu conditia NULL:


Exemplul 3.50:

Pentru a gasi elementele care nu returneaza NULL:

38
Exemplul 3.51:

3.3.5 Operatori de set


UNION (uniune) si UNION ALL
Operatorul UNION returneaza rezultatele a doua interogari cu exceptia randurilor
duplicate. Presupunem urmatoarele doua tabele de furnizori:
Exemplul 3.52:

39
Exemplul 3.53:

Cati furnizori sunt in total:


Exemplul 3.54:

Operatorul UNION returneaza 8 nume distincte din cele doua liste. Daca dorim sa
afisam si rezultatele duplicate, introducem:

40
Exemplul 3.55:

Lista combinata are 10 nume. Operatorul UNION ALL functioneaza la fel ca


operatorul UNION cu diferenta ca primul nu elimina randurile duplicate.
INTERSECT (intersectie)
Operatorul INTERSECT returneaza numai randurile comune ambelor interogari.
Folosind tabelele de mai sus, pentru a gasi lista de furnizori pentru ambele categorii de
produse, folosim:
Exemplul 3.56:

In acest exemplu, operatorul INTERSECT combina rezultatele celor doua declaratii


pentru a gasi numele comune.

41
MINUS (diferenta)
Operatorul MINUS returneaza randurile din prima interogare care nu se afla in cea de-
a doua interogare. De exemplu:
Exemplul 3.57:

Aceasta interogare returneaza numele furnizorilor hardware care nu sunt si furnizori


software. Putem sa inversam pozitia declaratiilor pentru a obtine numele furnizorilor software
care nu sunt furnizori hardware:
Exemplul 3.58:

42
3.3.6 Operatori diversi: IN (in) si BETWEEN (intre)
Acesti doi operatori ofera un mod mai simplu de scriere a unor declaratii. De exemplu,
pentru a gasit abonati aflati in Bucuresti, Cluj si Timisoara:
Exemplul 3.59:

Sau putem folosi operatorul IN astfel:


Exemplul 3.60:

Al doilea exemplu este mai scurt si mai usor de citit. Operatorul IN poate utiliza si
valori numerice.
Daca avem nevoie de o lista de abonamente cu preturile intr-o anumita gama de valori,
introducem:

43
Exemplul 3.61:

Acelasi rezultat il putem obtine folosind operatorul BETWEEN:


Exemplul 3.62:

Observam din nou ca ultimul exemplu este mai usor de inteles, si reprezinta o solutie
mai simpla. Operatorul BETWEEN include si valorile de la marginea gamei, similar cu
operatorii >= si <=.

44
Exercitiu propus

Se considera urmatoarele doua tabele:

Tabelul de abonati pentru persoane fizice (ABONATI_PF):

Tabelul de abonati pentru firme (ABONATI_FIRME):

45
Se dau urmatoarele cerinte:

a) cu ajutorul instructiunii SELECT si FROM, sa se afiseze toate datele din


tabelul de persoane fizice
b) folosind cuvantul cheie DISTINCT, sa se afiseze care sunt tipurile de
abonament folosite in tabelul de persoane fizice
c) folosind clauza WHERE, sa se afiseze toti abonatii din tabelul de persoane
fizice aflati in sectorul 4
d) folosind clauza WHERE si operatorii aritmetici, sa se afiseze numele firmelor
din tabelul de firme care au abonamente mai mari sau egale cu 100 de ron, iar
in cazul acestora se va face un discount de 10%
e) folosind clauza WHERE si operatorii de caractere sa se afiseze o singura
coloana cu numele si prenumele abonatilor, separate prin spatiu, din tabelul de
firme, al caror nume incep cu litera D
f) folosind clauza WHERE, operatorii logici si cei diversi, sa se afiseze numele
firmelor din sectorul 4 care au valoarea abonamentului intre 0 si 100 ron
g) folosind clauza WHERE si operatorii de set, sa se afiseze care din abonatii din
tabelul de persoane fizice sunt si persoane de contact la firme abonate

Rezolvarea cerintelor:

a) SELECT * FROM abonati_pf;

b) SELECT DISTINCT tip_abonament FROM abonati_pf;

46
c) SELECT * FROM abonati_pf WHERE sector = 4;

d) SELECT nume_firma, valoare_abonament, valoare_abonament * 0.9


valoare_abonament_nou
FROM abonati_firme WHERE valoare_abonament >= 100;

e) SELECT nume || ' ' || prenume nume_intreg


FROM abonati_firme WHERE nume LIKE 'D%';
47
f) SELECT * FROM abonati_firme WHERE sector = 4
AND valoare_abonament BETWEEN 0 AND 100;

g) SELECT nume, prenume FROM abonati_pf


INTERSECT
SELECT nume, prenume FROM abonati_firme;

48

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