Laborator5_SQL_an2

Documente similare
Baze de date-Anul 2 (semestrul 2)

Aggregating Data

Managementul Resurselor Umane

Laborator 8: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea II - functii) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de bloc

Baze de date-Anul 2

Microsoft Word - Curs_07.doc

Baze de date - Anul 2 Laborator 8 Limbajul de definire a datelor (LDD) (partea I) În general, instrucţiunile LDD sunt utilizate pentru definirea struc

PHP (II)

Baze de date - Anul 2 Laborator 9 Limbajul de definire a datelor (LDD) - II : Definirea vizualizărilor, secvenţelor, indecşilor, sinonimelor, tabelelo

Laborator 7: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea I - proceduri) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de blo

Baze de date

proiectarea bazelor de date

RZOLVARE EXERCITIU ZODII declare cursor distributie_zodie is select nume_zodie, count(*) distributie from zodiac z join utilizatori u on to_date(to_ch

PowerPoint Presentation

Subiectul 1

PowerPoint Presentation

PowerPoint Presentation

Database Management Systems Cap 2. Structured Query Language (1)

Anexa nr. 2 FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ superior UNIVERSITATEA DE VEST TIMISOARA 1.2 Facultatea FIZICA 1.3 De

Laborator02

PowerPoint Presentation

Mai multe despre optimizare

PROIECT DIDACTIC Clasa a VII-a Informatică și TIC

ADRIAN TRIF BAZE DE DATE APLICAŢII ACCESS UTPRESS Cluj-Napoca, 2019 ISBN

tehnologii web

Microsoft Word - Curs 11 - PHP.doc

Microsoft Word - Curs_09.doc

EXCEL FĂRĂ SECRETE Grafice şi diagrame

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

E_d_Informatica_sp_SN_2014_bar_10_LRO

Utilizare Internet

Capitole Speciale de Informatică Curs 4: Calculul scorurilor în un sistem complet de extragere a informaţiilor 18 octombrie 2018 Reamintim că în cursu

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

1. Găsiți k numerele cele mai apropiate într-un şir nesortat Dându-se un şir nesortat și două numere x și k, găsiți k cele mai apropiate valori de x.

Analiză de flux de date 29 octombrie 2012

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Elemente de Web design

Addendum Syllabus 6 Microsoft Access 2016 REF Syllabus 6.0 Cunoașterea domeniilor în care se utilizează bazele de date Datorită potenţialului ma

PowerPoint Presentation

Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare

Microsoft Word - Curs_10.doc

Microsoft Word - versiunea D doc

Declararea variabilelor

Paradigme de programare

Diapositive 1

Prezentarea calculatorului

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

PowerPoint Presentation

Microsoft Word - CarteC.doc

E_d_Informatica_sp_MI_2015_bar_02_LRO

Slide 1

Microsoft Word - Curs_08.doc

PowerPoint Presentation

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

Baze de date Anul 2 Teorie Examen 1. Diagrama entitate/relatie si diagrama conceptuala (curs 2-5) 2. Arbore algebric si expresie algebrica (curs 6-10)

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Slide 1

Programarea şi utilizarea calculatoarelor

Secţiunea 5-6 avansaţi PROBLEMA 1 Concurs online de informatică Categoria PROGRAMARE 100 puncte NR Un număr natural nenul V care se plictisea singur,

1

Lecții de pregă,re la informa,că Admitere 2019 Tema: Discutarea problemelor date la ul,mele sesiuni de admitere Bogdan Alexe

INSTITUTUL DE DEZVOLTARE A SOCIETĂŢII INFORMAŢIONLE

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

ALGORITHMICS

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

PowerPoint Presentation

Analiză statică Analiza fluxului de date 23 octombrie 2014

Microsoft Word - O problema cu bits.doc

SECURITATE ȘI CRIPTOGRAFIE

LABORATOR I

Laborator Implementarea algoritmului DES - Data Encryption Standard. Exemplu DES Algoritmul DES foloseşte numere b

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

Microsoft Word - CarteC.doc

Microsoft Word - Excel_3.DOC

Programarea şi utilizarea calculatoarelor

gaussx.dvi

Top

Metode API - integrare FGO v.2.5 Cuprins ISTORIC VERSIUNI... 2 INTRODUCERE... 2 APELARE... 4 NOMENCLATOARE... 4 FACTURA... 5 EMITERE... 5 PRINT... 6 S

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

Laborator 3

Documentaţie Tehnică Verificare TVA API Ultima actualizare: 1 ianuarie / 92 1

GHERCĂ MAGDA CASA CORPULUI DIDACTIC BRĂILA PORTOFOLIU EVALUARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A Neamț SERIA 1 GRUPA 1 CURSANT: GHERCĂ G

Microsoft Visual C++ (abreviat MSVC) is a commercial integrated development environment (IDE) product engineered by Microsoft for the C, C++, and C++/

Microsoft Word - BD4_Curs11.doc

B

Universitatea Aurel Vlaicu din Arad Facultatea de Științe Exacte CONCURSUL INTERNAȚIONAL DE MATEMATICĂ ȘI INFORMATICĂ CAIUS IACOB Ediția a VIII-a SECȚ

Microsoft Word - Revista_Universul_Juridic_nr_ _PAGINAT_.doc

Registrul Electronic National de Vaccinari (RENV) Descriere proiect: Proiectul urmareste crearea unui registru electronic de evidenta a vaccinarilor.

Curs 6: Clasificarea surselor de informatii - Clasificarea Bayes Naiva. Modelul Bernoulli

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

Consultant Fiscal, Auditor Financiar - Adrian Bența ; tel: Act normativ descărcat prin aboname

1 Smartree Romania

aplicatii java

Metode de programare Proiectarea algoritmilor

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Transcriere:

Baze de date-anul 2 Laborator 5 SQL Operatorii ROLLUP şi CUBE. Clauza GROUPING SETS. Funcţia GROUPING. Subcereri corelate. Cereri ierarhice. Analiza top-n. Clauza WITH. I. [Operatorii ROLLUP şi CUBE. Clauza GROUPING SETS. Funcţia GROUPING.] Am introdus, în laboratorul 4, operatorii ROLLUP şi CUBE. Aceştia se utilizează în cadrul clauzei GROUP BY pentru generarea de linii superagregat. Reamintim că: GROUP BY ROLLUP (expr_1, expr_2,, expr_n) generează n+1 tipuri de linii, corespunzătoare următoarelor grupări: o GROUP BY (expr_1, expr_2,, expr_n-1, expr_n) o GROUP BY (expr_1, expr_2,, expr_n-1) o o GROUP BY (expr_1, expr_2) o o GROUP BY (expr_1) GROUP BY () corespunzător absenţei clauzei GROUP BY şi deci, calculului funcţiilor grup din cerere pentru întreg tabelul. Obs: Lista de expresii care urmează operatorului ROLLUP este parcursă de la dreapta la stânga, suprimându-se câte o expresie. O cerere în care apare un astfel de operator este echivalentă cu reuniunea (UNION ALL) a n+1 cereri. GROUP BY CUBE (expr_1, expr_2,, expr_n) generează 2 n tipuri de linii, corespunzătoare tuturor combinaţiilor posibile de expresii din lista. Pentru determinarea modului ìn care a fost obţinută o valoare totalizatoare cu ROLLUP sau CUBE, se utilizează funcţia: GROUPING(expresie) Aceasta întoarce: - valoarea 0, dacă expresia a fost utilizată pentru calculul valorii agregat - valoarea 1, dacă expresia nu a fost utilizată. Dacă se doreşte obţinerea numai a anumitor grupări superagregat, acestea pot fi precizate prin intermediul clauzei : GROUPING SETS ((expr_11, expr_12,, expr_1n), (expr_21, expr_22, expr_2m), ) 1. a) Să se afişeze numele departamentelor, titlurile job-urilor şi valoarea medie a salariilor, pentru: - fiecare departament şi, în cadrul său pentru fiecare job; - fiecare departament (indiferent de job); - întreg tabelul.

!2 b) Analog cu a), afişând şi o coloană care arată intervenţia coloanelor department_name, job_title, în obţinerea rezultatului. 2. a) Să se afişeze numele departamentelor, titlurile job-urilor şi valoarea medie a salariilor, pentru: - fiecare departament şi, în cadrul său pentru fiecare job; - fiecare departament (indiferent de job); - fiecare job (indiferent de departament) - întreg tabelul. b) Cum intervin coloanele în obţinerea rezultatului? 3. Să se afişeze numele departamentelor, numele job-urilor, codurile managerilor, maximul şi suma salariilor pentru: - fiecare departament şi, în cadrul său, fiecare job; - fiecare job şi, în cadrul său, pentru fiecare manager; - întreg tabelul. II. [Subcereri corelate (sincronizate)] O subcerere (cerere imbricată) corelată poate avea forma următoare: SELECT nume_coloană_1[, nume_coloană_2 ] FROM nume_tabel_1 extern WHERE expresie operator (SELECT nume_coloană_1 [, nume_coloană_2 ] FROM nume_tabel_2 WHERE expresie_1 = extern.expresie_2); Modul de execuţie este următorul : cererea externă determină o linie candidat; cererea internă este executată utilizând valoarea liniei candidat; valorile rezultate din cererea internă sunt utilizate pentru calificarea sau descalificarea liniei candidat; paşii precedenţi se repetă până când nu mai există linii candidat. Obs: operator poate fi: single-row operator (>, =, >=, <, <>, <=), care poate fi utilizat dacă subcererea returnează o singură linie; multiple-row operator (IN, ANY, ALL), care poate fi folosit dacă subcererea returnează mai mult de o linie. Obs: Probleme ce pot apărea la utilizarea subcererilor: Folosirea unui operator single row cu o subcerere ce returnează mai mult de o linie. (ORA01427: single-row subquery returns more than one row). Pentru rezolvarea erorii se modifică operatorul într-unul multiple-row. Folosirea neadecvată a unei subcereri care poate să nu returneze nici o linie. În acest caz nu apar erori dar rezultatul nu este corect (no rows selected). Echivalențe de operatori: IN echivalent cu =ANY ;

!3 NOT IN echivalent cu!=all ; > ANY echivalent cu mai mare ca minimul ; < ANY echivalent cu mai mic decât maximul ; > ALL echivalent cu mai mare decât maximul ; < ALL echivalent cu mai mic decât minimul ; În cazul în care utilizăm NOT IN trebuie avut grijă ca subcererea să nu returneze valori null. În caz contrar, invariabil, rezultatul cererii va fi 'no rows selected'. Obs: O subcerere (corelată sau necorelată) poate apărea în clauzele: SELECT FROM (vezi laboratorul 4) WHERE HAVING (vezi laboratorul 4) START WITH (vezi mai jos la cereri ierarhice) Operatorul EXISTS În instrucţiunile SELECT imbricate, este permisă utilizarea oricărui operator logic. Pentru a testa dacă valoarea recuperată de cererea externă (cererea părinte) există în mulţimea valorilor regăsite de cererea internă corelată, se poate utiliza operatorul EXISTS. Dacă subcererea returnează cel puţin o linie, operatorul returnează valoarea TRUE. În caz contrar, va fi returnată valoarea FALSE. Operatorul EXISTS asigură că nu mai este continuată căutarea în cererea internă după ce aceasta regăseşte o linie. 4. a) Să se afişeze informaţii despre angajaţii al căror salariu depăşeşte valoarea medie a salariilor colegilor săi de departament. SELECT last_name, salary, department_id e WHERE salary > (SELECT AVG(salary) WHERE department_id = e.department_id); b) Analog cu cererea precedentă, afişându-se şi numele departamentului şi media salariilor acestuia şi numărul de angajaţi. Soluţia 1 (subcerere necorelată în clauza FROM): SELECT last_name, salary, e.department_id, department_name, sal_med, nr_sal e, departments d, (SELECT department_id, AVG(salary) sal_med, COUNT(*) nr_sal GROUP BY department_id) sm WHERE e.department_id = d.department_id AND d.department_id = sm.department_id AND salary > (SELECT AVG(salary) WHERE department_id = e.department_id); Soluţia 2 (subcerere corelată în clauza SELECT): SELECT last_name, salary, e. department_id, department_name, (SELECT AVG(salary)

!4 WHERE department_id = e. department_id) salariu mediu, (SELECT COUNT(*) WHERE department_id = e. department_id) Nr angajati e, departments d WHERE e.department_id = d.department_id AND salary > (SELECT AVG(salary) WHERE department_id = e.department_id); 5. Să se afişeze numele şi salariul angajaţilor al căror salariu este mai mare decât salariile medii din toate departamentele. Se cer 2 variante de rezolvare: cu operatorul ALL sau cu funcţia MAX. 6. Sa se afiseze numele si salariul celor mai prost platiti angajati din fiecare departament. Soluţia 1 (cu sincronizare): SELECT last_name, salary, department_id e WHERE salary = (SELECT MIN(salary) WHERE department_id = e.department_id); Soluţia 2 (fără sincronizare): SELECT last_name, salary, department_id WHERE (department_id, salary) IN (SELECT department_id, MIN(salary) GROUP BY department_id); Soluţia 3: Subcerere în clauza FROM 7. Sa se obtina numele salariatilor care lucreaza intr-un departament in care exista cel putin 1 angajat cu salariul egal cu salariul maxim din departamentul 30. Obs: Deoarece nu este necesar ca instrucţiunea SELECT interioară să returneze o anumită valoare, se poate selecta o constantă ( x,, 1 etc.). De altfel, din punct de vedere al performanţei, selectarea unei constante asigură mai multă rapiditate decât selectarea unei coloane. 8. Sa se obtina numele primilor 3 angajati avand salariul maxim. Rezultatul se va afişa în ordine crescătoare a salariilor. Solutia 1: subcerere sincronizată

!5 Solutia 2: vezi analiza top-n (mai jos) 9. Să se afişeze codul, numele şi prenumele angajaţilor care au cel puţin doi subalterni. 10. Să se determine locaţiile în care se află cel puţin un departament. Obs: Ca alternativă a lui EXISTS, poate fi utilizat operatorul IN. Scrieţi şi această variantă de rezolvare. 11. Să se determine departamentele în care nu există nici un angajat. SELECT department_id, department_name FROM departments d WHERE NOT EXISTS (SELECT 'x' WHERE department_id = d.department_id); Obs: Acest exemplu poate fi rezolvat şi printr-o subcerere necorelată, utilizând operatorul NOT IN (vezi şi laboratorul 3). Atenţie la valorile NULL! Scrieţi şi această variantă de rezolvare. III.[Subcereri ierarhice] Clauzele START WITH şi CONNECT BY se utilizează în formularea cererilor ierarhice. START WITH specifică o condiţie care identifică liniile ce urmează să fie considerate ca rădăcini ale cererii ierarhice respective. Dacă se omite această clauză, sistemul Oracle utilizează toate liniile din tabel drept linii rădăcină. CONNECT BY specifică o condiţie care identifică relaţia dintre liniile părinte şi copil ale ierarhiei. Condiţia trebuie să conţină operatorul PRIOR pentru a face referinţă la linia părinte. Operatorul PRIOR face referinţă la linia părinte. Plasarea acestui operator determină direcţia interogării, dinspre părinte spre copil (top-down) sau invers (bottom-up). Traversarea top-down, respectiv bottom-up a arborelui se realizează prin specificări de forma următoare: Top-down: CONNECT BY PRIOR cheie_parinte = cheie_copil; Bottom-up: CONNECT BY PRIOR cheie_copil = cheie_parinte; Obs: Operatorul PRIOR poate fi plasat în faţa oricărui membru al condiţiei specificate în clauza CONNECT BY. Obs: Liniile părinte ale interogării sunt identificate prin clauza START WITH. Pentru a găsi liniile copil, server-ul evaluează expresia din dreptul operatorului PRIOR pentru linia părinte, şi cealaltă expresie pentru fiecare linie a tabelului. Înregistrările pentru care condiţia este adevărată vor fi liniile copil. Spre deosebire de START WITH, în clauza CONNECT BY nu pot fi utilizate subcereri. Pseudocoloana LEVEL poate fi utilă într-o cerere ierarhică. Aceasta determină lungimea drumului de la rădăcină la un nod. 12. Să se afişeze codul, numele, data angajării, salariul şi managerul pentru: a) subalternii directi ai lui De Haan; b) ierarhia arborescenta de sub De Haan.

SELECT employee_id, last_name, hire_date, salary, manager_id START WITH manager_id = ( SELECT employee_id WHERE LOWER(last_name)='de haan') CONNECT BY manager_id = PRIOR employee_id;!6 Obs: Traversarea precedentă este top-down. Faceţi modificarea necesară obtinerii unei traversari bottom-up. Interpretaţi rezultatul. 13. Să se obţină ierarhia şef-subaltern, considerând ca rădăcină angajatul având codul 114. 14. Scrieti o cerere ierarhica pentru a afisa codul salariatului, codul managerului si numele salariatului, pentru angajatii care sunt cu 2 niveluri sub De Haan. Afisati, de asemenea, nivelul angajatului în ierarhie. 15. Pentru fiecare linie din tabelul EMPLOYEES, se va afisa o structura arborescenta in care va apărea angajatul, managerul său, managerul managerului etc. Coloanele afişate vor fi: codul angajatului, codul managerului, nivelul în ierarhie (LEVEL) si numele angajatului. Se vor folosi indentari. Obs: Pentru formatarea afişării coloanei nume din cerere, daţi comenzile SQL*Plus următoare: SET LINESIZE 100 COLUMN name FORMAT a25; -- Afiseaza maxim 25 de caractere; SELECT employee_id, manager_id, LEVEL, last_name, LPAD(last_name, length(last_name)+level*2-2, '_') name CONNECT BY employee_id=prior manager_id; 16. Să se afişeze ierarhia de sub angajatul având salariul maxim, reţinând numai angajaţii al căror salariu este mai mare de 5000. Se vor afişa codul, numele, salariul, nivelul din ierarhie şi codul managerului. SELECT FROM START WITH employee_id, last_name, salary, LEVEL, manager_id employees salary = ( SELECT MAX(salary) ) CONNECT BY PRIOR employee_id = manager_id AND salary > 5000 ; SAU: SELECT employee_id, last_name, salary, level,manager_id WHERE salary>5000 START WITH salary=(select max(salary) from employees ) CONNECT BY PRIOR employee_id=manager_id; Obs: În clauza CONNECT BY, coloana employee_id este evaluată pentru linia părinte, iar

!7 coloanele manager_id şi salary sunt evaluate pentru linia copil. Pentru a introduce, de exemplu, conditia ca salariul managerilor sa fie mai mare decât 15000, se scrie: PRIOR salary > 15000 IV. [Clauza WITH] Cu ajutorul clauzei WITH se poate defini un bloc de cerere înainte ca acesta să fie utilizat într-o interogare. Clauza permite reutilizarea aceluiaşi bloc de cerere într-o instrucţiune SELECT complexă. Acest lucru este util atunci când o cerere face referinţă de mai multe ori la acelaşi bloc de cerere, care conţine operaţii join şi funcţii agregat. 17. Utilizând clauza WITH, să se scrie o cerere care afişează numele departamentelor şi valoarea totală a salariilor din cadrul acestora. Se vor considera departamentele a căror valoare totală a salariilor este mai mare decât media valorilor totale ale salariilor tuturor angajatilor. WITH val_dep AS (SELECT department_name, SUM(salary) AS total FROM departments d, employees e WHERE d.department_id = e.department_id GROUP BY department_name), val_medie AS (SELECT SUM(total)/COUNT(*) AS medie FROM val_dep) SELECT * FROM val_dep WHERE total > (SELECT medie FROM val_medie) ORDER BY department_name; 18. Să se afişeze ierarhic codul, prenumele şi numele (pe aceeaşi coloană), codul job-ului şi data angajării, pornind de la subordonaţii direcţi ai lui Steven King care au cea mai mare vechime. Rezultatul nu va conţine angajaţii în anul 1970. V. [Analiza top-n] Pentru aflarea primelor n rezultate ale unei cereri, este utilă pseudocoloana ROWNUM. Aceasta returnează numărul de ordine al unei linii în rezultat. 19. Să se detemine primii 10 cei mai bine plătiţi angajaţi.

!8 VI. [Exerciţii utilizarea alternativă a funcţiei DECODE sau a structurii CASE; din nou NVL şi NVL2; COALESCE; NULLIF] Obs: NVL(a, b) întoarce a, dacă a este NOT NULL, altfel întoarce b; NVL2(a, b, c) - întoarce b, dacă a este NOT NULL, altfel întoarce c; COALESCE (expr_1, expr_2, expr_n) întoarce prima expresie NOT NULL din listă; NULLIF(a, b) întoarce a, dacă a!=b; altfel întoarce NULL ; DECODE (expresie, val_1, val_2, val_3, val_4,., val_2n-1, val_2n, default) dacă expresie = val_1, întoarce val_2; dacă expresie = val_3, întoarce val_4; ; altfel întoarce default. DECODE este echivalent cu CASE, a cărui structură este: CASE expresie WHEN val_1 THEN val_2 WHEN val_3 THEN val_4 ELSE default END CASE poate avea si forma: CASE WHEN expr_logica_1 THEN val_2 WHEN expr_logica_3 THEN val_4 ELSE default END 20. Să se afişeze informaţii despre departamente, în formatul următor: Departamentul <department_name> este condus de {<manager_id> nimeni} şi {are numărul de salariaţi <n> nu are salariati}. 21. Să se afişeze numele, prenumele angajaţilor şi lungimea numelui pentru înregistrările în care aceasta este diferită de lungimea prenumelui. 22. Să se afişeze numele, data angajării, salariul şi o coloană reprezentând salariul după ce se aplică o mărire, astfel: pentru salariaţii angajaţi în 1989 creşterea este de 20%, pentru cei angajaţi în 1990 creşterea este de 15%, iar salariul celor angajaţi în anul 1991 creşte cu 10%. Pentru salariaţii angajaţi în alţi ani valoarea nu se modifică. SELECT last_name, hire_date, salary, CASE TO_CHAR(hire_date, 'yyyy') WHEN '1989' THEN salary * 1.20 WHEN '1990' THEN salary * 1.15 WHEN '1991' THEN salary * 1.10 ELSE salary END "Salariu marit" ; Instrucţiunea din acest exemplu poate fi rescrisă utilizând funcţia DECODE în modul următor: SELECT last_name, hire_date, salary, DECODE (TO_CHAR(hire_date, 'yyyy'), '1989', salary * 1.20,

FROM employees;!9 '1990', salary * 1.15, '1991', salary * 1.10, salary) "Salariu marit" 23. Să se afişeze: - suma salariilor, pentru job-urile care incep cu litera S; - media generala a salariilor, pentru job-ul avand salariul maxim; - salariul minim, pentru fiecare din celelalte job-uri.