Sunteți pe pagina 1din 5

UTILIZAREA LIMBAJULUI TRANSACT SQL(T-SQL) DE INTEROGARE A

BAZELOR DE DATE MICROSOFT SQL SERVER


Se presupune c ntr-o instan Microsoft SQL Server 2005/2008 avem creat baza de date
angajat, cu tabelele emp care conine angajaii unei firme i dept---care descrie departamentele
din care fac parte angajaii (cu diagrama de relaii i structura date mai jos), populate cu date
care s respecte structura propus:




Structura tabelelor:
Tabelul emp

Coloan Allow Nulls Data Type Semnificaie coloan
empno NOT NULL numeric(4,0) Codul angajatului (cheie
primar)
ename NULL varchar(50) Numele angajatului
job NULL varchar(9) Job-ul angajatului
mgr NULL numeric(4,0) Codul managerului
hiredate NULL datetime Data angajrii
sal NULL numeric(7, 2) Salariul angajatului
comm NULL numeric(7, 2) Comisionul angajatului
deptno NOT NULL numeric(2,0) Nr. departamentului
angajatului(cheie strin)

dept
deptno
dname
loc
emp
empno
ename
job
mgr
hiredate
sal
comm
deptno


Tabelul dept


Coloan Allow Nulls Data Type Semnificaie coloan
deptno NOT NULL numeric(2,0) Numrul departamentului (cheie
primar)
dname NULL varchar(14) Numele departamentului
loc NULL varchar(13) Locaia departamentului



Exerciii rezolvate- Utiliznd limbajul de interogare a datelor Microsoft Transact
SQL

S se scrie instruciunile Microsoft Transact-SQL care s rspund la urmtoarele cerine:

I. Utilizarea instruciunii SELECT i a diferitelor clauze ale acesteia:

1. S se afieze numele angajailor, concatenat cu jobul, separat de o virgul i un spaiu,
sub aliasul Angajat si titlu.
SELECT ename+, +job AS [Angajat si titlu] FROM emp

2. S se afieze coninutul tabelei emp i apoi numrul de nregistrri.
SELECT * FROM emp
SELECT Tabela emp: , COUNT(*) AS [Nr. De inregistrari]
FROM emp

3. S se afieze numele angajailor a cror a treia liter a numelor este A.
SELECT ename FROM emp WHERE ename COLLATE Latin1_General_Cs_As
LIKE __A

4. S se afieze angajaii din departamentul 30, folosind alias-uri adecvate.
SELECT In departamentul +STR(deptno)+ sunt ,
STR(COUNT(*))+ angajati! FROM emp
WHERE deptno = 30
GROUP BY deptno

5. Afiai numrul de manageri existeni n tabela de angajai.
SELECT COUNT(DISTINCT(mgr)) [Nr. de manageri]
FROM emp




II. Utilizarea instruciunii SELECT n subinterogri:

1. S se afieze numele i data angajrii pentru toi angajaii din acelai departament
cu Blake (excludei Blake)
SELECT ename, hiredate
FROM emp
WHERE deptno IN
(SELECT deptno FROM emp
WHERE ename = Blake)
AND ename < > Blake

2. S se afieze codul i numele angajailor care ctig mai mult dect media
salariilor din firm; sortai rezultatul n ordinea descendent a salariilor.
SELECT empno [Codul angajat], ename [Numele]
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp)
ORDER BY sal DESC

3. Afiai codul i numele tuturor angajailor care lucreaz ntr-un departament care
are i angajai al cror nume conine pe T sau t.
SELECT empno [Codul angajat], ename [Numele]
FROM emp
WHERE deptno IN (SELECT deptno FROM emp WHERE ename LIKE %T%)

4. Afiai numele, numrul departamentului i jobul tuturor angajailor a cror
locaie de departament este Dallas:
SELECT ename, deptno, job
FROM emp
WHERE deptno IN
(SELECT deptno FROM emp
WHERE loc = Dallas)

5. Afiai numele i salariul angajailor subordonai lui King.
SELECT ename, sal
FROM emp
WHERE mgr IN
(SELECT empno FROM emp WHERE ename=King)

6. Afiai numrul departamentului, numele i jobul angajailor din departamentul
Sales.
SELECT dept, ename, job
FROM emp
WHERE deptno IN
(SELECT deptno FROM dept WHERE dname=Sales)

7. Afiai codul, numele i salariul angajailor care ctig mai mult dect salariul
mediu din firm i care lucreaz n departamentele care au cel puin un angajat
care are litera T n nume.
SELECT empno, ename, sal
FROM emp
WHERE sa l>
(SELECT AVG(sal) FROM emp )
AND deptno IN
(SELECT deptno FROM emp WHERE ename LIKE %T%)

III. Utilizarea instruciunii SELECT n gruparea datelor(funcii de grup)

1. Salariul maxim, minim, suma i media acestuia pentru toi angajaii; rotunjii
rezultatul la prima poziie zecimal .
SELECT ROUND(MAX(sal), 0) Maxim,
ROUND(MIN(sal), 0) Minim,
ROUND(SUM(sal), 0) Suma,
ROUND(AVG(sal), 0) Media,
FROM emp

2. Afiai maximul, minimul i suma salariilor pentru fiecare tip de job.
SELECT job, ROUND(MAX(sal),0) [Maximul],
MIN(sal) Minimul,
SUM(sal) Suma,
AVG(sal) [Media salariului]
FROM emp
GROUP BY job

3. Afiai numrul de persoane cu acelai job.
SELECT job, COUNT(*) [Nr. de persoane]
FROM emp
GROUP BY job

4. Afiai codul managerului i cel mai mic salariu al angajailor care-l au ca
manager ; excludei angajaii care nu au manager i grupurile de angajai care au
salariul minim mai mic dect 1000; sortai rezultatul n ordinea descresctoare a
salariului.
SELECT mgr, MIN(sal)
FROM emp
WHERE mgr IS NOT NULL
GROUP BY mgr
HAVING MIN(sal) > 1000
ORDER BY MIN(sal) DESC
Verificare (pentru un manager):
SELECT MIN(sal) FROM emp
WHERE mgr = 7566
5. Afiai numele i locaia departamentului, nr. de angajai i salariul mediu pentru
toi angajaii din acel departament.
SELECT d.dname, d.loc,
COUNT(*) [Nr. de angajati],
ROUND(AVG(sal), 2) [Salariul mediu]
FROM emp e, dept d
WHERE d.deptno = e.deptno
GROUP BY d.dname, d.loc

6. S se afieze numrul de angajai din fiecare an calendaristic.
SELECT YEAR(hiredate) [Anul angajarii],
COUNT(hiredate) [Nr. de angajati]
FROM emp
GROUP BY YEAR(hiredate)
Verificare:
SELECT YEAR(hiredate) [Anul angajarii],
COUNT(hiredate) [Nr. de angajati]
FROM emp
WHERE YEAR(hiredate) = 1981
GROUP BY YEAR(hiredate)

7. S se afieze numrul departamentului, joburile din departament (tipurile) i
suma salariilor pentru joburile respective.
SELECT deptno, job, SUM(sal) [Suma salariilor pe job]
FROM emp
GROUP BY job, deptno --(executie de la dreapta la stanga)
Verificare:
SELECT deptno, ename, job,sal
FROM emp
ORDER BY deptno, job
--faceti suma pe joburi in fiecare departament si comparati

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