Documente Academic
Documente Profesional
Documente Cultură
Lucrarea 1
Introducere n SQL. Instruciunea SELECT.
Expresii, condiii i operatori.
0
Cuprins
3.1 Expresii.................................................................................................................................15
3.2 Conditii.................................................................................................................................15
3.3 Operatori..............................................................................................................................17
Exercitiu propus 45
1
Capitolul I: Introducere in SQL
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.
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:
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:
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.
7
Capitolul II: Introducere in interogari: Declaratii
8
SELECT
FROM
WHERE
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.
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.
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.
Pentru a selecta date din acest tabel trebuie sa modificam clauza FROM cu numele
acestui tabel:
Exemplul 2.6:
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:
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.
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:
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.
17
Acum, daca folosim:
Exemplul 3.4:
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:
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:
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:
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.
25
Exemplul 3.19:
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:
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:
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:
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:
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:
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:
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:
38
Exemplul 3.51:
39
Exemplul 3.53:
Operatorul UNION returneaza 8 nume distincte din cele doua liste. Daca dorim sa
afisam si rezultatele duplicate, introducem:
40
Exemplul 3.55:
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:
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:
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:
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
45
Se dau urmatoarele cerinte:
Rezolvarea cerintelor:
46
c) SELECT * FROM abonati_pf WHERE sector = 4;
48