Sunteți pe pagina 1din 7

Laborator 6

COMENZI SQL PENTRU JONCTIUNI (EXTRAGEREA


DATELOR DIN MAI MULTE TABELE)

1. Partea teoretica

1.1. Operaţii şi operatori SQL


Pentru extragerea datelor din mai multe tabele sunt implementaţi operatorii pe mulţimi
definiţi în algebra relaţională. Pentru relaţii compatibile (cu aceeaşi structură) sunt definite
operaţiile de: reuniune, intersecţie, scădere, iar pentru alte asocieri operaţiile de joncţiune
(compunere).

1.2. Interogǎri compatibile


Sunt considerate interogǎri compatibile, comenzile SELECT care îndeplinesc următoarele
condiţii:
- comenzile SELECT trebuie să aibă acelaşi număr de coloane şi de acelaşi tip
- numele coloanelor care se afişează sunt cele din prima comandă SELECT
- dimensiunea coloanei rezultat este aceea a celei mai mari
- opţiunea DISTINCT este implicită (excepţie operatorul UNION ALL).

1.2.1. Operatorul UNION


Implementează reuniunea a două interogări compatibile. Sunt eliminate liniile duplicat..
Operatorul UNION ALL realizează reuniunea cu linii duplicat.
Utilizare
SELECT nume,functie,salariu FROM personal WHERE id_facultate=1
UNION
SELECT nume,functie,salariu FROM personal WHERE id_facultate=2

sau
SELECT nume,functie,salariu FROM personal WHERE id_facultate=1
UNION ALL
SELECT nume,functie,salariu FROM personal WHERE id_facultate=2

1.2.2. Operatorul INTERSECT


(nu este implementat la Access)
Implementează intersecţia a două interogări compatibile. Sunt eliminate liniile duplicat..
Utilizare
SELECT functie,salariu FROM personal WHERE id_facultate=1
INTERSECT
SELECT functie,salariu FROM personal WHERE id_facultate=2

1.2.3. Operatorul MINUS


(nu este implementat la Access)
Implementează diferenţa a două interogări compatibile. Sunt eliminate liniile duplicat..
Utilizare
SELECT functie,salariu FROM personal WHERE id_facultate=1
MINUS
SELECT functie,salariu FROM personal WHERE id_facultate=2

Se poate utiliza clauza ORDER BY la sfârşitul interogării.

1.3. SQL. Implementarea operatorului JOIN


Operatorul JOIN specifică joncţiunea (relaţia, legătura, asocierea) dintre tabele în extragerea
datelor din ele. În SQL sunt implementate operaţii pentru operatorii EQUI-JOIN, THETA-
JOIN, OUTER-JOIN, SELF-JOIN.
Joncţiunile implementate sunt:
1. joncţiuni echivalente - EQUI-JOIN
2. joncţiuni neechivalente - THETA-JOIN
3. joncţiuni externe - OUTER-JOIN
4. autojoncţiuni - SELF-JOIN.

1.3.1. Specificarea joncţiunii


Specificarea condiţiei de joncţiune se realizează în clauza WHERE. Tabelele din care se
extrag datele sunt specificate în clauza FROM, iar denumirile de coloane pot fi prefixate de
numele tabelulul astfel: tabel.coloană. În cazul în care denumirea de coloană este neambigua
se poate specifica doar coloana (adică se ştie cărui tabel aparţine).

1.3.2. Produsul cartezian


Produsul cartezian apare dacă se specifică coloane din mai multe tabele şi nu se specifică o
condiţie de joncţiune între tabele.
Exemplu:
SELECT personal.nume, facultate.nume_facultate
FROM personal, facultate
Interogarea va afisa toate combinaţiile dintre valorile celor două coloane.

1.4.SQL. Joncţiuni echivalente - EQUI-JOIN

1.4.1. Specificarea joncţiunii în clauza WHERE


In joncţiunile echivalente valorile dintr-o coloană a unui tabel sunt egale cu valorile unei
coloane din celălalt tabel. Se pot extrage date din cele două tabele care verifică condiţia.
Se pot adăuga condiţii adiţionale în clauza WHERE.
Sintaxă SQL:
SELECT [tabel1.]coloană, [tabel2.]coloană, ….
FROM tabel1, tabel2, …
WHERE tabel1.coloană1=tabel2.coloană2
Exemplu: Sa se afişeze numele şi denumirea specializării angajaţilor din tabelul personal:
SELECT personal.nume, facultati.nume_facultate
FROM personal, facultati
WHERE personal.id_facultate=facultati.id_facultate

Adăugarea condiţiilor adiţionale se realizează în clauza WHERE astfel:


Exemplu: Sa se afişeze numele şi denumirea specializării angajaţilor din tabelul personal
pentru facultatea de Matematică
SELECT personal.nume, facultati.nume_facultate
FROM personal, facultati
WHERE personal.id_facultate=facultati.id_facultate AND
UCASE(facultati.nume_facultate) LIKE “*MATEMATICA*”
Joncţiunile echivalente se mai numesc joncţiuni interne sau joncţiuni simple.

1.4.2. Utilizarea alias-urilor pentru denumirea tabelelor.


Alias-urile reprezintă nume alternative, mai convenabile in exprimare, date tabelelor cu
clauza AS si utilizabile in specificarea coloanelor. Alias-ul se poate utiliza doar pentru
comanda în care a fost definit.
Exemplu:
SELECT p.nume, f.nume_facultate
FROM personal AS p, facultati AS f
WHERE p.id_facultate=f.id_facultate AND UCASE(f.nume_facultate) LIKE
"*MATEMATICA*"

1.4.3. Operatorul INNER JOIN


La Access există implementat operatorul de joncţiune internă: INNER JOIN în clauza
FROM astfel:
FROM tabel1 INNER JOIN tabel2 ON tabel1.coloană1 operatorComparaţie
tabel2.coloană2
In acest caz nu mai este necesara specificarea condiţiei de joncţiune în clauza WHERE.
Exemplu:
SELECT personal.nume, facultati.nume_facultate
FROM personal INNER JOIN facultati ON personal.id_facultate=facultati.id_facultate
WHERE UCASE(facultati.nume_facultate) LIKE “*MATEMATICA*”

1.5. Joncţiuni neechivalente - THETA-JOIN

1.5.1. Implementare SQL


In joncţiunile neechivalente valorile dintr-o coloană a unui tabel sunt într-o altfel de
relaţie, decât de egalitate, cu valorile unei coloane din celălalt tabel. Se pot extrage date
din cele două tabele care verifică condiţia specificată. Se pot adăuga condiţii adiţionale în
clauza WHERE.
Sintaxă SQL:
SELECT [tabel1.]coloană, [tabel2.]coloană, ….
FROM tabel1, tabel2, …
WHERE tabel1.coloană1 operator tabel2.coloană2
Operatorul trebuie să fie un operator de comparaţie sau logic care are ca rezultat o valoare
logică (true sau false).
Exemplu: Sa se afişeze numele şi gradul salariilor angajaţilor din tabelul personal:
SELECT personal.nume, personal.salariu, baremSalariu.grad
FROM personal, baremSalariu
WHERE personal.salariu BETWEEN baremSalariu.sal_min AND
baremSalariu.sal_max
1.6.Condiţii adiţionale
Se pot adăuga condiţii adiţionale în clauza WHERE pentru filtrarea liniilor răspuns.
Se pot utiliza alias-uri.

1.7.Joncţiuni externe - OUTER-JOIN


Joncţiunile externe afişează şi datele care nu au corespondent într-o relaţie, înlocuind
absenţa cu valori NULL.
In unele sisteme de gestiune (Oracle) există implementat operatorul de outer-join cu
simbolul (+) în partea deficitară de informaţie.
Exemplu:
SELECT personal.nume, facultati.nume_facultate
FROM personal, facultati
WHERE personal.id_faculatate (+) = facultati.id_facultate

La Access sunt implementaţi operatorii LEFT JOIN şi RIGHT JOIN în clauza FROM,
specificănd joncţiunea externă şi partea deficitară de informaţie astfel:
FROM tabel1 LEFT JOIN tabel2 ON tabel1.coloană1 operatorComparaţie
tabel2.coloană2
LEFT JOIN înseamnă afişarea informaţiei din tabelul din stânga chiar dacă în partea
dreaptă nu există informaţie asociată aceseia.
In acest caz nu mai este necesară specificarea condiţiei de joncţiune în clauza WHERE.
Exemplu:
SELECT personal.nume, facultati.nume_facultate
FROM personal RIGHT JOIN facultati ON personal.id_facultate=facultati.id_facultate

1.8. Autojoncţiuni - SELF-JOIN.


Autojoncţiunile extrag date dintr-un singur tabel, dar care este interpretat în mod diferit. Ele
sunt folosite când este necesară parcurgerea tabelelor de două ori pentru a obţine informaţia.
De exemplu, dacă se cere afişarea numelui angajatului şi a numelui şefului fiecărui angajat
din tabelul personal, se parcurge o dată tabelul pentru a obţine id_sef, iar a doua oară pentru a
identifica numele angajatului cu valoarea id_sef corespunzătoare.
SELECT p.nume,s.nume
FROM personal AS p, personal AS s
WHERE p.id_sef=s.id_personal
In interogare s-au simulat două tabele unul de angajaţi (p) şi unul pentru şefi (s). Condiţia de
joncţiune fiind ca id_sef din angajaţi să fie id_personal din şefi.

2. Partea practica

1. Afisati numele studentilor si denumirea specializarii la care sunt studenti.


SELECT s.nume,sp.nume_spec FROM studenti AS s, specializari AS sp WHERE
s.id_spec=sp.id_spec;

2. Afisati denumirile facultatilor, specializarilor si numele studentilor in ordine alfabetica


dupa nume pe facultati si specializari.
SELECT f.nume_facultate,sp.nume_spec,s.nume FROM studenti AS s, specializari
AS sp, facultati AS f where s.id_spec=sp.id_spec AND sp.id_facultate=f.id_facultate
ORDER BY f.nume_facultate,sp.nume_spec,s.nume;

3. Afisati numele, facultatea, specializarea si taxa studentilor cu taxa mai mare de 400.
SELECT s.nume,sp.nume_spec, f.nume_facultate FROM studenti AS s, specializari
AS sp, facultati AS f WHERE s.id_spec=sp.id_spec AND
sp.id_facultate=f.id_facultate AND s.valoaretaxa>400;

4. Afisati numele angajatilor, salariul si gradul corespunzator al salariului.


SELECT p.nume,p.salariu, b.grad FROM personal AS p, BaremSalariu AS b WHERE
p.salariu BETWEEN b.sal_min AND b.sal_max;

5. Afisati angajatii cu gradul 3 al salariului.


SELECT p.* FROM personal AS p, BaremSalariu AS b WHERE p.salariu BETWEEN
b.sal_min AND b.sal_max AND b.grad=3;

6. Afisati studentii facultatii de Stiinte Economice.


SELECT s.* from studenti AS s, specializari AS sp, facultati AS f WHERE
s.id_spec=sp.id_spec AND sp.id_facultate=f.id_facultate AND
UCASE(f.nume_facultate)="STIINTE ECONOMICE";

7. Afisati numele angajatilor, functia, salariul, gradul si numele facultatii pentru angajatii
care nu apartin departamentului “Auxiliari”, ordonati descrescator dupa salariu.
SELECT p.nume,p.functie, p.salariu, b.grad, f.nume_facultate FROM personal AS p,
BaremSalariu AS b, facultati AS f WHERE p.salariu BETWEEN b.sal_min AND
b.sal_max AND p.id_facultate=f.id_facultate AND
UCASE(f.nume_facultate)<>"AUXILIARI" ORDER BY p.salariu DESC;

8. Afisati numele angajatilor, functia, facultatea, salariul si impozitul, calculat din tabelul
Baremsalariu, in ordine alfabetica dupa nume pe facultati.
SELECT p.nume,p.functie, p.salariu, f.nume_facultate,
b.impozitfix+b.procent/100*p.salariu AS impozit FROM personal AS p, BaremSalariu
AS b, facultati AS f WHERE p.salariu BETWEEN b.sal_min AND b.sal_max AND
p.id_facultate=f.id_facultate ORDER BY f.nume_facultate, p.nume;

9. Afisati denumirea facultatii care nu are angajati in tabelul personal.


SELECT f.nume_facultate FROM personal AS p RIGHT JOIN facultati AS f ON
p.id_facultate=f.id_facultate WHERE p.nume IS NULL;

10. Afisati numele si id-ul angajatilor impreuna cu numele si id-ul sefului.


SELECT p.nume, p.id_personal, s.nume, s.id_personal FROM personal AS p,
personal AS s WHERE p.id_sef=s.id_personal;

11. Afisati la interogarea 10 si sefii.


SELECT p.nume, p.id_personal, p.id_facultate,s.nume, s.id_personal FROM
personal AS p LEFT JOIN personal AS s ON p.id_sef=s.id_personal;

12. Gasiti functia care a fost ocupata in prima jumatate a anului 1999 si in aceeasi
perioada a anului 2000.
SELECT p.functie FROM personal AS p INNER JOIN personal AS s ON
p.functie=s.functie WHERE (p.data_angajare BETWEEN #01/01/1999# AND
#30/06/1999#) AND (s.data_angajare BETWEEN #01/01/2000# AND #30/06/2000#);

13. Afisati personalul angajat inaintea sefului.


SELECT p.nume, p.data_angajare, s.nume,s.data_angajare FROM personal AS p,
personal AS s WHERE p.id_sef=s.id_personal AND p.data_angajare <
s.data_angajare;

14. Afisati studentii fara taxa impreuna cu denumirea facultatii, specializarii, anul de
studiu si grupa, in ordinea facultatilor, specializarilor, anului de studiu, grupei si dupa
nume.
SELECT f.nume_facultate, sp.nume_spec, s.an, s.grupa, s.nume FROM studenti AS
s, specializari AS sp, facultati AS f WHERE s.id_spec=sp.id_spec AND
sp.id_facultate=f.id_facultate AND s.valoaretaxa IS NULL ORDER BY
f.nume_facultate, sp.nume_spec, s.an, s.grupa, s.nume;

15. Afişaţi studenţii din anul 1 ai facultaţii de Ştiinţe Economice, ordonaţi pe grupe
alfabetic.
SELECT s.*,sp.nume_spec,f.nume_facultate FROM studenti as s, specializari as sp,
facultati as f WHERE s.id_spec=sp.id_spec AND sp.id_facultate=f.id_facultate AND
an=1 AND nume_facultate="Stiinte economice" AND valoare;

16. Afişaţi studenţii fǎrǎ taxǎ din anul 1 ai facultaţii de Ştiinţe Economice, ordonaţi pe
grupe alfabetic.
SELECT s.*,sp.nume_spec,f.nume_facultate FROM studenti as s, specializari as sp,
facultati as f WHERE s.id_spec=sp.id_spec AND sp.id_facultate=f.id_facultate AND
an=1 AND nume_facultate="Stiinte economice" AND valoaretaxa is null ORDER BY
grupa,nume;

17. Afişaţi specializǎrile pentru care nu sunt studenţi în baza de date.


SELECT sp.nume_spec FROM studenti as s RIGHT JOIN specializari as sp ON
s.id_spec=sp.id_spec WHERE s.id_student IS NULL;

18. Afişaţi pentru fiecare angajat colegii din aceeaşi facultate.


SELECT c.nume,p.nume FROM personal as p, personal as c WHERE
p.id_facultate=c.id_facultate AND p.id_personal<>c.id_personal;

19. Afişaţi numele sefilor şi denumirea facultǎţii la care sunt sefi.


SELECT p.nume,p.id_sef,p.id_facultate,f.nume_facultate FROM personal as
p,facultati AS f WHERE p.id_facultate=f.id_facultate AND p.id_sef IS NULL;

20. Afişaţi numele angajaţilor, denumirea facultǎţii şi salariul angajaţilor cu gradul


salariului egal cu 2.
SELECT p.nume,f.nume_facultate,p.salariu,b.grad FROM personal as p,facultati AS
f,baremsalariu AS b WHERE p.id_facultate=f.id_facultate AND salariu BETWEEN
sal_min AND sal_max AND grad=2;

21. Afişaţi personalul facultǎţii de Matematica şi Informatica, casatoriţi, angajaţi dupa anul
2000.
SELECT p.*,f.nume_facultate FROM personal as p,facultati AS f WHERE
p.id_facultate=f.id_facultate AND nume_facultate="Matematica" AND casatorit AND
YEAR(data_angajare)>2000;

22. Afişaţi denumirile facultatilor şi funcţiile angajatilor.


SELECT DISTINCT nume_facultate,functie FROM personal as p,facultati AS f
WHERE p.id_facultate=f.id_facultate;

23. Afişaţi denumirea facultǎţii, numele, funcţia, salariul mǎrit cu 20% şi gradul noului
salariu pentru toţi angajaţii.
SELECT DISTINCT nume_facultate,nume,functie,salariu*1.2 AS sal_marit,grad
FROM personal as p,facultati AS f,baremsalariu AS b WHERE
p.id_facultate=f.id_facultate AND salariu*1.2 BETWEEN sal_min AND sal_max;

24. Afişaţi numele, funcţia, salariul şi suma necesarǎ fiecarui angajat pentru a trece la
gradul urmǎtor de salariu.
SELECT nume,functie,salariu,sal_max-salariu+1 AS suma FROM
personal,baremsalariu WHERE salariu BETWEEN sal_min AND sal_max;

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