Diferencia entre revisiones de «Plantilla:PHP/SQL subconsultas»
De WikiEducator
(→Qué es una subconsulta) |
(→Qué es una subconsulta) |
||
| (3 revisiones intermedias por el mismo usuario no mostrado) | |||
| 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 | ||
| Línea 47: | Línea 47: | ||
[[Archivo:img_subquery6.png|600px]] | [[Archivo:img_subquery6.png|600px]] | ||
{{MRM_Actividad|Title=Ejemplo| | {{MRM_Actividad|Title=Ejemplo| | ||
| − | ;Mostrar los empleados, cuyo | + | ;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 14:05 15 may 2018
Qué es una subconsulta
|
- Miramos el siguiente ejemplo
- Estructura de una subconsulta
- La subconsulta o consulta interna se ejecuta antes que la consulta principal
- En el ejemplo anterior la consulta quedaría
|
Obtener todos los trabajos (tabla JOBS) cuyo salario min sea mayor que el salario del trabajador cuyo id es 103
SELECT SALARY FROM EMPLOYEES WHERE EMPLOYEE_ID = 103;
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
- Tenemos dos tipos de subconsultas
- Subconsultas que devuelven una sola fila
- Subconsultas que devuelven varias filas
- 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
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
- subconsulta puede retornar un valor resultado de una agrupación (GROUP BY)
- Subconsutlas que devuelven varias fila
- Este tipo de subconsulta utiliza operadores de varias filas (in, any, all)
- 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
- 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
