Plantilla:PHP/SQL select

De WikiEducator
Revisión a fecha de 22:04 14 may 2018; ManuelRomero (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

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

 SELECT
 FROM

Las 5 posibles que estudaremos son

  SELECT 
  FROM
  WHERE
  GROUP BY
   HAVING
 (ORDER BY)


Icon key points.gif

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

Dml select t1.png


Dml select t2.png


Dml select t3.png


Dml select t4.png


Dml select t5.png


Dml select t6.png


Dml select t7.png


Dml select t8.png


Dml select t9.png


Dml select t10.png


Uso de funciones
  • Podemos usar funciones sobre todas las filas y obtener el resultado.
  • Algunas funciones típicas son
Funciones de carácter

Dml func 01.png


Descripción de las funciones

Dml func 02.png
Dml func 03.png

Ejemplos

Dml func 04.png
Dml func 05.png


Funciones con valores numércios

Dml func 06.png
Dml func 07.png


Funciones con fechas

Dml func 08.png
Dml func 09.png
Dml func 10.png

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

Dml func 11.png
Dml func 12.png
Dml func 13.png


Icon activity.jpg
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


Icon activity.jpg
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


Icon activity.jpg
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.

Where1.png

  • En esta claúsura, utiliza operadores de comparación para establecer el criterio de las filas seleccionadas

Dml func 14.png
Dml func 15.png
Dml func 16.png
Dml func 17.png
Dml func 18.png
Dml func 19.png
Dml func 20.png
Archivo:Dml func 31.png
Dml func 22.png


Ejercicios select/from/where con funciones



Icon activity.jpg
Realiza las siguientes consultas

Ej1 query.png

  • En este caso JOB_ID nos da el tipo de trabajo
Secretari@ es el tipo ST_CLERK
mysql> SELECT *  
       FROM EMPLOYEES 
       WHERE JOB_ID ="ST_CLERK"       
             AND       
             HIRE_DATE>"1997-12-31";

Ej2 query.png

SELECT LAST_NAME, JOB_ID,SALARY, COMMISSION_PCT 
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL 
ORDER BY LAST_NAME DESC;

Ej3 query.png

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

Ej4 query.png

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;

Ej5.png

SELECT *
FROM empleados
WHERE substr(last_name,1,1) IN ('J', 'K', 'L', 'M')

Ej6.png

SELECT last_name, salary, 
         decode (commission_pct,NULL, 'No' ,
                               'Yes') AS "comisión"
FROM employees

Ej7.png

SELECT department_name, location_id,job_id, salary
FROM departments d, employees e
WHERE d.department_id = e.department_id
       AND
       location_id = '&localizacion';

Ej8.png

SELECT COUNT(*)
FROM employees
WHERE last_name LIKE '%n';
--or
SELECT COUNT(*)
FROM employees
WHERE SUBSTR(last_name, -1) = 'n';

Ej10.png

SELECT DISTINCT job_id
FROM employees
WHERE department_id IN (10, 20);

Ej12.png

SELECT last_name, hire_date
FROM  employees
WHERE TO_CHAR(hire_date, 'DD') < 16;

Ej13.png

SELECT last_name, salary, TRUNC(salary, -3)/1000
FROM  employees;

Ej14.png

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;

Ej21.png

SELECT last_name, TO_CHAR(hire_date, 'Month DD') BIRTHDAY
FROM employees
ORDER BY TO_CHAR(hire_date, 'DDD');




Ejercicios de agrupación



Icon activity.jpg
Ejercicios de agrupación

Ej9.png

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;

Ej11.png

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;

Ej15.png

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;

Ej18.png

a) Contrate menos de tres empleados
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;
b) Tenga el mayor número de empleados
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);
c) Tenga el menor número de empleados
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);

Ej19.png

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;




Ejercicios con subconsultas



Icon activity.jpg

Ejercicios de subconsultas Ej16.png

SELECT department_id, MIN(salary)
FROM  employees
GROUP BY department_id
HAVING AVG(salary) = (SELECT MAX(AVG(salary))
                      FROM  employees
                      GROUP BY department_id);

Ej17.png

SELECT *
FROM
departments
WHERE   department_id NOT IN(SELECT department_id
                             FROM employees
                             WHERE job_id = 'SA_REP' 
                               AND department_id IS NOT NULL);

Ej20.png

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')));

{{{1}}}