|
|
(13 revisiones intermedias por el mismo usuario no mostrado) |
Línea 277: |
Línea 277: |
| </source> | | </source> |
| }} | | }} |
− |
| |
− |
| |
− |
| |
− | ===SELECT===
| |
− | *Esta es una claúsula especial a la que le vamos a dedicar bastante tiempo.
| |
− | *Consiste en hacer consultas de nuestro conjunto de datos y poder recuperarlos.
| |
− | *La cantidad de consultas que se pueden realizar es muy grande y variado, siempre que se pueda establecer la consulta y la lógica matemática de su resolución, va a haber una sentencia SQL que permita implementarla.
| |
− | Esta sentencia que empieza por la claúsual SELECT va a terner hasta 5 posibles claúsulas, de las cuales solo son obligatorias las dos primeras
| |
− | <source lang=SQL>
| |
− | SELECT
| |
− | FROM
| |
− | </source>
| |
− | Las 5 posibles que estudaremos son
| |
− | <source lang=SQL>
| |
− | SELECT
| |
− | FROM
| |
− | WHERE
| |
− | GROUP BY
| |
− | HAVING
| |
− | (ORDER BY)
| |
− | </source>
| |
− | {{MRM_Clave|Title=Importante (lo estudiaremos)|
| |
− | *'''''Having''''' solo se usa como opción en el '''group by'''.
| |
− | *'''''Order by''''' es un criterio de ordenación y no se considera como cláusula propiamente dicho
| |
− | }}
| |
− | *Usando el álgebra relacional y permite recuperar un subconjunto de los datos de la base de datos.
| |
− | *Esta sentencia devuelve un conjunto de tuplas como resultado de ejecutar la consulta.
| |
− | *Las operaciones del algebra relacional son
| |
− |
| |
− | ;Proyecciones
| |
− | ;Selecciones
| |
− | ;Producto cartesiano
| |
− | ;Join
| |
− |
| |
− | ====Claúsula Select====
| |
− | [[Archivo:dml_select_t1.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t2.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t3.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t4.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t5.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t6.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t7.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t8.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t9.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:dml_select_t10.png]]<br />
| |
− | <hr />
| |
− | ;Uso de funciones
| |
− | *Podemos usar funciones sobre todas las filas y obtener el resultado.
| |
− | *Algunas funciones típicas son
| |
− | ;Funciones de carácter
| |
− | [[Archivo:dml_func_01.png]]<br />
| |
− | <hr />
| |
− | ;Descripción de las funciones
| |
− | [[Archivo:dml_func_02.png]]<br />
| |
− | [[Archivo:dml_func_03.png]]<br />
| |
− | ;Ejemplos
| |
− | [[Archivo:dml_func_04.png]]<br />
| |
− | [[Archivo:dml_func_05.png]]<br />
| |
− | <hr />
| |
− | ;Funciones con valores numércios
| |
− | [[Archivo:dml_func_06.png]]<br />
| |
− | [[Archivo:dml_func_07.png]]<br />
| |
− | <hr />
| |
− | ;Funciones con fechas
| |
− | [[Archivo:dml_func_08.png]]<br />
| |
− | [[Archivo:dml_func_09.png]]<br />
| |
− | [[Archivo:dml_func_10.png]]<br />
| |
− | ====Funciones de agregación o grupo====
| |
− | *Son funciones que se aplican a un conjunto de valores de diferentes filas
| |
− | *Nos darán como resultado un sólo valor
| |
− | *Conviene renombrar la columna
| |
− | [[Archivo:dml_func_11.png]]<br />
| |
− | [[Archivo:dml_func_12.png]]<br />
| |
− | [[Archivo:dml_func_13.png]]<br />
| |
− | {{MRM_Actividad|Title=Realiza las siguientes consultas|
| |
− | *El usuario que más cobra
| |
− | *El trabajo más remunerado
| |
− | *La remuneración media, en número de trabajos y el que más y menos se paga
| |
− | *El empleado con la fecha de contratación mayor y menor
| |
− | *El total de comisiones pagadas a los empleados
| |
− | }}
| |
− |
| |
− | ===From===
| |
− | *Esta es una operación de un producto cartesiano
| |
− | *El producto cartesiano consiste en juntar todas las tuplas de una relación con cada una de las tuplas de otra
| |
− | *Genera gran cantidad de información, por ese motivo los gestores de bases de datos intentan hacerlo lo último
| |
− | {{MRM_Actividad|Title=probar from|
| |
− | *Realiza un producto cartesiano entre empleados y departamentos
| |
− | }}
| |
− | *En el from además de una relación o tabla, puede ir cualquier cosa que me devuelva una relación, incluso una consulta
| |
− | {{MRM_Actividad|Title=probar from|
| |
− | Realiza un producto cartesiano entre empleados y departamentos, solo nombres, y fuérzalo en el from.
| |
− | }}
| |
− | ===Where===
| |
− | *La claúsura '''''where''''' establece la operación de selección.
| |
− | *Es decir de todas las filas, indica cuales son las que queremos seleccionar.
| |
− | [[Archivo:where1.png]]<br />
| |
− | *En esta claúsura, utiliza operadores de comparación para establecer el criterio de las filas seleccionadas
| |
− | [[Archivo:dml_func_14.png]]<br />
| |
− | [[Archivo:dml_func_15.png]]<br />
| |
− | [[Archivo:dml_func_16.png]]<br />
| |
− | [[Archivo:dml_func_17.png]]<br />
| |
− | [[Archivo:dml_func_18.png]]<br />
| |
− | [[Archivo:dml_func_19.png]]<br />
| |
− | [[Archivo:dml_func_20.png]]<br />
| |
− | [[Archivo:dml_func_31.png]]<br />
| |
− | [[Archivo:dml_func_22.png]]<br />
| |
− | <hr />
| |
− |
| |
− | ====Ejercicios ====
| |
− | <br />
| |
− | {{MRM_Actividad|Title=Realiza las siguientes consultas|
| |
− |
| |
− | [[Archivo:ej1_query.png]]
| |
− | *En este caso JOB_ID nos da el tipo de trabajo
| |
− | Secretari@ es el tipo '''''ST_CLERK'''''
| |
− | <source lang=sql>
| |
− | mysql> SELECT *
| |
− | FROM EMPLOYEES
| |
− | WHERE JOB_ID ="ST_CLERK"
| |
− | AND
| |
− | HIRE_DATE>"1997-12-31";
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej2_query.png]]
| |
− |
| |
− | <source lang=sql>
| |
− | SELECT LAST_NAME, JOB_ID,SALARY, COMMISSION_PCT
| |
− | FROM EMPLOYEES
| |
− | WHERE COMMISSION_PCT IS NOT NULL
| |
− | ORDER BY LAST_NAME DESC;
| |
− | </source>
| |
− |
| |
− | <hr />
| |
− | [[Archivo:ej3_query.png]]
| |
− | <source lang=sql>
| |
− | SELECT 'El salario de '||Last_name||
| |
− | 'va a ser con un incremento del 10% de '||
| |
− | round(Salary *1.10) ||
| |
− | ' dólares' as "Nuevo Salario"
| |
− | FROM EMPLOYEES
| |
− | where COMMISSION_pCT IS NULL
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej4_query.png]]
| |
− | <source lang=sql>
| |
− | select last_name,
| |
− | trunc(months_between(sysdate, hire_date)/12) as "años",
| |
− | trunc(mod(months_between(sysdate, hire_date),12))as "meses"
| |
− | from employees
| |
− | order by hire_date;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej5.png]]
| |
− | <source lang=sql>
| |
− |
| |
− | select last_name, salary, decode (commission_pct,
| |
− | NULL, 'No' ,
| |
− | 'Yes') as "comisión"
| |
− | from employees
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej6.png]]
| |
− | <source lang=sql>
| |
− | select department_name, location_id,job_id, salary
| |
− | from departments d, employees e
| |
− | where d.department_id = e.department_id
| |
− | and
| |
− | location_id = '&localizacion';
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej7.png]]
| |
− | <source lang=sql>
| |
− | select count(*)
| |
− | from employees
| |
− | where last_name like '%n'
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej8.png]]
| |
− | <source lang=sql>
| |
− | SELECT COUNT(*)
| |
− | FROM employees
| |
− | WHERE last_name LIKE '%n';
| |
− | --or
| |
− | SELECT COUNT(*)
| |
− | FROM employees
| |
− | WHERE SUBSTR(last_name, -1) = 'n';
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej9.png]]
| |
− | <source lang=sql>
| |
− | SELECT d.department_id, d.department_name, d.location_id, COUNT(e.employee_id)
| |
− | FROM employees e
| |
− | RIGHT OUTER JOIN departments d
| |
− | ON
| |
− | e.department_id = d.department_id
| |
− | GROUP BY d.department_id, d.department_name, d.location_id;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej10.png]]
| |
− | <source lang=sql>
| |
− | SELECT DISTINCT job_id
| |
− | FROM employees
| |
− | WHERE department_id IN (10, 20);
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej11.png]]
| |
− | <source lang=sql>
| |
− | SELECT e.job_id, count(e.job_id) FREQUENCY
| |
− | FROM employees e
| |
− | JOIN departments d
| |
− | ON e.department_id = d.department_id
| |
− | WHERE d.department_name IN ('Administration', 'Executive')
| |
− | GROUP BY e.job_id
| |
− | ORDER BY FREQUENCY DESC;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej12.png]]
| |
− | <source lang=sql>
| |
− | SELECT last_name, hire_date
| |
− | FROM employees
| |
− | WHERE TO_CHAR(hire_date, 'DD') < 16;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej13.png]]
| |
− | <source lang=sql>
| |
− | SELECT last_name, salary, TRUNC(salary, -3)/1000
| |
− | FROM employees;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej14.png]]
| |
− | <source lang=sql>
| |
− | SELECT e.last_name, m.last_name manager, m.salary,
| |
− | j.grade_level
| |
− | FROM employees e JOIN employees m
| |
− | ON e.manager_id = m.employee_id
| |
− | JOIN job_grades j
| |
− | ON m.salary BETWEEN j.lowest_sal AND j.highest_sal
| |
− | AND m.salary > 15000;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej15.png]]
| |
− | <source lang=sql>
| |
− | SELECT d.department_id, d.department_name, count(e1.employee_id) employees,
| |
− | NVL(TO_CHAR(AVG(e1.salary), '99999.99'), 'No average') avg_sal,
| |
− | e2.last_name, e2.salary, e2.job_id
| |
− | FROM departments d RIGHT OUTER JOIN employees e1
| |
− | ON d.department_id = e1.department_id
| |
− | RIGHT OUTER JOIN employees e2
| |
− | ON d.department_id = e2.department_id
| |
− | GROUP BY d.department_id, d.department_name, e2.last_name,
| |
− | e2.salary,
| |
− | e2.job_id
| |
− | ORDER BY d.department_id, employees;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej16.png]]
| |
− | <source lang=sql>
| |
− | SELECT department_id, MIN(salary)
| |
− | FROM employees
| |
− | GROUP BY department_id
| |
− | HAVING AVG(salary) = (SELECT MAX(AVG(salary))
| |
− | FROM employees
| |
− | GROUP BY department_id);
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej17.png]]
| |
− | <source lang=sql>
| |
− | SELECT *
| |
− | FROM
| |
− | departments
| |
− | WHERE department_id NOT IN(SELECT department_id
| |
− | FROM employees
| |
− | WHERE job_id = 'SA_REP'
| |
− | AND department_id IS NOT NULL);
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej18.png]]
| |
− | ;a) Contrate menos de tres empleados:
| |
− | <source lang=sql>
| |
− | SELECT d.department_id, d.department_name, COUNT(*)
| |
− | FROM
| |
− | departments d JOIN employees e
| |
− | ON
| |
− | d.department_id = e.department_id
| |
− | GROUP BY d.department_id, d.department_name
| |
− | HAVING COUNT(*) < 3;
| |
− | </source>
| |
− | ;b) Tenga el mayor número de empleados:
| |
− | <source lang=sql>
| |
− | SELECT d.department_id, d.department_name, COUNT(*)
| |
− | FROM
| |
− | departments d JOIN employees e
| |
− | ON
| |
− | 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);
| |
− | </source>
| |
− |
| |
− | ;c) Tenga el menor número de empleados:
| |
− | <source lang=sql>
| |
− | SELECT d.department_id, d.department_name, COUNT(*)
| |
− | FROM
| |
− | departments d JOIN employees e
| |
− | ON
| |
− | d.department_id = e.department_id
| |
− | GROUP BY d.department_id, d.department_name
| |
− | HAVING COUNT(*) = (SELECT MIN(COUNT(*))
| |
− | FROM
| |
− | employees
| |
− | GROUP BY department_id);
| |
− | </source>
| |
− |
| |
− | <hr />
| |
− | [[Archivo:ej19.png]]
| |
− | <source lang=sql>
| |
− | SELECT e.employee_id, e.last_name, e.department_id, e.salary,
| |
− | AVG(s.salary)
| |
− | FROM
| |
− | employees e JOIN employees s
| |
− | ON
| |
− | e.department_id = s.department_id
| |
− | GROUP BY e.employee_id, e.last_name, e.department_id,
| |
− | e.salary;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej20.png]]
| |
− | <source lang=sql>
| |
− | SELECT last_name, TO_CHAR(hire_date, 'DAY') day
| |
− | FROM employees
| |
− | WHERE TO_CHAR(hire_date, 'Day') = (SELECT TO_CHAR(hire_date, 'Day')
| |
− | FROM employees
| |
− | GROUP BY TO_CHAR(hire_date, 'Day')
| |
− | HAVING COUNT(*) = (SELECT MAX(COUNT(*))
| |
− | FROM employees
| |
− | GROUP BY TO_CHAR(hire_date,'Day')));
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej21.png]]
| |
− | <source lang=sql>
| |
− | SELECT last_name, TO_CHAR(hire_date, 'Month DD') BIRTHDAY
| |
− | FROM employees
| |
− | ORDER BY TO_CHAR(hire_date, 'DDD');
| |
− | </source>
| |
− | <hr />
| |
− |
| |
− |
| |
− | }}
| |
− |
| |
− | ====Funciones de conversión de tipos====
| |
− | [[Archivo:func_conv1.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv1.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv2.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv3.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv4.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv5.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv6.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv7.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv8.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv9.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:func_conv10.png]]<br />
| |
− | <hr />
| |
− | ====Funciones de agrupación o grupo====
| |
− | *Son funciones que nos va a mostrar un valor por cada conjunto de filas a las que se aplica la función
| |
− | [[Archivo:sql_group1.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group2.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group3.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group4.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group5.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group6.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group7.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group8.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group9.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group10.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group11.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group12.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group13.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group14.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group15.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group16.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group17.png]]<br />
| |
− | <hr />
| |
− | [[Archivo:sql_group18.png]]<br />
| |
− | <hr />
| |
− | ====Actividades de funciones y agregados====
| |
− | [[Archivo:ej_func_01.png]]
| |
− | <source lang=sql>
| |
− | SELECT sysdate "Date"
| |
− | FROM dual;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_01.png]]
| |
− | <source lang=sql>
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_02.png]]
| |
− | <source lang=sql>
| |
− | SELECT employee_id, last_name, salary, ROUND(salary * 1.155, 0) "New Salary"
| |
− | FROM employees;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_03.png]]
| |
− | <source lang=sql>
| |
− |
| |
− |
| |
− | SELECT INITCAP(last_name) "Name", LENGTH(last_name) "Length"
| |
− | FROM employees
| |
− | WHERE last_name LIKE 'J%' OR last_name LIKE 'M%' OR last_name LIKE 'A%'
| |
− | ORDER BY last_name ;
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_04.png]]
| |
− | <source lang=sql>
| |
− | SELECT INITCAP(last_name) "Name", LENGTH(last_name) "Length"
| |
− | FROM employees
| |
− | WHERE last_name LIKE '&start_letter%'
| |
− | ORDER BY last_name;
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_05.png]]
| |
− | <source lang=sql>
| |
− | SELECT INITCAP(last_name) "Name", LENGTH(last_name) "Length"
| |
− | FROM employees
| |
− | WHERE last_name LIKE UPPER('&start_letter%' )
| |
− | ORDER BY last_name;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_06.png]]
| |
− | <source lang=sql>
| |
− | SELECT last_name, ROUND(MONTHS_BETWEEN(
| |
− | SYSDATE, hire_date)) MONTHS_WORKED
| |
− | FROM
| |
− | employees
| |
− | ORDER BY months_worked;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_07.png]]
| |
− | <source lang=sql>
| |
− | SELECT last_name, LPAD(salary, 15, '$') SALARY
| |
− | FROM employees;
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_08.png]]
| |
− | <source lang=sql>
| |
− | SELECT rpad(last_name, 8)||' '|| rpad(' ', salary/1000+1, '*') EMPLOYEES_AND_THEIR_SALARIES
| |
− | FROM employees
| |
− | ORDER BY salary DESC;
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_09.png]]
| |
− | <source lang=sql>
| |
− | SELECT last_name, trunc((SYSDATE-hire_date)/7) AS TENURE
| |
− | FROM employees
| |
− | WHERE department_id = 90
| |
− | ORDER BY TENURE DESC
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_10.png]]
| |
− | <source lang=sql>
| |
− |
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_11.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_12.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_13.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_14.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_15.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_16.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_17.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_18.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_19.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_20.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | <hr />
| |
− | [[Archivo:ej_func_21.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− | [[Archivo:ej_func_22.png]]
| |
− | <source lang=sql>
| |
− | </source>
| |
− |
| |
− | <hr />
| |