You are on page 1of 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:
emp
empno ename job mgr hiredate sal comm deptno

dept
deptno dname loc

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

Tabelul dept Coloan Allow Nulls Data Type NOT NULL numeric(2,0) deptno dname loc NULL NULL varchar(14) varchar(13) Semnificaie coloan Numrul departamentului (cheie primar) Numele departamentului 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

You might also like