Limbajul SQL (Structured Query Language):
Este un limbaj declarativ (neprocedural) care permite o
comunicare complexă şi rapidă a utilizatorului cu bazele de
date, în funcţie de cerinţele şi restricţiile informaţionale ale
acestuia.
Prin acest limbaj utilizatorul descrie informaţiile pe care
vrea să le obţină în urma interogării, fără a preciza
algoritmii necesari pentru obţinerea rezultatelor dorite.
SQL - face parte din categoria limbajelor de aplicaţii
(orientate pe mulţimi) pentru baze de date relaţionale.
Este un limbaj standard - ca urmare principalele sale
instrucţiuni sunt recunoscute de către mai multe SGBD-uri
(Oracle, Access, Dbase, INFORMIX, DB2, Visual FoxPro.)
Caracteristici
Facilităţi orientate obiect ce propun definirea la
nivel de utilizator a tipurilor de date abstracte;
Structuri de control specifice: IF, FOR, WHILE
Comunicare în reţea;
Prelucrare distribuită;
Facilităţi multi-media, înglobate în modulul
Multi - Media SQL.
Pe lângă manipularea şi regăsirea datelor, SQL
efectuează şi operaţii complexe privind actualizarea
şi administrarea bazei de date.
SGBD Access 2013: SQL
În funcţie de rolul lor în manipularea datelor şi tranzacţiilor,
instrucţiunile SQL, pot fi grupate în:
1. instrucţiuni de definire a datelor care permit
descrierea structurii bazei de date;
2. instrucţiuni de manipulare a datelor în sensul
adăugării, modificării şi ştergerii înregistrărilor;
3. instrucţiuni de selecţie a datelor care permit
consultarea bazei de date;
4. instrucţiuni de procesare a tranzacţiilor care privesc
unităţile logice de prelucrare şi constituie în fapt,
operaţii multiple de manipulare a datelor;
5. instrucţiuni de control al cursorului;
6. instrucţiuni privind controlul accesului la date.
SGBD Access 2013: SQL
Cuvintele cheie ale “vocabularului” SQL (fraza SQL) sunt:
instrucţiunile, clauzele, funcţiile şi operatorii.
• Instrucţiunile: au cel mai important rol, deoarece determină
executarea unei acţiuni (SELECT; CREATE; INSERT; DELETE;
UPDATE; TRANSFORM; ALTER; DROP).
• Clauzele restricţionează aria valorică a entităţilor ce participă la
interogare (WHERE; ORDER BY; GROUP BY; HAVING).
• Funcţiile îmbunătăţesc capacităţile SQL de a manipula datele
(Sum; Max; Min; Avg; Count; Iif).
• Operatorii efectuează o comparare a valorilor selecţiei:
= ; > ; >= ; < ; <= ; <>; And; Or; Not; Between;
Like; In
SGBD Access 2013: SQL
Reguli de sintaxă ale unei fraze SQL:
• Orice frază SQL se va termina cu semnul “;”
• Se utilizează punctul (“.”) ca separator între numele tabelului
şi numele câmpului, atunci când o interogare are ca surse de
date mai multe tabele (SELECT Carti.Nume_autor);
• Se utilizează parantezele drepte (“[ ]”) pentru a încadra nume
de câmpuri interspaţiate sau purtătoare de caractere neaceptate
de SQL (SELECT Materiale.[Denumire Material])
• Se utilizează virgula (“,”) pentru a delimita elementele
(parametrii) unei liste (SELECT Cod_Mat, Den_Mat, etc.)
• Elementele de tip şir de caractere se vor marca între ghilimele
(“text”), iar valorile de tip dată/timp se vor marca între #.
• Caracterele de înlocuire generice sunt “?” sau “*”
CREAREA UNEI INTEROGARI SQL
1. CREATE
2. QUERY DESIGN
3. CLOSE (SHOW TABLE)
4. UNION / PASS TROUGTH / DATA
DEFINITION
5. INTRODUCERE INSTRUCTIUNI SQL
Ex. SELECT ALL a1 FROM A;
6. RUN
7. SAVE ( SAVE AS..)
SGBD Access 2013: SQL SELECT
LMD: I.a. Interogări (simple) de selecţie
SELECT [domeniu]
<listă selecţie câmpuri>
FROM <nume tabel(e)>
[WHERE <criteriu de selecţie>]
[ORDER BY <listă câmpuri criterii de
ordonare> {ASC/DESC}];
[ ]- optional
< > - cuvinte utilizator
{ } – la alegere
Domeniul - determină modalităţile de manipulare
a înregistrărilor din BD asupra căreia operează
selecţia.
Domeniul poate fi:
• ALL (implicit) include toate înregistrările care
îndeplinesc condiţiile impuse;
• DISTINCT elimină înregistrările care au valori
duplicate în câmpurile selectate (se va afişa doar o
apariţie a datei multiple)
•TOP n – primele n
SGBD Access 2013: SQL SELECT
SELECT [domeniu: ALL / DISTINCT / TOP n] <listă selecţie
câmpuri>
FROM <nume tabel(e)>
[WHERE <criteriu de selecţie>]
[ORDER BY <listă câmpuri criterii de ordonare> {ASC/DESC}];
Clauza FROM <nume tabel > precizează tabelul sau tabelele (sau
interogări deja create) din care fac parte câmpurile ce se utilizează
pentru proiecţia BD
<Listă selecţie câmpuri> - reprezintă proiecţia BD, cuprinzând
toate câmpurile care vor apărea în tabelul cu rezultatele interogării
Clauza WHERE precizează criteriul de selecţie sub forma unei
expresii. Clauza este opţională şi nu operează cu funcţii totalizatoare
Clauza ORDER BY - criteriul de ordonare a înregistrărilor selectate.
Fiecare câmp precizat în Clauza ORDER BY constituie o cheie de
sortare (sensul sortării se precizează prin ASC (implicit) sau DESC)
SGBD Access 2013: SQL SELECT : Exemple
Tabelul A
a1 a2 a3 a4 a5 a6
Selectarea câmpurilor a1 şi a2 din A
SELECT ALL a1,a2
FROM A;
Selectarea (fără dubluri) a lui a1 şi a5
pentru care a5> 1000
SELECT DISTINCT a1,a5
FROM A
WHERE a5>1000;
Selectarea (fără dubluri )a lui a5 > 1000 şi a3=“text”
SELECT DISTINCT a5
FROM A
WHERE a5>1000 AND a3=”text”;
Selectarea lui a5 pt care a3 are o rădăcină precizată
SELECT DISTINCT a5
FROM A
WHERE a3 LIKE ”*ESCU”;
SGBD Access 2013: SQL SELECT : Exemple
Tabelul A
a1 a2 a3 a4 a5 a6Selectarea (fără dubluri) a lui a5 <> (100,1000)
SELECT DISTINCT a5
FROM A
WHERE a5
(NOT) BETWEEN 100 AND 1000
Selectarea lui a1 şi a rezultatului a2*a5
produs dintre înregistrările tabelei A
SELECT a1, a2*a5 AS Valoare
FROM A
Selectarea câmpurilor a2, a4 şi a5 din A pt.
care a2 să ia valorile 1500, 13000 şi 14000,
cu ordonare crescătoare a lui a2 şi
descrescătoare a lui a5
SELECT a2,a4,a5
FROM A
WHERE a2 IN(1500, 13000, 14000)
ORDER BY a2 ASC, a5 DESC;
Access 2013: SQL I.b. INTEROGARI SIMPLE CU FUNCȚII AGREGAT
SELECT funcţie_agregat1, funcţie_agregat2... AS
[Alias 1], [Alias 2], ...n,...
FROM <nume tabel(e)>
WHERE <criteriu de selecţie>
Funcții agregat:
•Count (<>Null);•Sum(nume atribut) Σ;•Min(nume atribut) ;•Max (nume atribut) •Avg (nume atribut);•Iif(([Valoare]<5000000,0,[Valoare]*0.15) AS Reducere
Access 2013: SQL I.b. INTEROGARI SIMPLE CU FUNCȚII AGREGAT
Tabela A
a1 a2 a3 a4 a5 a6
SELECT DISTINCT Max(a5) AS
[a5_Maxim], Min(a5) AS
[a5_Minim], Avg(a5) AS [a5_Medie]
FROM A;
SELECT COUNT(*) AS [Număr de tupluri]
FROM A;
SELECT a1, a5, a6, IIF(a5>=a6;a5-a6;a6-a5) AS [Rezultat evaluare]
FROM A
WHERE a2 IS NOT NULL;
Selectarea celei mai mari / mai mici / şi
medii valori a lui a5 din tabela A
Numărarea înregistrărilor din tabela A
Selectarea rezultatului evaluării
unei condiţii, pentru care a2 este
diferit de zero
SELECT funcţie_agregat1 AS [Alias1], ...2,...
FROM <nume tabel(e)>
WHERE <criteriu de selecţie>
Obs. În lipsa opţiunii GRUP BY, la utilizarea
funcţiilor agregat, rezultatul va conţine o singură linie
Count (<>Null);Sum Σ;Min ;Max
Avg;Iif
Exemple:
• Se dă structura tabelelor de date:
Facturi(NrFact, Datafact, Datascad, Codfiscal)
Continut Factura(Codisbn, NrFact, Cantitate, PretF)
1. Sa se afiseze numarul si data facturilor emise pentru toti
clientii:
SELECT FACTURI.NrFact, FACTURI.datafact
FROM FACTURI;
2. Sa se afiseze cantitatea maxima si minima facturata clientilor:
SELECT MAX(CANTITATE) AS CANTITATE_MAXIMA,
MIN(CANTITATE) AS CANTITATE_MINIMA FROM
[CONTINUT FACTURA];
SGBD Access 2013: SQL SELECT
LMD: II Interogări (complexe) de selecţie şi grupare
SELECT [domeniu] [ listă selecţie funcţii agregate(nume câmp) AS Alias]
FROM <nume tabel(e)>
WHERE <criteriu de selecţie>
[GROUP BY <câmp(uri) de grupare>]
[HAVING <criteriul câmpului de grupare>][ORDER BY <listă câmpuri criterii de ordonare> {ASC/DESC}];
Funcţiile de grup (agregat) permit construirea unor interogări SQL
prin care utilizatorul poate să efectueze diverse calcule pentru
grupuri de înregistrări care au câmpuri de aceeaşi valoare.
Listă selecţie se referă la una sau mai multe funcţii agregate care au
ca argumente nume de câmpuri ale tabelei(lor) bazei de date. Aceste
câmpuri trebuie să fie în mod obligatoriu numerice.
AS ALIAS asociază un pseudonim aferent rezultatului unui calcul
simplu sau unei funcţii agregat.
LMD: II. Interogări (complexe) de selecţie şi grupare
SELECT [domeniu] [listă selecţie funcţie agregată (nume câmp) AS
alias] […, listă selecţie] FROM <nume tabel(e)> WHERE <criteriu de selecţie>
[GROUP BY <câmp(uri) de grupare>]
[HAVING <criteriul câmpului de grupare>][ORDER BY listă câmpuri criterii de ordonare {ASC/DESC}];
Clauza GROUP BY precizează câmpul sau câmpurile pe baza cărora se
va efectua gruparea înregistrărilor. Se pot executa funcţiile agregate
descrise în lista de selecţie pentru fiecare dintre grupurile de inregistrări
Clauza GROUP BY formează grupuri de tupluri ale unei relaţii, pe
baza valorilor comune luate de un atribut.
Rezultatul unei fraze SELECT ce conţine clauza GROUP BY se
obţine prin regruparea tuturor liniilor din tabelele enumerate în
FROM, extrăgându-se câte o singură apariţie pentru fiecare valoare
distinctă a coloanei sau a grupului de coloane
[HAVING <criteriul câmpului de grupare>]
HAVING se referă la restricţia aplicată criteriului de
selectie pe grupuri de atribute.
- Clauza HAVING activează restricţia după gruparea
înregistrărilor, în timp ce clauza WHERE acţionează
înainte de gruparea înregistrărilor.
Deci, prin asocierea clauzei HAVING la GROUP BY este
posibilă selectarea anumitor grupuri de tupluri ce
îndeplinesc un criteriu numai la nivel de grup.
[ORDER BY < listă câmpuri criterii de ordonare>
{ASC/DESC}]- ordoneaza selectia dupa valorile
câmpurilor menţionate.
SGBD Access 2013: SQL SELECT –
LMD: Interogări (complexe) de selecţie şi grupare
Tabela A (Conţinut Factură)
a1 a2 a3 a4
100
100
100
305 25 12500
208 10 20000
85 30 10000
101
101
208 8 20000
74 10 30000
103
103
90 5 5000
74 25 30000
Tabela R
a1 a5=SUM(a3*a4)
100 812500
101 460000
103 775000
SELECT a1, SUM(a3*a4) AS a5
FROM A
GROUP BY a1;
1.Se ordonează liniile tabelei A după a1;
2. Se constituie un grup pentru fiecare valoare distinctă aferentă atributului a1;
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 lui a1
Exp. Interogări (complexe) de selecţie şi grupare
SELECT NRFACT, SUM(CANTITATE*PRETF) AS
VALOARE
FROM [CONTINUT FACTURA]
GROUP BY NRFACT;
Exp: Interogări (complexe) de selecţie şi grupare
SELECT NRFACT, SUM(CANTITATE*PRETF) AS VALOARE
GROUP BY NRFACT
HAVING SUM(CANTITATE*PRETF)>490;
Exp. Interogări (complexe) de selecţie şi grupare
SELECT NRFACT, SUM(CANTITATE*PRETF) AS
VALOARE
FROM [CONTINUT FACTURA]
WHERE CANTITATE>7
GROUP BY NRFACT
HAVING SUM(CANTITATE*PRETF)>1400;
SGBD Access 2013: SQL SELECT
Tabelul A
a1 a2 a3 a4
100
100
100
305 25 12500
208 10 20000
85 30 10000
101
101
208 8 200000
74 10 300000
103
103
90 5 5000
74 25 30000
Tabela R
a1 a5=SUM(a3*a4)
100 812500
103 775000
SELECT a1, SUM(a3*a4) AS a5
FROM A
GROUP BY a1
HAVING SUM(a3*a4) >500000;
460000
SELECT a1, SUM(a3*a4) AS a5
FROM A
WHERE a3>5
GROUP BY a1
HAVING SUM(a3*a4) >750000;
Tabela R1
a1 a5=SUM(a3*a4)
100 812500
SGBD Access 2013: SQL SELECT
Tabela B
b1 b2 b3 b4 b5 a1
SELECT b1, b2, b4, b5, b3*b4 AS [produs b3 şi b4]
FROM B
WHERE b2=”criteriu text”
GROUP BY b4
HAVING Sum(b3*b4)>300000;
SELECT b1, b2, Avg(b3) AS [medie b3], Count(*) AS [Total]
FROM B
GROUP BY b3,
HAVING Avg(b3) > 250000 AND Count (*)>5;
a) SGBD Access 2013: SQL SELECT: COMPUNERE cu WHERE
SELECT [domeniu] <listă selecţie
câmpuri din tabele diferite>
FROM <nume tabele>
[WHERE <criteriu de compunere>
[şi de selecţie]]
[ORDER BY <listă câmpuri criterii de
ordonare> {ASC/DESC}];
LMD: III Interogări de asociere (joncţiune / compunere) internă
Compunerile echivalente (EchiCompunerile) - utilizează clauza
WHERE (pt selecţia înregistrărilor) asociată cu o egalitate a valorilor
în câmpurile de legătură.
T1, T2,.....
T1.a1, T1.a2 …
T2.a1,
.........
a) SGBD Access 2013: SQL SELECT: WHERE
Tabela A
a1 a2 a3 a4 a5 a6
Tabela B
b1 b2 b3 b4 b5 a1
Tabela C
c1 c2 c3 c4 C5 a1
LMD: III Interogări de asociere (joncţiune / compunere) internă
Clauza WHERE (pt selecţia înregistrărilor) este asociată cu o egalitate a valorilor
în câmpurile de legătură.
• A compus cu B şi A compus cu cu C
SELECT A.a1, A.a2, B.b1, C.c1,C.c3
FROM A, B, C
WHERE A.a1=B.a1 AND A.a1=C.a1
ORDER BY C.c3;
SELECT A.a1, B.b2*
B.b3 AS Total
FROM A, B
WHERE A.a1=B.a1 AND
A.a5>=10000;
A compus cu B
SELECT A.a1, A.a2, B.b1, B.b4, B.b5
FROM A, B
WHERE A.a1=B.a1;
Exemplu:
SELECT Facturi.[Numar Factura], Facturi.[Data Facturii],
Facturi.[Cod Fiscal],[Continut Factura].[Cod ISBN], [Continut
Factura].Cantitate, [Continut Factura].[Pret f], [Cantitate]*[Pret f] AS
Valoare
FROM Facturi,[Continut Factura]
WHERE Facturi.[Numar Factura] = [Continut Factura].[Numar
Factura];
Compunerea a 2 tabele (WHERE)
Exemplu:
Compunerea a 3 tabele (WHERE)
SELECT
Facturi.[Numar Factura], Facturi.[Data Facturii],
[Continut Factura].Cantitate, [Continut Factura].[Pret f],
[Cantitate]*[Pret f] AS Valoare,
Clienti.[Cod Fiscal], Clienti.[Denumire Client],
FROM Facturi, [Continut Factura],Clienti
WHERE
Facturi.[Numar Factura]=[Continut Factura].[Numar Factura]
AND
Clienti.[Cod Fiscal] = Facturi.[Cod Fiscal];
b) SGBD Access 2013: SQL SELECT : COMPUNERE
CU JOIN
SELECT [domeniu] <listă selecţie câmpuri din
tabele diferite>
FROM <nume tabel_1>
{ INNER / LEFT OUTER / RIGHT OUTER }
JOIN <nume tabel_2>
ON <criteriu asociere>
[WHERE <criteriu de selecţie>
[ORDER BY <listă câmpuri criterii de
ordonare> {ASC/DESC}];
b) SGBD Access 2013: SQL SELECT : JOIN
SELECT [domeniu] <listă selecţie câmpuri din tabele diferite>
FROM <nume tabel_1>
{INNER/LEFT OUTER/RIGHT OUTER } JOIN <nume
tabel_2>
ON <criteriu asociere>[WHERE <criteriu de selecţie>
[ORDER BY <listă câmpuri criterii de ordonare> {ASC/DESC}];
SELECT A.a5, B.b3, (A.a5*B.b3) AS [Produs]
FROM A
INNER JOIN B ON A.a1=B.a1;
SELECT A.a1, A.a2, A.a5, B.b1, C.c1
FROM A
INNER JOIN B
ON (A.a1=B. a1 );
• A compus cu
rezultatul compunerii
dintre B şi C
Tabela A
a
1
a2 a3 a4 a5 a
6
Tabela B
b1 b2 b3 b4 b5 a1
Tabela C
c1 c2 c3 c4 c5 b1
(INNER JOIN C ON B.b1=C.b1)
b) SGBD Access 2013: SQL SELECT: JOIN
O compunere internă (INNER) sau echivalentă
(echicompunere) este aceea în care liniile unui tabel
sunt combinate cu liniile altui tabel pentru care
există egalitate între câmpurile de legătură (cazul 1
din Join Properties).
LEFT OUTER JOIN (1n) include toate înregistrările din tabelul A
(cardinalitate “1”) şi numai acele înregistrări din tabelul B
(cardinalitate “n”) pentru care valorile atributelor cheie (a1) sunt egale
(cazul 2 din Join Properties).
RIGHT OUTER JOIN (1n) include toate înregistrările din
tabelul “B” (cardinalitate “n”) şi numai acele înregistrări din tabelul
“A” (cardinalitate “1”) pentru care valorile atributelor cheie (a1) sunt
egale (cazul 3 din Join Properties).
Tabela A
a1 a2 a3 a4 a5 a6
Tabela B
b1 b2 b3 b4 b5 a1
Exemplu:
SELECT Facturi.[Numar Factura], Facturi.[Data Facturii],
Facturi.[Cod Fiscal], [Continut Factura].[Cod ISBN], [Continut
Factura].Cantitate, [Continut Factura].[Pret f], [Cantitate]*[Pret f] AS
Valoare
FROM Facturi INNER JOIN [Continut Factura]
ON Facturi.[Numar Factura] = [Continut Factura].[Numar Factura];
Compunerea a 2 tabele (INNER)
Exemplu:
SELECT Facturi.[Numar Factura], Facturi.[Data Facturii],
[Continut Factura].Cantitate, [Continut Factura].[Pret f],
[Cantitate]*[Pret f] AS Valoare,
Clienti.[Cod Fiscal], Clienti.[Denumire Client]
FROM Clienti INNER JOIN Facturi
ON Clienti.[Cod Fiscal] = Facturi.[Cod Fiscal];
Compunerea a 3 tabele (INNER)
(INNER JOIN [Continut Factura]
ON
Facturi.[Numar Factura] = [Continut Factura].[Numar Factura])
Exemplu:
SELECT Facturi.[Numar Factura],
[Continut Factura].Cantitate, [Continut Factura].
[Pret f], [Cantitate]*[Pret f] AS Valoare,
IIf([Valoare]<5000000,0,[Valoare]*0.15) AS Reducere
FROM Facturi
INNER JOIN [Continut Factura]
ON
Facturi.[Numar Factura] = [Continut Factura].[Numar Factura];
DISCOUNT LA VALOARE FACTURĂ
FACTURILE PE LUNA MARTIE 2012
SELECT facturi.nrfact, facturi.datafact, facturi.codfiscal,
[continut factura].codisbn,[continut factura].cantitate,
[continut factura].pretf,
[continut factura].cantitate*[continut factura].pretf AS Valoare,
Month([facturi.Datafact]) AS Luna,
Year([facturi.Datafact]) AS Anul
FROM facturi INNER JOIN [continut factura] ON
facturi.nrfact=[continut factura].nrfact
WHERE Month([Datafact])=3 AND Year([Datafact])=2012;
SQL IV SubInterogări SELECT în SELECT în .....Tabela A
a1 a2 a3 a4 a5 a6
O subinterogare sau o interogare imbricată presupune ca setul de
rezultate obţinut de la o interogare să constituie argument pentru o
alta (interogare în interogare).
SELECT [domeniu] <listă selecţie câmpuri >
FROM <nume tabel>
[WHERE <nume_câmp> operatori [> , < , >=, <=, <> , = , IN ]
(SELECT <nume_câmp>
FROM <nume tabel>
[WHERE <criteriu de selecţie>]);
SELECT DISTINCT a1,a3,a5
FROM A
WHERE a5 > (SELECT a5 FROM A WHERE a3=“text”);
a) Subinterogări construite pe o singură tabelă
Afișarea numărului de contract, codului furnizorilor si
datei pentru cei care au data contractului 17 aprilie 2012
SELECT DISTINCT [Nrcontract], codfz, DATA
FROM CONTRACTE
WHERE CODFZ IN
(SELECT CODFZ FROM CONTRACTE WHERE
([DATA]= #4/17/2012#));
Informatii referitoare numai despre contractul 111.
SELECT [Nrcontract], codfz, DATA
FROM CONTRACTE
WHERE CODFZ IN
(SELECT CODFZ FROM CONTRACTE WHERE
(NRCONTRACT=111));
Informatii despre toate contractele, în afară de contractul
111.
SELECT [Nrcontract], codfz, DATA
FROM CONTRACTE
WHERE CODFZ NOT IN
(SELECT CODFZ FROM CONTRACTE WHERE
(NRCONTRACT=111));
SELECT a1
FROM A
WHERE a2 IN (SELECT a2 FROM A WHERE a1=1120);
Execuţia interogării se va derula în doi timpi:
Tabela A
a1 a2 a3 a4 a5 A6
1118 05.11.2007 aaa bbb 30 50
1119 06.11.2007 ddd eee 45 74
1120 06.11.2007 rrr ttt 36 58
1121 06.11.2007
Care sunt elementele a1 (facturile)
emise în aceeaşi zi cu elementul a1
(factura) 1120?
executarea subcererii (SELECT a2 FROM A WHERE a1=1120) se
materializează într-o singură tabelă intermediară cu o singură linie.
a2
06.11.2007
executarea
cererii principale,
adică selecţia lui
a1din tabela A,
pentru care există
condiţia
a1
1119
1120
1121
NUMĂRUL DE CONTRACTELOR INCHEIATE CU FURNIZORII
DUPĂ 01/05/2009
SELECT [CODFZ], Count(*) AS NUMAR
FROM (SELECT * FROM CONTRACTE
WHERE [DATA]>#1/1/2009#)
GROUP BY [codFZ];
SQL IV. SubInterogări SELECT în SELECT în .....
Tabela A
a1 a2 a3 a4 a5 a6
Tabela B
b1 b2 b3 b4 b5 a1
SELECT [domeniu] <listă selecţie câmpuri>
FROM <nume tabel_1>
[WHERE <tabel_1.câmp legătură>=
(SELECT <câmp legătură>
FROM <nume tabel_2>
[WHERE <criteriu de selecţie pentru subinterogare>])
SELECT a1,a2,a5
FROM A
WHERE A.a1=(SELECT a1 FROM B WHERE b4>25000);
B) Subinterogări construite pe mai multe tabele
Legătura dintre
tabele se realizează
prin subinterogare
(fără o compunere
explicită)
Legătura dintre
tabele se realizează
printr-o compunere
explicită (JOIN)
Selectarea unor valori din A, pentru o valoare
restricţionată din B
Cum se numeste localitatea unde clientul cu codul=3 are
facturi ?SELECT CLIENTI.[COD-CL], LOCALITATE
FROM CLIENTI
WHERE CLIENTI.[COD-CL] IN
(SELECT FACTURI.[COD-CL]
FROM FACTURI
WHERE FACTURI.[COD-CL]=3);
SELECT Facturi.nrfact, Facturi.datafact,
Facturi.codfiscal,
[Continut Factura].codisbn,
[Continut Factura].cantitate,
[Continut Factura].pretf, [Continut
Factura].cantitate*[Continut Factura].pretf
AS Valoare
FROM Facturi, [Continut Factura]
WHERE Facturi.nrfact=[Continut
Factura].nrfact;
WHERE 3 tabele
SELECT Facturi.nrfact, Facturi.datafact,
Facturi.codfiscal, [Continut factura].codisbn,
[Continut factura].cantitate, [Continut
factura].pretf, [Continut
factura].cantitate*[Continut factura].pretf AS
valoare, Clienti.codfiscal, Clienti.denumirecl
FROM Facturi, [Continut factura], Clienti
WHERE Facturi.nrfact=[Continut
factura].nrfact And
Clienti.codfiscal=Facturi.codfiscal;
COMPUNERE CU INNER JOIN
SELECT FACTURI.nrfact, FACTURI.datafact,
FACTURI.codfiscal, [CONTINUT
FACTURA].codisbn, [CONTINUT
FACTURA].cantitate, [CONTINUT
FACTURA].pretf, [CONTINUT
FACTURA].cantitate
*[CONTINUT FACTURA].pretf
AS valoare
FROM FACTURI INNER JOIN [CONTINUT
FACTURA] ON FACTURI.nrfact=[CONTINUT
FACTURA].nrfact;
COMPUNERE CU LEFT JOIN
SELECT Facturi.nrfact, Facturi.datafact,
Facturi.codfiscal, [Continut factura]
.codisbn, [Continut factura].cantitate,
[Continut factura].pretf, [Continut
factura].cantitate*[Continut factura].pretf
AS valoare
FROM Facturi LEFT JOIN [Continut
factura] ON Facturi.nrfact=[Continut
factura].nrfact;
RIGHT JOIN
SELECT Facturi.nrfact,
Facturi.datafact, Facturi.codfiscal,
[Continut factura].codisbn, [Continut
factura].cantitate, [Continut factura].
pretf, [Continut factura].cantitate *
[Continut factura].pretf AS valoare
FROM Facturi RIGHT JOIN [Continut
factura] ON Facturi.nrfact=[Continut
factura].nrfact;
REDUCERE VALOARE CU 20% PENRU FACTURILE CU SUMA
<=250 LEI
SELECT FACTURI.NRFAC, SUM([CONTINUT
FACTURA].[CANTITATE]*[CONTINUT
FACTURA].[PRETF]) AS VALOARE,
IIF([VALOARE]<=250,[VALOARE]*0.2,0) AS
REDUCERE
FROM FACTURI RIGHT JOIN [CONTINUT
FACTURA] ON FACTURI.NRFACT =
[CONTINUT FACTURA].NRFACT
GROUP BY FACTURI.NRFACT;
REDUCERE PARAMETRU
SELECT FACTURI.NRFACT,
SUM([CONTINUT
FACTURA].[CANTITATE]*[CONTINUT
FACTURA].[PRETF]) AS VALOARE,
IIF([VALOARE]<=250,[VALOARE]*[TASTATI
PROCENT DE REDUCERE],0) AS
REDUCERE
FROM FACTURI RIGHT JOIN [CONTINUT
FACTURA] ON FACTURI.NRFACT =
[CONTINUT FACTURA].NRFACT
GROUP BY FACTURI.NRFACT;