+ All Categories
Home > Documents > LIMBAJUL SQL

LIMBAJUL SQL

Date post: 08-Aug-2015
Category:
Upload: almablack
View: 198 times
Download: 12 times
Share this document with a friend
Description:
SQL
64
LIMBAJUL SQL
Transcript
Page 1: LIMBAJUL SQL

LIMBAJUL SQL

Page 2: LIMBAJUL SQL

• SQL (Structured Query Language), a fost conceput iniţial de firma IBM, pentru produsul dBASE, ca un limbaj standard de descriere a datelor şi de acces la informţtiile din bazele de date. Limbaj de interogare a bazelor de date relaţionale, SQL a fost utilizat pe scară largă şi pană în prezent au fost dezvoltate şapte versiuni ale standardului SQL, trei dintre ele aparţinînd Institutului National American de Standarde (ANSI), celelalte fiind concepute de firme de prestigiu ca IBM, Microsoft şi Borland sau de cãtre consorţii ca SAG (The SQL Access Group) şi X/Open.

Page 3: LIMBAJUL SQL

• Primul standard SQL a fost creat in anul 1989 de cãtre ANSI fiind cunoscut sub numele de ANSI-SQL'89 şi a fost revizuit in octombrie 1992 sub noua denumire: ANSI-SQL'92.

• In anul 1992, firma Microsoft, in calitate de membru SAG, a lansat pe piata produsul ODBC (Open Database Connectivity), un standard API-SQL care defineste o interfatã de programare a aplicaţiilor (API) pentru accesul la bazele de date.

Page 4: LIMBAJUL SQL

• Clauzele SELECT, FROM şi WHERE• Clauzele SQL SELECT, FROM şi WHERE pot fi

puse în corespondentã cu operatorii din algebra relaţionalã, dupa cum urmeaza:

• clauza SELECT mentioneaza o lista de atribute şi corespunde proiectiei din algebra relaţionalã;

• clauza FROM mentioneazã o listã de relatii (tabele) şi corespunde produsului cartezian din algebra relaţionala;

• clauza WHERE descrie un predicat de selectie şi corespunde selectiei din algebra relaţionalã.

Page 5: LIMBAJUL SQL

• O interogare simpla SQL este de forma:• SELECT A1, A2, ..., An• FROM R1, R2, ..., Rm• WHERE P• Unde: Ai sunt atribute care apar în cel putin una dintre

relatiile Ri;• Ri sunt relatii (tabele);• P este un predicat de selectie.• Interogarea este echivalentã cu urmatoarea expresie din

algebra relaţionalã: A1,A2,…,An(p(R1 X R2 X…XRm))

Page 6: LIMBAJUL SQL

• In SQL, "select" desemneaza proiectia iar in algebra relaţionala acelasi termen desemneaza selectia dupa un predicat de selectie.

• Lista de atribute care apare in clauza SELECT din SQL poate fi inlocuita cu simbolul * daca se doreste selectarea tuturor atributelor care apar in relatiile din clauza FROM.

• Intotdeauna rezultatul unei interogari SQL este o relatie (o tabela).

Page 7: LIMBAJUL SQL

• Tabela FURNIZORI cu schema de relatie (cod_furnizor, nume_furnizor, adresa_furnizor).

• Tabela FLORI cu schema de relatie (cod_produs, nume_produs, culoare, inaltime, pret_unitar).

• Tabela COMENZI cu schema de relatie (nr_comanda, cod_produs, cod_furnizor, data_comenzii, timp_livrare, cantitate).

Page 8: LIMBAJUL SQL

• 1) "Sa se afiseze toate datele despre toti furnizorii"• SELECT *• FROM furnizori• 2) "Sa se afiseze orasele de resedinta ale tuturor

furnizorilor"• SELECT oras• FROM furnizori• Ca rezultat al acestei interogari se va obtine o tabela cu

o singura coloana, care contine numele oraselor de resedinta ale furnizorilor. Se va observa ca se repeta numele oraselor, deoarece se vor afisa orasele pentru fiecare furnizor in parte din tabela FURNIZORI.

Page 9: LIMBAJUL SQL

• O interogare SQL are urmatoarea forma generala:

• SELECT [DISTINCT/ALL] <lista de atribute>• FROM <lista de relatii>• [WHERE <conditie> / GROUP BY< lista de

atribute> / • HAVING <conditie> / ORDER BY <lista de

atribute>• [ASC / DESC] / UNION

<sub_interogare>]; ... ...

Page 10: LIMBAJUL SQL

• Dupã cum se observã, singurele elemente obligatorii intr-o interogare SQL sunt clauzele SELECT cu lista de atribute ce vor fi extrase şi clauza FROM cu relatiile din care fac parte atributele. Asadar o interogare SQL trebuie sa contina cel putin urmatoarele informatii:

• SELECT <lista de atribute>• FROM <lista de relatii>• restul clauzelor sunt optionale.

Page 11: LIMBAJUL SQL

• Lista de atribute poate consta din :• o serie de atribute separate prin virgulã care vor apãrea în tabela-

rezultat în ordinea explicitatã în linia de comandã, de la stanga la dreapta;

• toate atributele din relatia asupra careia se aplica interogarea, în ordinea în care au fost definite în aceastã relatie (in locul acestei liste se poate utiliza semnul "*");

• expresii formate din urmatoarele elemente:• -atribute şi operatori aritmetici (de exemplu: cantitate*pret_unitar)• -functii standard (de exemplu CTOD( ));• -constante;• -variabile de memorie.• expresii care contin functii SQL agregat cum ar fi AVG( ), MAX( ),

MIN( ), COUNT( ), SUM( ) ...

Page 12: LIMBAJUL SQL

• In exemplele de mai sus, pentru a evita repetarea unor informatii in tabelele rezultat se poate utiliza cuvintul cheie DISTINCT. Optiunea DISTINCT permite eliminarea tuplelor duplicat. In acest mod numai prima aparitie a unui tuplu este afisatã în tabela-rezultat.

• EXEMPLU:• "Sa se afiseze toate orasele resedinte ale furnizorilor,

dar sa apara fiecare oras o singura data in tabela-rezultat"

• SELECT DISTINCT oras• FROM furnizori

Page 13: LIMBAJUL SQL

• Clauza FROM are forma generala:• FROM <<nume relatie>/ <nume

view>[<alias>] ... >• si specifica relatiile (pot fi şi nume de view)

din care vor fi regãsite datele. In cazul în care se operazã cu mai multe tabele, este utilã atribuirea unor prescurtãri, (numite alias) numelor de tabele ce vor fi utilizate în interogare.

Page 14: LIMBAJUL SQL

• 1) "Sa se afiseze codurile furnizorilor şi numerele de comanda corespunzatoare pentru toti furnizorii care a cel putin o comanda"

• SELECT 1.cod_furnizor, B.numar_comanda

• FROM furnizori 1, comenzi B

• WHERE 1.cod_furnizor=B.cod_furnizor

Page 15: LIMBAJUL SQL

• 2) "Sa se afiseze codurile furnizorilor, numele furnizorilor, cantitatile, şi numerele comenzilor pentru toti furnizorii care au cel putin o comanda"

• SELECT A.cod_furnizor, nume_furnizor, cantitate, numar_comanda

• FROM furnizori A, comenzi B• WHERE A.cod_furnizor=B.cod_furnizor

Page 16: LIMBAJUL SQL

• A se observa ca in al doilea exemplu nu s-a mai utilizat notatia cu alias pentru atributul numar_comanda din tabela comenzi deoarece nu este pericol de confuzie. In schimb s-a utilizat notatia pentru a deosebi atributul cod_furnizor din tabela furnizori de atributul cu acelasi nume din tabela comenzi.

Page 17: LIMBAJUL SQL

• Pentru a restrange tuplele ce apar în tabela-rezultat, se specificã o conditie de cãutare prin utilizarea unui predicat de selectie in clauza WHERE.

• Clauza WHERE are forma generala:

• WHERE <predicat> / <expresie>;

• Numai tuplele care satisfac predicatul de selectie vor fi incluse in tabela-rezultat

Page 18: LIMBAJUL SQL

• Predicatul de cãutare poate fi specificat printr-o conditie logica in care se utilizeaza urmatoarele elemente:

• operatori:

• - aritmetici: + - / * ** ^

• - relaţionali: < > <= >= <> != =

• - logici: NOT AND OR

• - operatori SQL: IN, EXISTS, ALL, ANY

Page 19: LIMBAJUL SQL

• sub-interogãri (exprimate prin interogari SQL),cu observatia cã acestea vor fi primele evaluate şi tabela-rezultat trebuie sã corespundã operatorilor ce i se aplicã în continuare.

• Operatorii aritmetici• Acesti operatori sunt binecunoscuti şi

mentionam aici doar faptul ca şi ** şi ^ reprezinta ridicarea la putere.

• Ca operanzi, se pot utiliza atribute, constante, functii sau expresii algebrice. Expresiile algebrice pot aparea in clauzele SELECT sau WHERE.

Page 20: LIMBAJUL SQL

• "Sa se afiseze codul produsului şi valoarea pe care o reprezinta cantitatea de produs comandata la diversi furnizori"

• SELECT cod_produs, cantitate*pret_unitar

• FROM comenzi

• WHERE cantitate<>0

Page 21: LIMBAJUL SQL

• Operatorii relaţionali• < mai mic• > mai mare• ! negarea operatorilor <, >, =. Se obtin operatorii: !

=(diferit), !<(nu mai mic), !>(nu mai mare).• <= mai mic sau egal• => mai mare sau egal• <> diferit• Facem observatia că valorile comparate trebuie să

apartină unor tipuri de date compatibile (care se pot compara intre ele).

Page 22: LIMBAJUL SQL

• "Sa se afiseze codurile plantelor de culoare alba."

• SELECT cod-produs

• FROM flori

• WHERE culoare='alb'

Page 23: LIMBAJUL SQL

• Operatorii logici• Dacã o clauzã WHERE contine mai multe

conditii formate prin utilizarea aceluiasi tip de oparator logic, evaluarea se va face de la stanga la dreapta. tipul de operator logic este dat de precedenta operatorilor. Operatorul NOT are cea mai mare prioritate, urmat de AND şi OR care practic sunt de prioritati egale.

• Pentru a schimba ordinea de evaluare a unei expresii se utilizeazã parantezele rotunde ().

Page 24: LIMBAJUL SQL

• 1) "Sa se afiseze numele plantelor de culoare alba şi de inaltime minima 50 cm"

• SELECT nume_planta• FROM flori• WHERE culoare='alb' AND inaltime>=50• 2) "Sa se afiseze numele, culoarea şi inaltimea

plantelor care fie au culoarea alba fie sunt de inaltime mai mica de 50 cm"

• SELECT nume_planta, culoare, inaltime• FROM flori• WHERE (culoare='alb‘) OR (inaltime<50)

Page 25: LIMBAJUL SQL

• 3) A se observa ca ultima interogare este echivalenta cu interogarea

• SELECT nume_planta, culoare, inaltime

• FROM flori

• WHERE culoare='alb' OR NOT inaltime>=50

Page 26: LIMBAJUL SQL

• Ordonarea tuplelor (clauza ORDER BY)• În exemplele anterioare, tuplele tabelei-rezultat apar în

aceeasi ordine în care au fost introduse. Pentru modificarea ordinii de afisare se utilizeazã clauza ORDER BY. Forma generala a acestei clauze este:

• ORDER BY <(<nume atribut>/<numãr întreg>)(ASC/ DESC)>,...

• Tuplele sunt ordonate în mod implicit în ordine ascendentã (ASC). Ordinea este: 0,...,9,A,...,Z,a,...,z conform codului ASCII. Afisarea în ordine descrescãtoare se poate face prin utilizarea optiunii DESC.

Page 27: LIMBAJUL SQL

• "Sa se afiseze datele despre florile din evidente in ordinea alfabetica a numelor florilor."

• SELECT *• FROM flori• ORDER BY nume_planta, ASC• A se observa ca daca ar fi lipsit mentiunea ASC, ordinea tuplelor ar

fi fost aceeasi deoarece ordinea ascendenta este implicita.• În loc de precizarea numelui atributului dupã care se face

ordonarea, se poate preciza pozitia atributului în lista de atribute specificate în comanda SELECT.

• EXEMPLU:• SELECT oras, cod_furnizor, nume_furnizor• FROM furnizori• ORDER BY 1 DESC, 3 ASC

Page 28: LIMBAJUL SQL

• Operatorul IN permite simplificarea predicatului de cãutare. Predicatul IN testeazã dacã valoarea unui atribut specificat în lista de atribute din clauza WHERE se potriveste uneia din valorile listei specificate în predicatul IN (testeazã apartenenta la o multime).

• "Sa se afiseze toate datele despre furnizorii care au sediul in Bucuresti sau in Brasov sau in Cluj"

• SELECT *• FROM furnizori• WHERE oras IN ('BUCURESTI', 'BRASOV', 'CLUJ')

Page 29: LIMBAJUL SQL

• Functii standard• Functiile standard, cunoscute şi sub numele de functii

agregat, apar in clauza SELECT şi se aplica atributelor din tabelele implicate in interogare. Functii standard sunt:

• -valoarea medie - AVG• -valoarea minima - MIN• -valoarea maxima - MAX• -total(sumare) - SUM• -numãrãtoare - COUNT• NOTA: Nu este permisa utilizarea acestor functii in

clauza WHERE deoarece ele actioneaza la nivel de atribut şi nu la nivel de tuplu.

Page 30: LIMBAJUL SQL

• 1) "Care este cantitatea minima comandata?"• SELECT MIN(cantitate)• FROM comenzi• Spre exemplu,urmãtoarea interogare are ca rezultat

afisarea cantitãtii totale şi a numãrului de produse din fisierul de comenzi.

• SELECT SUM(cantitate), COUNT(*)• FROM comenzi• 2) "Care este cantitatea medie comandata?"• SELECT AVG(cantitate)• FROM comenzi

Page 31: LIMBAJUL SQL

• 3) "Care este cantitatea totala comandata din planta cu cod '202'?"

• SELECT SUM(cantitate)• FROM comenzi• WHERE cod_produs='202'• 4) "Cate tuple contine tabela de flori?"• SELECT COUNT(*)• FROM flori• 5) "Cate culori de flori sunt inregistrate pentru florile din

fisier?"• SELECT COUNT(DISTINCT culoare)• FROM flori

Page 32: LIMBAJUL SQL

• Gruparea rezultatelor (clauza GROUP BY)• În multe cazuri, utilizatorul doreste anumite

situatii sintetice, cum ar fi obtinerea de totaluri şi subtotaluri. Pentru aceaste operatii, limbajul SQL permite utilizarea clauzelor GROUP BY şi HAVING. Aceste clauze organizeazã tuplele în grupuri asupra cãrora se pot realiza anumite operatii, în special prin aplicarea functiilor agregat.

Page 33: LIMBAJUL SQL

• Clauza GROUP BY grupeazã tuplele din relatie dupã atributele cu aceeasi valoare care sunt specificate în clauzã, şi generezã un singur tuplu pentru fiecare grup de tuple cu aceeasi valoare pe atribut.

• Atributele care apar în clauza SELECT pot fi de douã feluri:

• - atribute care alcãtuiesc baza pentru grupare (cele care apar în clauza GROUP BY)

• - atribute care nu participa la gruparea rezultatelor, dar sunt constante pentru grup.

Page 34: LIMBAJUL SQL

• 1) "In ce orase exista furnizori ai florariei?"• SELECT oras• FROM furnizori• GROUP BY oras• In urma executarii interogarii vor apare orasele

din fisierul de furnizori listate o singura data.• 2) "Cati furnizori au sediul in fiecare oras?"• SELECT oras, COUNT(*)• FROM furnizori• GROUP BY oras

Page 35: LIMBAJUL SQL

• 3) "In care orase locuiesc cel putin 3 furnizori?"

• SELECT oras, COUNT(*)

• FROM furnizori

• GROUP BY oras

• HAVING COUNT(*)>=3

• Clauza GROUP BY se poate folosi şi cu clauzele ORDER BY şi WHERE.

Page 36: LIMBAJUL SQL

• 2) "Care furnizori livreaza in interval de cel mult 17 zile?"

• SELECT cod_furnizor

• FROM comenzi

• WHERE timp_livrare<17

• GROUP BY cod_furnizor

Page 37: LIMBAJUL SQL

• Interogari pe mai multe tabele• Una dintre operatiile cele mai frecvente realizate cu mai

multe tabele este jonctiunea sau produsul cartezian. Jonctiunea aminteste de operatiile din algebra relaţionala şi chiar este posibil de realizat (urmand anumite structuri ale interogarii SQL) oricare dintre tipurile de jonctiune prezentate teoretic in cadrul algebrei relaţionale. Se pot de asemenea realiza operatii ca reuniunea, intersectia şi diferenta. Sintaxa interogarii SQL difera de la un SGBD la altul dar sub o forma directa sau printr-o constructie sintactica specifica se pot realiza oricare dintre operatiile amintite.

Page 38: LIMBAJUL SQL

• 1) "Sa se afiseze codurile furnizorilor, numele furnizorilor, cantitatile comandate şi numerele comenzilor"

• SELECT 1.cod_furnizor, nume_furnizor, cantitate, nr_comanda• FROM furnizori 1, comenzi b• WHERE 1.cod_furnizor=b.cod_furnizor• A se observa scrierea cu notarea tuplelor care apartin fiecarei

tabele pentru a evita orice confuzie in legatura cu tabela din care se va extrage informatia. Exista doua atribute in tabele diferite care au acelasi nume: atributele cod_furnizor. Modul de notare de mai sus este acceptat de sintaxa SQL şi diferentiaza atributul cod_furnizor din tabela furnizori de atributul cod_furnizor din tabela comenzi.

Page 39: LIMBAJUL SQL

• 2) "Sa se afiseze datele de mai sus dar numai pentru furnizorii care au adresa in Brasov"

• SELECT 1.cod_furnizor, nume_furnizor, cantitate, nr_comanda

• FROM furnizori 1, comenzi b

• WHERE 1.cod_furnizor=b.cod_furnizor AND oras='Brasov'

Page 40: LIMBAJUL SQL

• 3) "Ce flori au aceeasi inaltime cu laleaua?" A se observa ca aceasta interogare necesita realizarea produsului cartezian al tabelei FLORI cu ea insasi.

• SELECT p1.nume_planta, p2.nume_planta, p1.inaltime, p2.inaltime

• FROM flori p1, flori p2• WHERE p1.inaltime=p2.inaltime AND

p2.nume_planta='LALEA'

Page 41: LIMBAJUL SQL

• Clauza UNION• Clauza UNION permite realizarea reuniunii de tabele. In

cazul cand dorim sa reunim doua sau mai multe tabele, este obligatoriu ca acestea sa fie descrise de scheme de relatie identice (acelasi numar de atribute şi corespunzator – de la stanga la dreapta – atributele din tabele au acelasi nume şi aceeasi descriere). Aceste conditii sunt impuse tabelelor implicate in operatiile intersectie şi minus (diferenta). Operatiile reuniune, intersectie şi diferenta de tabele actioneaza analog cu aceleasi operatii aplicate la multimi.

Page 42: LIMBAJUL SQL

• Forma generala a reuniunii de tabele este:• SELECT A1 ,…, Am• FROM • [WHERE …]• UNION• SELECT A1 ,…, Am• FROM …• [WHERE …]

Page 43: LIMBAJUL SQL

• 1) "Sa se afiseze numele plantelor şi codurile plantelor albe care au inaltimea fie mai mica decat 20 cm fie mai mare decat 50 cm."

• SELECT nume_planta, cod_produs• FROM flori• WHERE culoare='alb' AND inaltime<20• UNION• (SELECT nume_planta, cod_produs• FROM flori• WHERE culoare='alb' AND inaltime>50)

Page 44: LIMBAJUL SQL

• . Subinterogari (clauze SELECT imbricate)• Unul din motivele pentru care SQL este

considerat un limbaj puternic de interogare este acela cã oferã posibilitatea construirii interogãrilor complexe, formate din mai multe subinterogãri simple.

• Aceste interogãri complexe sunt construite prin includerea în clauza WHERE a inca unei clauze SELECT.

Page 45: LIMBAJUL SQL

• . Forma generala a unei astfel de constructii este:

• SELECT < lista atribute1 >

• FROM < lista relatii1 >

• WHERE < subinterogare >

• Se observa ca aceasta constructie a fost deja utilizata in exemplul de mai sus care ilustreaza o clauza UNION.

Page 46: LIMBAJUL SQL

• In constructia de mai sus clauza SELECT interioarã genereazã valorile pentru conditia de cãutare a clauzei SELECT exterioare care o contine. Clauza SELECT exterioarã genereazã o relatie pe baza valorilor generate de cãtre clauza interioarã. Modul de constuire a interogãrii exterioare depinde de numãrul valorilor returnate de cãtre interogarea interioarã .În acest sens, putem distinge:

• - subinterogãri care returneazã o singurã valoare

• - subinterogãri care returneazã mai multe valori.

Page 47: LIMBAJUL SQL

• Din punctul de vedere al ordinii de evaluare al interogãrilor putem distinge:

• subinterogãri simple• Interogarea interioarã este evaluatã prima, independent

de interogarea exterioarã. Rezultatul evaluãrii interogãrii interioare este utilizat de cãtre interogarea exterioarã .

• subinterogãri corelate• Valorile returnate de cãtre interogarea interioarã depind

de valorile returnate de cãtre interogarea exterioarã. Interogarea interioarã este evaluatã repetat pentru fiecare tuplu cercetat de interogarea exterioara.

Page 48: LIMBAJUL SQL

• Subinterogãri simple care returnezã o singurã valoare

• Aceste interogãri au urmãtoarea sintaxã:• SELECT < lista atribute >• FROM < lista relatii > • WHERE < atribut > (< subinterogare

>)• unde este un operator relaţional: = <

> >= <= !=

Page 49: LIMBAJUL SQL

• SELECT nume_planta• FROM flori• WHERE inaltime=• (SELECT inaltime• FROM flori• WHERE nume_planta='LALEA')• Aceeasi interogare poate oferi lista numelor de plante in ordine alfabetica

inversa daca se utilizeaza şi o clauza ORDER BY.• SELECT nume_planta• FROM flori• WHERE inaltime=• (SELECT inaltime• FROM flori• WHERE nume_planta='LALEA')• ORDER BY nume_planta DESC

Page 50: LIMBAJUL SQL

• Procesul de evaluare a acestei interogãri se desfãsoarã astfel:

• Se evalueazã în primul rînd interogarea interioarã. Conditia de evaluare a interogãrii interioare este nume_planta='LALEA'.

• Valoarea obtinuta pentru atributul inaltime (sa presupunem ca laleaua are 30 cm) este stocata într-o tabela temporara. Rezultatul evaluãrii interogãrii interioare devine conditie de cãutare pentru interogarea exterioarã, care ar putea fi exprimata in aceasta faza ca:

• SELECT nume_planta• FORM flori• WHERE inaltime=30

Page 51: LIMBAJUL SQL

• In urma executarii interogarii exterioare este creatã o relatie finalã, ce va contine tuplele a cãror inaltime este aceeasi cu valoarea stocata în tabela temporarã.

• Interogarea interioarã poate contine în clauza WHERE şi conditii complexe, formate prin utilizarea operatorilor logici (NOT, AND, OR) şi a functiilor agregat (AVG, MAX, …).

Page 52: LIMBAJUL SQL

• "Sa se afiseze numele plantelor care au inaltimea minima"

• SELECT nume_planta

• FORM flori

• WHERE inaltime=

• (SELECT MIN(inaltime)

• FROM flori)

Page 53: LIMBAJUL SQL

• Subinterogãri simple care returnezã mai multe valori

• Principiul de construire a acestui tip de interogare imbricatã utilizeazã în clauza WHERE conditii, care evaluate, genereazã o multime de valori. In aceastã categorie intrã operatorii (NOT) IN, (NOT) ANY, (NOT) ALL, (NOT) EXISTS.

Page 54: LIMBAJUL SQL

• 1) "Care furnizori mai au inca de executat livrari?"

• SELECT nume_furnizor• FROM furnizori• WHERE cod_furnizor IN• (SELECT cod_furnizor• FROM comenzi• GROUP BY cod_furnizor)

Page 55: LIMBAJUL SQL

• 2) "Care furnizori, dintre furnizorii obisnuiti ai florariei, nu mai au nimic de livrat?"

• SELECT nume_furnizor• FROM furnizori• WHERE cod_furnizor NOT IN• (SELECT cod_furnizor• FROM comenzi• GROUP BY cod_furnizor)• A se observa ca cele doua interogari difera doar prin

operatorul logic NOT. De asemenea se poate remarca faptul ca prima interogare aminteste de apartenenta din teoria multimilor iar a doua interogare corespunde operatiei minus (diferenta).

Page 56: LIMBAJUL SQL

• Daca versiunea SQL nu are un cuvant rezervat pentru operatia diferenta intre tabele, se poate construi aceasta operatie cu ajutorul predicatului NOT IN ca in exemplul de mai sus.

Page 57: LIMBAJUL SQL

• 3) "Care furnizori au numarul maxim de comenzi de flori?"

• SELECT nume_furnizor• FROM furnizori• WHERE cod_furnizor IN• (SELECT cod_furnizor• FROM comenzi• GROUP BY cod_furnizor• HAVING COUNT(*)=• (SELECT MAX(COUNT(cod_furnizor))• FROM comenzi• GROUP BY cod_furnizor))

Page 58: LIMBAJUL SQL

• Subinterogãri corelate• În exemplele de panã acum, interogarea interioarã era evaluatã

prima, dupã care valoarea sau valorile rezultate erau utilizate de cãtre clauza WHERE din interogarea exterioarã.

• Exista şi o alt forma de subinterogare şi anume subinterogarea corelatã, caz în care interogarea exterioarã transmite repetat cîte o valoare pentru interogarea interioarã.

• De fiecare datã cînd este transmisã o valoare, este evaluatã interogarea interioarã. Dacã ambele interogãri acceseazã acelasi tabel, trebuie asigurate alias-uri pentru fiecare referintã la tabelul respectiv. Ambele interogãri accesezã tuple diferite din acelasi tabel în acelasi moment.

Page 59: LIMBAJUL SQL

• "Sa se afiseze culoarea, inaltimea şi numele plantelor pentru plantele cu inaltimea maxima, ordonate dupa culoare"

• SELECT culoare, inaltime, nume_planta• FROM flori f• WHERE inaltime=• (SELECT MAX(inaltime)• FROM flori• WHERE culoare=f.culoare)• ORDER BY culoare

Page 60: LIMBAJUL SQL

• Operatorul EXISTS• Operatorul EXISTS verificã dacã pentru fiecare tuplu al

relatiei existã tuple care satisfac conditia interogãrii interioare. In cazul în care existã asemenea tuple, EXISTS ia valoarea de adevãr TRUE. Astfel, operatorul EXISTS permite specificarea mai multor atribute în interogarea interioarã. Acest lucru este posibil deoarece nu se verificã valoarea unui anumit atribut ca în cazurile anterioare, ci se genereazã o valoare de adevãr (TRUE sau FALSE), dupã cum existã sau nu existã o anumitã valoare într-o relatie diferitã de cea utilizatã în interogarea exterioarã.

• Ca şi operatorii ANY şi ALL, operatorul EXISTS apare in clauza WHERE.

Page 61: LIMBAJUL SQL

• "Care plante au un pret unitar egal sau mai mic cu cea mai ieftina planta de culoare alba?"

• SELECT nume_planta, pret_unitar, culoare• FROM flori f• WHERE NOT EXISTS• (SELECT *• FROM flori• WHERE culoare='alb' AND pret_unitar>f.pret_unitar)• Interogarea SELECT interioarã defineste o tabela care contine

acele tuple pentru care se verifica conditia din clauza WHERE interna. Daca nu exista nici o planta de culoare alba şi care sa aiba pretul unitar mai mare decat pretul unitar din tuplul curent, conditia NOT EXISTS este evaluatã la valoarea logica TRUE.

Page 62: LIMBAJUL SQL

• Se dau următoarele relaţii cu schemele lor:• -Scări (Nr_bloc, Scara, Lift)• -

Apartamente(Nr_bloc,Scara,Apartament,Suprafaţa,Cutii_poştale, Nr_prize_tv)

• - Familii (Nr_mat, Nr_pers, Nr_pers_prez, Nr_chei)

• -Locatari (Nr_Mat, Nr_bloc, Scara, Etaj, Apartament,Nume)

Page 63: LIMBAJUL SQL

• Să se exprime în SQL cererile:• (tabel nominal cu locatarii de pe scara = 3 din bloc = 34)

= R1• (tabel nominal cu locatarii de pe scara = 1 din bloc = 34)

= R2• (tabel nominal cu locatarii de pe scara = 2 din bloc = 34)

= R3• tabel nominal cu locatarii de pe scările 1,2,3 ale blocului

34• lista apartamentelor cu suprafaţa mai mare decât 50 mp• tabel nominal cu persoanele carelocuiesc pe scara 3

bloc 34 şi nu locuiesc şi pe scara 1 a aceluiaşi bloc

Page 64: LIMBAJUL SQL

Recommended