BD Curs 02 SQL Partea 1(1)

61
1 Introducere în SQL Clauzele Select-From-Where Interogări cu mai multe relaţii Interogări imbricate

description

Baza de date

Transcript of BD Curs 02 SQL Partea 1(1)

Page 1: BD Curs 02 SQL Partea 1(1)

1

Introducere în SQL

Clauzele Select-From-Where

Interogări cu mai multe relaţii

Interogări imbricate

Page 2: BD Curs 02 SQL Partea 1(1)

2

SQL

�Este un limbaj “very-high-level”.� Spune CE trebuie făcut şi nu CUM trebuie

făcut.

� Evită detaliile legate de lucrul cu datele,caracteristice limbajelor procedurale (C++ sau Java).

�SGBD-ul se îngrijeşte de modul de execuție a interogării. � Această funcţiune se numeşte “query

optimization.”

Page 3: BD Curs 02 SQL Partea 1(1)

3

Clauzele Select-From-Where

SELECT listă de atribute

FROM una sau mai multe tabele

WHERE condiţie aplicată tuplelor

tabelelor

Page 4: BD Curs 02 SQL Partea 1(1)

4

Schema BD Exemplu

�Interogările SQL prezentate în curs folosesc următoarea schemă:

Beers(name, manf)

Bars(name, addr, license)

Drinkers(name, addr, phone)

Likes(drinker, beer)

Sells(bar, beer, price)

Frequents(drinker, bar)� Atributele subliniate indică CHEIA fiecărei relaţii.

Page 5: BD Curs 02 SQL Partea 1(1)

5

Exemplu

�Folosind Beers(name, manf), care sunt mărcile de bere produse de Anheuser-Busch?

SELECT name

FROM Beers

WHERE manf = ’Anheuser-Busch’;

Page 6: BD Curs 02 SQL Partea 1(1)

6

Rezultatul Interogării

name

Bud

Bud Lite

Michelob

. . .

Răspunsul este o relaţie cu un singur atribut,“name”, şi tuplele cu denumirea fiecărei mărci debere produsă de Anheuser-Busch, cum este “Bud”.

Page 7: BD Curs 02 SQL Partea 1(1)

7

Cum funcţionează interogareaasupra unei singure relaţii

�Relaţia este specificată în clauza FROM.

�Se aplică selecţia precizată în clauzaWHERE.

�Se aplică proiecţia extinsă indicată prin lista de atribute din clauza SELECT.

Page 8: BD Curs 02 SQL Partea 1(1)

8

Semanticile Operaţiilor

Verifică dacămanf are valoarea‘Anheuser-Busch’

name manf

Bud Anheuser-Busch Se include t.name în rezultat, dacă eadevărat

Variabila de tuplă tparcurge toate tuplele

Page 9: BD Curs 02 SQL Partea 1(1)

9

Semanticile Operaţiilor

�Se poate gândi la o variabilă de tuplă ce vizitează fiecare tuplă a relaţieimenţionate în clauza FROM.

�Se verifică dacă tupla “curentă” satisface clauza WHERE.

�Dacă se întâmplă aşa, se determinăatributele sau expresiile clauzei SELECT folosind componentele acestei tuple.

Page 10: BD Curs 02 SQL Partea 1(1)

10

* în clauza SELECT

�Atunci când există o singură relaţie în clauza FROM, * în clauza SELECT semnifică“toate atributele acestei relaţii”.

�Exemplu: Se foloseşte Beers(name, manf):

SELECT *

FROM Beers

WHERE manf = ’Anheuser-Busch’;

Page 11: BD Curs 02 SQL Partea 1(1)

11

Rezultatul Interogării:

name manf

Bud Anheuser-Busch

Bud Lite Anheuser-Busch

Michelob Anheuser-Busch

. . . . . .

Acum, rezultatul are fiecare atributal relaţiei Beers.

Page 12: BD Curs 02 SQL Partea 1(1)

12

Redenumirea Atributelor

�Dacă se doreşte ca rezultatul să aibă nume diferite de atribute, se foloseşte “AS <numenou>” pentru a redenumi un atribut.

�Exemplu: Se foloseşte Beers(name, manf):

SELECT name AS beer, manf

FROM Beers

WHERE manf = ’Anheuser-Busch’

Page 13: BD Curs 02 SQL Partea 1(1)

13

Rezultatul Interogării:

beer manf

Bud Anheuser-Busch

Bud Lite Anheuser-Busch

Michelob Anheuser-Busch

. . . . . .

Page 14: BD Curs 02 SQL Partea 1(1)

14

Expresii în clauza SELECT

�Orice expresie ce are sens poate fi un element al clauzei SELECT.

�Exemplu: Se foloseşte Sells(bar, beer, price):

SELECT bar, beer,

price*114 AS priceInYen

FROM Sells;

Page 15: BD Curs 02 SQL Partea 1(1)

15

Rezultatul Interogării

bar beer priceInYen

Joe’s Bud 285

Sue’s Miller 342

… … …

Page 16: BD Curs 02 SQL Partea 1(1)

16

Exemplu: Constante ca Expresii

�Se foloseşte Likes(drinker, beer):

SELECT drinker,

’îi place Bud’ AS cuiîiplaceBud

FROM Likes

WHERE beer = ’Bud’;

Page 17: BD Curs 02 SQL Partea 1(1)

17

Rezultatul Interogării

drinker cuiîiplaceBud

Sally îi place Bud

Fred îi place Bud

… …

Page 18: BD Curs 02 SQL Partea 1(1)

18

Exemplu: Integrarea Informaţiei

�Adesea se construiesc “data warehouses” din surse multiple de date.

�Să presupunem că fiecare bar arepropria relaţie Menu(beer, price) .

�Pentru a contribui la Sells(bar, beer, price) este nevoie de interogareafiecărui bar şi de adăugarea (“insert”)denumirii barului.

Page 19: BD Curs 02 SQL Partea 1(1)

19

Integrarea Informaţiei

�Să spunem, că la “Joe’s Bar” emiteminterogarea (query):

SELECT ’Joe’’s Bar’, beer, price

FROM Menu;

Page 20: BD Curs 02 SQL Partea 1(1)

20

Condiţii Complexe în Clauza WHERE

�Operatori logici AND, OR, NOT.

�Comparaţii =, <>, <, >, <=, >=.

� Şi mulţi alţi operatori ce produc rezultate valoare-logică.

Page 21: BD Curs 02 SQL Partea 1(1)

21

Exemplu: Condiţie Complexă

�Se foloseşte Sells(bar, beer, price), trebuie găsit preţul de la “Joe’s Bar” pentru “Bud”:

SELECT price

FROM Sells

WHERE bar = ’Joe’’s Bar’ AND

beer = ’Bud’;

Page 22: BD Curs 02 SQL Partea 1(1)

22

Formate tipice (pattern)

�O condiţie poate compara un şir de caractere cu un format tipic în felul următor:� <Atribut> LIKE <pattern> sau <Atribut>

NOT LIKE <pattern>

�Pattern este un şir de caractere încadrat între ghilimele cu:% = “orice şir de caractere”;

_ = “orice caracter”.

Page 23: BD Curs 02 SQL Partea 1(1)

23

Exemplu: LIKE

�Se foloseşte Drinkers(name, addr, phone)Să se găsească “drinkers” cu prefixul numărului de telefon 555:

SELECT name

FROM Drinkers

WHERE phone LIKE ’%555-_ _ _ _’;

Page 24: BD Curs 02 SQL Partea 1(1)

24

Valori NULL

�Tuplele în relaţii SQL pot avea valoareaNULL pentru unul sau mai multe atribute.

�Semnificaţia depinde de context. Douăsituaţii obişnuite:

� Valoare lipsă : de exemplu, se ştie că “Joe’s Bar” are o adresă, dar aceasta nu se cunoaşte.

� Inaplicabil : de exemplu, valoarea atributuluisoţ pentru o persoană necăsătorită.

Page 25: BD Curs 02 SQL Partea 1(1)

25

Compararea NULL cu Valoare

�Condiţiile au de fapt o logică 3-valori în SQL: TRUE, FALSE, UNKNOWN.

�Compararea oricărei valori (incluzând NULL cu el însuşi) cu NULL conduce la UNKNOWN.

�Pentru ca o tuplă să aparţină răspunsului la o interogare, condiţia din clauza WHERE trebuie să aibă valoarea logică TRUE (nici FALSE şi niciUNKNOWN).

Page 26: BD Curs 02 SQL Partea 1(1)

26

Logica Trei-Valori

�Pentru a înţelege cum lucrează AND, OR, şiNOT în logica trei-valori, să ne gândim căTRUE = 1, FALSE = 0, şi UNKNOWN = ½.

�AND = MIN; OR = MAX, NOT(x) = 1-x.

�Exemplu:

TRUE AND (FALSE OR NOT(UNKNOWN)) =

MIN(1, MAX(0, (1 - ½ ))) =

MIN(1, MAX(0, ½ )) = MIN(1, ½ ) = ½.

Page 27: BD Curs 02 SQL Partea 1(1)

27

Exemplu Surprizător

�Pentru următoarea relaţie Sells :

bar beer price

Joe’s Bar Bud NULL

SELECT bar

FROM Sells

WHERE price < 2.00 OR price >= 2.00;UNKNOWN UNKNOWN

UNKNOWN

Page 28: BD Curs 02 SQL Partea 1(1)

28

Motivaţie: Legile 2-Valori!= Legile 3-Valori

�Anumite legi obişnuite, cum estecomutativitatea lui AND, rămân valabile în logica 3-valori.

�Dar altele nu, cum este legea excluderiimijlocului : p OR NOT p = TRUE.

� Când p = UNKNOWN, membrul stâng esteMAX( ½, (1 – ½ )) = ½ != 1.

Page 29: BD Curs 02 SQL Partea 1(1)

29

Interogări asupramai multor relaţii

�Interogările combină adesea datele dinmai multe relaţii.

�Se pot menţiona mai multe relaţii într-ointerogare prin introducerea lor în clauza FROM.

�Se face distincţie între atributele cu acelaşi nume prin prefixare cu numele relaţiei: “<relaţie>.<atribut>” .

Page 30: BD Curs 02 SQL Partea 1(1)

30

Exemplu: Reunirea a două Relaţii

�Se folosesc relaţiile Likes(drinker, beer) şiFrequents(drinker, bar), pentru a găsibăuturile preferate de cel puţin o persoanăce frecventează “Joe’s Bar”.SELECT beer

FROM Likes, Frequents

WHERE bar = ’Joe’’s Bar’ AND

Frequents.drinker =

Likes.drinker;

Page 31: BD Curs 02 SQL Partea 1(1)

31

Semanticile Formale pentru oInterogare cu mai multe relaţii

� Sunt aproximativ aceleaşi ca şi în cazul interogării cu o singură relaţie:

1. Se începe cu produsul relaţiilor din clauzaFROM.

2. Se aplică selecţia impusă de condiţia din clauza WHERE.

3. Se aplică proiecţia extinsă pe lista de atribute şi expresii din clauza SELECT.

Page 32: BD Curs 02 SQL Partea 1(1)

32

Semanticile Operaţionale pentruo Interogare cu mai multe relaţii

�Să ne imaginăm câte o variabilă de tuplă pentru fiecare relaţie din clauzaFROM.� Aceste variabile de tuplă parcurg fiecare

combinaţie de tuple, câte o tuplă dinfiecare relaţie.

�Dacă variabilele de tuplă indică tuple cesatisfac condiţia din clauza WHERE, aceste tuple fac parte din rezultat.

Page 33: BD Curs 02 SQL Partea 1(1)

33

Exemplu

drinker bar drinker beer

vt1 vt2Sally Bud

Sally Joe’s

LikesFrequents

coloana “beer”face partedin rezultat

dacă acestevalori suntegale

verificăpentruJoe’s

Page 34: BD Curs 02 SQL Partea 1(1)

34

Variabile de Tuplă Explicite

�Uneori, o interogare necesită folosirea adouă copii a aceleaşi relaţii.

�Se face distincţie între cele două copiiprin completarea după numele relaţiei anumelui unei variabile de tuplă, în clauza FROM.

�Oricând se poate proceda astfel, prinredenumirea relaţiilor, chiar dacă nu este o condiţie obligatorie.

Page 35: BD Curs 02 SQL Partea 1(1)

35

Exemplu: Self-Join

�Folosind Beers(name, manf), să se găseascătoate perechile de bere produse de aceeaşifabrică.� Nu interesează perechi cum ar fi (Bud, Bud).

� Perechile vor fi obţinute în ordine alfabetică, de ex. (Bud, Miller), nu (Miller, Bud).

SELECT b1.name, b2.name

FROM Beers b1, Beers b2

WHERE b1.manf = b2.manf AND

b1.name < b2.name;

Page 36: BD Curs 02 SQL Partea 1(1)

36

Interogări imbricate (Subqueries)

�O instrucţiune SELECT-FROM-WHERE amplasată între paranteze (subquery )poate fi folosită ca valoare în mai multe locuri, inclusiv în clauzele FROM şiWHERE.

�Exemplu: în locul unei relaţii în clauzaFROM, se poate folosi o interogare imbricată (subquery).� Este obligatoriu să fie utilizată o variabilă

de tuplă pentru a numi tuplele rezultatului subinterogării.

Page 37: BD Curs 02 SQL Partea 1(1)

37

Exemplu: Subquery în FROM

�Să se găsească berea preferată de cel puţino persoană ce frecventează “Joe’s Bar”.

SELECT beer

FROM Likes, (SELECT drinker

FROM Frequents

WHERE bar = ’Joe’’s Bar’)JD

WHERE Likes.drinker = JD.drinker;

Persoane cefrecventează “Joe’s Bar”

Page 38: BD Curs 02 SQL Partea 1(1)

38

Interogări imbricate ceReturnează 1 Tuplă

�Dacă o interogare imbricată returnează 1 tuplă şi numai una, atunci interogarea imbricată poate fi utilizată ca valoare.

� De obicei tupla are o singură componentă.

� Dacă interogarea imbricată nu returnează nici o tuplă sau mai mult de una, se semnalează o eroare run-time.

Page 39: BD Curs 02 SQL Partea 1(1)

39

Exemplu:Interogare imbricată cu 1 tuplă

� Se foloseşte Sells(bar, beer, price), pentru a găsi barurile ce servesc “Miller”la preţul cu care “Joe’s Bar” vinde “Bud”.

� Răspunsul poate fi dat sub forma a două interogări:

1. Găseşte preţul cu care “Joe’s Bar” vinde“Bud”.

2. Găseşte barurile ce servesc “Miller” la acel preţ.

Page 40: BD Curs 02 SQL Partea 1(1)

40

Soluţia cu interogare şiinterogare imbricată

SELECT bar

FROM Sells

WHERE beer = ’Miller’ AND

price = (SELECT price

FROM Sells

WHERE bar = ’Joe’’s Bar’

AND beer = ’Bud’);

Preţul cucare “Joe’s Bar”vinde “Bud”

Page 41: BD Curs 02 SQL Partea 1(1)

41

Operatorul IN

�<tuplă> IN (<subquery>) are valoarea logică True dacă şi numai dacă tuplaeste membră a relaţiei produse de interogarea imbricată.

� La modul opus este: <tuplă> NOT IN (<subquery>).

�Expresiile “IN” pot apare în clauzeWHERE.

Page 42: BD Curs 02 SQL Partea 1(1)

42

Exemplu: IN

�Se folosesc Beers(name, manf) şiLikes(drinker, beer), pentru a găsi numele şiproducătorul fiecărei beri preferată de Fred.

SELECT *

FROM Beers

WHERE name IN (SELECT beer

FROM Likes

WHERE drinker = ’Fred’);

Mulţimea (set)berilor preferatede Fred

Page 43: BD Curs 02 SQL Partea 1(1)

43

Revenim la întrebareadin cursul introductiv:

SELECT a

FROM R, S

WHERE R.b = S.b;

prin ce diferă de:

SELECT a

FROM R

WHERE b IN (SELECT b FROM S);

Page 44: BD Curs 02 SQL Partea 1(1)

44

Cu ajutorul IN se construieşte unpredicat pentru tuplele din R

SELECT a

FROM R

WHERE b IN (SELECT b FROM S);

O singurăparcurgere atuplelor din R

a b1 23 4R

b c2 52 6S

(1,2) satisfacecondiţia;

1 este afişato singură

dată.

Valoarea 2 apare de două ori

Page 45: BD Curs 02 SQL Partea 1(1)

45

Tuplele din R şi S fac pereche prin această interogare

SELECT a

FROM R, S

WHERE R.b = S.b;

Ciclu dublu:primul peste tuplele din R şi

al doilea pestetuplele din S

a b1 23 4R

b c2 52 6S

(1,2) cu (2,5) şi(1,2) cu (2,6),ambele satisfaccondiţia;1 este afişat dedouă ori.

Page 46: BD Curs 02 SQL Partea 1(1)

46

Operatorul EXISTS

�EXISTS(<subquery>) are valoarea logică True dacă şi numai dacărezultatul interogării imbricate estenevid.

�Exemplu: Se foloseşte Beers(name, manf) , pentru a găsi acele beri cereprezintă unica bere a producătorului ei.

Page 47: BD Curs 02 SQL Partea 1(1)

47

Exemplu: EXISTS

SELECT name

FROM Beers b1

WHERE NOT EXISTS (

SELECT *

FROM Beers

WHERE manf = b1.manf AND

name <> b1.name);

Mulţimeaberilorce suntprodusede acelaşiproducător(cu b1), darau altădenumire

De notat regula: manf se referăla o relaţie din cel mai apropiatFROM, ce conţine acel atribut.

De notatoperatorulSQL “notequals”

Page 48: BD Curs 02 SQL Partea 1(1)

48

Operatorul “ANY”

�x = ANY(<subquery>) este o condiţie booleană ceare valoarea logică True dacă x este “egal” cu cel puţin una din tuplele rezultatului interogării imbricate.

� “=“ poate fi oricare din operatorii de comparaţie.

�Exemplu: x >= ANY(<subquery>) semnifică x nu este singura tuplă cea mai mică produsă de interogarea imbricată.� De notat că tuplele trebuie să aibă doar o componentă.

Page 49: BD Curs 02 SQL Partea 1(1)

49

Operatorul “ALL”

�x <> ALL(<subquery>) are valoarea logicăTrue dacă pentru fiecare tuplă t din relaţia “subquery”, x este diferit de t.� Cu alte cuvinte, x nu se regăseşte în rezultatul

interogării imbricate.

�“<>” poate fi orice operator de comparaţie.

�Exemplu: x >= ALL(<subquery>) semnificănu există tuplă mai mare ca x în rezultatul interogării imbricate.

Page 50: BD Curs 02 SQL Partea 1(1)

50

Exemplu: ALL

�Se foloseşte Sells(bar, beer, price), pentru a găsi berea(-ile) vândute la cel mai mare preţ.

SELECT beer

FROM Sells

WHERE price >= ALL(

SELECT price

FROM Sells);

preţul “Sells” dinexterior să nu fiemai mic decâtnici un preţ.

Page 51: BD Curs 02 SQL Partea 1(1)

51

Uniunea, Intersecţia şi Diferenţa

�Uniunea, intersecţia şi diferenţarelaţiilor sunt exprimate prin formele următoare, fiecare implică interogări imbricate:

� (<subquery>) UNION (<subquery>)

� (<subquery>) INTERSECT (<subquery>)

� (<subquery>) EXCEPT (<subquery>)

Page 52: BD Curs 02 SQL Partea 1(1)

52

Exemplu: INTERSECT

� Se folosesc Likes(drinker, beer), Sells(bar, beer, price) şi Frequents(drinker, bar)pentru a găsi persoanele şi mărcile de bere astfel încât:

1. Persoana preferă berea şi

2. Persoana frecventează cel puţin un bar unde se vinde berea.

Page 53: BD Curs 02 SQL Partea 1(1)

53

Soluţia

(SELECT * FROM Likes)

INTERSECT

(SELECT drinker, beer

FROM Sells, Frequents

WHERE Frequents.bar = Sells.bar

);

Persoana frecventeazăun bar ce vinde berea.

De notat trucul:interogareaimbricată esteo tabelă de bază.

Page 54: BD Curs 02 SQL Partea 1(1)

54

Semanticile “Bag”

�Deşi instrucţiunea SELECT-FROM-WHERE foloseşte semantici “bag”, semanticile implicite pentru uniune, intersecţie şi diferenţă sunt “set”.

� Aceasta înseamnă că duplicatele sunteliminate implicit la aplicarea unuia din cei trei operatori (UNION, INTERSECT, EXCEPT).

Page 55: BD Curs 02 SQL Partea 1(1)

55

Motivaţie: Eficienţă

�Atunci când se aplică proiecţia extinsă, estemai uşor să se evite eliminarea duplicatelor.

� Deoarece se poate lucra cu o singură tuplă la un moment dat.

�Pentru intersecţie sau diferenţă, este maieficient să se sorteze mai întâi relaţiile.

� La acel moment dat se poate la fel de bine să seelimine duplicatele.

Page 56: BD Curs 02 SQL Partea 1(1)

56

Eliminarea explicită a Duplicatelor

�Pentru a forţa rezultatul unei interogări să fie “set”:

SELECT DISTINCT . . .

�Pentru a forţa rezultatul unei interogări să fie “bag” (adică să nu fie eliminate duplicatele):

se foloseşte ALL,

de exemplu . . . UNION ALL . . .

Page 57: BD Curs 02 SQL Partea 1(1)

57

Exemplu: DISTINCT

�Se foloseşte Sells(bar, beer, price), pentru a găsi toate preţurile diferite pentru mărcile de bere vândute:

SELECT DISTINCT price

FROM Sells;

�De notat că fără DISTINCT, fiecare preţpoate să apară de mai multe ori, multiplicat după numărul de baruri/mărci de bere.

Page 58: BD Curs 02 SQL Partea 1(1)

58

Exemplu: ALL

Interogarea:(SELECT drinker FROM Frequents)

EXCEPT ALL

(SELECT drinker FROM Likes);

foloseşte relaţiile Frequents(drinker, bar) şiLikes(drinker, beer) pentru a afişa persoanelepentru care numărul de baruri frecventateeste mai mare decât numărul de mărci de bere preferate şi o persoană apare de atâteaori în rezultat cât reprezintă diferenţa acestornumere.

Page 59: BD Curs 02 SQL Partea 1(1)

59

Expresii “Join”

�SQL mai multe variante de reuniri (“bag”).

�Aceste expresii pot fi interogări de sine stătătoare (stand-alone queries) sausunt folosite în locul relaţiilor în clauzaFROM.

Page 60: BD Curs 02 SQL Partea 1(1)

60

Produs şi Natural Join

�Natural join:

R NATURAL JOIN S;

�Produs:

R CROSS JOIN S;

�Exemplu:

Likes NATURAL JOIN Sells;

�Relaţiile pot fi la fel de bine interogări imbricate între paranteze.

Page 61: BD Curs 02 SQL Partea 1(1)

61

Theta Join

�R JOIN S ON <condiţie>

�Exemplu: Drinkers(name, addr) şiFrequents(drinker, bar):

Drinkers JOIN Frequents ON

name = drinker;

generează toate cvadruplele (d, a, d, b) a.î. persoana d locuieşte la adresa a şi frecventează barul b.