Sunteți pe pagina 1din 5

LABORATOR 1 SQL

CERERI MONOTABEL 1. Analizai sintaxa simplificat a comenzii SELECT. Care dintre clauze sunt obligatorii? SELECT { [ {DISTINCT | UNIQUE} | ALL] lista_campuri | *} FROM [nume_schem.]nume_obiect ] [, [nume_schem.]nume_obiect ] [WHERE condiie_clauza_where] [GROUP BY expresie [, expresie ] [HAVING condiie_clauza_having] ] [ORDER BY {expresie | poziie} [, {expresie | poziie} ] ] 2. Gsii eroarea din instruciunea urmtoare. SELECT employee_id, last_name, salary * 12 salariu anual FROM employees; Obs: SALARIU ANUAL este un alias pentru cmpul care reprezint salariul anual. Dac un alias conine blank-uri, el va fi scris obligatoriu ntre ghilimele. Altfel, ghilimelele pot fi omise. Alias-ul apare n rezultat, ca antet de coloan pentru expresia respectiv. Doar cele specificate ntre ghilimele sunt case-sensitive, celelalte fiind scrise implicit cu majuscule. Varianta 1: SELECT employee_id, last_name, salary * 12 salariu_anual FROM employees; Varianta 2: SELECT employee_id, last_name, salary * 12 " Salariu Anual " FROM employees; 3. S se listeze structura tabelelor din schema HR (EMPLOYEES, DEPARTMENTS, JOB_HISTORY, JOBS, LOCATIONS, COUNTRIES, REGIONS), observnd tipurile de date ale coloanelor. Obs: Se va utiliza comanda SQL*Plus DESCRIBE nume_tabel 4. S se listeze coninutul tabelelor din schema considerat, afind valorile tuturor cmpurilor. Obs: Se va utiliza comanda SQL SELECT * FROM nume_tabel; 5. S se obin nc o dat rezultatul cererii precedente, fr a rescrie cererea. Obs: Ultima comand SQL lansat de ctre client este pstrat n buffer-ul SQL. Pentru rularea acesteia se utilizeaz / sau RUN. 6. Listai structura tabelului EMPLOYEES i apoi dai comanda RUN (sau /). Ce observai? Comenzile SQL*Plus sunt pstrate n buffer? DESC employees RUN 1

7. S se afieze codul angajatului, numele, codul job-ului, data angajrii. Salvai instruciunea SQL ntr-un fiier numit p1_14.sql. Obs: Pentru salvarea ultimei comenzi SQL se utilizeaz comanda SAVE. Precizarea extensiei .sql a fiierului nu este obligatorie. SELECT employee_id, last_name, job_id, hire_date FROM employees; SAVE z:\\ p1_14.sql 8. Reexecutai cererea folosind fiierul p1_14.sql. START z:\\ p1_14.sql sau @ z:\\ p1_14.sql 9. Editai fiierul p1_14.sql, adugnd coloanelor cte un alias (cod, nume, cod job, data angajarii). EDIT z:\\ p1_14.sql Cererea se modific astfel: SELECT employee_id cod, last_name nume, job_id " cod job ", hire_date " data angajarii " FROM employees; @ z:\\ p1_14.sql 10. S se listeze, cu i fr duplicate, codurile job-urilor din tabelul EMPLOYEES. SELECT job_id FROM employees; SELECT DISTINCT job_id FROM employees; SELECT UNIQUE job_id FROM employees; Obs. DISTINCT = UNIQUE 11. S se afieze numele concatenat cu prenumele, separate prin spaiu. Etichetai coloana Nume si prenume. Obs: Operatorul de concatenare este ||. irurile de caractere se specific ntre apostrofuri (NU ghilimele, caz n care ar fi interpretate ca alias-uri). SELECT last_name|| ' ' || first_name " Nume si prenume " FROM employees; 12. S se listeze numele i salariul angajailor care ctig mai mult de 10000 $. SELECT last_name, salary FROM employees WHERE salary > 10000; 13. S se modifice cererea anterioar astfel nct s afieze numele i salariul pentru toi angajaii al cror salariu este cuprins ntre 5000$ i10000$. Obs: Pentru testarea apartenenei la un domeniu de valori se poate utiliza operatorul [NOT] BETWEEN valoare1 AND valoare2 SELECT last_name, salary FROM employees WHERE salary BETWEEN 5000 AND 10000; 14. S se creeze o cerere pentru a afia numele angajatului i numrul departamentului pentru angajatul 104. 2

SELECT last_name, department_id FROM employees WHERE employee_id =104; 15. S se afieze numele i salariul pentru toi angajaii din departamentele 10 sau 30, n ordine alfabetic a numelor. Obs: Apartenena la o mulime finit de valori se poate testa prin intermediul operatorului IN, urmat de lista valorilor ntre paranteze i separate prin virgule: expresie IN (valoare_1, valoare_2, , valoare_n) SELECT last_name, salary FROM employees WHERE department_id IN (10, 30) ORDER BY last_name; 16. S listeze numele i salariile angajailor care ctig mai mult de 10000 $ i lucreaz n departamentul 10 sau 30. Se vor eticheta coloanele drept Angajat si Salariu lunar. 17. Care este data curent? Obs: Pseudocoloana care returneaz data curent este SYSDATE. Pentru completarea sintaxei obligatorii a comenzii SELECT, se utilizeaz tabelul DUAL: SELECT SYSDATE FROM dual; Datele calendaristice pot fi formatate cu ajutorul funciei TO_CHAR(data, format), unde formatul poate fi alctuit dintr-o combinaie a urmtoarelor elemente: Element D DD DDD DY DAY MM MON MONTH Y YY, YYY, YYYY YEAR HH12, HH24 MI SS SSSSS Semnificaie Numrul zilei din sptmn (duminic=1; luni=2; smbt=6). Numrul zilei din lun. Numrul zilei din an. Numele zilei din sptmn, printr-o abreviere de 3 litere (MON, THU etc.) Numele zilei din sptmn, scris n ntregime. Numrul lunii din an. Numele lunii din an, printr-o abreviere de 3 litere (JAN, FEB etc.) Numele lunii din an, scris n ntregime. Ultima cifr din an Ultimele 2, 3, respectiv 4 cifre din an. Anul, scris n litere (ex: two thousand four). Orele din zi, ntre 0-12, respectiv 0-24. Minutele din or. Secundele din minut. Secundele trecute de la miezul nopii.

18. S se afieze numele i data angajrii pentru fiecare salariat care a fost angajat n 1987. Se cer 2 soluii: una n care se lucreaz cu formatul implicit al datei i alta prin care se formateaz data. 3

Varianta1: SELECT first_name, last_name, hire_date FROM employees WHERE hire_date LIKE (%87); Varianta 2: SELECT first_name, last_name, hire_date FROM employees WHERE TO_CHAR(hire_date, YYYY)=1987; Sunt obligatorii ghilimelele de la irul 1987? Ce observai? 19. S se afieze numele i job-ul pentru toi angajaii care nu au manager. SELECT last_name, job_id FROM employees WHERE manager_id IS NULL; 20. S se afieze numele, salariul i comisionul pentru toi salariaii care ctig comisioane. S se sorteze datele n ordine descresctoare a salariilor, iar pentru cei care au acelai salariu n ordine cresctoare a comisioanelor. SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NOT NULL ORDER BY salary DESC, commission_pct ASC; 21. S se listeze numele tuturor angajailor care au a treia litera din nume 'a'. Obs: Pentru a forma mtile de caractere utilizate mpreun cu operatorul LIKE cu scopul de a compara irurile de caractere, se utilizeaz: % - reprezentnd orice ir de caractere, inclusiv irul vid; _ (underscore) reprezentnd un singur caracter. SELECT DISTINCT last_name FROM employees WHERE last_name LIKE '__a%'; 22. Folosind data curent s se afieze urmtoarele informaii: - numele zilei, numrul zilei din sptmn, numrul zilei din luna, respectiv numrul zilei din an; - numrul lunii din an, numele lunii cu abreviere la 3 caractere, respectiv numele complet al lunii; - ora curent (ora, minute, secunde). 23. S se listeze numele departamentelor care funcioneaz n locaia avnd codul 1700 i al cror manager este cunoscut. 24. S se afieze codurile departamentelor n care lucreaz salariai. 25. S se afieze numele i prenumele salariailor angajai n luna mai 1987. 26. S se listeze codurile angajailor care au avut i alte joburi fa de cel prezent. S se ordoneze rezultatul descresctor dup codul angajatului. 27. S se afieze numele i data angajrii pentru cei care lucreaz n departamentul 80 i au fost angajai n luna martie a anului 1997. 28. S se afieze numele joburilor care permit un salariu cuprins ntre 8300$ i 14000$. 29. Care este grila de salarizare pentru un salariu de 10000$? 4

30. S se listeze numele tuturor angajailor care au 2 litere 'L' n nume i lucreaz n departamentul 30 sau managerul lor este 123. 31. S se afieze numele, job-ul i salariul pentru toi salariaii al cror job conine irul 'CLERK' sau 'REP' i salariul nu este egal cu 1000, 2000 sau 3000 $. 32. S se afieze numele, salariul i comisionul pentru toi angajaii al cror salariu este mai mare dect de 5 ori valoarea comisionului (salary*commission_pct*5).