You are on page 1of 20

BAZE DE DATE

Curs 5

SQL

M. Danubianu - Baze de date 1


LIMBAJUL SQL - Obiective şi caracteristici
- crearea bazelor de date şi a structurilor pentru relaţii;
- efectuarea de operaţii elementare de gestiune a datelor, precum
inserarea, modificarea şi ştergerea acestora din cadrul relaţiilor;
- efectuarea interogărilor începând cu cele simple până la cele complexe, în
scopul transformării datelor brute în informaţii.
- operaţiile se realizează cu un efort minim din partea utilizatorului,
- structura comenzilor şi sintaxa acestora este relativ uşor de învăţat.
 limbajul este portabil, - respectă un standard recunoscut astfel încât să se
poată utiliza aceeaşi structură şi sintaxă a comenzilor la trecerea de la un
SGBD la altul
 SQL prezintă două componente principale:
- un limbaj de definire a datelor (DDL) utilizat pentru definirea

structurii bazei de date şi


- un limbaj de manipulare a datelor (DML) pentru regăsirea şi

reactualizarea datelor.

M. Danubianu - Baze de date 2


 standardul SQL nu conţine comenzi de control (nu există
instrucţiuni de tipul IF..THEN..ELSE, GO TO,
DO..WHILE sau alte comenzi care să genereze un flux de
control) ⇒ poate fi utilizat în două moduri:
- interactiv prin introducerea instrucţiunilor de la un

terminal;
- prin integrarea instrucţiunilor SQL într-un limbaj

procedural.
 Are următoarele caracteristici:
- limbaj neprocedural.

- are un format liber;

- comenzile sunt structurate pe baza unor cuvinte

standard din limba engleză ( Create, Select, Insert..)


M. Danubianu - Baze de date 3
Scurt istoric
 începe în 1970 odată cu publicarea articolului lui E.F. Codd
 1974 – D. Chamberlin – lab. IBM din San Jose – defineşte “limbajul de interogare
structurată în engleză” - SEQUEL (Structured English QUEry Language)
 1975 SQUARE – specificarea interogărilor ca expresii relaţionale
 limbaj pentru cercetare care să implementeze algebra relaţională sub forma de propoziţii
în limba engleză (Boyce et al. 1975)
 1976 – versiune revizuită SEQUEL/2
 datorită unor motive legate de legalitatea folosirii numelui SEQUEL, denumirea
limbajului se schimbă în SQL (Chamberlin & Boyce)
 1976 – IBM realizează prototipul unui SGBD pe baza SEQUEL/2 – System R
(Astrahan et al. 1976)
 scop – validarea fezabilităţii modelului relaţional
 realizare – a permis dezvoltarea SQL
 sf. anilor 70 ORACLE realizează prima implementare comercială a unui SGBD
relaţional pe baza SQL - ORACLE
 INGRES – cu limbajul de interogare QUEL
 mai structurat decât SQL
 mai puţin asemănător limbii engleze
M. Danubianu - Baze de date 4
Principalele comenzi SQL

Pentru manipularea datelor SELECT Extragerea datelor din baza de date


INSERT Adăugarea de noi linii într-un tabel
DELETE Stergerea de linii dintr-un tabel
UPDATE Modificarea valorilor unor atribute
Pentru definirea bazei de CREATE TABLE Adăugarea unui nou tabel la baza de date
date DROP TABLE Stergerea unui tabel din baza de date
ALTER TABLE Modificarea structurii unei baze de date
CREATE VIEW Crearea unuitabel virtual (vedere)
DROP VIEW Stergerea unui tabel virtual
Pentru controlul accesului GRANT Acordarea unor drepturi pentru utilizatori
la baza de date REVOKE Revocarea unor drepturi pentru utilizatori
Pentru controlul COMMIT Marchează sfârşitul unei tranzacţii
tranzacţiilor ROLLBACK Abandonează tranzacţia în curs.

M. Danubianu - Baze de date 5


Terminologie şi convenţii de scriere
a comenzilor SQL

 In limbajul SQL standardizat se utilizează termenii de tabele , coloane


şi rânduri.
 O instrucţiune SQL este formată din cuvinte rezervate şi cuvinte
definite de utilizator.
 Cuvintele rezervate :
- au un înţeles fix, trebuie scrise exact cum este necesar şi nu

pot fi împărţite în mai multe rânduri.


 Cuvintele definite de utilizator :
- sunt formate de către acesta, conform unor anumite reguli de

sintaxă şi reprezintă denumirile diverselor obiecte din baza de


date, cum ar fi relaţiile, coloanele , vederile, indexurile etc.
 Majoritatea compnentelor unei instrucţiuni SQL nu sunt sensibile la
tipul de litere.
 excepţie importantă - faptul că datele de tip caracter literal trebuie
să fie scrise exact cum apar în baza de date.
M. Danubianu - Baze de date 6
Manipularea datelor în SQL

 Operaţia fundamentală în SQL este consultarea


 fraza SELECT - prezintă trei clauze principale : SELECT, FROM şi
WHERE.
• SELECT corespunde operatorului de proiecţie din algebra
relaţională, şi este utilizat pentru desemnarea listei de atribute
(coloane, câmpuri) din tabelul rezultat;
• FROM permite enumerarea tabelelor din care vor fi extrase

datele aferente consultării;


• WHERE desemnează predicatul selectiv al algebrei
relaţionale, relativ la atributele relaţiilor care apar în clauza
FROM.
 comandă extrem de puternică echivalentul operaţiilor de selecţie,
proiecţie şi uniune din algebra relaţională

M. Danubianu - Baze de date 7


Forma generală a instrucţiunii SELECT este:

- Alias reprezintă aliasul atribuit relaţiei


- câmp este numele câmpului selectat
SELECT - nume_nou numele câmpului selectat în noul tabel
[ALL | DISTINCT] [*] - local_alias aliasul local atribuit de utilizator;
[<alias>.]<camp>
- cond_leg condiţia de legătură între tabelele în care se manipulează datele;
[AS <nume_nou>]
[, [<alias>.]<camp> - cond_filtru condiţia de filtrare a înregistrărilor;
-
[AS <nume_nou>] ...]listă _câmpuri listă a câmpurilor în funcţie de care se face gruparea
FROM <tabel> înregistrărilor
[<local_alias>] - câmp_ord câmpul după care se face ordonarea înregistrărilor
[, <tabel> [<local_alias>] ...]
[WHERE <cond_leg> [AND <cond_leg> ...]
[AND | OR <cond_filtru> [AND | OR <cond_filtru> ...]]]
[GROUP BY <lista_campuri>]
[HAVING <cond_filtru>]
[ORDER BY <camp_ord> [ASC | DESC] [, <camp_ord> [ASC |
DESC] ...]]

M. Danubianu - Baze de date 8


Secvenţa de prelucrare a unei fraze SELECT...

 ...este următoarea:
- FROM - specifică tabelul sau tabelele care vor fi utilizate;

- WHERE - filtrează rândurile supuse unei anumite condiţii

sau conţine condiţia de joncţiune între mai multe tabele


- GROUP BY - formează grupuri de rânduri cu aceleaşi

valori ale coloanelor din lista de parametri;


- HAVING - filtrează grupurile supuse unei anumite condiţii;

- SELECT - specifică ce coloane vor apărea în tabelul

rezultat;
- ORDER BY - specifică ordinea ieşirii.

 Operaţia SELECT este închisă: rezultatul unei interogări unui tabel


este un alt tabel.
 rezultatul poate fi un tabel "normal" (tabel salvat pe disc), un tabel
temporar (cursor - tabel care se şterge automat la închiderea unei
sesiuni de lucru) sau chiar o variabilă-tablou (matrice).

M. Danubianu - Baze de date 9


Interogări în SQL

 Agenţi1 (zona, cod, nume, adresa, telefon, manager, tip_ag)


 Agenţi2 (zona, cod, nume, adresa, telefon, manager, tip_ag)
 Contracte (cod, tip_pr, tip_m, cant, index_v, index_n, act_idx)
 Facturi ( cod, număr, data, tip_pr, pret, cant, val)
 Nrsp (seria, nrs, număr, data, pag, anulat, ult_pag)
 Tipuri (tip_pr, den)

 Agenţi1 - agentii economici mari


 Agenţi2 - ceilalţi agenţi economici

M. Danubianu - Baze de date 10


Selecţia
 Ce agenti economici mari au sediul în zona BURDUJENI?
 intervine un singur tabel şi anume Agenti1. In clauza WHERE apare
predicatul de selecţie (conditia) : zona="BURDUJENI"
SELECT *
FROM AGENTI1
WHERE zona="BURDUJENI"

 Care sunt facturile emise în data de 29.01.1999, cu valoare mai mare


de 2000000 corespunzător apei potabile?
SELECT *
FROM FACTURI
WHERE DATA={29.01.1999} AND TIP=12 AND VAL >2000000

M. Danubianu - Baze de date 11


Operatorul BETWEEN

 Se poate reformula ultima interogare astfel: Care sunt facturile


pentru care valoarea consumului de apă potabilă este mai mare de
1500000 şi mai mică de 4000000?
 Se poate folosi următoarea instrucţiune:

SELECT *
FROM FACTURI
WHERE Tip=12 AND Val>1500000 AND val <4000000
 Aceeaşi interogare se poate scrie astfel:
SELECT *
FROM FACTURI
WHERE Tip=12 AND Val BETWEEN 1500000 AND 4000000

M. Danubianu - Baze de date 12


Operatorul LIKE

 Se foloseşte pentru a compara un atribut de tip şir de caractere


cu un literal (constantă de tip şir de caractere).
 %, "_" este un specificator multiplu, joker sau mască.
 Care sunt agenţii al căror nume începe cu "S" şi sunt
societăţi pe acţiuni?
SELECT *
FROM Agenti1
WHERE Nume LIKE "S%SA"

M. Danubianu - Baze de date 13


Operatorul IN
 Are următorul format general:
 expresie1 IN (expresie2, expresie3,..)

 Rezultatul evaluării unui predicat care conţine acest operator va fi


"adevărat" dacă valoarea expresiei1 este egală cu cel puţin una din
valorile: expresie2, expresie3, .. şi este util atunci când condiţiile de
selecţie sunt mai complexe.
 Care sunt agenţii din zonele: CENTRALĂ şi ZAMCA?
SELECT *
FROM AGENTI1
WHERE Zona = "CENTRALĂ" OR Zona="ZAMCA"
 Sau
SELECT *
FROM AGENTI1
WHERE Zona IN (CENTRALĂ, ZAMCA)

M. Danubianu - Baze de date 14


Operatorul IS NULL

 Care sunt agenţii pentru care nu s-a introdus numele managerului?


SELECT *
FROM AGENTI1
WHERE manger IS NULL

 Notă: Operatorul NULL se utilizează cu IS şi nu cu semnul "=".


Utilizarea unei expresii de forma =NULL ar conduce la un rezultat
care va fi întotdeauna fals, chiar dacă expresia nu este nulă.

M. Danubianu - Baze de date 15


Proiecţia
 In ce zone ale oraşului îşi au sediul agenţii comerciali, clienţi ai
firmei?
SELECT DISTINCT Zona
FROM Agenti
 Care este numele fiecărui agent comercial şi adresa sa?
SELECT Nume, Adresa
FROM Agenti
 prezentarea ordonată a agenţilor - ORDER BY.
SELECT *
FROM AGENTI
ORDER BY Nume
 dacă se doreşrte ordonarea descrescătoare se foloseşte următoarea
formulare:
SELECT *
FROM Agenţi
ORDER BY Zona ASCENDING, Nume DESCENDING
M. Danubianu - Baze de date 16
Reflectarea operatorilor asamblişti (pe mulţimi)
Reuniunea

 Pornind de la tabelele Agenti1 şi Agenti2 , tabelul reuniune care


reprezintă tabelul AGENTI va fi obţinut în SQL prin fraza:
SELECT *
FROM AGENTI1
UNION
SELECT *
FROM AGENTI2

 SQL elimină automat dublurile, deci nu este necesară utilizarea


clauzei DISTINCT.

M. Danubianu - Baze de date 17


Diferenţa

 Fie două tabele cu date de identificare pentru clienţii a două


societăţi: Clienţi1 şi Clienţi2.
 Să se găsească care sunt clienţii societăţii 1 care nu sunt şi clienţi ai
societăţii2.

SELECT *
FROM Clienţi1
MINUS
SELECT *
FROM Clienţi2

M. Danubianu - Baze de date 18


Intersecţia

 Să se găsească codurile agenţilor economici care au contract de


furnizare servicii.
SELECT cod
FROM Agenţi
INTERSECT
SELECT cod
FROM Contracte
 sau , ţinând cont de faptul că este un operator drivat:
SELECT cod
FROM Agenţi
MINUS
(SELECT cod
FROM Agenţi
MINUS
SELECT cod
FROM Contracte)

M. Danubianu - Baze de date 19


Produsul cartezian

SELECT *
FROM Agenţi, Contracte

M. Danubianu - Baze de date 20