Sunteți pe pagina 1din 77

Limbajul de definire a datelor (DDL).

CREATE, ALTER, DROP


Definirea tabelelor

1. Creati tabelul salariat_*** având următoarea structură:

Nume Caracteristici Tip


cod_ang NOT NULL NUMBER(4)
nume VARCHAR2(25)
prenume VARCHAR2(25)
functia VARCHAR2(20)
sef NUMBER(4)
data_angajarii Valoare implicită data curentă DATE

varsta NUMBER(2)
email CHAR(50)
salariu Valoare implicită 0 NUMBER(9,2)

CREATE TABLE salariat (


cod_ang NUMBER(4) NOT NULL,
nume VARCHAR2(25),
prenume VARCHAR2(25),
functia VARCHAR2(20),
sef NUMBER(4),
data_angajarii DATE DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(9,2) DEFAULT 0);

2. Afisati structura tabelului creat anterior.


DESCRIBE salariat;

3. Se dau următoarele valori:

COD_AN NUME PRENUME FUNCTIA SEF DATA_ANG VARSTA EMAIL SALARIU


G
1 ..... ..... director null ........ 30 ..... 5500
2 ..... ..... fuctionar 1 ..... 25 ..... 0
3 ..... ..... economist 1 ..... 45 ..... 3000
4 ..... ..... functionar 1 ..... 35 ..... 1000

4. Inserati în tabelul salariat_*** prima înregistrare din tabelul de mai sus fără să precizati lista de coloane
în comanda INSERT.
INSERT INTO salariat VALUES (
1, '.....', '.....', 'director', null ,’' , 30, '.....', 5500 );

5. Inserati a doua înregistrare folosind o listă de coloane din care excludeti data_angajarii si salariul care
au valori implicite. Observati
apoi rezultatul.

COD_ANG NUME PRENUME FUNCTIA SEF DATA_ANG VARSTA EMAIL SALARIU


2 ..... ..... fuctionar 1 ..... 25 ..... 0

1
INSERT INTO salariat (cod_ang, nume, prenume, functia, sef, varsta, email)
VALUES (2, '...', '...', 'functionar', 1, 25, '...' );

6. Inserati înregistrările 3 si 4.
INSERT INTO salariat (cod_ang, nume, prenume, functia, sef, varsta, email, salariu) VALUES (3, '...', '...',
'economist', 1, 45, '...', 3000 );

INSERT INTO salariat (cod_ang, nume, prenume, functia, sef, varsta, email, salariu) VALUES (4, '...', '...',
'functionar', 1, 35, '...', 1000 );

7. Creati tabelul functionar_*** care să contină functionarii din tabelul salariat_***, având următoarele
coloane: codul, numele, salariul anual si data angajării. Verificati cum a fost creat tabelul si ce date contine.

CREATE TABLE functionar


AS SELECT cod_ang, nume, prenume, salariu, data_angajarii
FROM salariat WHERE functia = 'functionar';
DESCRIBE functionar;
SELECT * FROM functionar;

8. Adăugati o nouă coloană tabelului salariat_*** care să contină data nasterii.


ALTER TABLE salariat
ADD (datan DATE);

9. Modificati dimensiunea coloanei nume la 30 si pe cea a salariului la 12 cu 3 zecimale.

ALTER TABLE salariat


MODIFY (nume VARCHAR2(30), salariu NUMBER(12,3));

10. Modificati tipul coloanei email la VARCHAR2.

ALTER TABLE salariat


MODIFY (email VARCHAR2(50));

11. Modificati valoarea implicită a coloanei data_angajarii la data sistemului + o zi.

ALTER TABLE salariat


MODIFY (data_angajarii DATE DEFAULT SYSDATE + 1);

12. Eliminati coloana varsta din tabelul salariat_***.

ALTER TABLE salariat


DROP COLUMN varsta;

13. Redenumiti tabelul functionar_*** cu funct_***.

RENAME functionar to funct;

14. Recreati tabelul functionar_*** utilizând tabelul funct_***..

CREATE TABLE functionar


AS SELECT cod_ang, nume, prenume, salariu, data_angajarii
FROM funct;

15. Eliminati tabelul funct_***.

2
DROP TABLE funct;

16. Stergeti si apoi creati din nou tabelul salariat_*** cu următoarea structură.

NUME TIP CONSTRÂNGERE


cod_ang NUMBER(4) Cheie primară
nume VARCHAR2(25) NOT NULL
prenume VARCHAR2(25)
data_nasterii DATE data_nasterii<data_angajarii
functia VARCHAR2(9) NOT NULL
sef NUMBER(4) Referă ca si cheie externă cod_ang
din acelasi tabel
data_angajarii DATE
email VARCHAR2(20) unic
salariu NUMBER(12,3) >0
cod_dept NUMBER(4)

cod_dept NUMBER(4) CombinaŃia NUME + PRENUME


să fie unică
Observatie: Constrângerile de tip CHECK se pot implementa la nivel de coloană doar dacă nu referă o altă
coloană a tabelului.

DROP TABLE salariat;


CREATE TABLE salariat (
cod_ang NUMBER(4) PRIMARY KEY,
nume VARCHAR2(25) NOT NULL,
prenume VARCHAR2(25),
data_nasterii DATE,
functia VARCHAR2(9) NOT NULL,
sef NUMBER(4) REFERENCES salariat (cod_ang),
data_angajarii DATE DEFAULT SYSDATE,
email VARCHAR2(20) UNIQUE,
salariu NUMBER(9,2) CHECK (salariu > 0),
cod_dep NUMBER(4),
CONSTRAINT const_c CHECK (data_angajarii > data_nasterii),
CONSTRAINT const_u UNIQUE (nume, prenume, data_nasterii));

17. Stergeti tabelul salariat_***, iar apoi recreati-l implementând toate constrângerile la nivel de tabel.
Observatie: Constrângerea de tip NOT NULL se poate declara doar la nivel de coloană.

DROP TABLE salariat;


CREATE TABLE salariat (
cod_ang NUMBER(4),
nume VARCHAR2(25) NOT NULL,
prenume VARCHAR2(25),
data_nasterii DATE,
functia VARCHAR2(9) NOT NULL,
sef NUMBER(4),
data_angajarii DATE DEFAULT SYSDATE,
email VARCHAR2(20),
salariu NUMBER(9,2),
cod_dep NUMBER(4),
CONSTRAINT ccp PRIMARY KEY (cod_ang),
CONSTRAINT cce FOREIGN KEY (sef) REFERENCES salariat (cod_ang),
CONSTRAINT cu1 UNIQUE (email),
CONSTRAINT cc1 CHECK (data_angajarii > data_nasterii),
3
CONSTRAINT cc2 CHECK (salariu > 0),
CONSTRAINT cu2 UNIQUE (nume,prenume,data_nasterii));

18. Creati tabelul departament_*** care să aibă următoarea structură.


NUME TIP CONSTRÂNGERI
COD_DEP NUMBER(4) Cheie primară
NUME VARCHAR2(20) Not null
ORAS VARCHAR2(25)

CREATE TABLE departament (


cod_dep NUMBER(4) PRIMARY KEY,
nume VARCHAR2(20) NOT NULL,
oras VARCHAR2(25));

Adăugarea constrângerilor ulterior creării tabelului, eliminarea, activarea sau dezactivarea constrângerilor
(ALTER TABLE)
- adaugă constrângeri
ALTER TABLE nume_tabel
ADD [CONSTRAINT nume_constr] tip_constr (coloana);
- elimină constrângeri
ALTER TABLE nume_tabel
DROP [CONSTRAINT nume_constr] tip_constr (coloana);
- activare/dezactivare constrângere
ALTER TABLE nume_tabel
MODIFY CONSTRAINT nume_constr ENABLE|DISABLE;
sau
ALTER TABLE nume_tabel
ENABLE| DISABLE nume_constr;

19. Inserati o nouă înregistrare în salariat_*** de forma:

cod nume prenume data_n functia sef data_ang email salariu cod_dep
2 N2 P2 11-JUN-1960 economist 1 Sysdate E2 2000 10

INSERT INTO salariat VALUES (


2, 'N2' , 'P2' , '11-06-1960' , 'ECONOMIST', 1, SYSDATE, 'E2', 2000, 10 );
/*EROARE la linia 1: ORA-02291: constrângere de integritate (SCOTT.CCE) violata - cheia parinte negasita

Ce observati? Introduceti înregistrarea dar specificând valoarea NULL pentru coloana sef.

INSERT INTO salariat VALUES (


2, 'N2' , 'P2' , '11-06-1960' , 'ECONOMIST', Null, SYSDATE, 'E2', 2000, 10 ); /*1 înregistrare creatã.*/

20. Încercati să adăugati o constrângere de cheie externă pe cod_dep din salariat_***. Ce observati?
ALTER TABLE salariat
ADD CONSTRAINT cce2 FOREIGN KEY (cod_dep) REFERENCES departament (cod_dep);
/*EROARE la linia 2: ORA-02298: (SCOTT.CCE2) nu a putut fi validata - nu au fost gasite cheile parinte

21. Inserati o nouă înregistrare în departament_***. Apoi adăugati constrângerea de cheie externă definită
anterior.

cod_dep nume loc


10 Economic Bucuresti

INSERT INTO departament VALUES (


4
10, 'Ecomomic', 'Bucuresti' );

Adaugam constrangerea de la ex.20:


ALTER TABLE salariat
ADD CONSTRAINT cce2 FOREIGN KEY (cod_dep) REFERENCES departament (cod_dep);

22. Inserati noi înregistrări în salariat_***, respectiv în departament_***. Care trebuie să fie ordinea de
inserare?

co n prenume data_n functi sef data_an emai salari cod_dep


d ume a g l u
3 N3 P3 11- jurist 2 Sysdate E3 2500 20
JUN-
1967

cod_dep nume loc

20 Juridic Constanta

INSERT INTO departament VALUES (


20, 'Juridic', 'Constanta' );
INSERT INTO salariat VALUES (
3, ’N3’, ’P3 ’, ’11-06-1967’, ’JURIST ’, 2, ’’, ’E3’, 2500, 20 );

23. Stergeti departamentul 20 din tabelul departament_***. Ce observati?


DELETE FROM departament
WHERE cod_dep=20;
/*EROARE la linia 1: ORA-02292: constrângerea de integritate (SCOTT.CCE2) violata – gasita înregistrarea
copil

24. Stergeti constrângerea cce2_***. Recreati această constrângere adăugând optiunea ON DELETE
CASCADE.
ALTER TABLE salariat
DROP CONSTRAINT cce2;
ALTER TABLE salariat
ADD CONSTRAINT cce2 FOREIGN KEY (cod_dep) REFERENCES departament (cod_dep) ON DELETE
CASCADE;

25. Stergeti departamentul 20 din tabelul departament_***. Ce observati în tabelul salariat_***? Anulati
modificările.
DELETE FROM departament
WHERE cod_dep=20;
ROLLBACK;

26. Stergeti constrângerea cce2_***. Recreati această constrângere adăugând optiunea ON DELETE SET
NULL.
ALTER TABLE salariat DROP CONSTRAINT cce2;
ALTER TABLE salariat
ADD CONSTRAINT cce2
FOREIGN KEY (cod_dep)
REFERENCES departament (cod_dep)
ON DELETE SET NULL;

27. Încercati să stergeti departamentul 10 din tabelul departament_***. Ce observati?


DELETE FROM departament
5
WHERE cod_dep=10;
/*1 înregistrare stearsã.

Verificam continutul tabelului departament


SELECT * FROM departament;

Consultarea dictionarului datelor


Informatii despre tabelele create se găsesc în vizualizările :
· USER_TABLES – informatii complete despre tabelele utilizatorului curent.
· ALL_TABLES – informatii complete despre tabelele tuturor utilizatorilor.
· COLS – informatii despre coloane.
· TAB – informatii de bază despre tabelele existente în schema utilizatorului curent.
Informatii despre constrângeri găsim în :
· USER_CONSTRAINTS – informatii despre constrângerile definite de utilizatorul curent;
· ALL_CONSTRAINTS – informatii despre cosntrângerile definite de toti

Definirea vizualizărilor

Sintaxa simplificată a comenzii CREATE VIEW este:

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW nume_view [(alias, alias, ..)]
AS subcerere
[WITH CHECK OPTION [CONSTRAINT nume_constr]]
[WITH READ ONLY [CONSTRAINT nume_constr]];

- FORCE permite crearea vizualizarea înainte de a defini tabelele de bază;


- subcererea poate fi oricât de complexă dar nu poate conŃine clauza ORDER BY;
- WITH CHECK OPTION permite inserarea si modificarea prin intermediul vizualizării numai a liniilor ce sunt
accesibile vizualizării; dacă lipseste numele constrângerii atunci sistemul asociază un nume implicit de tip
SYS_Cn acestei constrângeri;
- WITH READ ONLY asigură că prin intermediul vizualizării nu se pot executa operatii LMD.
Eliminarea unei vizualizări se face prin comanda DROP VIEW :
DROP VIEW nume_viz;

1. Să se creeze vizualizarea v_emp_*** care să contină codul si numele salariatilor din tabelul emp_***. Să
se afiseze continutul acesteia. Să se insereze o nouă înregistrare în această vizualizare. Ce observati? Să se
steargă vizualizarea v_emp_***.

Se creaza tabelul emp

CREATE TABLE emp (


employee_id NUMBER(4) PRIMARY KEY,
last_name VARCHAR2(64),
email VARCHAR2(64),
hire_date DATE DEFAULT SYSDATE,
salary NUMBER(8,2) DEFAULT 1000,
job_id VARCHAR2(10));

Se creaza vizualizarea v_emp

CREATE VIEW v_emp (cod, nume)


AS SELECT employee_id, last_name
FROM emp;

Se afiseaza continutul vizualizarii


6
select * from v_emp;
/*nici o înregistrare selectatã

Inseram o noua inregistrare

INSERT INTO v_emp


VALUES (400,’N1’);

Se sterge vizualizarea v_emp

DROP VIEW v_emp;

2. Să se creeze vizualizarea v_emp_*** care să contină codul, numele, emailul, data angajării, salariul si
codul jobului salariatilor din tabelul emp_***. Să se analizeze structura si continutul vizualizării. Să se
insereze o nouă înregistrare în această vizualizare. Să se verifice că noua înregistrare a fost inserată si în
tabelul de bază.

CREATE VIEW v_emp


AS
SELECT employee_id, last_name, email, hire_date, salary,job_id
FROM emp;
DESC v_emp
SELECT * FROM v_emp;
INSERT INTO v_emp
VALUES (400,’N1’,’E1’,SYSDATE,5000,’SA_REP’);
SELECT employee_id, last_name, email, hire_date, salary, job_id
FROM emp;
/* restrictia unica (SCOTT.SYS_C002806) nu este respectata – linia 5 si 6

3. Să se mărească cu 1000 salariul angajatului având codul 400 din vizualizarea creată anterior. Ce efect va
avea această actiune asupra tabelului de bază?

UPDATE v_emp
SET salary = salary + 1000
WHERE employee_id = 400;
SELECT * FROM v_emp;
SELECT * FROM emp;
/* salariul angajatului cu codul 400 devine 2000, in rest nu se schimba nimic

4. Să se steargă angajatul având codul 400 din vizualizarea creată anterior. Ce efect va avea această
actiune asupra tabelului de bază?

DELETE FROM v_emp


WHERE employee_id =400;
/* tabelul emp nu mai contine nici o inregistrare

5.a) Să se creeze vizualizarea v_emp_dept_*** care să contină employee_id, last_name, hire_date, job_id,
department_id din tabelul emp_*** si coloana department_name din tabelul dept_***.

Cream tabelul dept


CREATE TABLE dept (
department_id NUMBER(2) PRIMARY KEY,
department_descriere VARCHAR2(128));

Inseram in tabelul dept coloana department_name


7
Alter table dept
Add (department_name VARCHAR2(20));

Tabelul emp nu are coloana department_id asa ca trebuie creata pentru a putea continua
ALTER TABLE emp
ADD department_id NUMBER(2);

Se creaza vizualizarea
CREATE VIEW v_emp_dept
AS SELECT e.employee_id, e.last_name, e.hire_date, e.job_id, e.department_id, d.department_name
FROM emp e, dept d
WHERE e.department_id =d.department_id;

5.b) Să încerce inserarea înregistrării (500, 'N2', 'E2',SYSDATE,’SA_REP’,30, 'Administrativ') în


vizualizarea creată anterior.

INSERT INTO v_emp_dept VALUES (


500, 'N2', 'E2', SYSDATE,'SA-REP',30, 'Administrativ');
/*EROARE la linia 1: ORA-00913: prea multe valori

5.c) Care dintre coloanele vizualizării v_emp_dept_*** sunt actualizabile?

SELECT column_name, updatable


FROM user_updatable_columns
WHERE UPPER(table_name) = UPPER('v_emp_dept');
/* Toate sunt actualizabile in afara de departament_name

5.d) Adăugati tabelului emp_*** constrângerea de cheie externă care referă tabelul dept_***, apoi
verificati ce coloane din vizualizarea v_emp_dept_*** sunt actualizabile.

ALTER TABLE emp


ADD CONSTRAINT dep FOREIGN KEY (department_id)
REFERENCES dept1(department_id);
SELECT column_name, updatable
FROM user_updatable_columns
WHERE UPPER(table_name) = UPPER('v_emp_dept');
/* Toate sunt actualizabile in afara de departament_name

5.e) Recreati vizualizarea v_emp_dept_***, apoi verificati ce coloane sunt actualizabile.

CREATE OR REPLACE VIEW v_emp_dept


AS SELECT e.employee_id, e.last_name, e.hire_date, e.job_id, e.department_id, d.departament_name
FROM emp e, dept d
WHERE e.department_id =d.department_id;
SELECT column_name, updatable
FROM user_updatable_columns
WHERE UPPER(table_name) = UPPER('v_emp_dept');
/* Toate sunt actualizabile in afara de departament_name

6. Să se creeze vizualizarea v_dept_*** care să contine codul si numele departamentului, numărul de


angajati din departamentul respectiv si suma alocată pentru plata salariilor. Această vizualizare permite
actualizări?

CREATE VIEW v_dept (cod, nume, nr_angajati, val_salarii)


AS SELECT e.department_id, department_name, COUNT(*) nr_angajati,
SUM(salary) val_salarii
8
FROM emp e, dept d
WHERE e.department_id = d.department_id
GROUP BY e.department_id, department_name;
SELECT column_name, updatable
FROM user_updatable_columns
WHERE UPPER(table_name) = UPPER('v_dept');
/*Aceasta vizualizare nu permite actializari

7. a) Să se creeze vizualizarea v_emp30_*** care să contină numele, emailul, data angajării, salariul, codul
jobului si codul departamentului celor care lucrează în departamentul 30. În această vizualizare nu se va
permite modificarea sau inserarea liniilor ce nu sunt accesibile ei. Dati un nume constrângerii.

CREATE VIEW v_emp30


AS
SELECT employee_id, last_name, email, hire_date, salary, job_id,
department_id
FROM emp
WHERE department_id=30
WITH CHECK OPTION CONSTRAINT ck_option1;

7. b) Să se listeze structura si continutul vizualizării v_emp30_***.

DESCRIBE v_emp30;
SELECT * FROM v_emp30;
/*nici o inregistrare selectata

7. c) Să se încerce prin intermediul vizualizării inserarea unui angajat în departamentul 10 si a unui


angajat în departamentul 30

INSERT INTO v_emp30


VALUES ( 600, 'N5', 'E5', SYSDATE, 4000, 'ADMIN', 10);
EROARE la linia 1: ORA-01402: în vizualizarea WITH CHECK OPTION clauza where este încãlcatã

INSERT INTO v_emp30 VALUES (


600, 'N5', 'E5', SYSDATE, 4000, 'ADMIN', 30);
/*Daca department_id este 30 se face inserarea, inregistrarea de regaseste in tabela emp.

7. d) Să se încerce prin intermediul vizualizării modificarea departamentului unui angajat.

UPDATE v_emp30
SET department_id =20
WHERE employee_id = 11;
/*0 înregistrãri actualizate.

8. Să se creeze o vizualizare (v_dept_***) asupra tabelului dept_*** să nu permită efectuarea nici unei
operatii LMD. Testati operatiile de inserare, modificare si stergere asupra acestei vizualizări.

CREATE VIEW v_dept


AS SELECT * FROM dept
WITH READ ONLY;
/* EROARE la linia 1: ORA-00955: numele este deja utilizat de un obiect existent

CREATE OR REPLACE VIEW v_dept


AS SELECT * FROM dept
WITH READ ONLY;

9
9. Să se consulte informatii despre vizualizarea v_dept_***. Folositi vizualizarea dictionarului datelor
USER_VIEWS (coloanele VIEW_NAME si TEXT).
Obs: Coloana TEXT este de tip LONG. În cazul selectării unei coloane de tip LONG trebuie utilizată
comanda SET LONG n pentru a seta numărul de caractere afisate.

SET LONG 200


SELECT view_name, text
FROM user_views
WHERE UPPER(view_name)=UPPER(’v_dept’);

Definirea secventelor

Sintaxa comenzii CREATE SEQUENCE este:

CREATE SEQUENCE nume_secventă


[INCREMENT BY n]
[START WITH valoare_start]
[ {MAXVALUE valoare_maximă | NOMAXVALUE} ]
[ {MINVALUE valoare_minimă | NOMINVALUE} ]
[ {CYCLE | NOCYCLE} ]
[ {CACHE n | NOCACHE} ];

Stergerea secventelor se realizează cu ajutorul comenzii DROP SEQUENCE.


DROP SEQUENCE nume_secv;

10. Să se creeze o secventă care are pasul de incrementare 10 si începe de la 10, are ca valoare maximă
10000 si nu ciclează.

CREATE SEQUENCE sec


INCREMENT BY 10
START WITH 10
MAXVALUE 10000
NOCYCLE;

11. Să se modifice toate liniile din tabelul emp_***, regenerând codul angajatilor astfel încât să utilizeze
secventa sec_emp***. Să se anuleze modificările.

UPDATE emp
SET employee_id = sec_emp.NEXTVAL;
ROLLBACK;

12. Să se introducă un nou salariat în tabelul emp_*** folosindu-se pentru codul salariatului secventa
creată.

INSERT INTO emp VALUES (


sec_emp.NEXTVAL, 'N5', 'E5', SYSDATE, 2500, 'admin', 30);

13. Să se afiseze valoarea curentă a secventei.

SELECT sec_emp.CURRVAL valoare FROM DUAL;

Exercitiu
a) Creati o secventă pentru generarea codurilor de departamente, seq_dept_***. Secventa va începe de la
200, va creste cu 10 la fiecare pas si va avea valoarea maximă 20000, nu va cicla.
10
CREATE SEQUENCE seq_dept
START WITH 200
INCREMENT BY 10
MAXVALUE 20000
NOCYCLE;

b) Să se selecteze informatii despre secventele utilizatorului curent (nume, valoare minimă, maximă, de
incrementare, ultimul număr generat). Se va utiliza vizualizarea user_sequences.

SELECT * FROM user_sequences


WHERE sequence_name='SEQ_DEPT';

c) Să se insereze o înregistrare nouă în DEPT_*** utilizând secventa creată.

INSERT INTO departments VALUES (


seq_dept.NEXTVAL, 'contabil');

d) Să se selecteze valoarea curentă a secventei.

SELECT seq_dept.CURRVAL valoare FROM DUAL;

e) Să se steargă secventa.

DROP SEQUENCE seq_dept;

Definirea indecsilor

Sintaxa comenzii CREATE INDEX:

CREATE [UNIQUE] INDEX nume_index


ON tabel (coloana1 [, coloana2…]);

Modificarea unui index se face prin comanda ALTER INDEX.


Eliminarea unui index se face prin comanda: DROP INDEX nume_index;

14. Să se creeze un index neunic, emp_last_name_idx_***, asupra coloanei last_name din tabelul emp_***.

CREATE INDEX emp_last_name_idx ON EMP (last_name);

15. Să se creeze indecsi unici asupra codului angajatului (employee_id) si asupra combinatiei last_name,
first_name, hire_date.

CREATE UNIQUE INDEX employee_id_idx ON emp (employee_id);


CREATE UNIQUE INDEX employee_id_idx1 ON emp (last_name, hire_date);

16. Creati un index neunic asupra coloanei department_id din emp_*** pentru a eficientiza joinurile dintre
acest tabel si dept_***.

CREATE INDEX emp_department_idx ON EMP(department_id);

Definirea sinonimelor

11
Comanda pentru crearea sinonimelor este:

CREATE [PUBLIC] SYNONYM nume_sinonim


FOR obiect;

Eliminarea sinonimelor se face prin comanda


DROP SYNONYM nume_sinonim;

17. Creati un sinonim public se_*** pentru tabelul emp_***.

CREATE SYNONYM se for emp;

18. Creati un sinonim pentru vizualizarea v_dept_***.

CREATE SYNONYM sy_dept FOR v_dept;

19. Utilizând sinonimele create anterior, afisati informatii depre salariti si despre departamente.

SELECT * FROM se;

SELECT * FROM sy_dept;

Limbajul de interogare al datelor (DQL). SELECT

CERERI MONOTABEL
1. Analizati 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 condiŃie_clauza_where]
[GROUP BY expresie [, expresie …]
[HAVING condiŃie_clauza_having] ]
[ORDER BY {expresie | poziŃie} [, {expresie | poziŃie} …] ]

2. Să se listeze structura tabelelor din schema HR (EMPLOYEES, DEPARTMENTS, JOB_HISTORY,


JOBS, LOCATIONS, COUNTRIES, REGIONS), observând tipurile de date ale coloanelor.
Obs: Se va utiliza comanda SQL*Plus DESCRIBE nume_tabel

12
Se creaza tabelele:
1. REGIONS TABLE
CREATE TABLE regions
( region_id NUMBER
CONSTRAINT region_id_nn NOT NULL ,
region_name VARCHAR2(25) );

2. COUNTRIES TABLE
CREATE TABLE countries
( country_id CHAR(2)
CONSTRAINT country_id_nn NOT NULL
, country_name VARCHAR2(40)
, region_id NUMBER
, CONSTRAINT country_c_id_pk
PRIMARY KEY (country_id) )
ORGANIZATION INDEX;

3. LOCATIONS TABLE
CREATE TABLE locations
( location_id NUMBER(4)
, street_address VARCHAR2(40)
, postal_code VARCHAR2(12)
, city VARCHAR2(30)
CONSTRAINT loc_city_nn NOT NULL
, state_province VARCHAR2(25)
13
, country_id CHAR(2)
);

4. DEPARTAMENTS TABLE
CREATE TABLE departments
( department_id NUMBER(4)
, department_name VARCHAR2(30)
CONSTRAINT dept_name_nn NOT NULL
, manager_id NUMBER(6)
, location_id NUMBER(4)
);

5. JOBS TABLE
CREATE TABLE jobs
( job_id VARCHAR2(10)
, job_title VARCHAR2(35)
CONSTRAINT job_title_nn NOT NULL
, min_salary NUMBER(6)
, max_salary NUMBER(6)
);

6. EMPLOYYES TABLE
CREATE TABLE employees
( employee_id NUMBER(6)
, first_name VARCHAR2(20)
, last_name VARCHAR2(25)
CONSTRAINT emp_last_name_nn NOT NULL
, email VARCHAR2(25)
CONSTRAINT emp_email_nn NOT NULL
, phone_number VARCHAR2(20)
, hire_date DATE
CONSTRAINT emp_hire_date_nn NOT NULL
, job_id VARCHAR2(10)
CONSTRAINT emp_job_nn NOT NULL
, salary NUMBER(8,2)
, commission_pct NUMBER(2,2)
, manager_id NUMBER(6)
, department_id NUMBER(4)
, CONSTRAINT emp_salary_min
CHECK (salary > 0)
, CONSTRAINT emp_email_uk
UNIQUE (email)) ;

7. JOB_HISTORY TABLE
CREATE TABLE job_history
( employee_id NUMBER(6)
CONSTRAINT jhist_employee_nn NOT NULL
, start_date DATE
CONSTRAINT jhist_start_date_nn NOT NULL
, end_date DATE
CONSTRAINT jhist_end_date_nn NOT NULL
, job_id VARCHAR2(10)
CONSTRAINT jhist_job_nn NOT NULL
, department_id NUMBER(4)
, CONSTRAINT jhist_date_interval
CHECK (end_date > start_date) ) ;
14
8. JOB_GRADES TABLE
CREATE TABLE JOB_GRADES
(grade_level VARCHAR2(3),
lowest_sal NUMBER,
highest_sal NUMBER);

2. Să se listeze structura tabelelor din schema HR (EMPLOYEES, DEPARTMENTS, JOB_HISTORY,


JOBS, LOCATIONS, COUNTRIES, REGIONS), observând tipurile de date ale coloanelor.
Obs: Se va utiliza comanda SQL*Plus DESCRIBE nume_tabel

DESCRIBE employees;
DESCRIBE departments;
DESCRIBE jobs;
DESCRIBE job_history;
DESCRIBE locations;
DESCRIBE countries;
DESCRIBE regions;

3.Să se listeze continutul tabelelor din schema considerată, afisând valorile tuturor câmpurilor. Obs: Se va
utiliza comanda SQL SELECT * FROM nume_tabel;

SELECT * FROM employees;


SELECT * FROM departments;
SELECT * FROM jobs;
SELECT * FROM job_history;
SELECT * FROM locations;
SELECT * FROM countries;
SELECT * FROM regions;
/*nici o înregistrare selectatã – trebuie sa inseram valori in fiecare tabel

1. Inseram datele in tabelul REGIONS


INSERT INTO regions VALUES (
1, 'Europe' );
INSERT INTO regions VALUES (
2, 'Americas' );
INSERT INTO regions VALUES (
3, 'Asia' );
INSERT INTO regions VALUES (
4, 'Middle East and Africa');

2. Inseram datele in tabelul COUNTRIES

INSERT INTO countries VALUES (


'IT', 'Italy', 1);
INSERT INTO countries VALUES(
'JP', 'Japan', 3);
INSERT INTO countries VALUES (
'US', 'United States of America', 2);
INSERT INTO countries VALUES (
'CA', 'Canada', 2);
INSERT INTO countries VALUES (
'CN', 'China'3);
INSERT INTO countries VALUES (
'IN', 'India'3);
INSERT INTO countries VALUES (
15
'AU', 'Australia'3);
INSERT INTO countries VALUES (
'ZW', 'Zimbabwe', 4);
INSERT INTO countries VALUES (
'SG', 'Singapore', 3 );
INSERT INTO countries VALUES (
'UK', 'United Kingdom', 1);
INSERT INTO countries VALUES (
'FR', 'France', 1 );
INSERT INTO countries VALUES (
'DE', 'Germany', 1);
INSERT INTO countries VALUES (
'ZM', 'Zambia', 4);
INSERT INTO countries VALUES (
'EG', 'Egypt', 4);
INSERT INTO countries VALUES (
'BR', 'Brazil', 2);
INSERT INTO countries VALUES (
'CH', 'Switzerland', 1);
INSERT INTO countries VALUES (
'NL', 'Netherlands', 1);
INSERT INTO countries VALUES (
'MX', 'Mexico', 2);
INSERT INTO countries VALUES (
'KW', 'Kuwait', 4);
INSERT INTO countries VALUES (
'IL', 'Israel', 4);
INSERT INTO countries VALUES (
'DK', 'Denmark', 1);
INSERT INTO countries VALUES (
'HK', 'HongKong', 3);
INSERT INTO countries VALUES (
'NG', 'Nigeria', 4);
INSERT INTO countries VALUES (
'AR', 'Argentina' , 2);
INSERT INTO countries VALUES (
'BE', 'Belgium', 1 );

3. Inseram date in tabelul LOCATIONS

INSERT INTO locations VALUES (


1000, '1297 Via Cola di Rie', '00989', 'Roma', NULL, 'IT');
INSERT INTO locations VALUES (
1100, '93091 Calle della Testa', '10934', 'Venice', NULL, 'IT');
INSERT INTO locations VALUES (
1200, '2017 Shinjuku-ku', '1689', 'Tokyo', 'Tokyo Prefecture', 'JP');
INSERT INTO locations VALUES (
1300, '9450 Kamiya-cho', '6823', 'Hiroshima', NULL, 'JP');
INSERT INTO locations VALUES (
1400, '2014 Jabberwocky Rd', '26192', 'Southlake', 'Texas', 'US');
INSERT INTO locations VALUES (
1500, '2011 Interiors Blvd', '99236', 'South San Francisco', 'California', 'US');
INSERT INTO locations VALUES (
1600, '2007 Zagora St', '50090', 'South Brunswick', 'New Jersey', 'US');
INSERT INTO locations VALUES (
1700, '2004 Charade Rd', '98199', 'Seattle', 'Washington', 'US');
16
INSERT INTO locations VALUES (
1800, '147 Spadina Ave', 'M5V 2L7', 'Toronto', 'Ontario', 'CA');
INSERT INTO locations VALUES ( 1900, '6092 Boxwood St', 'YSW 9T2', 'Whitehorse', 'Yukon', 'CA');
INSERT INTO locations VALUES (
2000, '40-5-12 Laogianggen', '190518', 'Beijing', NULL, 'CN');
INSERT INTO locations VALUES (
2100, '1298 Vileparle (E)', '490231', 'Bombay', 'Maharashtra', 'IN');
INSERT INTO locations VALUES(
2200 '12-98 Victoria Street', '2901', 'Sydney', 'New South Wales', 'AU');
INSERT INTO locations VALUES (
2300, '198 Clementi North', '540198', 'Singapore', NULL, 'SG');
INSERT INTO locations VALUES ( 2400, '8204 Arthur St', NULL, 'London', NULL, 'UK');
INSERT INTO locations VALUES (
2500 , 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford', 'UK');
INSERT INTO locations VALUES (
2600, '9702 Chester Road', '09629850293', 'Stretford', 'Manchester', 'UK');
INSERT INTO locations VALUES (
2700, 'Schwanthalerstr. 7031', '80925', 'Munich', 'Bavaria', 'DE');
INSERT INTO locations VALUES (
2800, 'Rua Frei Caneca 1360 ', '01307-002', 'Sao Paulo', 'Sao Paulo', 'BR');
INSERT INTO locations VALUES (
2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve', 'CH');
INSERT INTO locations VALUES (
3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE', 'CH');
INSERT INTO locations VALUES (
3100, 'Pieter Breughelstraat 837', '3029SK', 'Utrecht', 'Utrecht', 'NL');
INSERT INTO locations VALUES (
3200 , 'Mariano Escobedo 9991', '11932', 'Mexico City', 'Distrito Federal,', 'MX');

4. Inseram date in tabelul DEPARTMENTS

INSERT INTO departments VALUES (


10, 'Administration', 200, 1700);
INSERT INTO departments VALUES (
20, 'Marketing', 201, 1800);
INSERT INTO departments VALUES (
30, 'Purchasing', 114, 1700);
INSERT INTO departments VALUES (
40, 'Human Resources', 203, 2400);
INSERT INTO departments VALUES (
50, 'Shipping', 121, 1500);
INSERT INTO departments VALUES (
60, 'IT', 103, 1400);
INSERT INTO departments VALUES (
70, 'Public Relations', 204, 2700);
INSERT INTO departments VALUES (
80, 'Sales', 145, 2500);
INSERT INTO departments VALUES (
90, 'Executive', 100, 1700);
INSERT INTO departments VALUES (
100, 'Finance', 108, 1700);
INSERT INTO departments VALUES (
110, 'Accounting', 205, 1700);
INSERT INTO departments VALUES (
120, 'Treasury', NULL, 1700);
INSERT INTO departments VALUES (
17
130, 'Corporate Tax', NULL, 1700);
INSERT INTO departments VALUES (
140, 'Control And Credit'
, NULL
, 1700
);

INSERT INTO departments VALUES


( 150
, 'Shareholder Services'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 160
, 'Benefits'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 170
, 'Manufacturing'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 180
, 'Construction'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 190
, 'Contracting'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 200
, 'Operations'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 210
, 'IT Support'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 220
, 'NOC'
, NULL
, 1700
);
INSERT INTO departments VALUES
18
( 230
, 'IT Helpdesk'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 240
, 'Government Sales'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 250
, 'Retail Sales'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 260
, 'Recruiting'
, NULL
, 1700
);
INSERT INTO departments VALUES
( 270
, 'Payroll'
, NULL
, 1700
);

5.Inseram date in tabelul JOBS

INSERT INTO jobs VALUES


( 'AD_PRES'
, 'President'
, 20000
, 40000
);
INSERT INTO jobs VALUES
( 'AD_VP'
, 'Administration Vice President'
, 15000
, 30000
);
INSERT INTO jobs VALUES
( 'AD_ASST'
, 'Administration Assistant'
, 3000
, 6000
);
INSERT INTO jobs VALUES
( 'FI_MGR'
, 'Finance Manager'
, 8200
, 16000
19
);
INSERT INTO jobs VALUES
( 'FI_ACCOUNT'
, 'Accountant'
, 4200
, 9000
);
INSERT INTO jobs VALUES
( 'AC_MGR'
, 'Accounting Manager'
, 8200
, 16000
);
INSERT INTO jobs VALUES
( 'AC_ACCOUNT'
, 'Public Accountant'
, 4200
, 9000
);
INSERT INTO jobs VALUES
( 'SA_MAN'
, 'Sales Manager'
, 10000
, 20000
);
INSERT INTO jobs VALUES
( 'SA_REP'
, 'Sales Representative'
, 6000
, 12000
);
INSERT INTO jobs VALUES
( 'PU_MAN'
, 'Purchasing Manager'
, 8000
, 15000
);
INSERT INTO jobs VALUES
( 'PU_CLERK'
, 'Purchasing Clerk'
, 2500
, 5500
);
INSERT INTO jobs VALUES
( 'ST_MAN'
, 'Stock Manager'
, 5500
, 8500
);
INSERT INTO jobs VALUES
( 'ST_CLERK'
, 'Stock Clerk'
, 2000
, 5000
);
INSERT INTO jobs VALUES
20
( 'SH_CLERK'
, 'Shipping Clerk'
, 2500
, 5500
);
INSERT INTO jobs VALUES
( 'IT_PROG'
, 'Programmer'
, 4000
, 10000
);
INSERT INTO jobs VALUES
( 'MK_MAN'
, 'Marketing Manager'
, 9000
, 15000
);
INSERT INTO jobs VALUES
( 'MK_REP'
, 'Marketing Representative'
, 4000
, 9000
);
INSERT INTO jobs VALUES
( 'HR_REP'
, 'Human Resources Representative'
, 4000
, 9000
);
INSERT INTO jobs VALUES
( 'PR_REP'
, 'Public Relations Representative'
, 4500
, 10500
);

Inseram date in tabelul EMPLOYEES

INSERT INTO employees VALUES


( 100
, 'Steven'
, 'King'
, 'SKING'
, '515.123.4567'
, TO_DATE('17-IUN-1987', 'dd-MON-yyyy')
, 'AD_PRES'
, 24000
, NULL
, NULL
, 90
);
INSERT INTO employees VALUES
( 101
, 'Neena'
, 'Kochhar'
, 'NKOCHHAR'
21
, '515.123.4568'
, TO_DATE('21-SEP-1989', 'dd-MON-yyyy')
, 'AD_VP'
, 17000
, NULL
, 100
, 90
);
INSERT INTO employees VALUES
( 102
, 'Lex'
, 'De Haan'
, 'LDEHAAN'
, '515.123.4569'
, TO_DATE('13-IAN-1993', 'dd-MON-yyyy')
, 'AD_VP'
, 17000
, NULL
, 100
, 90
);
INSERT INTO employees VALUES
( 103
, 'Alexander'
, 'Hunold'
, 'AHUNOLD'
, '590.423.4567'
, TO_DATE('03-IAN-1990', 'dd-MON-yyyy')
, 'IT_PROG'
, 9000
, NULL
, 102
, 60
);
INSERT INTO employees VALUES
( 104
, 'Bruce'
, 'Ernst'
, 'BERNST'
, '590.423.4568'
, TO_DATE('21-MAI-1991', 'dd-MON-yyyy')
, 'IT_PROG'
, 6000
, NULL
, 103
, 60
);
INSERT INTO employees VALUES
( 105
, 'David'
, 'Austin'
, 'DAUSTIN'
, '590.423.4569'
, TO_DATE('25-IUN-1997', 'dd-MON-yyyy')
, 'IT_PROG'
, 4800
22
, NULL
, 103
, 60
);
INSERT INTO employees VALUES
( 106
, 'Valli'
, 'Pataballa'
, 'VPATABAL'
, '590.423.4560'
, TO_DATE('05-FEB-1998', 'dd-MON-yyyy')
, 'IT_PROG'
, 4800
, NULL
, 103
, 60
);
INSERT INTO employees VALUES
( 107
, 'Diana'
, 'Lorentz'
, 'DLORENTZ'
, '590.423.5567'
, TO_DATE('07-FEB-1999', 'dd-MON-yyyy')
, 'IT_PROG'
, 4200
, NULL
, 103
, 60
);
INSERT INTO employees VALUES
( 108
, 'Nancy'
, 'Greenberg'
, 'NGREENBE'
, '515.124.4569'
, TO_DATE('17-AUG-1994', 'dd-MON-yyyy')
, 'FI_MGR'
, 12000
, NULL
, 101
, 100
);
INSERT INTO employees VALUES
( 109
, 'Daniel'
, 'Faviet'
, 'DFAVIET'
, '515.124.4169'
, TO_DATE('16-AUG-1994', 'dd-MON-yyyy')
, 'FI_ACCOUNT'
, 9000
, NULL
, 108
, 100
);
23
INSERT INTO employees VALUES
( 110
, 'John'
, 'Chen'
, 'JCHEN'
, '515.124.4269'
, TO_DATE('28-SEP-1997', 'dd-MON-yyyy')
, 'FI_ACCOUNT'
, 8200
, NULL
, 108
, 100
);
INSERT INTO employees VALUES
( 111
, 'Ismael'
, 'Sciarra'
, 'ISCIARRA'
, '515.124.4369'
, TO_DATE('30-SEP-1997', 'dd-MON-yyyy')
, 'FI_ACCOUNT'
, 7700
, NULL
, 108
, 100
);
INSERT INTO employees VALUES
( 112
, 'Jose Manuel'
, 'Urman'
, 'JMURMAN'
, '515.124.4469'
, TO_DATE('07-MAR-1998', 'dd-MON-yyyy')
, 'FI_ACCOUNT'
, 7800
, NULL
, 108
, 100
);
INSERT INTO employees VALUES
( 113
, 'Luis'
, 'Popp'
, 'LPOPP'
, '515.124.4567'
, TO_DATE('07-DEC-1999', 'dd-MON-yyyy')
, 'FI_ACCOUNT'
, 6900
, NULL
, 108
, 100
);
INSERT INTO employees VALUES
( 114
, 'Den'
, 'Raphaely'
24
, 'DRAPHEAL'
, '515.127.4561'
, TO_DATE('07-DEC-1994', 'dd-MON-yyyy')
, 'PU_MAN'
, 11000
, NULL
, 100
, 30
);
INSERT INTO employees VALUES
( 115
, 'Alexander'
, 'Khoo'
, 'AKHOO'
, '515.127.4562'
, TO_DATE('18-MAI-1995', 'dd-MON-yyyy')
, 'PU_CLERK'
, 3100
, NULL
, 114
, 30
);
INSERT INTO employees VALUES
( 116
, 'Shelli'
, 'Baida'
, 'SBAIDA'
, '515.127.4563'
, TO_DATE('24-DEC-1997', 'dd-MON-yyyy')
, 'PU_CLERK'
, 2900
, NULL
, 114
, 30
);
INSERT INTO employees VALUES
( 117
, 'Sigal'
, 'Tobias'
, 'STOBIAS'
, '515.127.4564'
, TO_DATE('24-IUL-1997', 'dd-MON-yyyy')
, 'PU_CLERK'
, 2800
, NULL
, 114
, 30
);
INSERT INTO employees VALUES
( 118
, 'Guy'
, 'Himuro'
, 'GHIMURO'
, '515.127.4565'
, TO_DATE('15-NOI-1998', 'dd-MON-yyyy')
, 'PU_CLERK'
25
, 2600
, NULL
, 114
, 30
);

INSERT INTO employees VALUES


( 119
, 'Karen'
, 'Colmenares'
, 'KCOLMENA'
, '515.127.4566'
, TO_DATE('10-AUG-1999', 'dd-MON-yyyy')
, 'PU_CLERK'
, 2500
, NULL
, 114
, 30
);
INSERT INTO employees VALUES
( 120
, 'Matthew'
, 'Weiss'
, 'MWEISS'
, '650.123.1234'
, TO_DATE('18-IUL-1996', 'dd-MON-yyyy')
, 'ST_MAN'
, 8000
, NULL
, 100
, 50
);
INSERT INTO employees VALUES
( 121
, 'Adam'
, 'Fripp'
, 'AFRIPP'
, '650.123.2234'
, TO_DATE('10-APR-1997', 'dd-MON-yyyy')
, 'ST_MAN'
, 8200
, NULL
, 100
, 50
);
INSERT INTO employees VALUES
( 122
, 'Payam'
, 'Kaufling'
, 'PKAUFLIN'
, '650.123.3234'
, TO_DATE('01-MAI-1995', 'dd-MON-yyyy')
, 'ST_MAN'
, 7900
, NULL
, 100
26
, 50
);
INSERT INTO employees VALUES
( 123
, 'Shanta'
, 'Vollman'
, 'SVOLLMAN'
, '650.123.4234'
, TO_DATE('10-OCT-1997', 'dd-MON-yyyy')
, 'ST_MAN'
, 6500
, NULL
, 100
, 50
);
INSERT INTO employees VALUES
( 124
, 'Kevin'
, 'Mourgos'
, 'KMOURGOS'
, '650.123.5234'
, TO_DATE('16-NOI-1999', 'dd-MON-yyyy')
, 'ST_MAN'
, 5800
, NULL
, 100
, 50
);
INSERT INTO employees VALUES
( 125
, 'Julia'
, 'Nayer'
, 'JNAYER'
, '650.124.1214'
, TO_DATE('16-IUL-1997', 'dd-MON-yyyy')
, 'ST_CLERK'
, 3200
, NULL
, 120
, 50
);
INSERT INTO employees VALUES
( 126
, 'Irene'
, 'Mikkilineni'
, 'IMIKKILI'
, '650.124.1224'
, TO_DATE('28-SEP-1998', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2700
, NULL
, 120
, 50
);
INSERT INTO employees VALUES
( 127
27
, 'James'
, 'Landry'
, 'JLANDRY'
, '650.124.1334'
, TO_DATE('14-IAN-1999', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2400
, NULL
, 120
, 50
);
INSERT INTO employees VALUES
( 128
, 'Steven'
, 'Markle'
, 'SMARKLE'
, '650.124.1434'
, TO_DATE('08-MAR-2000', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2200
, NULL
, 120
, 50
);
INSERT INTO employees VALUES
( 129
, 'Laura'
, 'Bissot'
, 'LBISSOT'
, '650.124.5234'
, TO_DATE('20-AUG-1997', 'dd-MON-yyyy')
, 'ST_CLERK'
, 3300
, NULL
, 121
, 50
);
INSERT INTO employees VALUES
( 130
, 'Mozhe'
, 'Atkinson'
, 'MATKINSO'
, '650.124.6234'
, TO_DATE('30-OCT-1997', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2800
, NULL
, 121
, 50
);
INSERT INTO employees VALUES
( 131
, 'James'
, 'Marlow'
, 'JAMRLOW'
, '650.124.7234'
28
, TO_DATE('16-FEB-1997', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2500
, NULL
, 121
, 50
);
INSERT INTO employees VALUES
( 132
, 'TJ'
, 'Olson'
, 'TJOLSON'
, '650.124.8234'
, TO_DATE('10-APR-1999', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2100
, NULL
, 121
, 50
);
INSERT INTO employees VALUES
( 133
, 'Jason'
, 'Mallin'
, 'JMALLIN'
, '650.127.1934'
, TO_DATE('14-IUN-1996', 'dd-MON-yyyy')
, 'ST_CLERK'
, 3300
, NULL
, 122
, 50
);
INSERT INTO employees VALUES
( 134
, 'Michael'
, 'Rogers'
, 'MROGERS'
, '650.127.1834'
, TO_DATE('26-AUG-1998', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2900
, NULL
, 122
, 50
);
INSERT INTO employees VALUES
( 135
, 'Ki'
, 'Gee'
, 'KGEE'
, '650.127.1734'
, TO_DATE('12-DEC-1999', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2400
, NULL
29
, 122
, 50
);
INSERT INTO employees VALUES
( 136
, 'Hazel'
, 'Philtanker'
, 'HPHILTAN'
, '650.127.1634'
, TO_DATE('06-FEB-2000', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2200
, NULL
, 122
, 50
);
INSERT INTO employees VALUES
( 137
, 'Renske'
, 'Ladwig'
, 'RLADWIG'
, '650.121.1234'
, TO_DATE('14-IUL-1995', 'dd-MON-yyyy')
, 'ST_CLERK'
, 3600
, NULL
, 123
, 50
);
INSERT INTO employees VALUES
( 138
, 'Stephen'
, 'Stiles'
, 'SSTILES'
, '650.121.2034'
, TO_DATE('26-OCT-1997', 'dd-MON-yyyy')
, 'ST_CLERK'
, 3200
, NULL
, 123
, 50
);
INSERT INTO employees VALUES
( 139
, 'John'
, 'Seo'
, 'JSEO'
, '650.121.2019'
, TO_DATE('12-FEB-1998', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2700
, NULL
, 123
, 50
);
INSERT INTO employees VALUES
30
( 140
, 'Joshua'
, 'Patel'
, 'JPATEL'
, '650.121.1834'
, TO_DATE('06-APR-1998', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2500
, NULL
, 123
, 50
);
INSERT INTO employees VALUES
( 141
, 'Trenna'
, 'Rajs'
, 'TRAJS'
, '650.121.8009'
, TO_DATE('17-OCT-1995', 'dd-MON-yyyy')
, 'ST_CLERK'
, 3500
, NULL
, 124
, 50
);
INSERT INTO employees VALUES
( 142
, 'Curtis'
, 'Davies'
, 'CDAVIES'
, '650.121.2994'
, TO_DATE('29-IAN-1997', 'dd-MON-yyyy')
, 'ST_CLERK'
, 3100
, NULL
, 124
, 50
);
INSERT INTO employees VALUES
( 143
, 'Randall'
, 'Matos'
, 'RMATOS'
, '650.121.2874'
, TO_DATE('15-MAR-1998', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2600
, NULL
, 124
, 50
);
INSERT INTO employees VALUES
( 144
, 'Peter'
, 'Vargas'
, 'PVARGAS'
31
, '650.121.2004'
, TO_DATE('09-IUL-1998', 'dd-MON-yyyy')
, 'ST_CLERK'
, 2500
, NULL
, 124
, 50
);
INSERT INTO employees VALUES
( 145
, 'John'
, 'Russell'
, 'JRUSSEL'
, '011.44.1344.429268'
, TO_DATE('01-OCT-1996', 'dd-MON-yyyy')
, 'SA_MAN'
, 14000
, .4
, 100
, 80
);
INSERT INTO employees VALUES
( 146
, 'Karen'
, 'Partners'
, 'KPARTNER'
, '011.44.1344.467268'
, TO_DATE('05-IAN-1997', 'dd-MON-yyyy')
, 'SA_MAN'
, 13500
, .3
, 100
, 80
);
INSERT INTO employees VALUES
( 147
, 'Alberto'
, 'Errazuriz'
, 'AERRAZUR'
, '011.44.1344.429278'
, TO_DATE('10-MAR-1997', 'dd-MON-yyyy')
, 'SA_MAN'
, 12000
, .3
, 100
, 80
);
INSERT INTO employees VALUES
( 148
, 'Gerald'
, 'Cambrault'
, 'GCAMBRAU'
, '011.44.1344.619268'
, TO_DATE('15-OCT-1999', 'dd-MON-yyyy')
, 'SA_MAN'
, 11000
32
, .3
, 100
, 80
);

INSERT INTO employees VALUES


( 149
, 'Eleni'
, 'Zlotkey'
, 'EZLOTKEY'
, '011.44.1344.429018'
, TO_DATE('29-IAN-2000', 'dd-MON-yyyy')
, 'SA_MAN'
, 10500
, .2
, 100
, 80
);
INSERT INTO employees VALUES
( 150
, 'Peter'
, 'Tucker'
, 'PTUCKER'
, '011.44.1344.129268'
, TO_DATE('30-IAN-1997', 'dd-MON-yyyy')
, 'SA_REP'
, 10000
, .3
, 145
, 80
);
INSERT INTO employees VALUES
( 151
, 'David'
, 'Bernstein'
, 'DBERNSTE'
, '011.44.1344.345268'
, TO_DATE('24-MAR-1997', 'dd-MON-yyyy')
, 'SA_REP'
, 9500
, .25
, 145
, 80
);
INSERT INTO employees VALUES
( 152
, 'Peter'
, 'Hall'
, 'PHALL'
, '011.44.1344.478968'
, TO_DATE('20-AUG-1997', 'dd-MON-yyyy')
, 'SA_REP'
, 9000
, .25
, 145
, 80
33
);
INSERT INTO employees VALUES
( 153
, 'Christopher'
, 'Olsen'
, 'COLSEN'
, '011.44.1344.498718'
, TO_DATE('30-MAR-1998', 'dd-MON-yyyy')
, 'SA_REP'
, 8000
, .2
, 145
, 80
);
INSERT INTO employees VALUES
( 154
, 'Nanette'
, 'Cambrault'
, 'NCAMBRAU'
, '011.44.1344.987668'
, TO_DATE('09-DEC-1998', 'dd-MON-yyyy')
, 'SA_REP'
, 7500
, .2
, 145
, 80
);
INSERT INTO employees VALUES
( 155
, 'Oliver'
, 'Tuvault'
, 'OTUVAULT'
, '011.44.1344.486508'
, TO_DATE('23-NOI-1999', 'dd-MON-yyyy')
, 'SA_REP'
, 7000
, .15
, 145
, 80
);
INSERT INTO employees VALUES
( 156
, 'Janette'
, 'King'
, 'JKING'
, '011.44.1345.429268'
, TO_DATE('30-IAN-1996', 'dd-MON-yyyy')
, 'SA_REP'
, 10000
, .35
, 146
, 80
);
INSERT INTO employees VALUES
( 157
, 'Patrick'
34
, 'Sully'
, 'PSULLY'
, '011.44.1345.929268'
, TO_DATE('04-MAR-1996', 'dd-MON-yyyy')
, 'SA_REP'
, 9500
, .35
, 146
, 80
);
INSERT INTO employees VALUES
( 158
, 'Allan'
, 'McEwen'
, 'AMCEWEN'
, '011.44.1345.829268'
, TO_DATE('01-AUG-1996', 'dd-MON-yyyy')
, 'SA_REP'
, 9000
, .35
, 146
, 80
);
INSERT INTO employees VALUES
( 159
, 'Lindsey'
, 'Smith'
, 'LSMITH'
, '011.44.1345.729268'
, TO_DATE('10-MAR-1997', 'dd-MON-yyyy')
, 'SA_REP'
, 8000
, .3
, 146
, 80
);
INSERT INTO employees VALUES
( 160
, 'Louise'
, 'Doran'
, 'LDORAN'
, '011.44.1345.629268'
, TO_DATE('15-DEC-1997', 'dd-MON-yyyy')
, 'SA_REP'
, 7500
, .3
, 146
, 80
);
INSERT INTO employees VALUES
( 161
, 'Sarath'
, 'Sewall'
, 'SSEWALL'
, '011.44.1345.529268'
, TO_DATE('03-NOI-1998', 'dd-MON-yyyy')
35
, 'SA_REP'
, 7000
, .25
, 146
, 80
);
INSERT INTO employees VALUES
( 162
, 'Clara'
, 'Vishney'
, 'CVISHNEY'
, '011.44.1346.129268'
, TO_DATE('11-NOI-1997', 'dd-MON-yyyy')
, 'SA_REP'
, 10500
, .25
, 147
, 80
);
INSERT INTO employees VALUES
( 163
, 'Danielle'
, 'Greene'
, 'DGREENE'
, '011.44.1346.229268'
, TO_DATE('19-MAR-1999', 'dd-MON-yyyy')
, 'SA_REP'
, 9500
, .15
, 147
, 80
);
INSERT INTO employees VALUES
( 164
, 'Mattea'
, 'Marvins'
, 'MMARVINS'
, '011.44.1346.329268'
, TO_DATE('24-IAN-2000', 'dd-MON-yyyy')
, 'SA_REP'
, 7200
, .10
, 147
, 80
);
INSERT INTO employees VALUES
( 165
, 'David'
, 'Lee'
, 'DLEE'
, '011.44.1346.529268'
, TO_DATE('23-FEB-2000', 'dd-MON-yyyy')
, 'SA_REP'
, 6800
, .1
, 147
36
, 80
);
INSERT INTO employees VALUES
( 166
, 'Sundar'
, 'Ande'
, 'SANDE'
, '011.44.1346.629268'
, TO_DATE('24-MAR-2000', 'dd-MON-yyyy')
, 'SA_REP'
, 6400
, .10
, 147
, 80
);
INSERT INTO employees VALUES
( 167
, 'Amit'
, 'Banda'
, 'ABANDA'
, '011.44.1346.729268'
, TO_DATE('21-APR-2000', 'dd-MON-yyyy')
, 'SA_REP'
, 6200
, .10
, 147
, 80
);
INSERT INTO employees VALUES
( 168
, 'Lisa'
, 'Ozer'
, 'LOZER'
, '011.44.1343.929268'
, TO_DATE('11-MAR-1997', 'dd-MON-yyyy')
, 'SA_REP'
, 11500
, .25
, 148
, 80
);
INSERT INTO employees VALUES
( 169
, 'Harrison'
, 'Bloom'
, 'HBLOOM'
, '011.44.1343.829268'
, TO_DATE('23-MAR-1998', 'dd-MON-yyyy')
, 'SA_REP'
, 10000
, .20
, 148
, 80
);
INSERT INTO employees VALUES
( 170
37
, 'Tayler'
, 'Fox'
, 'TFOX'
, '011.44.1343.729268'
, TO_DATE('24-IAN-1998', 'dd-MON-yyyy')
, 'SA_REP'
, 9600
, .20
, 148
, 80
);

INSERT INTO employees VALUES


( 171
, 'William'
, 'Smith'
, 'WSMITH'
, '011.44.1343.629268'
, TO_DATE('23-FEB-1999', 'dd-MON-yyyy')
, 'SA_REP'
, 7400
, .15
, 148
, 80
);

INSERT INTO employees VALUES


( 172
, 'Elizabeth'
, 'Bates'
, 'EBATES'
, '011.44.1343.529268'
, TO_DATE('24-MAR-1999', 'dd-MON-yyyy')
, 'SA_REP'
, 7300
, .15
, 148
, 80
);

INSERT INTO employees VALUES


( 173
, 'Sundita'
, 'Kumar'
, 'SKUMAR'
, '011.44.1343.329268'
, TO_DATE('21-APR-2000', 'dd-MON-yyyy')
, 'SA_REP'
, 6100
, .10
, 148
, 80
);

INSERT INTO employees VALUES


( 174
38
, 'Ellen'
, 'Abel'
, 'EABEL'
, '011.44.1644.429267'
, TO_DATE('11-MAI-1996', 'dd-MON-yyyy')
, 'SA_REP'
, 11000
, .30
, 149
, 80
);

INSERT INTO employees VALUES


( 175
, 'Alyssa'
, 'Hutton'
, 'AHUTTON'
, '011.44.1644.429266'
, TO_DATE('19-MAR-1997', 'dd-MON-yyyy')
, 'SA_REP'
, 8800
, .25
, 149
, 80
);

INSERT INTO employees VALUES


( 176
, 'Jonathon'
, 'Taylor'
, 'JTAYLOR'
, '011.44.1644.429265'
, TO_DATE('24-MAR-1998', 'dd-MON-yyyy')
, 'SA_REP'
, 8600
, .20
, 149
, 80
);

INSERT INTO employees VALUES


( 177
, 'Jack'
, 'Livingston'
, 'JLIVINGS'
, '011.44.1644.429264'
, TO_DATE('23-APR-1998', 'dd-MON-yyyy')
, 'SA_REP'
, 8400
, .20
, 149
, 80
);

INSERT INTO employees VALUES


( 178
39
, 'Kimberely'
, 'Grant'
, 'KGRANT'
, '011.44.1644.429263'
, TO_DATE('24-MAI-1999', 'dd-MON-yyyy')
, 'SA_REP'
, 7000
, .15
, 149
, NULL
);

INSERT INTO employees VALUES


( 179
, 'Charles'
, 'Johnson'
, 'CJOHNSON'
, '011.44.1644.429262'
, TO_DATE('04-IAN-2000', 'dd-MON-yyyy')
, 'SA_REP'
, 6200
, .10
, 149
, 80
);

INSERT INTO employees VALUES


( 180
, 'Winston'
, 'Taylor'
, 'WTAYLOR'
, '650.507.9876'
, TO_DATE('24-IAN-1998', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3200
, NULL
, 120
, 50
);

INSERT INTO employees VALUES


( 181
, 'Jean'
, 'Fleaur'
, 'JFLEAUR'
, '650.507.9877'
, TO_DATE('23-FEB-1998', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3100
, NULL
, 120
, 50
);

INSERT INTO employees VALUES


( 182
40
, 'Martha'
, 'Sullivan'
, 'MSULLIVA'
, '650.507.9878'
, TO_DATE('21-IUN-1999', 'dd-MON-yyyy')
, 'SH_CLERK'
, 2500
, NULL
, 120
, 50
);

INSERT INTO employees VALUES


( 183
, 'Girard'
, 'Geoni'
, 'GGEONI'
, '650.507.9879'
, TO_DATE('03-FEB-2000', 'dd-MON-yyyy')
, 'SH_CLERK'
, 2800
, NULL
, 120
, 50
);

INSERT INTO employees VALUES


( 184
, 'Nandita'
, 'Sarchand'
, 'NSARCHAN'
, '650.509.1876'
, TO_DATE('27-IAN-1996', 'dd-MON-yyyy')
, 'SH_CLERK'
, 4200
, NULL
, 121
, 50
);

INSERT INTO employees VALUES


( 185
, 'Alexis'
, 'Bull'
, 'ABULL'
, '650.509.2876'
, TO_DATE('20-FEB-1997', 'dd-MON-yyyy')
, 'SH_CLERK'
, 4100
, NULL
, 121
, 50
);

INSERT INTO employees VALUES


( 186
41
, 'Julia'
, 'Dellinger'
, 'JDELLING'
, '650.509.3876'
, TO_DATE('24-IUN-1998', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3400
, NULL
, 121
, 50
);

INSERT INTO employees VALUES


( 187
, 'Anthony'
, 'Cabrio'
, 'ACABRIO'
, '650.509.4876'
, TO_DATE('07-FEB-1999', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3000
, NULL
, 121
, 50
);

INSERT INTO employees VALUES


( 188
, 'Kelly'
, 'Chung'
, 'KCHUNG'
, '650.505.1876'
, TO_DATE('14-IUN-1997', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3800
, NULL
, 122
, 50
);

INSERT INTO employees VALUES


( 189
, 'Jennifer'
, 'Dilly'
, 'JDILLY'
, '650.505.2876'
, TO_DATE('13-AUG-1997', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3600
, NULL
, 122
, 50
);

INSERT INTO employees VALUES


( 190
42
, 'Timothy'
, 'Gates'
, 'TGATES'
, '650.505.3876'
, TO_DATE('11-IUL-1998', 'dd-MON-yyyy')
, 'SH_CLERK'
, 2900
, NULL
, 122
, 50
);

INSERT INTO employees VALUES


( 191
, 'Randall'
, 'Perkins'
, 'RPERKINS'
, '650.505.4876'
, TO_DATE('19-DEC-1999', 'dd-MON-yyyy')
, 'SH_CLERK'
, 2500
, NULL
, 122
, 50
);

INSERT INTO employees VALUES


( 192
, 'Sarah'
, 'Bell'
, 'SBELL'
, '650.501.1876'
, TO_DATE('04-FEB-1996', 'dd-MON-yyyy')
, 'SH_CLERK'
, 4000
, NULL
, 123
, 50
);

INSERT INTO employees VALUES


( 193
, 'Britney'
, 'Everett'
, 'BEVERETT'
, '650.501.2876'
, TO_DATE('03-MAR-1997', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3900
, NULL
, 123
, 50
);

INSERT INTO employees VALUES


( 194
43
, 'Samuel'
, 'McCain'
, 'SMCCAIN'
, '650.501.3876'
, TO_DATE('01-IUL-1998', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3200
, NULL
, 123
, 50
);

INSERT INTO employees VALUES


( 195
, 'Vance'
, 'Jones'
, 'VJONES'
, '650.501.4876'
, TO_DATE('17-MAR-1999', 'dd-MON-yyyy')
, 'SH_CLERK'
, 2800
, NULL
, 123
, 50
);

INSERT INTO employees VALUES


( 196
, 'Alana'
, 'Walsh'
, 'AWALSH'
, '650.507.9811'
, TO_DATE('24-APR-1998', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3100
, NULL
, 124
, 50
);

INSERT INTO employees VALUES


( 197
, 'Kevin'
, 'Feeney'
, 'KFEENEY'
, '650.507.9822'
, TO_DATE('23-MAI-1998', 'dd-MON-yyyy')
, 'SH_CLERK'
, 3000
, NULL
, 124
, 50
);

INSERT INTO employees VALUES


( 198
44
, 'Donald'
, 'OConnell'
, 'DOCONNEL'
, '650.507.9833'
, TO_DATE('21-IUN-1999', 'dd-MON-yyyy')
, 'SH_CLERK'
, 2600
, NULL
, 124
, 50
);

INSERT INTO employees VALUES


( 199
, 'Douglas'
, 'Grant'
, 'DGRANT'
, '650.507.9844'
, TO_DATE('13-IAN-2000', 'dd-MON-yyyy')
, 'SH_CLERK'
, 2600
, NULL
, 124
, 50
);

INSERT INTO employees VALUES


( 200
, 'Jennifer'
, 'Whalen'
, 'JWHALEN'
, '515.123.4444'
, TO_DATE('17-SEP-1987', 'dd-MON-yyyy')
, 'AD_ASST'
, 4400
, NULL
, 101
, 10
);

INSERT INTO employees VALUES


( 201
, 'Michael'
, 'Hartstein'
, 'MHARTSTE'
, '515.123.5555'
, TO_DATE('17-FEB-1996', 'dd-MON-yyyy')
, 'MK_MAN'
, 13000
, NULL
, 100
, 20
);

INSERT INTO employees VALUES


( 202
45
, 'Pat'
, 'Fay'
, 'PFAY'
, '603.123.6666'
, TO_DATE('17-AUG-1997', 'dd-MON-yyyy')
, 'MK_REP'
, 6000
, NULL
, 201
, 20
);

INSERT INTO employees VALUES


( 203
, 'Susan'
, 'Mavris'
, 'SMAVRIS'
, '515.123.7777'
, TO_DATE('07-IUN-1994', 'dd-MON-yyyy')
, 'HR_REP'
, 6500
, NULL
, 101
, 40
);

INSERT INTO employees VALUES


( 204
, 'Hermann'
, 'Baer'
, 'HBAER'
, '515.123.8888'
, TO_DATE('07-JUN-1994', 'dd-MON-yyyy')
, 'PR_REP'
, 10000
, NULL
, 101
, 70
);

INSERT INTO employees VALUES


( 205
, 'Shelley'
, 'Higgins'
, 'SHIGGINS'
, '515.123.8080'
, TO_DATE('07-IUN-1994', 'dd-MON-yyyy')
, 'AC_MGR'
, 12000
, NULL
, 101
, 110
);

INSERT INTO employees VALUES


( 206
46
, 'William'
, 'Gietz'
, 'WGIETZ'
, '515.123.8181'
, TO_DATE('07-IUN-1994', 'dd-MON-yyyy')
, 'AC_ACCOUNT'
, 8300
, NULL
, 205
, 110
);

Inseram date in tabelul JOB_HISTORY

INSERT INTO job_history


VALUES (102
, TO_DATE('13-IAN-1993', 'dd-MON-yyyy')
, TO_DATE('24-IUL-1998', 'dd-MON-yyyy')
, 'IT_PROG'
, 60);

INSERT INTO job_history


VALUES (101
, TO_DATE('21-SEP-1989', 'dd-MON-yyyy')
, TO_DATE('27-OCT-1993', 'dd-MON-yyyy')
, 'AC_ACCOUNT'
, 110);

INSERT INTO job_history


VALUES (101
, TO_DATE('28-OCT-1993', 'dd-MON-yyyy')
, TO_DATE('15-MAR-1997', 'dd-MON-yyyy')
, 'AC_MGR'
, 110);

INSERT INTO job_history


VALUES (201
, TO_DATE('17-FEB-1996', 'dd-MON-yyyy')
, TO_DATE('19-DEC-1999', 'dd-MON-yyyy')
, 'MK_REP'
, 20);

INSERT INTO job_history


VALUES (114
, TO_DATE('24-MAR-1998', 'dd-MON-yyyy')
, TO_DATE('31-DEC-1999', 'dd-MON-yyyy')
, 'ST_CLERK'
, 50
);

INSERT INTO job_history


VALUES (122
, TO_DATE('01-IAN-1999', 'dd-MON-yyyy')
, TO_DATE('31-DEC-1999', 'dd-MON-yyyy')
, 'ST_CLERK'
, 50
47
);

INSERT INTO job_history


VALUES (200
, TO_DATE('17-SEP-1987', 'dd-MON-yyyy')
, TO_DATE('17-IUN-1993', 'dd-MON-yyyy')
, 'AD_ASST'
, 90
);

INSERT INTO job_history


VALUES (176
, TO_DATE('24-MAR-1998', 'dd-MON-yyyy')
, TO_DATE('31-DEC-1998', 'dd-MON-yyyy')
, 'SA_REP'
, 80
);

INSERT INTO job_history


VALUES (176
, TO_DATE('01-IAN-1999', 'dd-MON-yyyy')
, TO_DATE('31-DEC-1999', 'dd-MON-yyyy')
, 'SA_MAN'
, 80
);

INSERT INTO job_history


VALUES (200
, TO_DATE('01-IUL-1994', 'dd-MON-yyyy')
, TO_DATE('31-DEC-1998', 'dd-MON-yyyy')
, 'AC_ACCOUNT'
, 90
);

Inseram datele in tabelul JOB_GRADES


INSERT INTO JOB_GRADES VALUES (1, 2000, 5000);
INSERT INTO JOB_GRADES VALUES (2, 5001, 7000);
INSERT INTO JOB_GRADES VALUES (3, 7001, 10000);
INSERT INTO JOB_GRADES VALUES (4, 10001,13000);
INSERT INTO JOB_GRADES VALUES (5, 13001,16000);
INSERT INTO JOB_GRADES VALUES (6, 16001,19000);
INSERT INTO JOB_GRADES VALUES (7, 19001,99000);

Reluam exercitiul

SELECT * FROM employees;


/*106 înregistrãri selectate.*/
SELECT * FROM departments;
/*27 înregistrãri selectate.*/
SELECT * FROM jobs;*/
/*19 înregistrãri selectate.*/
SELECT * FROM job_history;
/*10 înregistrãri selectate.*/
SELECT * FROM locations;
*/22 înregistrãri selectate.
SELECT * FROM countries;
48
*/22 înregistrãri selectate.
SELECT * FROM regions;
*/4 inregistrari */

4. Să se obtină încă o dată rezultatul cererii precedente, fără a rescrie cererea.


Obs: Ultima comandă SQL lansată de către client este păstrată în buffer-ul SQL. Pentru rularea acesteia se
utilizează “/” sau RUN.

RUN sau /
/* Acelasi rezultat ca la ex. 3

5. Listati structura tabelului EMPLOYEES si apoi dati comanda RUN (sau “/”). Ce observati? Comenzile
SQL*Plus sunt păstrate în buffer?
DESC employees
RUN
/*Comenzile sunt pastrate in buffer.

6. Să se afiseze codul angajatului, numele, codul job-ului, data angajării. Salvati instruciunea SQL într-un
fisier numit p1_14.sql.
Obs: Pentru salvarea ultimei comenzi SQL se utilizează comanda SAVE. Precizarea extensiei „.sql” a
fisierului nu este obligatorie.
SELECT employee_id, last_name, job_id, hire_date
FROM employees;
SAVE z:\…\ p1_14.sql

SELECT employee_id, last_name, job_id, hire_date


FROM employees;
SAVE E:\Oracle\p1_14.sql

7. Reexecutati cererea folosind fisierul p1_14.sql.


START z:\…\ p1_14.sql sau @ z:\…\ p1_14.sql

START E:\Oracle\p1_14.sql;
@ E:\Oracle\p1_14.sql;

8. Editati fisierul p1_14.sql, adăugând coloanelor câte un alias (cod, nume, cod job, data angajarii).
EDIT z:\…\ p1_14.sql

EDIT E:\Oracle\p1_14.sql;
SELECT employee_id cod, last_name nume, job_id "cod job", hire_date "data angajarii"
FROM employees;

9. Să se listeze, cu si fără duplicate, codurile job-urilor din tabelul EMPLOYEES.


Obs. DISTINCT = UNIQUE

SELECT DISTINCT job_id FROM employees;


sau
SELECT UNIQUE job_id FROM employees;
SELECT job_id FROM employees;

10. Să se afiseze numele concatenat cu prenumele, separate prin spatiu. Etichetati coloana “Nume si
prenume”.
Obs: Operatorul de concatenare este “||”. Sirurile 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"


49
FROM employees;

11. Să se listeze numele si salariul angajatilor care câstigă mai mult de 10000 $.

SELECT last_name, salary


FROM employees
WHERE salary > 10000;

12. Să se modifice cererea anterioară astfel încât să afiseze numele si salariul pentru toti angajatii al căror
salariu este cuprins între 5000$ si10000$.
Obs: Pentru testarea apartenentei 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;

13. Să se creeze o cerere pentru a afisa numele angajatului si numărul departamentului pentru angajatul
104.

SELECT last_name, department_id


FROM employees WHERE employee_id = 104;

14. Să se afiseze numele si salariul pentru toti angajatii din departamentele 10 sau 30, în ordine alfabetică a
numelor.
Obs: Apartenenta la o multime finită de valori se poate testa prin intermediul operatorului IN, urmat de
lista valorilor între paranteze si 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;
/*afiseaza numai numele salariatilor in ordine alfabetica
Sau
SELECT last_name||' '||first_name "Nume complet", salary
FROM employees
WHERE department_id IN (10,30)
ORDER BY last_name, first_name;
/* afiseaza last_mame si frist_name (numele complet) in ordine alfabetica.

15. Să listeze numele si salariile angajatilor care câstigă mai mult de 10000 $ si lucrează în departamentul
10 sau 30. Se vor eticheta coloanele drept Angajat si Salariu lunar.

SELECT last_name "Angajat", salary "Salariu lunar"


FROM employees
WHERE department_id IN(10,30);

16. 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 functiei TO_CHAR(data, format), unde formatul poate fi
alcătuit dintr-o combinatie a următoarelor elemente:

50
Element Semnificaie
D Numărul zilei din săptămână (duminică=1;
luni=2; …sâmbătă=6).
DD Numărul zilei din lună.
DDD Numărul zilei din an.
DY Numele zilei din săptămână, printr-o
abreviere de 3 litere (MON, THU etc.)
DAY Numele zilei din săptămână, scris în
întregime.
MM Numărul lunii din an.
MON Numele lunii din an, printr-o abreviere de 3
litere (JAN, FEB etc.)
MONTH Numele lunii din an, scris în întregime.
Y Ultima cifră din an
YY, YYY, YYYY Ultimele 2, 3, respectiv 4 cifre din an.
YEAR Anul, scris în litere (ex: two thousand
four).
HH12, HH24 Orele din zi, între 0-12, respectiv 0-24.
MI Minutele din oră.
SS Secundele din minut.
SSSSS Secundele trecute de la miezul nopŃii.

SELECT sysdate FROM DUAL;

17. Să se afiseze numele si data angajării pentru fiecare salariat care a fost angajat în 1987. Se cer 2 solutii:
una în care se lucrează cu formatul implicit al datei si alta prin care se formatează data.

Varianta1- cu formatul implicit al datei


SELECT last_name, hire_date
FROM employees
WHERE hire_date LIKE ('%87');
Varianta 2 – cu data formatata
SELECT last_name, hire_date
FROM employees
WHERE TO_CHAR(hire_date, 'YYYY' ) = 1987;
Sunt obligatorii ghilimelele de la sirul ‘1987’? Ce observati?
Nu sunt obligatorii.

18. Să se afiseze numele si job-ul pentru toti angajatii care nu au manager.

SELECT last_name, job_id


FROM employees
WHERE manager_id IS NULL;

19. Să se afiseze numele, salariul si comisionul pentru toti salariatii care câstigă comisioane. Să se sorteze
datele în ordine descrescătoare a salariilor, iar pentru cei care au acelasi salariu în ordine crescătoare a
comisioanelor.

SELECT last_name, salary, commission_pct


FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC, commission_pct ASC;

20. Să se listeze numele tuturor angajatilor care au a treia litera din nume 'a'.

51
Obs: Pentru a forma măstile de caractere utilizate împreună cu operatorul LIKE cu scopul de a compara sirurile
de caractere, se utilizează:
% - reprezentând orice sir de caractere, inclusiv sirul vid; _ (underscore) reprezentând un singur caracter.

SELECT DISTINCT last_name


FROM employees WHERE last_name LIKE '__a%';

21. Folosind data curentă să se afiseze următoarele informatii:


- numele zilei, numărul zilei din săptămână, numărul zilei din luna, respectiv numărul zilei din an;
SELECT TO_CHAR(SYSDATE,'DAY,D,DD,DDD') FROM DUAL;

- numărul lunii din an, numele lunii cu abreviere la 3 caractere, respectiv numele complet al lunii;
SELECT TO_CHAR(SYSDATE,'MM-MON-MONTH') FROM DUAL;

- ora curentă (ora, minute, secunde).


SELECT TO_CHAR(SYSDATE,'HH24:MI:SS') FROM DUAL;

22. Să se listeze numele departamentelor care functionează în locatia având codul 1700 si al căror manager
este cunoscut.

SELECT department_name
FROM departments
WHERE location_id=1700 AND manager_id IS NOT NULL;

23. Să se afiseze codurile departamentelor în care lucrează salariati.

SELECT DISTINCT department_id


FROM employees
WHERE department_id IS NOT NULL
ORDER BY department_id;

24. Să se afiseze numele si prenumele salariatilor angajati în luna mai 1987.

SELECT last_name, first_name


FROM employees
WHERE TO_CHAR(hire_date, 'MON,YYYY') = 'may-1987';

Sau
SELECT last_name, first_name
FROM employees
WHERE TO_CHAR (hire_date, 'mm-YYYY') = '05-1987';

25. Să se listeze codurile angajatilor care au avut si alte joburi fată de cel prezent. Să se ordoneze rezultatul
descrescător după codul angajatului.

SELECT department_name FROM departments


WHERE manager_id IS NOT NULL;

26. Să se afiseze numele si data angajării pentru cei care lucrează în departamentul 80 si au fost angajati în
luna martie a anului 1997.

SELECT last_name, hire_date


FROM employees
WHERE TO_CHAR(hire_date, 'MON-YYYY') = 'MAR-1987' AND department_id = 80;

27. Să se afiseze numele joburilor care permit un salariu cuprins între 8300$ si 14000$.
52
SELECT DISTINCT j.job_title, s.salary
FROM jobs j, employees s
WHERE j.job_id = s.job_id and salary BETWEEN 8300 AND 14000
ORDER BY salary DESC;

28. Care este grila de salarizare pentru un salariu de 10000$?

SELECT * FROM employees WHERE salary = 10000;

29. Să se listeze numele tuturor angajatilor care au 2 litere 'L' în nume si lucrează în departamentul 30 sau
managerul lor este 123.

SELECT last_name||' '||first_name "Numele si prenumele"


FROM employees
WHERE last_name LIKE '%L%L%'
AND department_id = 30 OR
manager_id = 123;

30. Să se afiseze numele, job-ul si salariul pentru toti salariatii al căror job contine sirul 'CLERK' sau
'REP' si salariul nu este egal cu 1000, 2000 sau 3000 $.

31. Să se afiseze numele, salariul si comisionul pentru toti angajatii al căror salariu este mai mare decât de
5 ori valoarea comisionului (salary*commission_pct*5).

SELECT last_name||' '||first_name "Numele si prenumele", commission_pct


FROM employees
WHERE salary > commission_pct*5;

FUNCłII SQL (single-row)

Principalele functii SQL pot fi clasificate în următoarele categorii:


· Functii single-row
· Functii multiple-row (functii agregat)
Functiile single-row returnează câte o linie rezultat pentru fiecare linie a tabelului sau vizualizării
interogate. Aceste functii pot apărea în listele SELECT, clauzele WHERE, START WITH, CONNECT BY
si HAVING.

1. Analizati următoarele functii pentru prelucrarea sirurilor de caractere:

LOWER (expresie) - Converteste un sir de caractere la minuscule.


LOWER ('AbCdE') = 'abcde'

UPPER (expresie) - Converteste un sir de caractere


UPPER ('AbCdE') = 'ABCDE'

INITCAP (expresie) - Converteste un sir de caractere la un sir care începe cu majusculă si continuă cu
INITCAP ('AbCdE') = 'Abcde'

INITCAP (expresie) - Converteste un sir de caractere la un sir care începe cu majusculă si continuă cu minuscule.
INITCAP ('AbCdE') = 'Abcde'

53
SUBSTR (expresie, m[, n]) - Extrage din expresia de tip sir de caractere, n caractere începând cu pozitia m. Dacă
lipseste argumentul n, atunci extrage toate caracterele până la sfârsitul sirului. Dacă m este negativ numărătoarea
poziŃiilor începe de la sfârsitul sirului de caractere spre început.
SUBSTR ('AbCdE', 2) = 'bCdE'
SUBSTR ('AbCdE', -3,2) = 'Cd'
SUBSTR ('AbCdE', -3) = 'CdE'

LENGTH (expresie) - Returnează numărul de caractere al expresiei.


LENGTH ('AbCdE') = 5

INSTR (expresie, expr1[, m][, n]) - Returnează pozitia la care se găseste a n-a ocurentă a expresiei 'expr1' în
cadrul expresiei 'expresie', căutarea începând de la poziŃia m. Daca m sau n lipsesc, valorile implicite sunt 1
pentru ambele.
INSTR (LOWER('AbCdE aBcDe'), 'ab', 5) = 7
INSTR (LOWER('AbC aBcDe'), 'ab', 5, 2) = 0

LTRIM (expresie[, expr1]) sau RTRIM (expresie[, expr1]) - Reversul functiilor LPAD, RPAD. Trunchează
expresia RTRIM (expresie[, expr1]) caracter la stânga sau la dreapta prin eliminarea succesivă a caracterelor din
expresia expr1. Implicit, daca lipseste, expr1 = 'abcde'
RTRIM ('abcdeXXXX', 'X') = 'abcde'
LTRIM (' abcde') = 'abcde'

TRIM (LEADING | TRAILING | BOTH caractere_trim FROM expresie) - Permite eliminarea caracterelor
specificate (caractere_trim) de la începutul (leading) , sfârsitul (trailing) sau din ambele părti, dintr-o expresie
caracter data.
TRIM (LEADING 'X' FROM
'XXXabcdeXXX') = 'abcdeXXX'
TRIM (TRAILING 'X' FROM
'XXXabcdeXXX') = 'XXXabcde'
TRIM ( BOTH 'X' FROM
XXXabcdeXXX') = 'abcde'
TRIM (' abcde ') = 'abcde'

2. Să se afiseze pentru fiecare angajat din departamentul 20 un sir de caractere de forma "Functia
salariatului {prenume} {nume} este {cod functie}".
Să se afiseze prenumele cu initiala litera mare, iar numele cu litere mari (Stephen KING), iar codul functiei
să se afiseze cu litere mici.

SELECT 'Functia salariatului ' || INITCAP(first_name)||' '||UPPER(last_name) ||' este ' ||LOWER(job_id)||' .' AS
"Angajatul si codul functiei"
FROM employees
WHERE department_id = 20;

3. Să se afiseze pentru angajatul cu numele 'HIGGINS' codul, numele si codul departamentului. Cum se
scrie conditia din WHERE astfel încât să existe siguranta ca angajatul 'HIGGINS' va fi găsit oricum ar fi
fost introdus numele acestuia? Căutarea trebuie să nu fie case-sensitive, iar eventualele blank-uri care
preced sau urmează numelui trebuie ignorate.

SELECT employee_id, last_name, department_id


FROM employees
WHERE UPPER(TRIM(last_name)) = 'HIGGINS';

4. Să se afiseze pentru toti angajatii al căror nume se termină în 'n', codul, numele, lungimea numelui si
pozitia din nume în care apare prima data litera 'a'. Asociati aliasuri coloanelor returnate de cerere.

54
SELECT employee_id, last_name, LENGTH(last_name), INSTR(UPPER(last_name), 'A')
FROM employees
WHERE SUBSTR(last_name,-1)='n';

5. Analizati următoarele functii aritmetice:

ROUND (expresie [, n]) - Returnează valoarea rotunjită a expresiei până la n zecimale. Daca n este negativ sunt
rotunjite cifre din stânga virgulei. Valoarea implicită pentru n este 0.
ROUND(1.6) = 2
ROUND(1.4) = 1
ROUND (1234.56,1) = 1234.6
ROUND (1230.56, -2) = 1200
ROUND (1260.56, -2) = 1300

MOD (m,n) - Returnează restul împărtirii lui m la n.


MOD (11, 4) = MOD (11, -4) = 3
MOD(-11, 4) = MOD (-11, -4) = -3

7. Să se afiseze numele, salariul si numărul de mii al salariului rotunjit la 2 zecimale pentru cei care nu au
salariul divizibil cu 1000.

SELECT last_name, salary, ROUND(salary/1000 ,2) "MII LEI"


FROM employees
WHERE MOD(salary,1000) !=0;

8. Analizati următoarele operatii pe expresii de tip dată calendaristică:


date -/+ number - Date - Scade/Adaugă un număr de zile dintr-o / la o dată.
date1 - date2 - Number - Întoarce numărul de zile dintre două date calendaristice.
date +/- number/24 – Date - Scade/Adaugă un număr de ore la o / dintr-o dată calendaristică.

9. Să se afiseze data (luna, ziua, ora, minutul si secunda) de peste 10 zile.


SYSDATE+10

SELECT TO_CHAR(SYSDATE+30, ‘MONTH DD HH24:MM:SS’) “Data”


FROM DUAL;

10. Să se afiseze numărul de zile rămase până la sfârsitul anului. ROUND(TO_DATE(’31-DEC-2009’)-


SYSDATE)

SELECT ROUND(TO_DATE('31-DEC-2009') - SYSDATE) FROM DUAL;

11. a. Să se afiseze data de peste 12 ore. SYSDATE+12/24

SELECT SYSDATE + 12/24 FROM DUAL;


Sau
SELECT TO_CHAR(SYSDATE+12/24, ‘ DD/MM HH24:MM:SS’) “Data”
FROM DUAL;

11. b. Să se afiseze data de peste 5 minute. SYSDATE+1/288

SELECT SYSDATE + 1/288 FROM DUAL;


Sau – data, incluziv minutele si secundele
SELECT TO_CHAR(SYSDATE+1/288, ‘ DD/MM HH24:MM:SS’) “Data”
FROM DUAL;

12. Analizati următoarele functii pentru prelucrarea datelor calendaristice:


55
SYSDATE - Întoarce data si timpul curent
MONTHS_BETWEEN (date1, date2) - Returnează numărul de luni dintre data date1 si data date2. Rezultatul
poate fi pozitiv sau negativ după cum date1 este mai recentă sau nu fată de date2. Zecimalele reprezintă parti
dintr-o luna!
ROUND(MONTHS_BETWEEN
(SYSDATE + 31, SYSDATE)) = 1

ADD_MONTHS (date, n) - Adaugă n luni la o data specificată. Valoarea n trebuie să fie întreagă (pozitivă sau
negativă).
ADD_MONTHS (date, n)
MONTHS_BETWEEN
(ADD_MONTHS(SYSDATE, 3),
SYSDATE) = 3

NEXT_DAY (date, char) - Returnează data corespunzătoare primei zile a săptămânii specificate (char) care
urmează după date.
NEXT_DAY('15-dec-2006','Monday') = '18-dec-2006'
NEXT_DAY ('15-dec-2006',1) = '18-dec-2006'

13. Să se afiseze numele angajatului, data angajării si data negocierii salariului, care a avut loc în prima zi
de Luni, după 6 luni de serviciu. Etichetati această coloană “Negociere”.
NEXT_DAY(ADD_MONTHS(hire_date, 6), ‘Monday’)

SELECT last_name, hire_date,


NEXT_DAY(ADD_MONTHS(hire_date, 6), 'Luni') "Negociere"
FROM employees;

14. Pentru fiecare angajat să se afiseze numele si numărul de luni de la data angajării. Etichetati
coloana“Luni lucrate”. Să se ordoneze rezultatul după numărul de luni lucrate. Se va rotunji numărul de
luni la cel mai apropiat număr întreg.

SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) “Luni lucrate”


FROM employees
ORDER BY MONTHS_BETWEEN(SYSDATE, hire_date);
SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) “Luni lucrate”
FROM employees
ORDER BY “Luni lucrate”;
SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) “Luni lucrate”
FROM employees
ORDER BY 2;

15. Analizati următoarele functii de conversie:


Obs. Conversiile implicite asigurate de server-ul Oracle sunt:
de la VARCHAR2 sau CHAR la NUMBER;
de la VARCHAR2 sau CHAR la DATE;
de la NUMBER la VARCHAR2 sau CHAR;
de la DATE la VARCHAR2 sau CHAR.

SELECT last_name
FROM employees
WHERE TO_CHAR(hire_date,'yyyy')=1994;
/* afiseaza o singura coloana cu numele salariatilor care au fost angajati in anul 1994*/

SELECT last_name
56
FROM employees
WHERE hire_date='07-IUN-1994';
/*afiseaza numele salariatilor care au fost angajati in 7 iunie 1994*/

SELECT employee_id||' '||last_name||' '||hire_date


FROM employees
WHERE department_id=10;
/* afiseaza id angajat, numele si data angajarii salariatilor din departamentul cu id 10*/

16. Să se afiseze numele si prenumele pentru toti angajatii care s-au angajat în luna mai.

SELECT last_name, first_name


FROM employees
WHERE TO_CHAR(hire_date,'MON') = 'MAY';
sau
SELECT last_name, first_name
FROM employees
WHERE TO_CHAR(hire_date,'mm') = 05;

18. Să se afiseze numele angajatilor si comisionul. Dacă un angajat nu câstigă comision, să se scrie “Fara
comision”. Etichetati coloana “Comision”.
NVL(TO_CHAR(commission_pct), ‘Fara comision’)

UPDATE employees SET commission_pct = NULL WHERE last_name = ' Kochhar';


SELECT last_name, NVL(TO_CHAR(commission_pct),'Fara comision') "Comision"
FROM employees;

19. Să se listeze numele, salariul si comisionul tuturor angajatilor al căror venit lunar depăseste 10000$.
salary * NVL(commission_pct, 0) venit_lunar

SELECT last_name, salary, commission_pct


FROM employees
WHERE salary * NVL(commission_pct, 0) >10000;

21. Să se afiseze numele, codul functiei, salariul si o coloana care să arate salariul după mărire. Se stie că
pentru IT_PROG are loc o mărire de 10%, pentru ST_CLERK 15%, iar pentru SA_REP o mărire de 20%.
Pentru ceilalti angajati nu se acordă mărire. Să se denumească coloana "Salariu revizuit".
IT_PROG >> 44
ST_CLERK >> 55
SA_REP >> 99

SELECT last_name, job_id, salary,


DECODE(job_id, ‘IT_PROG’, salary*1.1, ’ST_CLERK’, salary*1.15, ‘SA_REP’, salary*1.2, salary ) “salariu
revizuit”
FROM employees;
SELECT last_name, job_id, salary,
CASE job_id WHEN ‘IT_PROG’ THEN salary* 1.1
WHEN ’ST_CLERK’ THEN salary*1.15
WHEN ‘SA_REP’ THEN salary*1.2
ELSE salary
END “salariu revizuit”
FROM employees;
SELECT last_name, job_id, salary,
CASE WHEN job_id= ‘IT_PROG’ THEN salary* 1.1
57
WHEN job_id=’ST_CLERK’ THEN salary*1.15
WHEN job_id =‘SA_REP’ THEN salary*1.2
ELSE salary
END “salariu revizuit”
FROM employees;

22. Să se afiseze numele salariatului si codul departamentului în care acesta lucrează. Dacă există salariati
care nu au un cod de departament asociat, atunci pe coloana id_depratment să se afiseze: textul “fara
departament”; valoarea zero.

SELECT last_name, NVL(TO_CHAR(department_id) , 'Fara departament') "department"


FROM employees;

SELECT last_name, NVL(TO_CHAR(department_id) , 0) "department"


FROM employees;

SELECT last_name,
CASE WHEN department_id IS NULL THEN 'Fara departament'
ELSE TO_CHAR(department_id)
END "DEPARTAMENT"
FROM employees;

SELECT last_name,
CASE WHEN department_id IS NULL THEN 0
ELSE department_id
END "DEPARTAMENT"
FROM employees;

23. a. Să se afiseze numele angajatilor care nu au manager.

SELECT last_name FROM employees WHERE manager_id IS NULL;

sau
SELECT last_name||' '||first_name FROM employees WHERE manager_id IS NULL;

23.b. Să se afiseze numele angajatilor si codul managerilor lor. Pentru angajatii care nu au manager să
apară textul “nu are sef”.

SELECT last_name,
CASE WHEN manager_id IS NULL THEN 'Nu are sef'
ELSE TO_CHAR(manager_id)
END "manager"
FROM employees;

Sau
SELECT last_name||' '||first_name,
CASE WHEN manager_id IS NULL THEN 'Nu are sef'
ELSE TO_CHAR(manager_id)
END "manager"
FROM employees;

24. Să se afiseze numele salariatului si:


58
· venitul anual dacă are comision;
· salariul dacă nu are comision.
Se va utiliza functia NVL2.

Functie
NVL2 (expr1, expr2, expr3)
Explicatie
Dacă expr1 este nenulă atunci returnează expr2, altfel Returnează expr3
Exemplu
NVL2 (1, 2, 3) = 2
NVL2 (NULL, 2, 3) = 3

24. Să se afiseze numele salariatului si:


· venitul anual dacă are comision;
· salariul dacă nu are comision.
Se va utiliza functia NVL2.

/*si aici voi aduna salariul cu comisionul*/


SELECT last_name NVL2(commission_pct, salary+commission_pct, 0) "It's about money"
FROM employees;

/*nu am inteles exact ce ar trebui sa facem asa ca am pus sa afiseze si separat pe doua coloane */
SELECT last_name, NVL2(commission_pct, salary+commission_pct, 0) "astia au comision",
NVL2(commission_pct, 0, salary) "astia nu au comision"
FROM employees;
?????????

25. Să se afiseze numele salariatului, salariul si salariul revizuit astfel:


- dacă lucrează de mai mult de 200 de luni atunci salariul va fi mărit cu 20%;
- dacă lucrează de mai mult de 150 de luni, dar mai putin de 200 de luni, atunci salariul va fi mărit cu 15%;
- dacă lucrează de mai mult de 100 de luni, dar mai puŃin de 150 de luni, atunci salariul va fi mărit cu
10%;
- altfel, salariul va fi mărit cu 5%.

SELECT last_name, salary,


CASE WHEN ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) > 200 THEN salary*1.2
WHEN ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) > 150 THEN salary*1.15 WHEN
ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) > 100 THEN salary*1.1
ELSE salary*1.05
END "SALARIU REVIZUIT"
FROM employees;

59
CERERI MULTITABEL, SUBCERERI

Tipuri de join:
- equijoin (se mai numeste inner join sau simple join) - compunerea a două tabele diferite după o conditie ce
contine operatorul de egalitate.

SELECT last_name, department_name, location_id, e.department_id


FROM employees e, departments d
WHERE e.department_id = d.department_id;

Obs: Numele sau alias-urile tabelelor sunt obligatorii în dreptul coloanelor care au acelasi nume
în mai multe tabele.

- nonequijoin - compunerea a două relatii tabele după o conditie oarecare, ce NU contine operatorul de egalitate.

SELECT last_name, salary, grade_level


FROM employees, job_grades
WHERE salary BETWEEN lowest_sal AND highest_sal;

- outerjoin - compunerea externă a două tabele diferite completând una dintre relatii cu valori NULL acolo unde
nu există în aceasta nici un tuplu ce îndeplineste conditia de corelare. Relatia completată cu valori NULL este cea
în dreptul căreia apare “(+)”. Operatorul (+) poate fi plasat în orice parte a conditiei de join, dar nu în ambele
părti. Full outer join = Left outer join UNION Right outer join.

SELECT last_name, department_name,location_id


FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;

- selfjoin - compunerea externă a unui tabel cu el însusi după o conditie dată.

SELECT sef.last_name, angajat.last_name


FROM employees sef, employees angajat
WHERE sef.employee_id = angajat.manager_id
ORDER BY sef.last_name;

1. Pentru fiecare angajat să se afiseze numele, codul si numele departamentului.

SELECT last_name, e.department_id, department_name


FROM employees e, departments d
WHERE e.department_id = d.department_id;

2. Să se afiseze numele angajatului, numele departamentului pentru toti angajatii care câstigă comision.
SELECT last_name, department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND commission_pct IS NOT NULL;
3. Să se listeze numele job-urile care există în departamentul 30.

SELECT DISTINCT job_title


FROM employees e, jobs j
WHERE e.job_id = j.job_id
AND department_id = 30;

4. Sa se afiseze numele, job-ul si numele departamentului pentru tot angajati care lucrează în Seattle.
60
SELECT last_name, job_id, department_name
FROM employees e, departments d, locations s
WHERE e.department_id = d.department_id
AND d.location_id = s.location_id
AND city = ‘Seattle’;
Sau

SELECT last_name, e.job_id, department_name


FROM employees e, departments d
WHERE e.department_id = d.department_id
AND location_id = (SELECT location_id FROM locations WHERE city = 'Seattle');

5. Să se afiseze numele, salariul, data angajării si numele departamentului pentru toti programatorii care
lucrează în America.
region_name = ‘Americas’
job_title = ‘Programmer’

SELECT last_name, salary, hire_date, department_name


FROM employees e, departments d, locations s, countries c, regions r, jobs j
WHERE e.department_id = d.department_id
AND d.location_id = s.location_id
AND s.country_id = c.country_id
AND c.region_id = r.region_id
AND e.job_id = j.job_id
AND region_name = ‘Americas’
AND job_title = ‘Programmer’;
6. Să se afiseze numele salariatilor si numele departamentelor în care lucrează. Se vor afisa si salariatii care
nu lucrează într-un departament (right outher join).

SELECT last_name, department_name


FROM employees e, departments d
WHERE e.department_id = d.department_id(+);

7. Să se afiseze numele departamentelor si numele salariatilor care lucrează în ele. Se vor afisa si
departamentele care nu au salariati (left outher join).

SELECT department_name, last_name


FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
8. Să se afiseze numele, job-ul, numele departamentului, salariul si grila de salarizare pentru toti angajatii.
SELECT last_name, job_id, salary, department_name, grade_level
FROM employees e, departments d, job_grades
WHERE e.department_id = d.department_id
AND salary BETWEEN lowest_sal AND highest_sal;

9. Să se afiseze codul angajatului si numele acestuia, împreună cu numele si codul sefului său direct. Se vor
eticheta coloanele Ang#, Angajat, Mgr#, Manager. Să se salveze instrucsiunea într-un fisier numit p3_9.sql.

SELECT a.employee_id “Ang#”, a.last_name “Angajat”,


b.employee_id “Mgr#”, b.last_name“Manager”
FROM employees a, employees b
WHERE a.manager_id = b. employee_id;
61
SAVE p3_9;

10. Să se modifice p3_9.sql pentru a afisa toti salariatii, inclusiv pe cei care nu au sef.

SELECT e.employee_id Ang#, e.last_name Angajat,


e.manager_id Mgr#, m.last_name Manager
FROM employees e, employees m
WHERE e.manager_id = m.employee_id(+);

11. Să se afiseze numele salariatului si data angajării împreună cu numele si data angajării sefului direct
pentru salariatii care au fost angajati înaintea sefilor lor. Se vor eticheta coloanele Angajat, Data_ang,
Manager si Data_mgr.

SELECT e.last_name Angajat, e.hire_date Data_ang, m.last_name Manager, m.hire_date Data_mgr


FROM employees e, employees m
WHERE e.manager_id = m.employee_id AND e.hire_date<m.hire_date;

12. Pentru fiecare angajat din departamentele 20 si 30 să afiseze numele, codul departamentului si toti
colegii săi (salariatii care lucrează în acelasi departament cu el). Se vor eticheta coloanele corespunzător.
SELECT a.last_name “Angajat”, a.department_id ”Departament”, b.last_name “Coleg”
FROM employees a, employees b
WHERE a.department_id = b.department_id
AND a.employee_id <> b.employee_id
AND a.department_id IN (20,30)
ORDER BY a.last_name;
13. Să se afiseze numele si data angajării pentru salariatii care au fost angajati după Fay.

SELECT last_name, hire_date


FROM employees
WHERE hire_date > (SELECT hire_date
FROM employees
WHERE last_name = ‘Fay’);

Sau
SELECT a.last_name, a.hire_date
FROM employees a, employees b
WHERE UPPER(b.last_name)=’FAY’ AND a.hire_date>b.hire_date;

14. Scrieti o cerere pentru a afisa numele si salariul pentru toti colegii (din acelasi departament) lui Fay. Se
va exclude Fay.

SELECT last_name, salary


FROM employees
WHERE last_name <> ‘Fay’
AND department_id = (SELECT department_id
FROM employees
WHERE last_name = ‘Fay’);
Sau
SELECT last_name, salary
FROM employees
WHERE department_id = (SELECT department_id
FROM employees WHERE last_name = 'Fay')
AND last_name != 'Fay';

62
15. Să se afiseze codul departamentului, codul si numele angajatilor care lucrează în acelasi departament
cu cel putin un angajat al cărui nume contine litera “T”. Să se ordoneze după codul departamentului.

SELECT employee_id, last_name, department_id


FROM employees
WHERE department_id IN (SELECT DISTINCT department_id
FROM employees
WHERE UPPER(last_name) LIKE ‘%T%’)
ORDER BY department_id;

16. Să se afiseze numele si salariul angajatilor condusi direct de Steven King.

SELECT last_name, salary


FROM employees
WHERE manager_id = (SELECT employee_id
FROM employees
WHERE UPPER(last_name) ='KING'
AND UPPER(first_name) ='STEVEN' );

17. Să se afiseze numele si job-ul tuturor angajatilor din departamentul ‘Sales’.


SELECT last_name, job_id
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name ='Sales');

18. Să se afiseze numele angajatilor, numărul departamentului si job-ul tuturor salariatilor al căror
departament este localizat în Seattle.

SELECT last_name, job_id, department_id


FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE location_id = (SELECT location_id
FROM locations
WHERE city = ‘Seattle’));

Rezolvati această problemă utilizând join-uri.

19. Să se afle dacă există angajati care nu lucrează în departamentul ‘Sales’ si al căror salariu si comision
coincid cu salariul si comisionul unui angajat din departamentul ‘Sales’.

SELECT last_name, salary, commission_pct, department_id


FROM employees
WHERE (salary, commission_pct) IN (SELECT salary, commission_pct
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND department_name = ‘Sales’)
AND department_id <> (SELECT department_id
FROM departments
WHERE department_name = ‘Sales’);

20. Scrieti o cerere pentru a afisa numele, numele departamentului si salariul angajatilor care nu câstigă
comision, dar al căror manager coincide cu managerul unui angajat care câstigă comision.

63
SELECT last_name, department_name, salary
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.manager_id IN (SELECT DISTINCT manager_id
FROM employees
WHERE commission_pct IS NOT NULL)
AND commission_pct IS NULL;

21. Scrieti o cerere pentru a afisa angajatii care câstigă mai mult decât oricare functionar. Sortati
rezultatele după salariu, în ordine descrescătoare.

SELECT last_name, salary, job_id


FROM employees
WHERE salary > (SELECT MAX(salary)
FROM employees
WHERE job_id LIKE '%CLERK')
ORDER BY salary DESC;

22. Să se afiseze codul, numele si salariul tuturor angajatilor care câstigă mai mult decât salariul mediu.
SELECT employee_id, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary)
FROM employees);

23. Să se afiseze pentru fiecare salariat angajat în luna martie numele său, data angajării si numele jobului.

SELECT last_name, hire_date, job_title


FROM employees e, jobs j
WHERE TO_CHAR(hire_date,'MON') = 'MAR'
AND e.job_id = j.job_id;

24. Să se afiseze pentru fiecare salariat al cărui câstig total lunar este mai mare decât 12000, numele său,
câstigul total lunar si numele departamentului în care lucrează.

SELECT last_name, salary+commission_pct "castig total lunar" , department_name


FROM employees e, departments d
WHERE salary+commission_pct > 12000
AND e.department_id = d.department_id;

25. Să se afiseze pentru fiecare angajat codul său si numele joburilor sale anterioare, precum si intervalul
de timp în care a lucrat pe jobul respectiv.??

SELECT employee_id, job_id, start_date "data angaj job anterior",end_date"data final job anterior",
ROUND(MONTHS_BETWEEN(end_date, start_date)) "interval angajare"
FROM Job_history;
/* Nu stiu daca este bine

EMPLOYEE_ID JOB_ID data angaj data final interval angajare


----------- ---------- ---------- ---------- -----------------
102 IT_PROG 13-01-1993 24-07-1998 66
101 AC_ACCOUNT 21-09-1989 27-10-1993 49
101 AC_MGR 28-10-1993 15-03-1997 41
201 MK_REP 17-02-1996 19-12-1999 46
114 ST_CLERK 24-03-1998 31-12-1999 21
122 ST_CLERK 01-01-1999 31-12-1999 12
64
176 SA_REP 24-03-1998 31-12-1998 9
176 SA_MAN 01-01-1999 31-12-1999 12
200 AC_ACCOUNT 01-07-1994 31-12-1998 54
200 AD_ASST 17-09-1987 17-06-1993 69

26. Să se modifice cererea de la punctul 25 astfel încât să se afiseze si numele angajatului, respectiv codul
jobului său curent.

SELECT last_name, job_id, hire_date "data angajarii", SYSDATE "data curenta",


ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) "Vechime in firma"
FROM employees;

27. Să se modifice cererea de la punctul 26 astfel încât să se afiseze si numele jobului său curent.

SELECT last_name, e.job_id, job_title, hire_date "data angajarii", SYSDATE "data curenta",
ROUND(MONTHS_BETWEEN(SYSDATE, hire_date))||' ' ||'luni' "Vechime in firma"
FROM employees e, jobs j
WHERE e.job_id = j.job_id;

28. Să se afiseze salariatii care au acelasi manager ca si angajatul având codul 140.

SELECT first_name||' '||last_name


FROM employees
WHERE manager_id = ( SELECT manager_id FROM employees WHERE employee_id = 140);

29. Să se afiseze numele departamentelor care functionează în America.

Functii multiple-row (grup). Gruparea datelor.

Aceste tipuri de functii pot fi utilizate pentru a returna informatia corespunzătoare fiecăruia dintre
grupurile obtinute în urma divizării liniilor tabelului cu ajutorul clauzei GROUP BY.
Pot apărea în clauzele SELECT, ORDER BY si HAVING.
Server-ul Oracle aplică aceste functii fiecărui grup de linii si returnează un singur rezultat pentru fiecare
multime.
Exemple de functii grup: AVG, SUM, MAX, MIN, COUNT etc.
Tipurile de date ale argumentelor functiilor grup pot fi CHAR, VARCHAR2, NUMBER sau DATE.
Functiile AVG si SUM, operează numai asupra valorilor numerice. Functiile MAX si MIN pot opera
asupra valorilor numerice, caracter sau dată calendaristică.
Toate functiile grup, cu exceptia lui COUNT(*), ignoră valorile null. COUNT(expresie)
returnează numărul de linii pentru care expresia dată nu are valoarea null. FuncŃia COUNT returnează un
număr mai mare sau egal cu zero si nu întoarce niciodată valoarea null.
Când este utilizată clauza GROUP BY, server-ul sortează implicit multimea rezultată în
ordinea crescătoare a valorilor coloanelor după care se realizează gruparea.
Absenta clauzei GROUP BY conduce la aplicarea funcŃiei grup pe mulŃimea tuturor liniilor
tabelului.
În clauza GROUP BY se trec obligatoriu toate coloanele prezente în clauza SELECT, care nu sunt
argument al functiilor grup.

1. Să se afiseze cel mai mare salariu, cel mai mic salariu, suma si media salariilor tuturor angajatilor.
Etichetati coloanele Maxim, Minim, Suma, respectiv Media. Să se rotunjească rezultatele.
65
SELECT MIN(salary) min, MAX(salary) max, SUM(salary) suma,
ROUND(AVG(salary)) media
FROM employees;

2. Utilizând functia grup COUNT să se determine:

a. numărul total de angajati;


SELECT COUNT(*) "Total - angajati" FROM employees;

b. numărul de angajati care au manager;


SELECT COUNT(*) "angajari cu manager" FROM employees WHERE manager_id IS NOT NULL;

c. numărul de manageri.
SELECT COUNT(*) "Numar manageri" FROM employees WHERE manager_id IS NULL;

3. Să se afiseze diferenta dintre cel mai mare si cel mai mic salariu. Etichetati coloana “Diferenta”.

SELECT MAX(salary) - MIN(salary) "Diferenta" FROM employees;

4. Să se listeze numărul de angajati din departamentul având codul 50.

SELECT COUNT(*) "ANGAJATI - DEP_50" FROM employees WHERE department_id = 50;

5. Cati angajati din departamentul 80 câstigă comision?

SELECT COUNT(*) "ANGAJATI CU COMISION" FROM employees WHERE commission_pct IS NOT


NULL;

6. Să se selecteze valoarea medie si suma salariilor pentru toti angajatii care sunt reprezentanti de vânzări
(SA_MAN, SA_REP).

SELECT AVG(salary) media, SUM(salary)


FROM employees
GROUP BY job_id IN ( SA_MAN, SA_REP);

7. Să se selecteze data angajării primei persoane care a fost angajată de companie.

SELECT MIN(hire_date) FROM employees;

8. Să se afiseze numărul de angajati pentru fiecare job.

SELECT job_id, COUNT(employee_id) nr_angajati


FROM employees
GROUP BY job_id;

9. Să se afiseze minimul, maximul, suma si media salariilor pentru fiecare departament.

SELECT department_id, MIN(salary), MAX(salary), SUM(salary), AVG(salary)


FROM employees
GROUP BY department_id;

10. Să se afiseze codul departamentului si media salariilor pentru fiecare job din cadrul acestuia.

SELECT department_id, job_id, AVG(salary)


FROM employees
66
GROUP BY department_id, job_id;

11. a. Să se afiseze codul departamentelor pentru care salariul minim depăseste 5000$.

SELECT department_id, MIN(salary)


FROM employees
GROUP BY department_id
HAVING MIN(salary)>5000;

11.b. Să se modifice cererea anterioară astfel încât să se afiseze si orasul în care functionează aceste
departamente.

SELECT department_id, MIN(salary), city


FROM employees, locations
GROUP BY department_id, city
HAVING MIN(salary) > 5000;

12. Să se obtină codul departamentelor si numărul de angajati al acestora pentru departamentele care au
cel putin 10 angajati.

SELECT department_id, COUNT(employee_id)


FROM employees
GROUP BY department_id
HAVING COUNT(employee_id) >= 10;

13. Să se obtină codul departamentelor si suma salariilor angajatilor care lucrează în acestea, în ordine
descrescătoare după sumă. Se consideră angajatii care au comision si departamentele care au mai mult de 5
angajati.

SELECT department_id, SUM(salary)


FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY department_id
HAVING COUNT(employee_id) > 5
ORDER BY SUM(salary) DESC;

14. Să se obtină job-ul pentru care salariul mediu este minim.

SELECT job_id
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id);

15. Să se afiseze cel mai mare dintre salariile medii pe departamente.

SELECT AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id);

16. a. Să se afiseze codul, numele departamentului si suma salariilor pe departamente.


SELECT d.department_id, department_name,a.suma
FROM departments d, (SELECT department_id ,SUM(salary) suma
67
FROM employees
GROUP BY department_id) a
WHERE d.department_id =a.department_id;

b. Dati o altă metodă de rezolvare a acestei probleme.

SELECT d.department_id, department_name, SUM(salary)


FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_id, department_name;

17. a. Scrieti o cerere pentru a afisa numele departamentului, numărul de angajati si salariul mediu pentru
angajatii din acel departament. Coloanele vor fi etichetate Departament, Nr. angajati, Salariu Mediu.

SELECT department_name “Departament”,


(SELECT COUNT(employee_id)
FROM employees
WHERE department_id = d.department_id ) ” Nr. angajati”,
(SELECT AVG(salary)
FROM employees
WHERE department_id = d.department_id) ”Salariu mediu”
FROM departments d;

b. Dati o altă metodă de rezolvare pentru problema anterioară.

SELECT department_name "Departament", COUNT(employee_id) "Nr. angajati", AVG(salary) "Salariu mediu"


FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY department_name;
/* nu returneaza departmanetele care nu au angajati*/

18. Să se creeze o cerere prin care să se afiseze numărul total de angajati si, din acest total, numărul celor
care au fost angajati în 1997, 1998, 1999 si 2000. Datele vor fi afisate în forma următoare:

Total 1997 1998 1999 2000


--------------------------------------------------------------
50 10 5 25 1

SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1997,1,0))

SELECT COUNT(employee_id) "Total",


SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1997,1,0)) "1997",
SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1998,1,0)) "1998",
SUM(DECODE(TO_CHAR(hire_date,'yyyy'),1999,1,0)) "1999",
SUM(DECODE(TO_CHAR(hire_date,'yyyy'),2000,1,0)) "2000"
FROM employees;

/*afiseaza

Total 1997 1998 1999 2000


---------- ---------- ---------- ---------- ----------
106 28 23 18 11

68
Operatorii ROLLUP si CUBE
Clauza GROUP BY permite gruparea liniilor selectate după valorile expresiilor precizate în aceasta.
Pentru fiecare grup, va fi returnată o singură linie de informatie. Clauza GROUP BY poate produce grupări
superagregat utilizând extensiile CUBE sau ROLLUP.

ROLLUP
- grupează liniile selectate pe baza valorilor primelor n, n - 1, …, 0 expresii din specificatia
GROUP BY si returnează o singură linie pentru fiecare grup.
- creează grupări prin deplasarea într-o singură direcŃie, de la dreapta la stânga, de-a
lungul listei de coloane specificate în clauza GROUP BY
Apoi, se aplică functia agregat acestor grupări. Dacă sunt specificate n expresii în operatorul ROLLUP,
numărul de grupări generate va fi n + 1. Liniile care se bazează pe valoarea primelor n expresii se numesc linii
obisnuite, iar celelalte se numesc linii superagregat.

GROUP BY ROLLUP (expr_1, expr_2, …, expr_n) generează n+1 tipuri de linii, corespunzătoare
următoarelor grupări:
· GROUP BY (expr_1, expr_2, …, expr_n-1, expr_n)
· GROUP BY (expr_1, expr_2, …, expr_n-1)
·…
· GROUP BY (expr_1, expr_2)
· GROUP BY (expr_1)
· GROUP BY () – corespunzător absentei clauzei GROUP BY si deci, calculului funcŃiilor
grup din cerere pentru întreg tabelul.

CUBE grupează liniile selectate pe baza valorilor tuturor combinatiilor posibile ale expresiilor specificate
si returnează câte o linie totalizatoare pentru fiecare grup. Acest operator este folosit pentru a produce multimi de
rezultate care sunt utilizate în rapoarte. În vreme ce ROLLUP produce subtotalurile doar pentru o parte dintre
combinatiile posibile, operatorul CUBE produce subtotaluri pentru toate combinatiile posibile de grupări
specificate în clauza GROUP BY, precum si un total general.
Dacă există n coloane sau expresii în clauza GROUP BY, vor exista 2n combinatii posibile superagregat.

19. Să se afiseze codurile departamentelor în care lucrează cel putin un angajat, iar pentru fiecare dintre
acestea si pentru fiecare manager care lucrează în departamentul respectiv să se afiseze numărul de
salariati. De asemenea, să se afiseze numărul de salariati pentru fiecare departament indiferent de manager
si numărul total de angajati din companie.

SELECT department_id, manager_id, COUNT(employee_id)


FROM employees
WHERE manager_id IS NOT NULL AND department_id IS NOT NULL
GROUP BY ROLLUP (department_id, manager_id);

20. Să se afiseze codurile departamentelor în care lucrează cel putin un angajat, iar pentru fiecare dintre
acestea si pentru fiecare manager care lucrează în departamentul respectiv să se afiseze numărul de
salariati. De asemenea, să se afiseze numărul de salariati pentru fiecare departament indiferent de
manager, numărul de angajati subordonati unui manager indiferent de departament si numărul total de
angajati din companie.

SELECT department_id, manager_id, COUNT(employee_id)


FROM employees
WHERE manager_id IS NOT NULL AND department_id IS NOT NULL
GROUP BY CUBE (department_id, manager_id);

21. Pentru fiecare departament, job, respectiv an al angajării să se afiseze numărul de salariati. De
asemenea se va afisa numărul de angajati:
- pentru fiecare departament si job, indiferent de anul angajării;
69
- pentru fiecare departament, indiferent de job si de anul angajării;
- la nivel de companie.

Exemplu:
Să se afiseze valoarea totală a operelor de artă ale unui autor, expuse în cadrul fiecărei galerii având codul mai
mic decât 50. De asemenea, să se afiseze valoarea totală a operelor din fiecare galerie având codul mai mic decât
50, valoarea totală a operelor fiecărui autor indiferent de galerie si valoarea totală a operelor din galeriile având
codul mai mic decât 50.

SELECT cod_galerie, cod_artist, SUM(valoare)


FROM opera
WHERE cod_galerie < 50
GROUP BY CUBE(cod_galerie, cod_artist);

22. Să se afiseze suma alocată pentru plata salariilor pe joburi (codul jobului), în cadrul departamentului
(codul departamentului). De asemenea, să se afiseze valoarea totală necesară pentru plata salariilor la nivel
de departament, valoarea totală necesară pentru plata salariilor la nivel de job, indiferent de departament
si valoarea totală necesară pentru plata salariilor la nivel de companie.

23. Functia GROUPING(expresie) întoarce:


- valoarea 0, dacă expresia a fost utilizată pentru calculul valorii agregat
- valoarea 1, dacă expresia nu a fost utilizată.

24. Să se afiseze numele departamentelor, titlurile job-urilor si valoarea medie a salariilor, pentru:
- fiecare departament si, în cadrul său pentru fiecare job;
- fiecare departament (indiferent de job);
- întreg tabelul.
De asemenea, să se afiseze si o coloană care indică intervenŃia coloanelor department_name si job_title în
obtinerea rezultatului.

SET LINESIZE 100


COLUMN job FORMAT ‘99’
COLUMN dept FORMAT ‘99’
SELECT department_name, job_title, AVG(salary) medie,
GROUPING(department_name) dept, GROUPING(job_title) job
FROM employees e, departments d, jobs j
WHERE e.department_id = d.department_id
AND e.job_id = j.job_id
GROUP BY ROLLUP(department_name, job_title);

25. Modificati cererea anterioară astfel încât să se afiseze numele departamentelor, titlurile job-urilor si
valoarea medie a salariilor, pentru:
- fiecare departament si, în cadrul său pentru fiecare job;
- fiecare departament (indiferent de job);
- fiecare job(indiferent de departament);
- întreg tabelul.
Cum intervin coloanele în obtinerea rezultatului? Să se afiseze ’Dept’, dacă departamentul a intervenit în
agregare si ‘Job’, dacă job-ul a intervenit în agregare.
DECODE(GROUPING(department_name), 0, ‘Dept’)

SELECT department_name, job_title, AVG(salary) medie,


DECODE(GROUPING(department_name), 0, ‘Dept’) dept,
DECODE(GROUPING(job_title), 0, ‘Job’) job
FROM employees e, departments d, jobs j
WHERE e.department_id = d.department_id
70
AND e.job_id = j.job_id
GROUP BY CUBE(department_name, job_title);

26. Utilizati cererea de la punctul 20.


a. Eliminati clauza WHERE din această cerere. Analizati rezultatul obtinut.
b. Modificati cererea obtinută astfel încât să se identifice dacă o valoare null din rezultat este stocată pe una
dintre coloanele manager_id sau department_id sau este produsă de operatorul CUBE.

/*Cererea de la pct.20*/
SELECT department_id, manager_id, COUNT(employee_id)
FROM employees
WHERE manager_id IS NOT NULL AND department_id IS NOT NULL
GROUP BY CUBE (department_id, manager_id);
/* 54 de inregistrari selectate*/

SELECT department_id, manager_id, COUNT(employee_id)


FROM employees
GROUP BY CUBE (department_id, manager_id);
/*58 înregistrãri selectate.*/
/* se afiseaza departamentele care nu au angajati si angajatii care nu fac parte din nici un departament

27. Clauza GROUPING SETS. Permite obtinerea numai a anumitor grupări superagregat. Acestea pot fi
precizate prin intermediul clauzei:
GROUP BY GROUPING SETS ((expr_11, expr_12, …, expr_1n), (expr_21, expr_22, …expr_2m),
…)

28. Să se afiseze numele departamentelor, numele job-urilor, codurile managerilor angajatilor, maximul si
suma salariilor pentru:
- fiecare departament si, în cadrul său, fiecare job;
- fiecare job si, în cadrul său, pentru fiecare manager;
- întreg tabelul.
GROUPING SETS ((department_name, job_title), (job_title, e.manager_id), ());

SELECT department_name, job_title, e.manager_id, MAX(salary) “Maxim”, SUM(salary) “Suma”


FROM employees e, departments d, jobs j
WHERE e.department_id = d.department_id
AND e.job_id = j.job_id
GROUP BY GROUPING SETS ((department_name, job_title), (job_title, e.manager_id), ());

Limbajul de control al datelor (DCL). COMMIT, SAVEPOINT, ROLLBACK.

· Comanda COMMIT permanentizează modificările care au fost realizate de tranzactia curentă (o tranzactie este
un set de comenzi LMD); comanda suprimă toate punctele intermediare definite în tranzactie si eliberează
blocările tranzactiei.

Observatie:
Sistemul realizează COMMIT implicit:
- la închiderea normală a unui client Oracle (de exemplu SQL*Plus),
- după fiecare comandă LDD (CREATE, ALTER, DROP).

· Comanda SAVEPOINT marchează un punct intermediar în procesarea tranzactiei. În acest mod este posibilă
împărtirea tranzactiei în subtranzactii.

71
Comanda SAVEPOINT are sintaxa:

SAVEPOINT nume_pct_intermediar;

· Comanda ROLLBACK permite renuntarea la modificările efectuate; aceasta determină încheierea tranzactiei,
anularea modificărilor asupra datelor si restaurarea stării lor precedente.

Comanda ROLLBACK are sintaxa:

ROLLBACK [TO SAVEPOINT nume_punct_salvare];

Observatii:
- sistemul realizează ROLLBACK implicit dacă se închide anormal (defectiune hardware sau software, pană de
curent etc.);
- nici o comanda LDD (CREATE, ALTER; DROP) nu poate fi anulată.

1. Ce efect are următoarea secventă de instructiuni?

CREATE TABLE dept1


AS SELECT * FROM departments;
SELECT * FROM dept1;
SAVEPOINT a;
/* punct de salvare creat*/
DELETE FROM dept1;
INSERT INTO dept1
VALUES (300,’Economic’,100,1000);
/*EROARE la linia 1:ORA-00913: prea multe valori*/
INSERT INTO dept1
VALUES (350,’Cercetare’,200,2000);
/*EROARE la linia 1:ORA-00913: prea multe valori*/
SAVEPOINT b;
/* punct de salvare creat*/
INSERT INTO dept1
VALUES (400,’Juritic’,150,3000);
SELECT COUNT(*)
FROM dept1;
*/ COUNT(*)
----------
0*/
ROLLBACK TO b;
/* revenire incheiata
SELECT COUNT(*)
FROM dept1;
*/COUNT(*)
----------
0*/
ROLLBACK TO a;
*/ punct de salvare creat
INSERT INTO dept1
VALUES (500,’Contabilitate’,175,1500);
*/EROARE la linia 1: ORA-00913: prea multe valori*/
COMMIT;
*/Confirmare finalizatã.*/
SELECT *
FROM dept1; */nici o înregistrare selectatã*/
72
Limbajul de prelucrare a datelor (DML). INSERT, UPDATE, DELETE.

1. Să se creeze tabele emp_*** si dept_***, având aceeasi structură si date ca si tabelele employees,
respectiv departments.
CREATE TABLE emp AS SELECT * FROM employees;
CREATE TABLE dept AS SELECT * FROM departments;

2. Să se selecteze toate înregistrările din cele două tabele create anterior.


SELECT * FROM emp;
SELECT * from dept;

3.Stergeti toate înregistrările din cele 2 tabele create anterior. Salvati modificările.

DELETE FROM emp;


DELETE FROM dept;
COMMIT;

4. Să se listeze structura tabelului employees si să se compare cu structura tabelului emp_***. Ce observati?

DESCRIBE employees;
DESCRIBE emp;
/*Au aceeasi structura.*/

5. Sintaxa simplificată a comenzii INSERT

- pentru inserarea unei singure linii:


INSERT INTO nume_tabel [(col1,col2,...)]
VALUES (expresie1, expresie2, ...);

- pentru inserarea liniilor rezultat ale unei comenzi SELECT:


INSERT INTO nume_tabel [(col1,col2,...)]
comanda_SELECT;

6. Să se exemplifice câteva dintre erorile care pot să apară la inserare si să se observe mesajul returnat de
sistem.

- lipsa de valori pentru coloane NOT NULL (coloana department_name este definită NOT NULL)
INSERT INTO dept (department_id, location_id)
VALUES (200, 2000);
*/EROARE la linia 1: ORA-01400: nu poate fi inserat NULL în ("SCOTT"."DEPT3"."DEPARTMENT_NAME")*/

- nepotrivirea listei de coloane cu cea de expresii


INSERT INTO dept
VALUES (200, 2000);
INSERT INTO dept(department_id, department_name,location_id)
VALUES (200, 2000);
*/EROARE la linia 2: ORA-00947: valori prea putine*/

- nepotrivirea tipului de date


INSERT INTO dept (department_id, location_id)
VALUES (‘D23’, 2000);
*/EROARE la linia 2: ORA-01722: numãr eronat*/

- valoare prea mare pentru coloană


INSERT INTO dept_*** (department_id, location_id)
VALUES (15000, 2000);
73
7. Inserati în tabelul emp_*** salariatii (din tabelul employees) al căror comision depăseste 25% din
salariu.

INSERT INTO emp


SELECT * FROM employees WHERE salary*0.25 < commission_pct ;

8. Creati tabele emp1_***, emp2_*** si emp3_*** cu aceeasi structură ca tabelul employees.


Inserati, utilizând o singură comandă INSERT, informatii din tabelul employees:
- în tabelul emp1_*** salariatii care au salariul mai mic decât 6000;
- în tabelul emp2_*** salariatii care au salariul cuprins între 6000 si 10000;
- în tabelul emp3_*** salariatii care au salariul mai mare decât 10000.
Verificati rezultatele, apoi stergeti toate înregistrările din aceste tabele.
Obs. Clauza ALL a comenzii INSERT determină evaluarea tuturor conditiilor din clauzele WHEN. Pentru
cele a căror valoare este TRUE, se inserează înregistrarea specificată în optiunea INTO corespunzătoare.

CREATE TABLE emp1_1


AS SELECT * FROM employees WHERE 1=0;
CREATE TABLE emp2_1
AS SELECT * FROM employees WHERE 1=0;
CREATE TABLE emp3_1
AS SELECT * FROM employees WHERE 1=0;
INSERT ALL
WHEN salary < =6000 THEN
INTO emp1_1
WHEN salary > = 6000 AND salary <= 10000 THEN
INTO emp2_1
ELSE
INTO emp3_1
SELECT * FROM employees;
DELETE FROM emp1_1;
DELETE FROM emp2_1;
DELETE FROM emp3_1;
COMMIT;

9. Să se creeze tabelul emp0_*** cu aceeasi structură ca tabelul employees. Inserati, utilizând o singură
comandă INSERT, informatii din tabelul employees:
- în tabelul emp0_*** salariatii care lucrează în departamentul 80;
- în tabelul emp1_*** salariatii care au salariul mai mic decât 6000 (care nu se regăsesc în tabelul
emp0_***);
- în tabelul emp2_*** salariatii care au salariul cuprins între 6000 si 10000 (care nu se regăsesc în
tabelele emp0_*** si emp1_***);
- în tabelul emp3_*** salariatii care au salariul mai mare decât 10000 (care nu se regăsesc în tabelele
emp0_***, emp1_*** si emp2_***).
Obs.
Clauza FIRST a comenzii INSERT determină inserarea corespunzătoare primei clauze WHEN a cărei
conditie este evaluată TRUE. Toate celelalte clauze WHEN sunt ignorate.

CREATE TABLE emp0_1


AS SELECT * FROM employees WHERE 1=0;
INSERT FIRST
WHEN department_id = 80 THEN
INTO emp0_1
WHEN salary <= 6000 THEN
INTO emp1_1
WHEN salary > = 6000 AND salary <= 10000 THEN
INTO emp2_1
74
ELSE
INTO emp3_1
SELECT * FROM employees;

10. Sintaxa simplificată a comenzii DELETE


DELETE FROM nume_tabel
[WHERE conditie];

11. Stergeti toate înregistrările din tabelele emp_*** si dept_***. Inserati în aceste tabele toate înregistrările
corespunzătoare din employees, respectiv departments. Permanentizati tranzactia.

DELETE FROM dept;


DELETE FROM emp;
INSERT INTO emp
SELECT * FROM employees;
INSERT INTO dept
SELECT * FROM departments;
COMMIT;

12. Stergeti angajatii care nu au comision. Anulati modificările.


DELETE FROM emp_***
WHERE commission_pct IS NULL;
ROLLBACK;

DELETE FROM emp


WHERE commission IS NULL;
ROLLBACK;

13. Eliminati departamentele care nu au nici un angajat. Anulati modificările.

DELETE FROM dept


WHERE department_id NOT IN (SELECT DISTINCT department_id
FROM emp
WHERE department_id IS NOT NULL);
ROLLBACK;

14. Eliminati angajatii care nu apartin unui departament valid. Anulati modificările.

DELETE FROM emp


WHERE department_id NOT IN (SELECT department_id
FROM dept)
OR department_id IS NULL;
ROLLBACK;

15. Sintaxa simplificată a comenzii UPDATE:

UPDATE nume_tabel [alias]


SET col1 = expr1[, col2=expr2]
[WHERE conditie];
sau
UPDATE nume_tabel [alias]
SET (col1,col2,...) = (subcerere)
[WHERE conditie];

16. Măriti salariul tuturor angajatilor din tabelul emp_*** cu 5%. Anulati modificările.

75
UPDATE emp
SET salary = salary * 1.05;
ROLLBACK;

17. Schimbati jobul tuturor salariatilor din departamentul 80 care au comision în 'SA_REP'. Anulati
modificările.

UPDATE emp
SET job_id = 'SA_REP'
WHERE department_id=80 AND commission_pct IS NOT NULL;
ROLLBACK;

UPDATE emp
SET job_id = 99
WHERE department_id=80 AND commission IS NOT NULL;
ROLLBACK;

18. Să se modifice jobul si departamentul angajatului având codul 114, astfel încât să fie la fel cu cele ale
angajatului având codul 205.

UPDATE emp
SET (job_id, department_id) = (SELECT job_id, department_id
FROM emp
WHERE employee_id = 205)
WHERE employee_id = 114;
ROLLBACK;

19. Schimbati salariul si comisionul celui mai prost plătit salariat din firmă, astfel încât să fie egale cu
salariul si comisionul directorului.

DELETE FROM emp WHERE employee_id = 123;


UPDATE emp
SET (salary, commission) = (SELECT salary, commission
FROM emp
WHERE manager_id IS NULL)
WHERE salary = (SELECT MIN(salary)
FROM emp);
ROLLBACK;

20. Pentru fiecare departament să se mărească salariul celor care au fost angajaŃi primii astfel încât să
devină media salariilor din companie.

UPDATE emp e
SET salary = (SELECT AVG(salary)
FROM emp)
WHERE hire_date = (SELECT MIN(hire_date)
FROM emp
WHERE department_id=e.department_id);
ROLLBACK;

21. Să se modifice valoarea emailului pentru angajatii care câstigă cel mai mult în departamentul în care
lucrează astfel încât acesta să devină initiala numelui concatenată cu prenumele. Dacă nu are prenume
atunci în loc de acesta apare caracterul ‘.’. Anulati modificările.

UPDATE emp
SET email = LOWER(SUBSTR(first_name,1,1)) || LOWER(NVL(last_name, '. '))
76
WHERE (department_id, salary) IN (SELECT department_id, MAX(salary)
FROM emp
GROUP BY department_id);
ROLLBACK;

77

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