Sunteți pe pagina 1din 20

Limbajul SQL : tipuri de instruciuni

SQL, formatul frazei SELECT (INNER


JOIN, LEFT/RIGHT JOIN)

Limbajul SQL
este unul dintre cele mai vechi limbaje de programare
a fost implementat pentru prima la inceputul anilor 70 de ctre firma IBM n
scopul procesrii datelor memorate n structuri relaionale.
are la baz algebra relaional,
obiectivele SQL au vizat de la nceput definirea structurilor de date i
manipularea ulterioar a datelor (operaii de adugare, tergere, actualizare i
consultare), precum i asigurarea unui set de instruciuni pentru controlul
accesului la date.
dei este prezentat n multe lucrri ca un limbaj declarativ , SQL prezint n
cele mai multe dintre versiuni i elemente caracteristice limbajelor procedurale
de-a lungul timpului, limbajul SQL a fost adoptat i de ctre ali productori de
sisteme de gestiune a bazelor de date, precum Oracle sau Microsoft, ceea ce a
condus la apariia mai multor dialecte ale limbajului
1986 a fost declarat de ctre ANSI (American National Standards Institute)
drept limbaj standard utilizat n sistemele de gestiune pentru bazele de date
relaionale
1987 SQL a devenit standard ISO (International Organization for
Standardization)

Limbajul SQL n Microsoft Access


2013
Dialectul SQL pentru Microsoft Access este o versiune simplificat a

limbajului T-SQL utilizat n MS SQL Server


Are particulariti specifice produselor din pachetul Office i
elemente de sintax mai permisive
n spatele fiecrei interogri (query) realizat prin interfaa grafic
QBE se genereaz automat codul n limbajul SQL aferent interogrii.
Exist situaii n care anumite interogri complexe pot fi rezolvate
mai simplu prin scrierea codului direct n SQL
Varianta generat automat n SQL la realizarea interogrii prin
modul Design (QBE) conine multe elemente opionale (precum
parantezele sau denumirile de tabele ce preced numele de
cmpuri), care fac instruciunile s par mai complicate dect sunt
n realitate
Generarea unui query prin interfaa QBE poate fi utilizat pentru
nvarea limbajului SQL prin studierea codului generat automat de
ctre sistem

Definirea unei interogri n


limbajul SQL

Limbajul SQL reguli de sintax


Se utilizeaz punctul . ca separator ntre numele tabelei i numele cmpului, atunci
cnd o interogare are ca surs de date mai multe tabele sau interogri si exist cmpuri ce
au acelai nume n sursa de date. De exemplu: Factura.CodFurnizor;
Se utilizeaz parantezele drepte [ ] pentru a ncadra nume de cmpuri ori tabele ce conin
spaii. De exemplu: [Concedii angajati].[Data Concediu];
n cazul interogrilor parametrizate, parametrii se vor completa ncadrai ntre paranteze
drepte. De exemplu: [Tastati cod furnizor];
Se utilizeaz virgula pentru a delimita elementele unei liste. De exemplu IN(10,11,16,20);
Se utilizeaz virgula pentru a delimita argumentele funciilor. 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#;
Orice fraz SQL se va termina cu semnul ; (n Access aceasta regula este opional);
Limbajul SQL pentru Access nu face distincie ntre majuscule i minuscule;
Este permis scrierea unei instruciuni pe unul sau mai multe rnduri.

Limbajul SQL cuvinte cheie


Instruciunile care determin tipul de aciune ce urmeaz a fi executat. De
exemplu:

CREATE (definirea structurii unui tabel)


INSERT (adugarea de nregistrri)
DELETE (tergerea de nregistrri)
UPDATE (actualizarea de nregistrri)
SELECT (consultarea unei surse de date i afiarea rezultatelor)

Clauzele care determin sursa de date, impunerea de criterii de filtrare asupra


sursei de date sau pot realiza ordonri ori grupri ale datelor. De exemplu:

FROM (stabilete sursa de date pentru o interogare SQL)


WHERE (impunerea unor condiii de selecie asupra nregistrrilor din sursa de date)
ORDER BY (sortarea nregistrrilor)
GROUP BY (gruparea datelor)

Funciile cu rolul de a facilita efectuarea de calcule n cadru comenzilor SQL. De


exemplu (Sum, Max, Avg, Year, Month, Iif, etc.)
Operatorii (aritmetici, logici, de atribuire si comparare)

Limbajul SQL selecia datelor

SELECT [DISTINCT | DISTINCT ROW | TOP n ] list cmpuri


selectate/calculate
FROM Sursa de date
[ WHERE condiii aplicate nregistrrilor negrupate (nainte de
gruparea datelor)]
[ GROUP BY lista cmpuri de grupare ]
[ HAVING condiii aplicate nregistrrilor grupate ]
[ ORDER BY cmp1 [ASC / DESC] [, camp2, ...] ]

Limbajul SQL selecia datelor


DISTINCT - elimin nregistrrile duplicate returnate de interogare (duplicatele sunt
identificate pe baza cmpurilor selectate);
DISTINCTROW- elimin nregistrrile duplicate returnate de interogare atunci cnd n
sursa de date este format din mai multe tabele;
TOP N afieaz numai primele N nregistrri rezultate din interogare;
FROM specific sursa de date (sursa poate fi compus din unul sau mai multe tabele
sau alte interogri)
WHERE permite definirea unor criterii de filtrare a datelor nainte de realizarea
eventualelor grupri;
GROUP BY conine numele cmpurilor dup care se vor grupa datele, separate prin
virgul;
HAVING permite adugarea unor criterii de filtrare a datelor rezultate n urma gruprii.
Se utilizeaz pentru funcii de tip agregat (SUM, COUNT, MIN, MAX, etc.)
ORDER BY conine denumirile cmpurilor folosite la sortarea datelor.
Cuvintele cheie ASC sau DESC semnific sortarea ascendent sau descendent i sunt
opionale. Implicit sortarea se realizeaz ascendent (ASC).

Limbajul SQL selecia datelor


Alte observaii:
o comand de tip SELECT trebuie s conin obligatoriu instruciunea
SELECT i clauza FROM (celelalte elemente sunt opionale i se
adaug n funcie de cerinele informaionale pentru care a fost
proictat interogarea).
cmpurile din lista ce urmeaz instruciunii SELECT sunt separate
prin virgul
atribuirea unui nume (alias) pentru un cmp calculat se realizeaz
prin cuvntul cheie AS (de exemplu Pret*Cantitate AS Valoare).
n SQL pentru Access nu se pot utiliza denumirile de tip alias pentru
cmpuri n clauzele WHERE, GROUP BY, HAVING sau ORDER BY.
dac se dorete afiarea n lista de rezultate a tuturor cmpurilor din
sursa de date, lista de cmpuri ce urmeaz instruciunii SELECT
poate fi nlocuit de simbolul *.

Exemplul 1. S se afieze informaiile privind contractele realizate n zilele de 3


ianuarie 2014 i 9 ianuarie 2014, pentru care valoarea tarifului negociat este
cuprins ntre 900000 lei i 1500000.
SELECT *
FROM Contract
WHERE (DataContract=#4/1/2014# OR DataContract=#9/1/2014# )
AND TarifNegociat>=900000 AND TarifNegociat<=1500000

SELECT *
FROM Contract
WHERE DataContract IN(#4/1/2014# , #9/1/2014# )
AND TarifNegociat BETWEEN 900000 AND 1500000

Exemplul 2. Sa se afieze lista ordonat alfabetic cu numele i


prenumele angajailor nscui n luna aprilie care locuiesc n
Bucureti (observaie: adresele sunt nregistrate n formatul
Bucureti, strada 1 Mai, nr 15

SELECT NumeANG, PrenumeAng


FROM Angajat
WHERE CNPAngajat LIKE "???04*" AND Adresa NOT LIKE
"Bucuresti*"
ORDER BY NumeAng, PrenumeAng

Exemplul 3. Care sunt ultimii 3 salariai angajai n firm ?

SELECT TOP 3 NumeAng, PrenumeAng


FROM Angajat
ORDER BY DataAng DESC

Exemplul 4. Care sunt localitile din care provin clienii firmei


(fiecare localitate va figura o singur dat n list) ?
SELECT DISTINCT LocalitateCL FROM Client

Exemplul 5. Calculai pentru fiecare angajat numrul de zile


lucrate la fiecare contract iar, pentru cei care au lucrat mai mult
de 3 sptmni la un contract, se va va afia ntr-un cmp numit
observaii textul De verificat. Lista de rezultate va fi ordonat
ascendent, dup numrul contractului i, n cazul n care mai
multe persoane au lucrat la acelai contract, se va ordona
descresctor dup numrul de zile lucrate.
SELECT CNPAngajat, NrContract, DataSfarsit-DataInceput
AS ZileLucrate,
Iif(ZileLucrate>21, "de verificat", "-") AS Observatii
FROM Lucreaza
ORDER BY NrContract ASC, DataSfarsit-DataInceput DESC

Exemplul 6. Calculai pentru fiecare ofert valabil n data de 10


ianuarie 2014 tariful de baz calculat n euro. Cursul euro va fi
specificat prin parametru n momentul interogrii bazei de date.
SELECT CodOferta, TarifBaza, TarifBaza/[Tastati curs euro]
AS TarifBazaEuro
FROM Oferta
WHERE DataInceputValab<=#10/1/2013# and
DataSfarsitValab>=#10/1/2013#

Interogri cu surs de date format din


mai multe tabele/interogri
legturile realizate prin intermediul cmpurilor cheie primar cheie extern pot fi
descrise n clauza FROM utiliznd predicatul JOIN conform sintaxei:
FROM Tabel1 [INNER]|[RIGHT]|LEFT] JOIN Tabel2 ON Tabel1.Camp1=Tabel2.Camp2
INNER JOIN (implicit), setul de rezultate al interogrii va conine doar nregistrile din
Tabel1 care au corespondent n Tabel2 prin intermediul cmpului de legtur.
RIGHT JOIN, setul de rezultate va conine toate nregistrrile din Tabel2, indiferent dac au
sau nu corespondent n primul tabel (cel din stnga n acest caz).
LEFT JOIN va conduce la preluarea n setul de rezultatea tuturor nregistrrilor din tabelul
Tabel1.
n toate cazurile, setul final de rezultate va depinde de eventualele condiii precizate n
clauzele WHERE sau HAVING.
O soluie alternativ la descrierea legturilor dintre tabele n clauza FROM o reprezint
specificarea modului de compunere a nregistrrilor rezultate prin intermediul condiiilor
din clauza WHERE (se condiioneaz ca valorile cheii primare s fie egale cu cele ale cheii
externe corespondente).

Exemplul 1 (JOIN): S se afieze lista alfabetic a contractelor nefinalizate,


specificnd i codul i numele clientului pentru fiecare dintre acestea.
SELECT DISTINCT NrContract, Client.CUIClient, DenumireCL
FROM Client INNER JOIN Contract ON
Client.CUIClient=Contract.CUIClient
WHERE DataFinContract>Date()
Exemplul 1 (WHERE):
SELECT DISTINCT NrContract, Client.CUIClient, DenumireCL
FROM Client, Contract
WHERE DataFinContract>Date() AND
Client.CUIClient=Contract.CUIClient

Exemplul 2 (LEFT/RIGHT JOIN): S se afieze lista contractelor


ordonate cronologic i descrierea ofertei pentru fiecare dintre
acestea.
SELECT DISTINCT NrContract, DataContract,
DescriereOfert
FROM Contract LEFT JOIN Oferta ON
Contract.CodOferta=Oferta.CodOferta
ORDER BY DataContract

Exemplul 3 (RIGHT JOIN) Care sunt clienii pentru care nu s-au


ntocmit contracte?
SELECT Client.CUIClient, DenumireCL
FROM Contract RIGHT JOIN Client ON
Contract.CUIClient=Client.CUIClient
WHERE Contract.CUIClient IS NULL