Documente Academic
Documente Profesional
Documente Cultură
___________________________________________________________________________
INTEROGAREA TABELELOR
Instructiunea SELECT
interogare
SELECT
[DISTINCT] (*/coloana1 [alias], expresii [alias])
FROM
tabela1, tabela2, ...
WHERE (conditii, precizarea legaturilor dintre tabele)
GROUP BY nume_tabela.nume_coloana
HAVING (conditii impuse valorilor de grup)
ORDER BY nume_tabela.nume_coloana ASC/DESC;
UNDE:
SELECT
DISTINCT
*
coloana
expresie
alias
FROM tabele
WHERE
GROUP BY
HAVING
ORDER BY
Comenzile SQL:
- Nu sunt case sensitive, de regula comezile se scriu cu litere mari pentru a se
distinge mai usor;
- Pot fi scrise pe mai multe linii;
- Cuvintele cheie nu pot fi prescurtate sau scrise pe mai multe linii;
In construirea comenzilor SQL se utilizeaza urmatorii operatori:
<, >, =, >=, <=, NOT
operatori de comparatie
BETWEEN val_min AND ntre dou valori (inclusiv).
val_max
SELECT id_angajat, nume, salariul, id_departament FROM salariati WHERE salariul
BETWEEN 2000 AND 6100 AND id_departament NOT IN (20, 30);
SELECT id_angajat, nume, salariul, id_departament FROM salariati WHERE salariul >=
2000 AND salariul <=6100 AND id_departament = 50;
IN (list valori)
egal cu oricare valoare din lista de valori
SELECT id_angajat, nume, id_manager FROM salariati WHERE id_manager IN (120,
122, 123);
LIKE
similar cu un ablon
___________________________________________________________________________
% oricte caractere; _ un caracter;
SELECT id_angajat, nume, id_functie FROM salariati WHERE nume LIKE 'B% ';
SELECT id_angajat, nume, id_functie FROM salariati WHERE nume LIKE '__t%';
IS NULL
are valoarea NULL
SELECT id_angajat, nume, comision FROM salariati WHERE comision IS NULL;
Coloanele se specific n ordinea n care se doresc a fi afiate, nu obligatoriu n ordinea n
care apar n descrierea tabelelor.
Valoarea NULL, ca i n alte limbaje, semnific valoare ne-disponibil, ne-alocat, i nu este
acelai lucru cu blank sau zero.
Cu ajutorul comenzii select se pot extrage informaii din baza de date. Comanda SELECT
permite imprementarea operatorilor algebrei relationale:
Selecia:
Permite obinerea unei noi relaii care conine toate atributele relaiei
iniiale i un numr redus de tupluri. Reducerea se face dup o condiie
numit condiie de selecie.
Proiecia:
Permite obinerea unei noi relaii care conine un numr redus de atribute
fa de relaia iniial i toate valorile sau combinaiile distincte de valori
ale acestor atribute.
Jonciunea
:
___________________________________________________________________________
Exemple:
1. Sa se selecteze toti angajatii din tabela salariati.
SELECT * FROM salariati;
2. Sa se selecteze coloanele id_angajat, nume, prenume si id_functie din tabela salariati.
SELECT id_angajat, nume, prenume, id_functie FROM salariati;
3. Sa se selecteze numai angajatii care fac parte din categoria functionar (al caror
id_functie contine CLERK).
SELECT * FROM salariati
WHERE upper(id_functie) LIKE '%CLERK%';
4. Sa se selecteze comenzile incheiate de salariatul cu id_angajat = 161.
SELECT * FROM comenzi
WHERE id_angajat = 161
ORDER BY nr_comanda;
5. Sa se selecteze toate comezile care au fost lansate online dupa 1 ianuarie 2000.
SELECT * FROM comenzi
WHERE LOWER(modalitate) LIKE '%online%'
AND data > TO_DATE('01.01.2000','DD.MM.YYYY');
6. Sa se selecteze id_angajat, nume, prenume, id_manager, id_departament din tabela
angajati si denumire_departament din tabela departamente si sa se realizeze jonctiunea
dintre cele doua tabele.
SELECT a.id_angajat, a.nume, a.prenume, a.id_manager, a.id_departament,
d.denumire_departament
FROM angajati a, departamente d
WHERE a.id_departament=d.id_departament;
___________________________________________________________________________
ANY Comapara valoarea cu oricare valoare returnata de interogare
ALL compara valoarea cu fiecare valoare returnata de interogare
7. S se afieze id_angajat, prenume, id_functie si salariul pentru angajatii care nu lucreaza in
departamentul IT_PROG si al caror salariu este mai mic decat oricare dintre salariile
angajatilor care lucreaza in departamentul IT_PROG:
SELECT id_angajat, prenume, id_functie,
salariul
FROM angajati
WHERE salariul < ANY
(SELECT salariul FROM angajati
WHERE id_functie = 'IT_PROG')
AND id_functie <> 'IT_PROG'
ORDER BY salariul DESC;
___________________________________________________________________________
8. S se afieze id_angajat, prenume, id_functie si salariul pentru angajatii care nu lucreaza in
departamentul IT_PROG si al caror salariu este mai mic decat fiecare dintre salariile
angajatilor care lucreaza in departamentul IT_PROG:
SELECT id_angajat, prenume, id_functie,
salariul
FROM angajati
WHERE salariul < ALL
(SELECT salariul FROM angajati
WHERE id_functie = 'IT_PROG')
AND id_functie <> 'IT_PROG'
ORDER BY salariul DESC;
___________________________________________________________________________
Realizarea jonctiunilor ntre relaii. Tipuri de jonctiuni
a. Jonctiune de egalitate
9. Sa se selecteze comenzile incheiate de angajati (in clauza WHERE se va preciza
conditia de legatura dintre tabele).
SELECT a.*, c.*
FROM angajati a, comenzi c
WHERE a.id_angajat= c.id_angajat;
10. Sa se selecteze comenzile incheiate de angajatul Greene numai in luna noiembrie.
SELECT angajati.*, comenzi.*
FROM angajati, comenzi
WHERE angajati.id_angajat=comenzi.id_angajat
AND lower(comenzi.data) like '%nov%'
AND upper(angajati.nume) = 'GREENE';
11. Sa se calculeze valoarea fiecarui produs (valoare = cantitate * pret) si sa se afiseze
denumirea produsului, pretul, cantitatea si valoarea.
SELECT produse.denumire_produs, rand_comenzi.cantitate, rand_comenzi.pret,
rand_comenzi.cantitate * rand_comenzi.pret AS Valoare
FROM produse, rand_comenzi
WHERE produse.id_produs= rand_comenzi.id_produs;
12. Sa se selecteze numai produsele cu valoarea cuprinsa intre 1000 si 2000.
SELECT produse.denumire_produs, rand_comenzi.cantitate, rand_comenzi.pret,
rand_comenzi.cantitate * rand_comenzi.pret AS Valoare
FROM produse, rand_comenzi
WHERE produse.id_produs= rand_comenzi.id_produs
AND rand_comenzi.cantitate * rand_comenzi.pret BETWEEN 1000 AND 2000;
b. Jonctiune externa
13. S se afieze id-ul produsului, denumirea produsului i cantitatea chiar daca nu au fost
comandate
SELECT p.id_produs, p.denumire_produs, rc.cantitate, rc.pret
FROM produse p, rand_comenzi rc
WHERE p.id_produs = rc.id_produs (+);
c. Jonctiunea dintre o tabel cu aceeai tabel
14. S se afieze numele fiecarui angajat i numele sefului direct superior:
SELECT a.nume||' lucreaza pentru: '||m.nume
FROM angajati a, angajati m
WHERE a.id_manager=m.id_angajat;
6
___________________________________________________________________________
Realizarea interogarilor subordonate (se utilizeaza 2 comenzi SELECT imbricate)
15. Sa se selecteze angajatii care sunt in acelasi departament cu angajatul Smith.
SELECT * FROM angajati
WHERE id_departament =
(SELECT id_departament FROM angajati WHERE upper(nume)= 'SMITH');
Eroare "single-row subquery returns more than one row"
SELECT nume, prenume, id_angajat, id_departament FROM angajati WHERE nume =
'Smith';