Advertisement
lucasmouraahere

Módulo 14

Sep 17th, 2019
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 15.74 KB | None | 0 0
  1. CREATE TABLE representantes_venda(
  2.     id NUMBER,
  3.     nome VARCHAR2(50),
  4.     salario NUMBER,
  5.     comissao NUMBER
  6. );
  7.  
  8. DROP TABLE representantes_venda;
  9.  
  10. DROP TABLE representantes_venda;
  11.  
  12. SELECT * FROM representantes_venda;
  13.  
  14. ALTER TABLE respresentantes_venda
  15. RENAME TO representantes_venda;
  16.  
  17. DESC representantes_venda;
  18.  
  19.  
  20. --SELECT COM INSERT
  21. INSERT INTO
  22.     (SELECT nome, id,
  23.             salario, comissao
  24.      FROM representantes_venda)
  25. VALUES ('William', 100,
  26.         10000, 0.5);
  27.  
  28.  
  29. -- USANDO SUBQUERY COMO SE FOSSE UMA VIEW
  30.  
  31. SELECT a.last_name, a.salary,
  32.        a.department_id, b.salavg
  33. FROM hr.employees a, (SELECT department_id,
  34.                              AVG(salary) salavg
  35.                      FROM hr.employees
  36.                      GROUP BY department_id) b
  37. WHERE a.department_id = b.department_id
  38.     AND a.salary > b.salavg;
  39.  
  40. -- UPDATE USANDO SUBQUERY
  41.  
  42. UPDATE representantes_venda
  43.     SET id = (SELECT employee_id
  44.                      FROM hr.employees
  45.                      WHERE employee_id = 103),
  46.         comissao = (SELECT commission_pct
  47.                      FROM hr.employees
  48.                      WHERE employee_id = 122);
  49.        
  50. SELECT * FROM representantes_venda;
  51.  
  52. -- DELETE USANDO SUBQUERY
  53.  
  54. DELETE FROM representantes_venda
  55.     WHERE id IN (100);
  56.                  
  57. -- WITH CHECK OPTION EM UM DML
  58.  
  59. INSERT INTO
  60.     (SELECT nome, id,
  61.             salario, comissao
  62.      FROM representantes_venda
  63.      WHERE salario = 10000
  64.      WITH CHECK OPTION) -- VALIDAÇÃO PARA VERIFICAR VALORES QUE NÃO RETORNAM NA SUBQUERY.
  65. VALUES ('William', 100,
  66.         10000, 0.5);
  67.        
  68. ALTER TABLE representantes_venda
  69.  MODIFY salario NUMBER(10) DEFAULT (500);
  70.  
  71. INSERT INTO representantes_venda
  72.     (id, nome, salario, comissao)
  73.  VALUES(200, 'TESTE DEFAULT', DEFAULT, NULL); -- DEFAULT EXPLICITO
  74.  
  75. SELECT * FROM representantes_venda;
  76.  
  77. UPDATE representantes_venda
  78. SET salario = DEFAULT
  79. WHERE id = 100;
  80.  
  81. CREATE TABLE hist_salario (
  82.     employee_id         NUMBER(10),
  83.     hire_date           DATE,
  84.     salary              NUMBER(10)
  85. );
  86.  
  87. CREATE TABLE hist_salario_mng(
  88.     employee_id         NUMBER(10),
  89.     manager_id          NUMBER(10),
  90.     salary              NUMBER(10)
  91. );
  92.  
  93. --INSERT ALL SEM CONDICIONAL
  94. INSERT ALL
  95. INTO hist_salario       VALUES(EMPID, HIREDATE, SAL)
  96. INTO hist_salario_mng   VALUES(EMPID, MGR, SAL)
  97. SELECT employee_id EMPID, hire_date HIREDATE,
  98.        salary SAL, manager_id MGR
  99. FROM hr.employees
  100. WHERE employee_id > 200;
  101.  
  102. SELECT * FROM hist_salario_mng;
  103.  
  104. -- INSERT ALL CONDICIONAL
  105.  
  106. INSERT ALL
  107. WHEN SAL > 10000 THEN
  108.     INTO hist_salario
  109.         VALUES(EMPID, HIREDATE, SAL)
  110. WHEN MGR > 200 THEN
  111.     INTO hist_salario_mng
  112.         VALUES(EMPID, MGR, SAL)
  113. SELECT employee_id EMPID, hire_date HIREDATE,
  114.        salary SAL, manager_id MGR
  115.  FROM hr.employees
  116. WHERE employee_id > 200;
  117.  
  118. SELECT * FROM hist_salario;
  119.  
  120. SELECT * FROM hist_salario_mng;
  121.  
  122. -- INSERT FIRST
  123.  
  124. CREATE TABLE sal_especial(
  125.     department_id       NUMBER(10),
  126.     salary              NUMBER(10)
  127. );
  128.  
  129. CREATE TABLE hist_contratacao_07(
  130.     department_id       NUMBER(10),
  131.     hire_date           DATE
  132. );
  133.  
  134. DROP TABLE hist_CONTRATACAO_07;
  135. CREATE TABLE hist_contratacao(
  136.     department_id       NUMBER(10),
  137.     hire_date           DATE
  138. );
  139.  
  140. INSERT FIRST
  141. WHEN SAL > 25000 THEN
  142.   INTO sal_especial
  143.     VALUES(DEPTID, SAL)
  144. WHEN HIREDATE LIKE ('%07%') THEN
  145.   INTO hist_contratacao_07
  146.     VALUES(DEPTID, HIREDATE)
  147. ELSE
  148.   INTO hist_contratacao
  149.     VALUES(DEPTID, HIREDATE)
  150. SELECT department_id DEPTID,
  151.        SUM(salary) SAL,
  152.        MAX(hire_date) HIREDATE
  153. FROM hr.employees
  154. GROUP BY department_id;
  155.  
  156. SELECT * FROM sal_especial;
  157.  
  158. SELECT * FROM hist_contratacao_07;
  159.  
  160. SELECT * FROM hist_contratacao;
  161.  
  162. -- INSERT COM PIVOT
  163.  
  164. CREATE TABLE info_vendas_geral(
  165.     employee_id         NUMBER(10),
  166.     semana_id           NUMBER(10),
  167.     vendas_SEG          NUMBER(10),
  168.     vendas_TER          NUMBER(10),
  169.     vendas_QUA          NUMBER(10),
  170.     vendas_QUI          NUMBER(10),
  171.     vendas_SEX          NUMBER(10)
  172. );
  173.  
  174. INSERT INTO info_vendas_geral
  175.     VALUES (200, 19, 300, 500, 1000, 30, 5000);
  176.    
  177. SELECT * FROM info_vendas_geral;
  178.  
  179. CREATE TABLE info_vendas(
  180.     employee_id     NUMBER(10),
  181.     semana_id       NUMBER(10),
  182.     dia_id          NUMBER(2),
  183.     vendas          NUMBER(10)
  184. );
  185.  
  186. INSERT ALL
  187.     INTO info_vendas
  188.         VALUES(employee_id, semana_id, 1, vendas_SEG)
  189.     INTO info_vendas
  190.         VALUES(employee_id, semana_id, 2, vendas_TER)
  191.     INTO info_vendas
  192.         VALUES(employee_id, semana_id, 3, vendas_QUA)
  193.     INTO info_vendas
  194.         VALUES(employee_id, semana_id, 4, vendas_QUI)
  195.     INTO info_vendas
  196.         VALUES(employee_id, semana_id, 5, vendas_SEX)
  197. SELECT employee_id, semana_id, vendas_SEG, vendas_TER,
  198.         vendas_QUA, vendas_QUI, vendas_SEX
  199. FROM info_vendas_geral;
  200.    
  201. SELECT * FROM info_vendas;
  202.  
  203. -- INSTRUÇÃO MERGE
  204.  
  205. CREATE TABLE empl3
  206. AS
  207.     (SELECT * FROM hr.employees
  208.         WHERE department_id IN (20, 30, 40));
  209.        
  210. SELECT * FROM empl3
  211. ORDER BY employee_id DESC;
  212.  
  213. MERGE INTO empl3 c
  214. USING hr.employees e
  215.     ON(c.employee_id = e.employee_id)
  216. WHEN MATCHED THEN
  217.     UPDATE SET
  218.     c.first_name = e.first_name,
  219.     c.last_name = e.last_name,
  220.     c.email = e.email,
  221.     c.phone_number = e.phone_number,
  222.     c.hire_date = e.hire_date,
  223.     c.job_id = e.job_id,
  224.     c.salary = e.salary,
  225.     c.commission_pct = e.commission_pct,
  226.     c.manager_id = e.manager_id,
  227.     c.department_id = e.department_id
  228. WHEN NOT MATCHED THEN
  229.     INSERT VALUES (e.employee_id, e.first_name, e.last_name,
  230.                    e.email, e.phone_number, e.hire_date,
  231.                    e.job_id, e.salary, e.commission_pct,
  232.                    e.manager_id, e.department_id);
  233.  
  234. -- CONTROLANDO ALTERAÇÕES NO BANCO DE DADOS
  235.  
  236. SELECT salary FROM empl3
  237. WHERE employee_id = 110;
  238.  
  239. UPDATE empl3
  240.     SET salary = salary * 1.5
  241. WHERE employee_id = 110;
  242.  
  243. SELECT salary,
  244.        versions_starttime,
  245.        versions_endtime
  246. FROM empl3
  247. VERSIONS BETWEEN
  248.     SCN MINVALUE AND MAXVALUE
  249. WHERE employee_id = 110;
  250.  
  251. /* Crie as seguintes tabelas:
  252. 1º func_ricos( employee_id number(10), salary NUMBER(10,2)),
  253. 2º ger_hist(employee_id(10), salary number(10,2), manager_id number(10))
  254. 3º salario (employee_id number(10), hire_date date, salary number(10,2)); */
  255.  
  256. CREATE TABLE func_ricos (
  257.     employee_id     NUMBER(10),
  258.     salary          NUMBER(10,2)
  259. );
  260.  
  261. CREATE TABLE ger_hist (
  262.     employee_id NUMBER(10),
  263.     salary NUMBER(10,2),
  264.     manager_id NUMBER(10)
  265. );
  266.  
  267. CREATE TABLE salario (
  268.     employee_id NUMBER(10),
  269.     hire_date   DATE,
  270.     salary      NUMBER(10,2)
  271. );
  272.  
  273.  
  274.  
  275. /* Agora crie uma consulta que faça o seguinte:
  276. 1º Recuper o id do funcionário, data de admissão, salário e o id somente dos gerentes dos funcionários que possuem gerente;
  277. 2º Quando o funcionário receber mais de 15.000 ele deve ser incluído na tabela func_ricos;
  278. 3º Insira os dados do funcionários que foram admitidos entre os anos de 2002 e 2005 na tabela salario;
  279. 4º O restante dos funcionários devem ser inseridos na tabela ger_hist.
  280. Lembrando que deve-se usar apenas uma query para isso. */
  281.  
  282. INSERT FIRST
  283.  WHEN SAL > 15000 THEN
  284.     INTO func_ricos
  285.       VALUES(EMPD, SAL)
  286.  WHEN HIREDATE LIKE ('%02') OR HIREDATE LIKE ('%05') THEN
  287.     INTO salario
  288.         VALUES(EMPD, HIREDATE, SAL)
  289.  ELSE
  290.     INTO ger_hist
  291.         VALUES(EMPD, SAL, MGR)
  292. SELECT employee_id EMPD, hire_date HIREDATE,
  293.        salary SAL, manager_id MGR
  294. FROM hr.employees
  295.  WHERE manager_id IS NOT NULL;
  296.  
  297. /* Crie as tabelas vendas com a seguinte estrutura:
  298. 1º Tabela vendas semanais vendas_sem (employee_id number(10), semana_id number(10), vendas_seg number(10), vendas_ter number(10), vendas_qua number(10), vendas_qui number(10), vendas_sex number(10));
  299. 2º Insira uma linha aleatória que na tabela vendas_sem;
  300. 3º Cria a tabela vendas (employee_id number(10), semana_id number(10), qtd_venda number(10), dia_sem number(1));
  301. 4º Insira os dados com o insert pivot da tabela vendas_sem na tabela vendas.*/
  302.  
  303. CREATE TABLE vendas_sem (
  304.     employee_id NUMBER(10),
  305.     semana_id NUMBER(10),
  306.     vendas_seg NUMBER(10),
  307.     vendas_ter NUMBER(10),
  308.     vendas_qua NUMBER(10),
  309.     vendas_qui NUMBER(10),
  310.     vendas_sex NUMBER(10)
  311. );
  312.  
  313. INSERT INTO vendas_sem VALUES
  314. (1, 12, 300, 400, 500, 600, 1500);
  315.  
  316. SELECT * FROM vendas_sem;
  317.  
  318. CREATE TABLE vendas (
  319.     employee_id NUMBER(10),
  320.     semana_id NUMBER(10),
  321.     qtd_venda NUMBER(10),
  322.     dia_sem NUMBER(1)
  323. );
  324.  
  325. INSERT ALL
  326.     INTO vendas
  327.         VALUES(employee_id, 12, vendas_seg, 1)
  328.     INTO vendas
  329.         VALUES(employee_id, 12, vendas_ter, 2)
  330.     INTO vendas
  331.         VALUES(employee_id, 12, vendas_qua, 3)
  332.     INTO vendas
  333.         VALUES(employee_id, 12, vendas_qui, 4)
  334.     INTO vendas
  335.         VALUES(employee_id, 12, vendas_sex, 5)
  336. SELECT employee_id, semana_id, vendas_seg,
  337.        vendas_ter, vendas_qua, vendas_qui,
  338.        vendas_sex
  339. FROM vendas_sem;
  340.  
  341. /* 1º Cria a tabela employee_4 com os dados idênticos à tabela employees, com todos os funcionários que ganham menos de 6000;
  342. 2º Faça uma consulta que caso o employee_id da tabela employees seja igual ao employee_id da tabela employees_4,
  343. os dados do empregado devem ser atualizado, em caso contrário o funcionário deve ser inserido na tabela employee_4;*/
  344.  
  345. CREATE TABLE employee_4 AS
  346.     (SELECT * FROM hr.employees
  347.             WHERE salary < 6000);
  348.  
  349. MERGE INTO employee_4 e4
  350.     USING hr.employees e
  351.        ON (e4.employee_id = e.employee_id)
  352. WHEN MATCHED THEN
  353.     UPDATE
  354.         SET e4.first_name = e.first_name,
  355.             e4.last_name = e.last_name,
  356.             e4.email = e.email,
  357.             e4.phone_number = e.phone_number,
  358.             e4.hire_date = e.hire_date,
  359.             e4.job_id = e.job_id,
  360.             e4.salary = e.salary,
  361.             e4.commission_pct = e.commission_pct,
  362.             e4.manager_id = e.manager_id,
  363.             e4.department_id = e.department_id
  364.             WHERE e.employee_id = e4.employee_id
  365. WHEN NOT MATCHED THEN
  366.   INSERT VALUES (e.employee_id, e.first_name, e.last_name,
  367.                  e.email, e.phone_number, e.hire_date,
  368.                  e.job_id, e.salary, e.commission_pct,
  369.                  e.manager_id, e.department_id);
  370.                  
  371. /* 1º Atualize o salário do funcionário 100 para 25000;
  372. 2º Mostre todas as alterações nesse campo desse funcionário e quando eles começaram a ser válidas e quando elas deixaram de ser válidas.*/
  373.  
  374. UPDATE employee_4
  375. SET salary = 25000
  376. WHERE employee_id = 100;
  377.  
  378. SELECT salary,
  379.        versions_starttime,
  380.        versions_endtime
  381. FROM employee_4
  382. VERSIONS BETWEEN
  383.     SCN MINVALUE AND MAXVALUE
  384. WHERE employee_id = 100;
  385.  
  386. /* TIPOS DE SUBCONSULTAS
  387.  
  388. Emparelhadas - duas ou mais colunas da consulta externa, com duas ou mais consultas de uma subconsulta (consulta interna).
  389.  
  390. Não Emparelhadas - Repete a consulta interna duas ou mais vezes
  391.  
  392. Escalares - Subconsulta que retorna somente um registro na consulta interna, por esse motivo ela pode ser utilizada em todas as clausulas do SELECT
  393. menos no GROUP BY e no CONNECT BY, pode ser utilizadas como parte da expressão e da condição DECODE e CASE.
  394.  
  395. Correlacionadas - subconsulta que pega uma informação da consulta externa e compara com uma informação da consulta interna para trazer o resultado desejado.
  396. Elas são processadas uma vez para cada linha retornada na consulta externa. Basicamente ela segue o seguinte fluxo:
  397.  
  398. 1. Retorna a linha da consulta Externa;
  399. 2. Executa consulta interna;
  400. 3. verifica se o valor da consulta externa deve ou não retornar.
  401.  
  402. é possível usar ANY eo ALL neste tipo de subconsulta
  403.  
  404. */
  405.  
  406. --RETORNA CONSULTA DE TODOS OS EMPREGADOS QUE TENHAM O MESMO MANAGER_ID E DEPARTMENT_ID IGUAIS AO EMPLOYEE_ID 104 E 105 E NÃO MOSTRAR OS FUNCIONÁRIOS NESSA PESQUISA.
  407. --Emparelhadas - duas ou mais colunas da consulta externa, com duas ou mais consultas de uma subconsulta (consulta interna).
  408.  
  409. SELECT employee_id, manager_id, department_id
  410.  FROM hr.employees
  411.     WHERE (manager_id, department_id) IN
  412.                                 (SELECT manager_id, department_id
  413.                                  FROM hr.employees
  414.                                  WHERE employee_id IN (104, 105))
  415.                     AND employee_id NOT IN (104, 105);
  416.                    
  417. --RETORNA CONSULTA DE TODOS OS EMPREGADOS QUE TENHAM O MESMO MANAGER_ID E DEPARTMENT_ID IGUAIS AO EMPLOYEE_ID 104 E 105 E NÃO MOSTRAR OS FUNCIONÁRIOS NESSA PESQUISA.
  418. --Não Emparelhadas - Repete a consulta interna duas ou mais vezes
  419.  
  420. SELECT employee_id, manager_id, department_id
  421.  FROM hr.employees
  422. WHERE manager_id IN
  423.     (SELECT manager_id
  424.      FROM hr.employees
  425.      WHERE employee_id IN (104,105))
  426.  AND department_id IN
  427.     (SELECT department_id
  428.      FROM hr.employees
  429.      WHERE employee_id IN (104,105))
  430.  AND employee_id NOT IN (104,105);
  431.      
  432.  
  433. /* Escalares - Subconsulta que retorna somente um registro na consulta interna, por esse motivo ela pode ser utilizada em todas as clausulas do SELECT
  434. menos no GROUP BY e no CONNECT BY, pode ser utilizadas como parte da expressão e da condição DECODE e CASE.*/
  435.  
  436. SELECT * FROM hr.employees
  437.  WHERE department_id =
  438.         (SELECT department_id FROM hr.departments
  439.          WHERE department_name = 'IT');
  440.  
  441. /*Correlacionadas - subconsulta que pega uma informação da consulta externa e compara com uma informação da consulta interna para trazer o resultado desejado.
  442. Elas são processadas uma vez para cada linha retornada na consulta externa. Basicamente ela segue o seguinte fluxo:
  443.  
  444. 1. Retorna a linha da consulta Externa;
  445. 2. Executa consulta interna;
  446. 3. verifica se o valor da consulta externa deve ou não retornar.
  447.  
  448. é possível usar ANY eo ALL neste tipo de subconsultA*/
  449.  
  450. SELECT * FROM hr.employees emp
  451.     WHERE salary >
  452.          (SELECT AVG(salary)
  453.           FROM hr.employees
  454.           WHERE department_id = emp.department_id);
  455.          
  456.          
  457. -- OPERADOR EXISTS
  458. /* O operador EXISTS é utilizado para verificar se o resultado da consulta interna é retornado
  459. ele é muito mais performático que o IN, uma vez que o EXISTS só retorna TRUE ou FALSE,
  460. enquanto o IN compara com todos os resultados da consulta iterna o que acaba honerando o
  461. banco fazendo com que a consulta seja mais lenta */
  462.  
  463. SELECT * FROM hr.employees emp
  464.  WHERE EXISTS (SELECT 1
  465.                FROM hr.employees
  466.                WHERE manager_id = emp.employee_id);
  467.                
  468. SELECT * FROM hr.departments d
  469.     WHERE NOT EXISTS (SELECT employee_id
  470.                       FROM hr.employees
  471.                       WHERE department_id = d.department_id);
  472.                      
  473. -- CLAUSULA WITH
  474. /* WITH se ganha performance dentro de subquerys complexas.
  475.  
  476. Esta cláusula cria uma tabela temporaria detro do Oracle, com isso armazenamos o resultado de uma consulta nesse espaço físico temporário
  477. e ele funciona como uma tabela à consulta que for utiliza-la, este tipo de recurso auxilia e muito em casos de problemas de performance,
  478. porém devemos tomar cuidado ao utiliza-lo uma vez que ele consome muita memoria do banco e em casos de consultas muito utilizidas
  479. isso pode gerar outros problemas de oneração do hardware.
  480.  
  481. */
  482.  
  483. WITH
  484.     dept_custo AS (
  485.         SELECT d.department_name, SUM(e.salary) AS dept_total
  486.          FROM hr.employees e, hr.departments d
  487.         WHERE e.department_id = d.department_id
  488.         GROUP BY d.department_name), -- SOMA SALARIAL POR DEPARTAMENTO
  489.     avg_custo AS (
  490.         SELECT SUM(dept_total)/COUNT(*) AS dept_avg
  491.          FROM dept_custo) -- MÉDIA SARIAL POR DEPARTAMENTO
  492.     SELECT * FROM dept_custo
  493.     WHERE dept_total >
  494.                    (SELECT dept_avg
  495.                     FROM avg_custo) -- DEPARTAMENTOS QUE RECEBM A MAIOR MÉDIA DOS DEPARTAMENTOS
  496. ORDER BY department_name;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement