sql structured query language ) - cig2.ase.rocig2.ase.ro/acreditare/cv/f1521-limbajul-sql-1.pdf ·...

54
SGBD Access 2013: LIMBAJUL SQL SQL ( Structured Query Language )

Upload: dokhuong

Post on 10-Apr-2018

249 views

Category:

Documents


3 download

TRANSCRIPT

SGBD Access 2013: LIMBAJUL SQL

SQL ( Structured

Query Language )

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);

I

COMPUNERE CU WHERE 2 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

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;