Diferencia entre revisiones de «Plantilla:PHP/SQL subconsultas»

De WikiEducator
Saltar a: navegación, buscar
(Qué es una subconsulta)
(Qué es una subconsulta)
 
(8 revisiones intermedias por el mismo usuario no mostrado)
Línea 6: Línea 6:
 
*Miramos el siguiente ejemplo
 
*Miramos el siguiente ejemplo
 
<br />
 
<br />
[[Archivo:img_subquery1.png|size=500px|center]]
+
[[Archivo:img_subquery1.png|600px]]
 
<hr />
 
<hr />
 
;Estructura de una subconsulta
 
;Estructura de una subconsulta
 
*La subconsulta o consulta interna se ejecuta antes que la consulta principal
 
*La subconsulta o consulta interna se ejecuta antes que la consulta principal
 
<br />
 
<br />
[[Archivo:img_subquery2.png]]
+
[[Archivo:img_subquery2.png|600px]]
 
<hr />
 
<hr />
 
*En el ejemplo anterior la consulta quedaría
 
*En el ejemplo anterior la consulta quedaría
 
<br />
 
<br />
[[Archivo:img_subquery3.png]]
+
[[Archivo:img_subquery3.png|600px]]
 
<hr />
 
<hr />
 
{{MRM_Actividad|Title=Ejemplo|
 
{{MRM_Actividad|Title=Ejemplo|
Línea 29: Línea 29:
 
Select job_id, job_name form JOBS where min_salary > 9000;
 
Select job_id, job_name form JOBS where min_salary > 9000;
 
</source>
 
</source>
<!--
+
 
 
<source lang=sql>
 
<source lang=sql>
 
Select job_id, job_title from JOBS where min_salary > select salary from EMPLOYEES where employee_id = 103;
 
Select job_id, job_title from JOBS where min_salary > select salary from EMPLOYEES where employee_id = 103;
 
</source>
 
</source>
-->
+
 
 
}}
 
}}
 
;Reglas a la hora de usar una subconsulta
 
;Reglas a la hora de usar una subconsulta
[[Archivo:img_subquery4.png]]
+
[[Archivo:img_subquery4.png|600px]]
 
;Tenemos dos tipos de subconsultas
 
;Tenemos dos tipos de subconsultas
 
#Subconsultas que devuelven una sola fila
 
#Subconsultas que devuelven una sola fila
 
#Subconsultas que devuelven varias filas
 
#Subconsultas que devuelven varias filas
[[Archivo:img_subquery5.png]]
+
[[Archivo:img_subquery5.png|600px]]
 
*Los operadores de comparación serán diferentes según estemos en un caso u otro
 
*Los operadores de comparación serán diferentes según estemos en un caso u otro
 
*Es totalmente lógico, no es lo mismo comparar salario con un valor, que con un conjunto de valores
 
*Es totalmente lógico, no es lo mismo comparar salario con un valor, que con un conjunto de valores
 
;Subconsutlas que devuelven una fila
 
;Subconsutlas que devuelven una fila
 
*Este tipo de subconsulta utiliza operadores de una sola fila
 
*Este tipo de subconsulta utiliza operadores de una sola fila
[[Archivo:img_subquery6.png]]
+
[[Archivo:img_subquery6.png|600px]]
 
{{MRM_Actividad|Title=Ejemplo|
 
{{MRM_Actividad|Title=Ejemplo|
;Mostrar los empleados, cuyo id de cargo sea el mismo que el del empleado 141
+
;Mostrar los empleados, cuyo manager_id (Es decir su encargado o jefe) sea el mismo que el mismo que tiene el  empleado 141
<!--
+
 
 
<source lang=php>
 
<source lang=php>
 
select last_name, job_id                               
 
select last_name, job_id                               
Línea 58: Línea 58:
  
 
</source>
 
</source>
-->
+
 
 
}}
 
}}
 
{{MRM_Actividad|Title=Ejemplo|
 
{{MRM_Actividad|Title=Ejemplo|
;Mostrar empleados (nombre, trabajo y salario)  que trabajen en el mismo trabajo que trabaja Taylor y cobren más que el sueldo de Taylor
+
;Mostrar empleados (nombre, trabajo y salario)  que trabajen en el mismo trabajo (campo job_id)  que trabaja Taylor y cobren más que el sueldo de Taylor
<!--
+
 
 
<source lang=php>
 
<source lang=php>
 
select last_name, job_id, salary
 
select last_name, job_id, salary
Línea 76: Línea 76:
 
                     WHERE last_name = 'Taylor');
 
                     WHERE last_name = 'Taylor');
 
</source>
 
</source>
-->
+
 
 
}}
 
}}
 
;También la subconsulta puede retornar un valor resultado de una función de agrupación
 
;También la subconsulta puede retornar un valor resultado de una función de agrupación
Línea 88: Línea 88:
 
                     from EMPLOYEES);
 
                     from EMPLOYEES);
  
 +
</source>
 +
-->
 +
}}
 +
;subconsulta puede retornar un valor resultado de una agrupación (GROUP BY)
 +
{{MRM_Actividad|Title=Ejemplo|
 +
;Mostrar departamentos (id) y el salario mínimo  de los empleados
 +
de cada departamento pero solo de aquellos departamentos cuyo salario mínimo cobrado por sus empleados sea mayor que el salario mínimo de los empleados del departamento 50
 +
<!--
 +
<source lang=sql>
 +
select department_id, min(salary)
 +
from EMPLOYEES
 +
group by(department_id)
 +
HAVING min(salary) > (select min(Salary)
 +
                      from EMPLOYEES
 +
                      WHERE DEPARTMENT_ID=50);
 +
 +
</source>
 +
-->
 +
}}
 +
;Subconsutlas que devuelven varias  fila
 +
*Este tipo de subconsulta utiliza operadores de varias filas (in, any, all)
 +
[[Archivo:img_subquery7.png|600px]]
 +
{{MRM_Actividad|Title=Ejemplo|
 +
;Obtener los empleados (nombre, departamento y salario) que ganan el mismo salario que el salario mínimo de de cualquier departamento
 +
<!--
 +
<source lang=sql>
 +
select last_name, department_id, salary
 +
from EMPLOYEES
 +
where salary in (select min(salary)
 +
                  from EMPLOYEES
 +
                  group by department_id);
 +
 +
</source>
 +
-->
 +
}}
 +
;Operador ANY
 +
*Este operador tiene el significado de para cada uno, es decir compara con cada uno de los valores
 +
*va acompañado de =, >, >
 +
*Es como hacer un OR lógico
 +
[[Archivo:img_subquery8.png|600px]]
 +
{{MRM_Actividad |Title=Ejemplo|
 +
;Obtener los empleados (nombre, departamento y salario) cuyo salario sea menor que cualquier salario que se cobre los empleados que trabajan en el trabajo 'IT_PROG' y que tengan otro trabajo asignado
 +
<!--
 +
<source lang=sql>
 +
select employee_id, last_name, job_id, salary
 +
from EMPLOYEES
 +
where salary < any (select salary
 +
                    from EMPLOYEES
 +
                    where job_id='IT_PROG')
 +
      and JOB_ID<>'IT_PROG';
 +
</source>
 +
-->
 +
}}
 +
;Operador ALL
 +
*Este operador compara el valor con todos y cada uno de los valores.
 +
*Sería como hacer un AND lógico
 +
;>ALL  es como > que el máximo
 +
;<ALL es como < que el mínimo
 +
{{MRM_Actividad |Title=Ejemplo|
 +
;Obtener los empleados (nombre, departamento y salario) cuyo salario sea menor que todos los salarios que se cobre los empleados que trabajan en el trabajo 'IT_PROG' y que tengan otro trabajo asignado
 +
<!--
 +
<source lang=sql>
 +
select employee_id, last_name, job_id, salary
 +
from EMPLOYEES
 +
where salary < all (select salary
 +
                    from EMPLOYEES
 +
                    where job_id='IT_PROG')
 +
      and JOB_ID<>'IT_PROG';
 
</source>
 
</source>
 
-->
 
-->
 
}}
 
}}

Última revisión de 02:05 16 may 2018

Qué es una subconsulta



Icon define.gif
Qué es una subconsulta
Es una consulta que realizamos dentro de otra con el objetivo de obtener uno o varios valores que necesitamos en la consulta principal para comparar valores


  • Miramos el siguiente ejemplo


Img subquery1.png


Estructura de una subconsulta
  • La subconsulta o consulta interna se ejecuta antes que la consulta principal


Img subquery2.png


  • En el ejemplo anterior la consulta quedaría


Img subquery3.png



Icon activity.jpg
Ejemplo

Obtener todos los trabajos (tabla JOBS) cuyo salario min sea mayor que el salario del trabajador cuyo id es 103

  • Si lo hiciéramos sin subconsultas primero obtendríamos el sueldo del empleado 103
SELECT SALARY FROM EMPLOYEES WHERE EMPLOYEE_ID = 103;
  • Y luego usaríamos ese valor para obetener los trabajos que nos interesan
SELECT job_id, job_name form JOBS WHERE min_salary > 9000;
SELECT job_id, job_title FROM JOBS WHERE min_salary > SELECT salary FROM EMPLOYEES WHERE employee_id = 103;



Reglas a la hora de usar una subconsulta

Img subquery4.png

Tenemos dos tipos de subconsultas
  1. Subconsultas que devuelven una sola fila
  2. Subconsultas que devuelven varias filas

Img subquery5.png

  • Los operadores de comparación serán diferentes según estemos en un caso u otro
  • Es totalmente lógico, no es lo mismo comparar salario con un valor, que con un conjunto de valores
Subconsutlas que devuelven una fila
  • Este tipo de subconsulta utiliza operadores de una sola fila

Img subquery6.png


Icon activity.jpg
Ejemplo
Mostrar los empleados, cuyo manager_id (Es decir su encargado o jefe) sea el mismo que el mismo que tiene el empleado 141
select last_name, job_id                               
     from EMPLOYEES
     where job_id =
                   (SELECT JOB_ID
                    FROM EMPLOYEES
                    WHERE EMPLOYEE_ID = 141);





Icon activity.jpg
Ejemplo
Mostrar empleados (nombre, trabajo y salario) que trabajen en el mismo trabajo (campo job_id) que trabaja Taylor y cobren más que el sueldo de Taylor
select last_name, job_id, salary
     from EMPLOYEES
     where job_id =
                   (SELECT JOB_ID
                    FROM EMPLOYEES
                    WHERE last_name = 'Taylor')
         and
salary > 
                   (SELECT salary
                    FROM EMPLOYEES
                    WHERE last_name = 'Taylor');



También la subconsulta puede retornar un valor resultado de una función de agrupación


Icon activity.jpg
Ejemplo
Mostrar empleados (nombre, trabajo y salario) que cobren más que la media que se cobra en la empresa



subconsulta puede retornar un valor resultado de una agrupación (GROUP BY)


Icon activity.jpg
Ejemplo
Mostrar departamentos (id) y el salario mínimo de los empleados

de cada departamento pero solo de aquellos departamentos cuyo salario mínimo cobrado por sus empleados sea mayor que el salario mínimo de los empleados del departamento 50



Subconsutlas que devuelven varias fila
  • Este tipo de subconsulta utiliza operadores de varias filas (in, any, all)

Img subquery7.png


Icon activity.jpg
Ejemplo
Obtener los empleados (nombre, departamento y salario) que ganan el mismo salario que el salario mínimo de de cualquier departamento



Operador ANY
  • Este operador tiene el significado de para cada uno, es decir compara con cada uno de los valores
  • va acompañado de =, >, >
  • Es como hacer un OR lógico

Img subquery8.png


Icon activity.jpg
Ejemplo
Obtener los empleados (nombre, departamento y salario) cuyo salario sea menor que cualquier salario que se cobre los empleados que trabajan en el trabajo 'IT_PROG' y que tengan otro trabajo asignado



Operador ALL
  • Este operador compara el valor con todos y cada uno de los valores.
  • Sería como hacer un AND lógico
>ALL es como > que el máximo
<ALL es como < que el mínimo


Icon activity.jpg
Ejemplo
Obtener los empleados (nombre, departamento y salario) cuyo salario sea menor que todos los salarios que se cobre los empleados que trabajan en el trabajo 'IT_PROG' y que tengan otro trabajo asignado