Ing. Eduardo Yataco Silva Ing. Eduardo Yataco Silva AGENDA AGENDA Funciones CASE/DECODE SubQuerys Joins Operadores Operadores Ejercicios CASE CASE Syntaxis CASE expr WHEN comparison_expr1 THEN return_expr1 [WHEN comparison_expr2 THEN return_expr2 WHEN comparison_exprn THEN return_exprn ELSE else_expr] END END DECODE DECODE Syntaxis DECODE(col|expression, search1, result1 [, search2, result2,...,] [, default]) CASE / DECODE CASE / DECODE Para los Empleados, mostrar: Apellido del Empleado Trabajo del Empleado Salario del Empleado Salario del Empleado Incremento de Salario. CASE / DECODE CASE / DECODE Donde el Incremento de Salario ser: Si Trabajo es IT_PROG, el incremento en 10% Si Trabajo es ST_CLERK, el incremento Si Trabajo es ST_CLERK, el incremento en 15% Si Trabajo es SA_REP, el incremento en 20% Otros 0% CASE / DECODE CASE / DECODE SELECT last_name AS "Apellido", job_id AS "Rol", salary AS "Salario", CASE job_id WHEN 'IT_PROG' THEN 1.10*salary WHEN 'ST_CLERK' THEN 1.15*salary WHEN 'SA_REP' THEN 1.20*salary ELSE salary END As "Incremento_Salario" FROM employees; SELECT last_name AS "Apellido", job_id AS "Rol", salary AS "Salario", DECODE(job_id, 'IT_PROG', 1.10*salary, 'ST_CLERK', 1.15*salary, 'SA_REP', 1.20*salary, salary) As "Incremento_Salario" FROM employees; SUBQUERY SUBQUERY Syntaxis SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); La subconsulta (consulta interna) se ejecuta antes de la consulta principal (consulta externa). El resultado de la subconsulta es utilizado por la consulta principal. FROM table); SUBQUERY SUBQUERY Incluya las subconsultas entre parntesis. Coloque subconsultas en el lado derecho de la condicin de comparacin. Use operadores de una sola fila con Use operadores de una sola fila con subconsultas que devuelven una sola fila. Use operadores de mltiples filas con subconsultas que devuelven mltiples registros. SUBQUERY SUBQUERY Para los Empleados cuyo Salario (salary) sea mayor al Salario del Empleado cuyo apellidos es Abel, seleccione: Apellidos (last_name) Apellidos (last_name) Salario (salary) SUBQUERY SUBQUERY SELECT last_name, salary FROM employees WHERE salary > (SELECT salary FROM employees FROM employees WHERE last_name = 'Abel'); SUBQUERY SUBQUERY Para los Empleados que cumplan lo siguiente: Rol sea igual al del empleado 141 Salarios mayores al salario del empleado 143 Salarios mayores al salario del empleado 143 Seleccione: Apellidos (last_name) Rol (job_id) Salario (salary) SUBQUERY SUBQUERY SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143); SUBQUERY SUBQUERY Para los Empleados que tienen como Salario el Salario Mnimo de los Empleados, seleccione: Apellidos (last_name) Apellidos (last_name) Rol (job_id) Salario (salary) SUBQUERY SUBQUERY SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) WHERE salary = (SELECT MIN(salary) FROM employees); SUBQUERY SUBQUERY Seleccione: Departamento (department_id) Salario Mnimo de los empleados de dicho departamento departamento Para aquellos departamentos cuyo salario mnimo sea mayor al salario mnimo del departamento 50. SUBQUERY SUBQUERY SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50); JOINS JOINS Syntaxis SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2; Un Join es usado para consultar datos de mas de una tabla. Las filas se combinan relacionando valores comunes. JOINS JOINS SQL ANSI SELECT table1.column, table2.column FROM table1 [[NATURAL JOIN table2] | [JOIN table2 USING (column_name)] | [JOIN table2 [JOIN table2 ON (table1.colum_name = table2.column_name)]] JOINS JOINS NATURAL JOIN JOIN de 2 tablas basado en el mismo nombre de columna. JOIN USING JOIN USING JOIN basado en el nombre de una columna. JOIN ON JOIN basado en la condicin de la clausula ON JOINS JOINS Seleccione: Cdigo de regin Descripcin de la regin Descripcin del pas. Descripcin del pas. JOINS JOINS SELECT r.region_id AS "Region_Codigo", r.region_name AS "Region_Nombre", c.country_name AS "Pais_Nombre" FROM regions r, FROM regions r, countries c WHERE r.region_id = c.region_id JOINS JOINS SELECT region_id AS "Region_Codigo", r.region_name AS "Region_Nombre", c.country_name AS "Pais_Nombre" FROM regions r NATURAL JOIN countries c; SELECT region_id AS "Region_Codigo", r.region_name AS "Region_Nombre", r.region_name AS "Region_Nombre", c.country_name AS "Pais_Nombre" FROM regions r JOIN countries c USING(region_id); SELECT r.region_id AS "Region_Codigo", r.region_name AS "Region_Nombre", c.country_name AS "Pais_Nombre" FROM regions r JOIN countries c ON (r.region_id = c.region_id); OUTER JOINS OUTER JOINS Syntaxis SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 (+) = table2.column2; SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2 (+); OUTER JOINS OUTER JOINS La ausencia de filas puede ser obtenida colocando el operador (+). El operador es colocado del lado que es deficiente en informacin. deficiente en informacin. El efecto el operador es crear una o mas filas nulas, la cual es asociada con una o mas filas de la tabla no deficiente. JOINS JOINS SQL ANSI SELECT table1.column, table2.column FROM table1 [[LEFT|RIGHT|FULL] OUTER JOIN table2 ON (table1.colum_name = table2.column_name)] ON (table1.colum_name = table2.column_name)] JOINS JOINS Seleccione: Descripciones del pas Descripcin de la ciudad Para los pases que comiencen con la letra Para los pases que comiencen con la letra I, tenga el pas ciudades registradas o no. JOINS JOINS SELECT c.country_name AS "Pais", l.city AS "Ciudad" FROM countries c, locations l locations l WHERE c.country_id = l.country_id(+) AND c.country_name LIKE 'I%'; JOINS JOINS SELECT c.country_name AS "Pais", l.city AS "Ciudad" FROM countries c NATURAL LEFT JOIN locations l WHERE c.country_name LIKE 'I%'; SELECT c.country_name AS "Pais", l.city AS "Ciudad" l.city AS "Ciudad" FROM countries c LEFT JOIN locations l USING(country_id) WHERE c.country_name LIKE 'I%'; SELECT c.country_name AS "Pais", l.city AS "Ciudad" FROM countries c LEFT OUTER JOIN locations l ON (c.country_id = l.country_id) WHERE c.country_name LIKE 'I%'; OPERADORES OPERADORES UNION/UNION ALL INTERSECT MINUS OPERADOR: OPERADOR: UNION UNION El operador UNION devuelve los resultados de ambos querys despus de eliminar los duplicados. OPERADOR: OPERADOR: UNION UNION SELECT employee_id, job_id FROM employees UNION UNION SELECT employee_id, job_id FROM job_history; OPERADOR: OPERADOR: UNION UNION ALL ALL El operador UNION ALL devuelve los resultados de ambos querys incluyendo la informacin duplicada. OPERADOR: OPERADOR: UNION UNION ALL ALL SELECT employee_id, job_id FROM employees UNION ALL UNION ALL SELECT employee_id, job_id FROM job_history; OPERADOR: OPERADOR: INTERSECT INTERSECT El operador INTERSECT devuelve las filas que son comunes a ambas consultas. OPERADOR: OPERADOR: INTERSECT INTERSECT SELECT employee_id, job_id FROM employees INTERSECT INTERSECT SELECT employee_id, job_id FROM job_history; OPERADOR: OPERADOR: MINUS MINUS El operador MINUS devuelve las filas de la primera consulta que no estn presentes en la segunda consulta. OPERADOR: OPERADOR: MINUS MINUS SELECT employee_id, job_id FROM employees FROM employees MINUS SELECT employee_id, job_id FROM job_history; EJERCICIOS EJERCICIOS Mostrar el % Impositivo aplicable a los Empleados del Departamento 80, segn: Rango de Salario Porcentaje Impositivo $0.001,999.99 00% $2,000.003,999.99 09% $4,000.005,999.99 20% $6,000.007,999.99 30% $8,000.009,999.99 40% $10,000.0011,999.99 42% $12,000.0013,999.99 44% $14,000.00 o mayor 45% EJERCICIOS EJERCICIOS SELECT last_name AS "Apellido", salary AS "Salario", DECODE (TRUNC(salary/2000, 0), 0, '0.00 %', 1, '0.09 %', 2, '0.20 %', 2, '0.20 %', 3, '0.30 %', 4, '0.40 %', 5, '0.42 %', 6, '0.44 %', '0.45 %') AS "%_Impuesto" FROM employees WHERE department_id = 80; EJERCICIOS EJERCICIOS SELECT last_name AS "Apellido", salary AS "Salario", CASE TRUNC(salary/2000, 0) WHEN 0 THEN '0.00 %' WHEN 1 THEN '0.09 %' WHEN 2 THEN '0.20 %' WHEN 3 THEN '0.30 %' WHEN 3 THEN '0.30 %' WHEN 4 THEN '0.40 %' WHEN 5 THEN '0.42 %' WHEN 6 THEN '0.44 % ELSE '0.45 % END AS "%_Impuesto" FROM employees WHERE department_id = 80; EJERCICIOS EJERCICIOS Seleccione los siguientes datos de los Empleados: Apellido del Empleado Salario del Empleado Salario del Empleado Indicador de Comisin Indicar si el Empleado recibi o no Comisin EJERCICIOS EJERCICIOS SELECT last_name AS "Apellido", salary AS "Salario", salary AS "Salario", DECODE(commission_pct, NULL, 'No', 'Si') AS "Ind_Comision" FROM employees; EJERCICIOS EJERCICIOS Seleccione: Cdigo del Departamento Descripcin del Departamento Cantidad de Empleados Cantidad de Empleados Siempre y cuando la Cantidad de Empleados de los Departamentos seleccionados sea igual a la cantidad mxima de empleados de todos los Departamentos. EJERCICIOS EJERCICIOS SELECT d.department_id AS "Codigo", d.department_name AS "Descripcion", COUNT(*) AS "Cantidad" FROM departments d, employees e WHERE d.department_id = e.department_id GROUP BY d.department_id, d.department_name HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM employees GROUP BY department_id); EJERCICIOS EJERCICIOS Seleccione: Cdigo del Departamento Salario Mnimo del Departamento Siempre y cuando el Salario Promedio de Siempre y cuando el Salario Promedio de los Departamentos seleccionados sea igual al Maximo Salario Promedio de todos los Departamentos. EJERCICIOS EJERCICIOS SELECT department_id AS "Codigo", MIN(salary) AS "Minimo" FROM employees FROM employees GROUP BY department_id HAVING AVG(salary) = (SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id); Gracias !!! Gracias !!! Gracias !!! Gracias !!! Ing. Eduardo Ing. Eduardo Yataco Yataco Silva Silva