6-2 Copyright Oracle Corporation, 1997. All rights reserved.
ObjetivosObjetivos
Al completar esta lección, debería ser capaz de hacer lo siguiente:
• Describir los tipos de problemas que las subconsultas pueden resolver.
• Definir subconsultas.
• Enumerar los tipos de subconsultas.
• Escribir subconsultas que afecten a un solo registro, o a más de uno.
Al completar esta lecciAl completar esta leccióón, debern, deberíía ser a ser capaz de hacer lo siguiente:capaz de hacer lo siguiente:
• Describir los tipos de problemas que las subconsultas pueden resolver.
• Definir subconsultas.
• Enumerar los tipos de subconsultas.
• Escribir subconsultas que afecten a un solo registro, o a más de uno.
6-3 Copyright Oracle Corporation, 1997. All rights reserved.
Uso de una Subconsulta para Resolver un Problema
Uso de una Subconsulta para Resolver un Problema
“¿Quién tiene un salario superior al de Jones?”“¿“¿QuiQuiéén tiene un salario superior al de Jones?n tiene un salario superior al de Jones?””
“¿Qué empleados tienen un salario superior al salrio de Jones?”
Consulta Principal
??
“¿Cuál es el salario de Jones?”??
Subconsulta
6-4 Copyright Oracle Corporation, 1997. All rights reserved.
SubconsultasSubconsultas
•• La subconsulta se ejecuta una vez y La subconsulta se ejecuta una vez y antes de la consulta principal.antes de la consulta principal.
•• El resultado de la subconsulta es usado El resultado de la subconsulta es usado por la consulta principal externa.por la consulta principal externa.
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
6-5 Copyright Oracle Corporation, 1997. All rights reserved.
2975
SQL> SELECT ename
2 FROM emp
3 WHERE sal >
4 (SELECT sal
5 FROM emp
6 WHERE empno=7566);
Usando una SubconsultaUsando una Subconsulta
ENAME
----------
KING
FORD
SCOTT
ENAME
----------
KING
FORD
SCOTT
6-6 Copyright Oracle Corporation, 1997. All rights reserved.
Guía para el Uso de SubconsultasGuía para el Uso de Subconsultas
• Encierre las subconsultas entre paréntesis.
• Una subconsulta debe aparecer a la derecha del operador.
• No añada una cláusula ORDER BY a una subconsulta.
• Utilice operadores a nivel de fila para subconsultas que devuelvan solo una fila.
• Utilice operadores que actúan sobre varios registros para subconsultas que devuelvan más de una fila.
• Encierre las subconsultas entre paréntesis.
• Una subconsulta debe aparecer a la derecha del operador.
• No añada una cláusula ORDER BY a una subconsulta.
• Utilice operadores a nivel de fila para subconsultas que devuelvan solo una fila.
• Utilice operadores que actúan sobre varios registros para subconsultas que devuelvan más de una fila.
6-7 Copyright Oracle Corporation, 1997. All rights reserved.
Tipos de SubconsultasTipos de Subconsultas• Subconsulta mono-registro• Subconsulta mono-registro
Cons. Principal
Subquerydevuelvedevuelve
CLERKCLERK
• Subconsulta multi-registro• Subconsulta multi-registro
CLERKCLERK
MANAGERMANAGER
Cons. Principal
Subquerydevuelvedevuelve
• Subconsulta multi-columna• Subconsulta multi-columna
CLERK 7900CLERK 7900
MANAGER 7698MANAGER 7698
Cons. Principal
Subquerydevuelvedevuelve
6-8 Copyright Oracle Corporation, 1997. All rights reserved.
Subconsultas Mono-registroSubconsultas Mono-registro
• Devuelven un único registro.
• Se utilizan operadores de comparación.
• Devuelven un único registro.
• Se utilizan operadores de comparación.
Operador
=
>
>=
<
<=
<>
Significado
Igual a
Mayor que
Mayor que o igual a
Menor que
Menor que o igual a
No igual a
6-9 Copyright Oracle Corporation, 1997. All rights reserved.
Ejecución de Subc. Mono-registroEjecución de Subc. Mono-registro
CLERK
1100
ENAME JOB
---------- ---------
MILLER CLERK
ENAME JOB
---------- ---------
MILLER CLERK
SQL> SELECT ename, job
2 FROM emp
3 WHERE job =
4 (SELECT job
5 FROM emp
6 WHERE empno = 7369)
7 AND sal >
8 (SELECT sal
9 FROM emp
10 WHERE empno = 7876);
6-10 Copyright Oracle Corporation, 1997. All rights reserved.
Uso de Funciones de Grupo en una Subconsulta
Uso de Funciones de Grupo en una Subconsulta
800
ENAME JOB SAL
---------- --------- ---------
SMITH CLERK 800
ENAME JOB SAL
---------- --------- ---------
SMITH CLERK 800
SQL> SELECT ename, job, sal
2 FROM emp
3 WHERE sal =
4 (SELECT MIN(sal)
5 FROM emp);
6-11 Copyright Oracle Corporation, 1997. All rights reserved.
La Cláusula HAVING en SubconsultasLa Cláusula HAVING en Subconsultas
• El Servidor Oracle8 ejecuta primero las subconsultas.
• El Servidor Oracle8 devuelve el resultado a la cláusula HAVING de la consulta principal.
• El Servidor Oracle8 ejecuta primero las subconsultas.
• El Servidor Oracle8 devuelve el resultado a la cláusula HAVING de la consulta principal.
800
SQL> SELECT deptno, MIN(sal)
2 FROM emp
3 GROUP BY deptno
4 HAVING MIN(sal) >
5 (SELECT MIN(sal)
6 FROM emp
7 WHERE deptno = 20);
6-12 Copyright Oracle Corporation, 1997. All rights reserved.
¿Qué está mal en esta Sentencia?¿Qué está mal en esta Sentencia?
ERROR:
ORA-01427: single-row subquery returns more than
one row
no rows selected
ERROR:
ORA-01427: single-row subquery returns more than
one row
no rows selected
SQL> SELECT empno, ename
2 FROM emp
3 WHERE sal =
4 (SELECT MIN(sal)
5 FROM emp
6 GROUP BY deptno);
““Oper
ador m
ono
Oper
ador m
ono--reg
istro e
n subco
nsulta
multi
regis
tro e
n subco
nsulta
multi
--reg
istro
regis
tro””
6-13 Copyright Oracle Corporation, 1997. All rights reserved.
¿Funcionaría esta Sentencia?¿Funcionaría esta Sentencia?
no rows selectedno rows selected
La Subco
nsulta
NO
dev
uelve
regis
tros
La Subco
nsulta
NO
dev
uelve
regis
tros
SQL> SELECT ename, job
2 FROM emp
3 WHERE job =
4 (SELECT job
5 FROM emp
6 WHERE ename='SMYTHE');
6-14 Copyright Oracle Corporation, 1997. All rights reserved.
Subconsultas Multi-registroSubconsultas Multi-registro
• Devuelven más de un registro.
• Use comparadores multi-registro.
• Devuelven más de un registro.
• Use comparadores multi-registro.
Operador
IN
ANY
ALL
Significado
Igual a los valores de cierta lista
Compara los valores con cada valor
devuelto por la subconsulta
Compara los valores con cada uno de los
valores devueltos por la subconsulta
6-15 Copyright Oracle Corporation, 1997. All rights reserved.
Uso del Operador ANY enUso del Operador ANY en
9508001100
1300
EMPNO ENAME JOB
--------- ---------- ---------
7654 MARTIN SALESMAN
7521 WARD SALESMAN
EMPNO ENAME JOB
--------- ---------- ---------
7654 MARTIN SALESMAN
7521 WARD SALESMAN
SQL> SELECT empno, ename, job
2 FROM emp
3 WHERE sal < ANY
4 (SELECT sal
5 FROM emp
6 WHERE job = 'CLERK')
7 AND job <> 'CLERK';
Subconsultas Multi-registroSubconsultas Multi-registro
6-16 Copyright Oracle Corporation, 1997. All rights reserved.
Uso del Operador ALL enUso del Operador ALL en
2916.6667
2175
1566.6667
EMPNO ENAME JOB
--------- ---------- ---------
7839 KING PRESIDENT
7566 JONES MANAGER
7902 FORD ANALYST
7788 SCOTT ANALYST
EMPNO ENAME JOB
--------- ---------- ---------
7839 KING PRESIDENT
7566 JONES MANAGER
7902 FORD ANALYST
7788 SCOTT ANALYST
SQL> SELECT empno, ename, job
2 FROM emp
3 WHERE sal > ALL
4 (SELECT avg(sal)
5 FROM emp
6 GROUP BY deptno)
Subconsultas Multi-registroSubconsultas Multi-registro
6-17 Copyright Oracle Corporation, 1997. All rights reserved.
ResumenResumen
Las Subconsulas resultan muy útiles cuando una consulta esta basada en valores que no conocemos.
Las Subconsulas resultan muy Las Subconsulas resultan muy úútiles tiles cuando una consulta esta basada en cuando una consulta esta basada en valores que no conocemos.valores que no conocemos.
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
6-18 Copyright Oracle Corporation, 1997. All rights reserved.
Visión General de la PrácticaVisión General de la Práctica
•• Crear subconsultas para recuperar Crear subconsultas para recuperar valores basados en criterios valores basados en criterios desconocidos.desconocidos.
•• Usar subconsultas para recuperar Usar subconsultas para recuperar valores que existen en un conjunto de valores que existen en un conjunto de datos y que no existen en otro.datos y que no existen en otro.