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