Differences

This shows you the differences between two versions of the page.

Link to this comparison view

bd:laboratoare:07 [2019/03/31 13:54]
maria_luiza.serban
bd:laboratoare:07 [2022/05/05 16:55] (current)
florin.radulescu [Funcții diverse]
Line 1: Line 1:
 ===== Laborator 07 - Funcții SQL (II) ===== ===== Laborator 07 - Funcții SQL (II) =====
  
-**Conținut**+ 
 +===== Obiective ===== 
   * Funcții de conversie   * Funcții de conversie
   * Funcții diverse   * Funcții diverse
   * Funcții de grup   * Funcții de grup
 +  ​
 +===== Materiale ajutătoare =====
 +
 +[[bd:​resurse:​tables|Resurse BD]]
 +
  
 ==== Funcții de conversie ==== ==== Funcții de conversie ====
Line 28: Line 35:
 | 9    | Numere (nr. de 9 determină lungimea de afișare) ​   |  | 9    | Numere (nr. de 9 determină lungimea de afișare) ​   | 
 | 0    | Afișează 0 de la început ​   | | 0    | Afișează 0 de la început ​   |
-\$   | Semnul $     ​| ​+''​$'' ​  | Semnul ​''​$'' ​    | 
 | .    | Punct decimal ​    | | .    | Punct decimal ​    |
 | ,    | Virgulă ​    | | ,    | Virgulă ​    |
Line 41: Line 48:
 {{:​bd:​laboratoare:​lab07_p3.png?​320}} {{:​bd:​laboratoare:​lab07_p3.png?​320}}
  
-|{{:​bd:​laboratoare:​lab07_p4.png?​350}}|{{:​bd:​laboratoare:​lab07_p5.png?​320}}|+|{{:​bd:​laboratoare:​lab07_p4.png?​380}}|{{:​bd:​laboratoare:​lab07_p5.png?​340}}|
  
  
Line 67: Line 74:
 {{:​bd:​laboratoare:​lab07_p7_2.png?​520}} {{:​bd:​laboratoare:​lab07_p7_2.png?​520}}
  
-  * **Instrucțiunea ​CASE**+  * **Expresii ​CASE**
  
-Instrucținea ​CASE poate fi folosită ​în clauza SELECT sau WHERE:+Expresiile ​CASE pot fi folosite ​în clauza SELECT sau WHERE. Ele returnează o valoare (a nu se confunda cu instrucțiunea CASE):
  
 Sintaxa 1: Sintaxa 1:
  
 <code sql>CASE expr <code sql>CASE expr
-WHEN value1 THEN statements_1;​ +WHEN value1 THEN retval_1 
-WHEN value2 THEN statements_2;​+WHEN value2 THEN retval_2
 ... ...
-[ELSE statements_k;​]+[ELSE retval_k]
 END</​code>​ END</​code>​
  
   * **expr** – reprezintă expresia care se va evalua;   * **expr** – reprezintă expresia care se va evalua;
-  * **statements_1** – reprezintă valoarea care se va returna pentru **expr = value1;** +  * **retval_1** – reprezintă valoarea care se va returna pentru **expr = value1;** 
-  * **statements_2** – reprezintă valoarea care se va returna pentru **expr = value2;** +  * **retval_2** – reprezintă valoarea care se va returna pentru **expr = value2;** 
-  * **statements_k** – reprezintă valoarea implicită care se va returna pentru **expr <> value1, value2, ...** +  * **retval_k** – reprezintă valoarea implicită care se va returna pentru **expr <> value1, value2, ...** 
  
 Sintaxa 2: Sintaxa 2:
  
 <code sql>​CASE ​ <code sql>​CASE ​
-WHEN expr_1 THEN statements_1;​ +WHEN expr_1 THEN retval_1 
-WHEN expr_2 THEN statements_2;​+WHEN expr_2 THEN retval_2
 ... ...
-[ELSE statements_k;​]+[ELSE retval_k]
 END</​code>​ END</​code>​
  
-  * **expr_i** – reprezintă expresia care se va evalua  +  * **expr_i** – reprezintă expresia ​**booleana** ​care se va evalua  
-  * **statements_i** – reprezintă valoarea care se va returna pentru **expr_i**+  * **retval_i** – reprezintă valoarea care se va returna pentru **expr_i**
  
 |{{:​bd:​laboratoare:​lab07_p8_1.png?​320}}|{{:​bd:​laboratoare:​lab07_p8_2.png?​410}}| |{{:​bd:​laboratoare:​lab07_p8_1.png?​320}}|{{:​bd:​laboratoare:​lab07_p8_2.png?​410}}|
Line 154: Line 161:
   * **STDDEV([DISTINCT|ALL] expr)** – returnează deviația standard pentru expr, ingnorând valorile null.   * **STDDEV([DISTINCT|ALL] expr)** – returnează deviația standard pentru expr, ingnorând valorile null.
  
-<color red>Ex 10. </​color>​ Să se afișeze varianțtia standard și deviația standard a salariilor pentru fiecare departament.+<color red>Ex 10. </​color>​ Să se afișeze varianția standard și deviația standard a salariilor pentru fiecare departament.
 {{:​bd:​laboratoare:​lab07_p17.png?​500}} {{:​bd:​laboratoare:​lab07_p17.png?​500}}
  
Line 161: Line 168:
  
 <color red>Ex 1. </​color>​ Să se facă o listă cu: <color red>Ex 1. </​color>​ Să se facă o listă cu:
 +  * id-ul sefului
 +  * numele sefului
 +  * numarul de subalterni
 +  * numele departamentului din care face parte seful
 +  * salariu minim/​mediu/​maxim pt subalterni
 +
 +<​hidden>​
 +<​code>​
 +select s.empno "id sef", ​
 + s.ename "nume sef", ​
 + count(e.empno) "nr angajati",​
 + d.dname "​dept",​
 + min (e.sal) "​min",​
 + max (e.sal) "​max",​
 + avg (e.sal) "​avg"​
 +from emp e, emp s, dept d
 +where e.mgr = s.empno and
 + s.deptno = d.deptno
 +group by s.empno, s.ename, d.dname;
 +
 +    id sef nume sef   nr angajati dept                  min        max        avg
 +---------- ---------- ----------- -------------- ---------- ---------- ----------
 +      7782 CLARK                1 ACCOUNTING ​          ​1300 ​      ​1300 ​      1300
 +      7839 KING                 3 ACCOUNTING ​          ​2450 ​      2975 2758.33333
 +      7566 JONES                2 RESEARCH ​            ​3000 ​      ​3000 ​      3000
 +      7788 SCOTT                1 RESEARCH ​            ​1100 ​      ​1100 ​      1100
 +      7902 FORD                 1 RESEARCH ​             800        800        800
 +      7698 BLAKE                5 SALES                 ​950 ​      ​1600 ​      1310
 +
 +</​code>​
 +</​hidden>​
 +
 +<color red>Ex 2. </​color>​ Să se facă o listă cu:
   * numele angajatului - formatați prima litera mare și restul mici   * numele angajatului - formatați prima litera mare și restul mici
   * departamentul în care lucreaza angajatul - formatați cu litere mici   * departamentul în care lucreaza angajatul - formatați cu litere mici
Line 172: Line 212:
   * dacă angajatul are gradul salarial 2: salariu * sqrt(c * log2(n))   * dacă angajatul are gradul salarial 2: salariu * sqrt(c * log2(n))
   * dacă angajatul are gradul salarial 4: salariu * sqrt(c * log3(n))   * dacă angajatul are gradul salarial 4: salariu * sqrt(c * log3(n))
 +  * altfel: 0
 unde n este vechimea în firmă calculată în luni și c este o valoare introdusă de la tastatură (folosiți 0.15 pentru testare). unde n este vechimea în firmă calculată în luni și c este o valoare introdusă de la tastatură (folosiți 0.15 pentru testare).
  
Line 184: Line 225:
  lower (d.dname) dep_ang,  lower (d.dname) dep_ang,
  to_char (a.hiredate,​ '​MM-YYYY'​) data_ang,  to_char (a.hiredate,​ '​MM-YYYY'​) data_ang,
- case g.grade+ case when to_number (to_char(a.hiredate,​ '​YYYY'​)) = to_number (to_char(s.hiredate,​ '​YYYY'​)) 
 +           ​then ​case g.grade
  when 2 then a.sal * sqrt(&c * log(2, months_between(sysdate,​ a.hiredate)))  when 2 then a.sal * sqrt(&c * log(2, months_between(sysdate,​ a.hiredate)))
  when 4 then a.sal * sqrt(&c * log(3, ​ months_between(sysdate,​ a.hiredate))) ​  when 4 then a.sal * sqrt(&c * log(3, ​ months_between(sysdate,​ a.hiredate))) ​
 +                else 0
 +                end
 +            else 0
  end prima,  end prima,
  g.grade,  g.grade,
Line 194: Line 239:
  join dept d on a.deptno = d.deptno  join dept d on a.deptno = d.deptno
  join salgrade g on a.sal between g.losal and hisal  join salgrade g on a.sal between g.losal and hisal
- join emp s + left outer join emp s 
  join dept ds on s.deptno = ds.deptno ​  join dept ds on s.deptno = ds.deptno ​
  on a.mgr = s.empno  on a.mgr = s.empno
-where (g.grade = 2 or g.grade = 4)  ​ 
- and to_number (to_char(a.hiredate,​ '​YYYY'​)) = to_number (to_char(s.hiredate,​ '​YYYY'​)) 
 order by a.ename;  order by a.ename;
 </​code>​ </​code>​
Line 208: Line 251:
 ANGAJAT ​   DEP_ANG ​       DATA_AN ​     PRIMA      GRADE SEF        DEP_SEF ANGAJAT ​   DEP_ANG ​       DATA_AN ​     PRIMA      GRADE SEF        DEP_SEF
 ---------- -------------- ------- ---------- ---------- ---------- -------------- ---------- -------------- ------- ---------- ---------- ---------- --------------
-Blake      sales          05-1981 2605.27225          4 King       ​accounting +Adams      research ​      ​01-1983 ​         0          1 Scott      research 
-Clark      accounting ​    ​06-1981 2239.11333          4 King       ​accounting +Allen      sales          02-1981 ​         0          3 Blake      sales 
-Ford       ​research ​      ​12-1981 ​ 2738.8836          4 Jones      research +Blake      sales          05-1981 2605.28073          4 King       ​accounting 
-Jones      research ​      ​04-1981 ​ 2720.0106          4 King       ​accounting +Clark      accounting ​    ​06-1981 2239.13302          4 King       ​accounting 
-Martin ​    ​sales ​         09-1981 1437.29374          2 Blake      sales +Ford       ​research ​      ​12-1981 2738.90805          4 Jones      research 
-Ward       ​sales ​         02-1981 1439.15756          2 Blake      sales+James      sales          12-1981 ​         0          1 Blake      sales 
 +Jones      research ​      ​04-1981 2720.03438          4 King       ​accounting 
 +King       ​accounting ​    ​11-1981 ​         0          5 
 +Martin ​    ​sales ​         09-1981 ​ 1437.3065          ​2 ​Blake      sales 
 +Miller ​    ​accounting ​    ​01-1982 ​         0          2 Clark      accounting 
 +Scott      research ​      ​12-1982 ​         0          4 Jones      research 
 +Smith      research ​      ​12-1980 ​         0          1 Ford       ​research 
 +Turner ​    ​sales ​         09-1981 ​         0          3 Blake      sales 
 +Ward       ​sales ​         02-1981 1439.17011          2 Blake      sales 
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
-====Bibliografie==== + 
-  - **Alexandru Boicea** -// Oracle SQL SQL Plus//, Editura Printech ​+ 
bd/laboratoare/07.1554029682.txt.gz · Last modified: 2019/03/31 13:54 by maria_luiza.serban
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0