Sunteți pe pagina 1din 56

Universitatea Al.I.

Cuza Iai
Facultatea de Economie i Administrarea Afacerilor
Departamentul de Contabilitate, Informatic economic i
Statistic

Limbaje de
interogare a
bazelor
de date
Algebra
relaional
i
SQL (2)
Marin
Fotache

Tutoriale video
11a_LimbajeInterogare_Operatori1

http://1drv.ms/1oCrZA3
11b_Reuniune-Proiectie

http://1drv.ms/1oCs7zo
11c_Theta-Echi-Jonctiune

http://1drv.ms/1oCsn1e

Limbaje de interogare
Vizeaz:

Obinerea de informaii din BD


Crearea i modificarea schemei BD
Modificarea coninutului BD

D.p.d.v. al implementrii:

Teoretice: algebr relaional, calcul relaional


Practice:

QBE
Quel
SQL
OQL

Algebra relaional
Reprezint baza (teoretic a) SQL
Dispune de operatori care se aplic
asupra relaiilor (tabelelor)
n urma aplicrii unui operator asupra a
una sau dou relaii se obine o nou
relaie
Noua relaie poate fi argumentul unui
alt (sau aceluiai) operator
Din pcate, nu exist instrumente
software care s compileze i s
execute comenzi AR

Analogie cu aritmetica (1)


Rezultat
(numr real)

Rezultat
(tabel)

Operanzi
(numere reale)

Operanzi
(tabele)

R1

Operator
(+,-, *, - ...)

Operator
(reuniune,selecie,
jonciune,...)

R2

SQL: Sintaxa de baz a frazei


SELECT
SELECT C1, C2, ..., Cn
FRO M R1, R2
PROIECIE
W H ERE P

SELECIE

PRODUS
CARTEZIAN

Deviaia SQL de la spiritul


relaional

Rezultatul unei interogri SQL are form


tabelar (tabel anonim)
Rezultatul nu este o relaie, ntruct nu
se respect porunca unicitii fiecrei
linii/tuplu
Critici virulente din partea puritilor:
Codd, Date, Darwen, Pascal
Poate fi rezolvat prin folosirea clauzei
DISTINCT

Operatorii principali ai AR
Ansambliti

Reuniune

Intersecie

Diferen

Produs cartezian

Relaionali

Selecie

Proiecie

Jonciune

Diviziune

Tabelele cobai (R1 i R2)

n SQL:
D RO P TABLE IF EXISTS r1; D RO P TABLE IF EXISTS r2;
CREATE TABLE r1 ( A N U M ERIC(4), B VARCH AR(6),
C N U M ERIC (4) ) ;
CREATE TABLE r2 ( C N U M ERIC(4), D VARCH AR(6),
E N U M ERIC (4) ) ;
IN SERT IN TO

r1 VALU ES (20,'XYZ', 30) ;

IN SERT IN TO

r1 VALU ES (30,'XXZ', 20) ;

IN SERT IN TO

r1 VALU ES (40,'YYX', 25) ;

IN SERT IN TO

r2 VALU ES (25,'XYZ', 30) ;

IN SERT IN TO

r2 VALU ES (40,'YYX', 25) ;

IN SERT IN TO

r2 VALU ES (30,'XXZ', 40) ;

R1 i R2 sunt unicompatibile
R1 ( A1, A2, ..., An,) i
R2 (B1, B2, ..., Bm) sunt dou relaii
unicompati-bile dac:

n=m
pt. orice i={1,2, ..., n}, Ai i Bi sunt de acelai tip (sunt
definite pe un domeniu comun)

Operatorii
Reuniune,
Intersecie,
Diferen se aplic numai asupra a dou
relaii unicompatibile

Reuniune - AR

Reuniune - SQL
SELECT * FRO M r1
U N IO N
SELECT * FRO M r2

!!!
SELECT * FRO M r1
U N IO N ALL
SELECT * FRO M r2

Tupluri
duplicate

Intersecie - AR

Intersecie - SQL
SELECT * FRO M r1
IN TERSECT
SELECT * FRO M r2

Diferen - AR

Diferen - SQL
SELECT * FRO M r1
EXCEPT
SELECT * FRO M r2

SELECT * FRO M r1
M IN U S
SELECT * FRO M r2
Inoperabil n PostgreSQL

Produs cartezian - AR

Produs cartezian - SQL


SELECT *
FRO M r1, r2

SELECT *
FRO M r1 CRO SS JO IN r2

Selecie AR (1)

Care sunt liniile din R1 pentru care valorile


atributelor A i C sunt mai mari dect 20 ?

SELECT *
FRO M r1
W H ERE a > 20
AN D c > 20

Selecie SQL (1)

Selecie AR (2)
Care sunt judeele din Moldova ?

Selecie SQL (2)

SELECT *
FRO M judete
W H ERE regiune =
M oldova

Proiecie - AR
Ce regiuni ale rii sunt preluate n baz ?

Proiecie - SQL
SELECT regiune
FRO M judete

Tupluri
duplicat
e

Clauza
DISTINC
T

SELECT D ISTIN CT regiune


FRO M judete

Combinarea operatorilor AR (1)


Care este nr. de telefon al clientul Client 2
SA ?

Combinarea operatorilor SQL (1)

SELECT Telefon
FRO M clienti
W H ERE D enCl=
'Client 2 SA'

Combinarea operatorilor AR (2)


Care sunt codurile produselor care apar deopotriv
n factura 1111 i n factura 1117 ?

Combinarea operatorilor SQL (2)

SELECT CodPr
FRO M liniifact
W H ERE N rFact = 1111
IN TERSECT
SELECT CodPr
FRO M liniifact
W H ERE N rFact = 1117

Jonciune
Jonciune intern

Theta-jonciune
Echi-jonciune
Jonciune natural
Semi-jonciune

Jonciune extern

La stnga
La dreapta
Total

Theta-jonciune - AR

Theta-jonciune SQL-89
SELECT * FRO M r1, r2 W H ERE r1.a > = r2.e

Theta-jonciune SQL-92
SELECT * FRO M r1 IN N ER JO IN r2 O N r1.a > = r2.e

Ex. de theta-jonciune TRIAJ - AR


Care este ID-ul fiecrui doctor care a
examinat cazurile din triaj ?

T1

T2

JONCIUNE (TRIAJ, GARZI;


TRIAJ.DataOra_Examinare >=
GARZI.Inceput_Garda AND
TRIAJ.DataOra_Examinare <=
GARZI.Sfirsit_Garda
PROIECIE (T1; IdExaminare,
DataOra_Examinare, IdPacient,
IdDoctor)

Tabelele T1 i T2

Ex. de theta-jonciune TRIAJ - SQL


Care este ID-ul fiecrui doctor care a
examinat cazurile din triaj ?
SELECT IdExam inare,D ataO ra_Exam inare,
IdPacient, IdD octor
FRO M triajIN N ER JO IN garzi
O N triaj.dataora_exam inare > =
garzi.inceput_garda
AN D
triaj.dataora_exam inare < =
garzi.sfi
rsit_garda

Echi-jonciune - AR

Echi-jonciune - SQL
Notaia SQL-89:
SELECT *
FRO M r1, r2
W H ERE r1.a = r2.e

Notaia SQL-92:
SELECT *
FRO M r1 IN N ER JO IN r2 O N r1.a = r2.e

Jonciune natural - AR

Jonciune natural - SQL


SELECT * FRO M r1 N ATU RAL JO IN r2

n ce zile s-a vndut produsul


cu denumirea Produs 1 ?

n ce zile s-a vndut produsul cu


denumirea Produs 1 ? - AR
Soluie 1 AR neoptimizat

Soluie 2 AR optimizat

n ce zile s-a vndut produsul


cu denumirea Produs 1 ?
SQL-89
SELECT D ISTIN CT D ataFact
FRO M produse,liniifact,
facturi
W H ERE
produse.CodPr =
liniifact.CodPr AN D
liniifact.N rfact =
facturi.N rFact AN D
D enPr = Produs 1

n ce zile s-a vndut produsul cu


denumirea Produs 1 ? SQL92
SELECT D ISTIN CT D ataFact
FRO M produse
IN N ER JO IN liniifact
O N produse.CodPr =
liniifact.CodPr
IN N ER JO IN facturi
O N liniifact.N rFact =
facturi.N rFact
W H ERE D enPr = 'Produs 1'

n ce zile s-au vndut i produsul cu


denumirea Produs 1 i cel cu
denumirea Produs 2 ?
Pas 1: Aflarea zilelor
n care s-a
vndut Produs 1
Pas 2: Aflarea zilelor
n care s-a
vndut Produs 2
Pas 3: Intersecia
rezultatelor de la
paii 1 i 2

n ce zile s-au vndut i produsul cu


denumirea Produs 1 i cel cu
denumirea Produs 2 ? AR(1)

n ce zile s-au vndut i Produs


1 i Produs 2 ? SQL-92
SELECT D ISTIN CT D ataFact
FRO M produse
IN N ER JO IN liniifact O N produse.CodPr = liniifact.CodPr
IN N ER JO IN facturiO N liniifact.N rFact = facturi.N rFact
W H ERE D enPr = 'Produs 1'
IN TERSECT
SELECT D ISTIN CT D ataFact
FRO M produse
IN N ER JO IN liniifact O N produse.CodPr = liniifact.CodPr
IN N ER JO IN facturiO N liniifact.N rFact = facturi.N rFact
W H ERE D enPr = 'Produs 2'

Un truc: Intersecia prin jonciune

Intersecia prin jonciune SQL


SELECT r1.a, r1.b,r1.c
FRO M r1 IN N ER JO IN r2 O N r1.a= r2.c
AN D r1.b= r2.d AN D r1.c= r2.e

n ce zile s-au vndut i produsul cu


denumirea Produs 1 i cel cu
denumirea Produs 2 ? AR(2)

Auto-Jonciune: Ce facturi au fost


emise n aceeai zi cu factura 1120 ?
- AR

Auto-Jonciune: Ce facturi au fost


emise n aceeai zi cu factura
1120 ? SQL

SQL-89

SELECT f2.N rFact


FRO M facturif1,facturif2
W H ERE f1.D ataFact = f2.D ataFact
AN D f1.N rFact= 1120

SQL-92

SELECT f2.N rFact


FRO M facturif1 IN N ER JO IN facturif2
O N f1.datafact= f2.datafact
W H ERE f1.nrfact= 1120

SELECT * FROM facturi f1 INNER JOIN


facturi f2 ON f1.datafact=f2.datafact
(fragment)

SELECT *
FROM facturi f1 INNER JOIN facturi f2
ON f1.datafact=f2.datafact
AND f1.NrFact=1120

n ce zile s-au vndut i Produs 1 i


Produs 2 ?
SQL Autojonciune (intersecie prin
jonciunea a dou cpii ale tabelelor)
SELECT D ISTIN CT f1.D ataFact
FRO M produse p1
IN N ER JO IN liniifact lf1 O N p1.CodPr = lf1.CodPr
AN D p1.D enPr = 'Produs 1'
IN N ER JO IN facturif1 O N lf1.N rFact = f1.N rFact
IN N ER JO IN facturif2
O N f1.D ataFact = f2.D ataFact
IN N ER JO IN liniifact lf2 O N f2.N rFact = lf2.N rFact
IN N ER JO IN produse p2 O N lf2.CodPr = p2.CodPr
AN D p2.D enPr = 'Produs 2'
O RD ER BY 1

Jonciune extern &


diviziune
va urma

Detalii/exerciii despre AR & SQL

AP