Sunteți pe pagina 1din 59

Limbajul SQL

partea II
Definirea unei interogări în limbajul SQL
Limbajul SQL – reguli de sintaxă
• Se utilizează punctul “.” ca separator între numele tabelei și numele
câmpului. De exemplu: Comanda.CodClient;
• Se utilizează parantezele drepte [ ] pentru a încadra nume de câmpuri
sau tabele. De exemplu: [Comanda].[DataComanda];
• În cazul interogărilor parametrizate, parametrii se vor completa
încadrați între paranteze drepte. De exemplu: [Tastati orasul];
• Se utilizează virgula pentru a delimita elementele unei liste.
De exemplu IN(10,11,16,20);
Limbajul SQL – reguli de sintaxă
• Se utilizează virgula pentru a delimita argumentele funcțiilor. De
exemplu: IIF(Valoare>100, Valoare*1.2, Valoare*1.15);
• Valorile de tip șir de caractere se vor încadra între ghilimele. De
exemplu “Ionescu Ion”;
• Valorile de tip dată calendaristică se vor marca între simboluri #. De
exemplu #12/10/2014#;
• Semnul “;” marchează sfârșitul frazei SQL, în ACCESS nu este
obligatoriu ca fraza SQL să se finalizeze cu ;.
• Limbajul SQL pentru Access nu face distincţie între majuscule și
minuscule;
• Este permisă scrierea unei instrucţiuni pe unul sau mai multe rânduri.
SQL - Gruparea datelor
SELECT [listă selecţie funcţie agregată(nume câmp) AS alias]
FROM nume tabelă(e)
WHERE criteriu de selecţie
[GROUP BY câmp(uri) de grupare]
[HAVING criteriile asociate câmpurilor de grupare sau
funcțiilor agregate ]
[ORDER BY listă câmpuri criterii de ordonare {ASC/DESC}];
Să se afișeze valoarea fiecărei
SQL - GROUP BY comenzi.
SELECT NrComanda,
SUM([Cantitate]*[Pret]) AS Valoare
FROM ContinutulComanda
GROUP BY NrComanda;
1.Se ordonează liniile tabelei ContinutulComanda după
NrComanda;
2. Se constituie un grup pentru fiecare valoare distinctă
aferentă atributului NrComanda;
3. Se aplică funcţia agregată SUM asupra grupurilor;
4. Se obţine rezultatul, al cărui număr de linii coincide cu
valorile distincte ale câmpului NrComanda.
Să se afișeze produsele pentru care media
SQL - HAVING preturilor este mai mare decât 4.
SELECT CodProdus, AVG(Pret) AS PretMediu
FROM ContinutComanda
GROUP BY CodProdus
HAVING AVG(Pret)>4
SQL - Să se afișeze produsele pentru care media preturilor în
anii 2005 și 2006 a fost mai mică decât 4.
WHERE ,
HAVING SELECT CodProdus, AVG(Pret) AS PretMediu
FROM ContinutComanda INNER JOIN Comanda ON
ContinutComanda.NrComanda=Comanda.NrComanda
WHERE YEAR(DataComanda) IN (2005, 2006)
GROUP BY CodProdus
HAVING AVG(Pret)<=4
Să se afișeze produsele pentru care media preturilor pe
SQL - fiecare din anii 2005 și 2006 a fost mai mică decât 4.
WHERE , SELECT CodProdus, AVG(Pret) AS PretMediu,
HAVING YEAR(DataComanda)
FROM ContinutComanda INNER JOIN Comanda ON
ContinutComanda.NrComanda=Comanda.NrComanda
GROUP BY CodProdus,YEAR(DataComanda)
HAVING YEAR(DataComanda) IN (2005, 2006) AND
AVG(Pret)<=4
Să se afișeze produsele pentru care media preturilor
SQL - fost mai mică decât 4. Se vor lua în considerare doar
WHERE , prețurile mai mari decât 3.
HAVING SELECT CodProdus, AVG(Pret) AS PretMediu

FROM ContinutComanda
WHERE Pret>3
GROUP BY CodProdus
HAVING AVG(Pret)<=4
SQL - Subinterogari

O subinterogare sau o interogare imbricată


presupune ca setul de rezultate obţinut de la o
interogare să constituie argument pentru o altă
(interogare în interogare).
SQL - Să se afișeze produsele pentru care numărul
comenzilor în 2006 a fost mai mic decât numărul total
Subinterogari al comenzilor din primul semestru al anului 2005.
SELECT CodProdus, COUNT(Comanda.NrComanda)
FROM ContinutComanda INNER JOIN Comanda ON
ContinutComanda.NrComanda=Comanda.NrComanda
WHERE YEAR(DataComanda)=2006
GROUP BY CodProdus
HAVING COUNT(Comanda.NrComanda) <
(SELECT COUNT(NrComanda)
FROM Comanda
WHERE DataComanda BETWEEN #1/1/2005# AND #30/6/2005#)
SQL - Să se afișeze produsele pentru care numărul
comenzilor în 2006 a fost mai mic decât numărul total
Subinterogari al comenzilor din primul semestru al anului 2005.
SQL - Să se afișeze produsele care nu au fost
Subinterogari comandate.
(NOT IN)
SELECT *
FROM Produs
WHERE CodProdus NOT IN
(SELECT CodProdus
FROM ContinutComanda)
SQL - ALL
ALL are în vedere compararea valorii de ieşire a subinterogării cu
fiecare înregistrare din interogarea externă.
Comparația returnează TRUE dacă se verifică pentru fiecare din
valorile din coloana returnată de subinterogare.
Să se afișeze produsele cu cel mai mare preț de vânzare.
SELECT CodProdus, Pret
FROM ContinutComanda
WHERE Pret>= ALL
(SELECT Pret
FROM ContinutComanda)
SQL - ALL
Să se afișeze comenzile cu cele mai mai multe produse conținute.

SELECT NrComanda, COUNT(CodProdus) AS Nr


FROM ContinutComanda
GROUP BY NrComanda
HAVING COUNT(CodProdus)>= ALL
(SELECT COUNT(CodProdus)
FROM ContinutComanda
GROUP BY NrComanda )
SQL - EXISTS
EXISTS: foloseşte subinterogarea ca pe o condiţie, analizând
setul de rezultate al acesteia şi returnând valoarea False dacă nu
există nici o ieşire.
Se poate astfel verifica existenţa anumitor înregistrări şi controla
ansamblul răspunsurilor date de interogare.
Să se afișeze produsele care au fost comandate.
SELECT * FROM Produs
WHERE EXISTS
(SELECT * FROM ContinutComanda
WHERE ContinutComanda.CodProdus= Produs.CodProdus ) ;
TRANSFORM funcţie agregat AS alias
SQL - CROSSTAB Instrucţiune de selecţie cu grupare pe
linie
PIVOT câmp antet coloană ;
Funcţia agregat operează asupra înregistrărilor, prin definirea
calculului aplicat elementelor de grup;
Instrucţiunea de selecţie serveşte pentru a specifica antetele de
rând ale rezultatelor interogării;
Câmpul antet coloană constituie câmpul sau expresia ce se
utilizează în definirea antetelor de coloane, pentru setul de
rezultate al interogării.
SQL - CROSSTAB
TRANSFORM AVG(Pret) AS PretMediu
SELECT Denumire
FROM Comanda , ContinutComanda, Produs
WHERE Produs.CodProdus = ContinutComanda.CodProdus AND
Comanda.NrComanda = ContinutComanda.NrComanda
GROUP BY Produs.Denumire
PIVOT YEAR(DataComanda)
SQL - UNION
Dacă se doreşte să se vizualizeze rezultatele mai multor
interogări SELECT în acelaşi timp, prin combinarea ieşirilor lor,
poate fi utilizată facilitatea UNION a limbajului de interogare SQL.

SELECT Client.CodClient, Client.DenumireClient, Client.OrasClient


FROM Client
UNION
SELECT Furnizor.CodFurnizor, Furnizor.DenumireFurnizor,
Furnizor.OrasFurnizor
FROM Furnizor;
SQL - UNION
SQL - UNION ALL
UNION ALL permite afișarea în rezultat a tuturor înregistrărilor,
chiar și repetarea celor care se regăsesc în ambele tabele.

SELECT Client.CodClient, Client.DenumireClient, Client.OrasClient


FROM Client
UNION ALL
SELECT Furnizor.CodFurnizor, Furnizor.DenumireFurnizor,
Furnizor.OrasFurnizor
FROM Furnizor;
SQL - UNION ALL
SQL - UNION , ORDER BY
Rezultatul reuniunii (UNION) poate fi ordonat în funcție de oricare
dintre câmpurile acestuia. În fraza SQL ce conține UNION clauza
ORDER BY apare o singură dată la final.
SELECT Client.CodClient, Client.DenumireClient, Client.OrasClient
FROM Client
UNION
SELECT Furnizor.CodFurnizor, Furnizor.DenumireFurnizor,
Furnizor.OrasFurnizor
FROM Furnizor
ORDER BY OrasClient, DenumireClient
SQL - UNION ,
ORDER BY
SQL - UNION
Dacă se dorește să se vizualizeze rezultatele mai multor
interogări SELECT în același timp, cu afișarea unei valori distincte
în funcție de tabelul de proveniență, poate fi utilizată facilitatea
UNION și a unei expresii constante pentru fiecare frază SELECT.
SELECT Client.CodClient, Client.DenumireClient, Client.OrasClient,
"Client" AS Tip
FROM Client
UNION
SELECT Furnizor.CodFurnizor, Furnizor.DenumireFurnizor,
Furnizor.OrasFurnizor, "Furnizor" as Tip
FROM Furnizor;
SQL - UNION
Interogări/cereri de tip acțiune
● Adăugarea de înregistrări într-un tabel existent (INSERT)
● Modificarea înregistrărilor unui tabel (UPDATE)
● Ștergerea înregistrărilor dintr-un tabel (DELETE)
● Crearea unui tabel nou din rezultatul unei interogări (SELECT..INTO..
)
SQL - INSERT INTO
INSERT INTO nume_tabelă (câmp1, câmp2,....)
VALUES (valoare_1, valoare_2,.....);

INSERT INTO nume_tabelă (câmp1, câmp2,....)


SELECT câmp1, câmp2,....
FROM ….
SQL - INSERT INTO Să se adauge produsul Biscuiți susan, cu codul 77 din
categoria Alimentare. Unitatea de măsura este Kg.
SQL - INSERT INTO Să se adauge produsele din categoria ambalaje în
tabelul „Produse Alimentare”,
SQL - UPDATE
UPDATE nume_tabelă
SET nume_câmp=valoare_1
[,nume_câmp=valoare_2].....
[WHERE criteriu de actualizare a valorilor tuplurilor];
SQL - UPDATE Să se micșoreze cu 10% prețul
tuturor produselor comandate.

Dacă nu se menționează condiții, se


modifică toate înregistrările tabelului!
SQL - DELETE
DELETE *
FROM nume_tabelă
[WHERE criteriu de ştergere a înregistrărilor];
SQL - DELETE Să se șteargă toți clienții care nu sunt din
București.

Dacă nu se menționează condiții,


se șterg toate înregistrările
tabelului!
SQL - SELECT.. INTO ...
SELECT câmp1, câmp2,....
INTO nume tabelă nouă
FROM nume_tabelă_sursă
[WHERE criteriu de adăugare a înregistrărilor în tabela
nouă];
Să se creeze o nouă tabelă „Produse Alimentare”,
SQL - SELECT.. INTO ... care va conține produsele alimentare.
Operatorii relaţionali de bază - operatori unari
● Proiecția
● Selecția
Operatori unari - proiecția
● Proiecţia unei relaţii/tabele T cu o anumită structură de
atribute, după un set de atribute din cadrul acesteia este
o altă relaţie/tabelă T1, care va avea ca structură setul de
atribute aplicate prin proiecție. Înregistrările/tuplurile
relației/tabelei T1, obținute prin proiecție, sunt cele din
relația/tabela inițială T, mai puțin atributele și valorile
care nu fac parte din criteriul de proiecție. Înregistrările/
tuplurile duplicat pot fi eliminate sau nu, în funcție de
scop.

T= PROIECTIEC (T1)
Operatori unari - exemplu proiecție Access
Proiecție aplicată pe tabelul Client, după atributele
DenumireClient, OrasClient
SELECT DenumireClient, OrasClient
FROM Client
Operatori unari - selecția
● Selecția aplicată unei relaţii/tabele T cu o anumită
structură de atribute, înseamnă aplicarea unui criteriu C
asupra valorilor atributelor specificate în criteriu. În urma
aplicării selecției rezultă o altă relaţie/tabelă T1, care va
avea ca structură aceleași atribute ca în relația/tabela
inițială T. Înregistrările/tuplurile relației/tabelei T1,
obținute prin selecție, sunt cele din relația/tabela inițială T,
rezultate prin aplicarea criteriului C.

T= SELECTIEC (T1)
Operatori unari - exemplu selecție Access
● Selecție aplicată tabelului Client, după criteriul
OrasClient="Bucuresti" or OrasClient="Brasov"

SELECT *
FROM Client
WHERE OrasClient =”Bucuresti” OR
OrasClient=”Brasov”

● Atributele din rezultat sunt


aceleași ca în tabelul Client.
● Criteriul aplicat este cel care
stabilește ce înregistrări se vor
afișa în rezultat.
Operatori unari - exemplu selecție Access
● Selecție aplicată tabelului Client, după criteriul
OrasClient="Bucuresti" or OrasClient="Brasov"
SELECT *
FROM Client
WHERE OrasClient =”Bucuresti” OR
OrasClient=”Brasov”
Operatorii relaţionali - operatori binari
● Produsul cartezian
● Reuniunea
● Intersecția
● Diferența
● Compunerea (join)
● Diviziunea (împărțirea)
Operatori binari- produsul cartezian
● Produsul cartezian a două relaţii/tabele T1 şi T2
(T1xT2) este o relaţie/tabelă T care stochează mulţimea
perechilor obţinute prin concatenarea înregistrărilor
aparţinând lui T1 cu cele aparţinând lui T2.

● Produsul cartezian conține practic toate combinațiile


posibile dintre întregistrările tabelelor T1 și T2.
T= T1 x T2
Operatori binari- exemplu produs cartezian
● Produsul cartezian dintre tabelele Client și Produs.

X
SELECT * Client x Produs = ?
FROM Client, Produs
5x4=?
Operatori binari- exemplu produs cartezian
Operatori binari- compunerea
● Compunerea (join) a două relaţii/tabele T1 şi T2, unde
T1 este formată din n atribute/coloane şi T2 este formată
din m atribute/coloane, are ca rezultat o a treia relaţie/
tabelă T, produsul cartezian al celor două tabele sursă,
fiind alese doar acelea care îndeplinesc o anumită
condiţie specificată în cadrul compunerii. Numărul de
atribute/coloane ale rezultatul compunerii este m+n.

T=T1 JOINC T2 sau T = SELECTC (T1 x T2)


Operatori binari- Compunerea
JOINCifraAfaceri Between MinCifraAfaceri
AND MaxCifraAfaceri

SELECT *
FROM Client, Reducere
WHERE CifraAfaceri BETWEEN =
MinCifrAfceri AND MaxCifraAfaceri
Operatori binari- echicompunerea
● EchiCompunerea este compunerea pentru care condiţia
este alcătuită numai din egalităţi, putând conţine una sau
mai multe egalităţi. În cazul echicompunerii, în tabela
rezultat apar două câmpuri ce au valori identice.
Operatori binari- compunerea externă
● Compunerea externă este o echicompunere dar care,
spre deosebire de aceasta, afişează şi tuplurile care nu
au corespondent în cadrul celor două tabele sursă
LEFT JOINClient.OrasClient=
Oras.Oras

=
Operatori binari- compunerea externă
● Compunerea externă este o echicompunere dar care,
spre deosebire de aceasta, afişează şi tuplurile care nu
au corespondent în cadrul celor două tabele sursă
RIGHT JOINClient.OrasClient=
Oras.Oras

=
Operatori binari- reuniunea
● Reuniunea a două relaţii/tabele T1 şi T2, cu aceeaşi
structură, unde T1 este formată din n tupluri/înregistrări şi
T2 este formată din m tupluri/înregistrări, are ca rezultat o
a treia relaţie/tabelă T, având aceeaşi structură cu a
relaţiilor/tabelelor sursă şi conţinând m+n tupluri/
înregistrări.

T= T1 U T2
Operatori

binari - reuniunea
Reuniunea nu poate fi exemplificată în QBE, datorită limitărilor interfeței
grafice
● Se poate realiza în limbajul SQL, folosind UNION

SELECT Codclient,
DenumireClient,
OrasClient
FROM Client
UNION
U = SELECT CodFurnizor,
DenumireFurnizor,
OrasFurnizor
FROM Furnizor
Operatori binari - intersecția
● Intersecția a două relaţii/tabele T1 şi T2, cu aceeaşi
structură, unde T1 este formată din n tupluri/înregistrări şi
T2 este formată din m tupluri/înregistrări, are ca rezultat o
a treia relaţie/tabelă T, având aceeaşi structură cu a
relaţiilor/tabelelor sursă şi conţinând doar înregistările
comune ale celor două relații T1 și T2. Numărul de
tupluri/înregistrări ale rezultatul intersecției este cel mult
minumul dintre m și n.
Operatori binari - intersecția
● Intersecția poate fi exemplificată în SQL prin utilizarea subinterogarilor sau
prin combinarea unui produs cartezian și a unei selecții.

SELECT *
FROM Client, Furnizor
WHERE CodClient=CodFurnizor AND
DenumireClient=DenumireFurnizor
AND OrasClient=OrasFurnizor

SELECT *
U FROM Client
WHERE CodClient IN ( SELECT CodFurnizor
FROM Furnizor)

=
Operatori binari- diferența
● Diferența poate fi exemplificată în SQL prin utilizarea subinterogarilor

SELECT *
FROM Client
WHERE CodClient NOT IN ( SELECT CodFurnizor
FROM Furnizor)

=
Operatori binari - diviziunea (împărțirea)
● Diviziunea presupune împărţirea unei tabele T1,
denumită deîmpărţit, la o tabela denumită împărţitor T2
rezultând o altă tabela T denumită cât, astfel încât orice
tuplu al tabelei cât T trebuie să se regăsească în cadrul
tuplurilor tabelei deîmpărţit T1 în combinaţie cu fiecare
tuplu din tabela împărţitor T2. Pentru a putea să aibă sens
diviziunea, tabela împărţitor T2 trebuie să aibă ca atribute
un subset al atributelor tabelei deîmpărţit T1.
T= T1 : T2, T x T2 este inclus in T1
Operatori binari- diviziunea
● Diviziunea este utilă pentru a se evidenția produsele care s-
au vândut în anumite orașe.

: =

X =

S-ar putea să vă placă și