Subconsultas

Una subconsulta (subquery) es una sentencia “select” anidada en otra sentencia “select”, “insert”, “update” o “delete” (o en otra subconsulta).

  • Las subconsultas se emplean cuando una consulta es muy compleja, entonces se la divide en varios pasos lógicos y se obtiene el resultado con una única instrucción y cuando la consulta depende de los resultados de otra consulta.
  • Generalmente, una subconsulta se puede reemplazar por combinaciones y estas últimas son más eficientes.
  • Las subconsultas se DEBEN incluir entre paréntesis.
  • Puede haber subconsultas dentro de subconsultas, se admiten hasta 32 niveles de anidación.
  • Se pueden emplear subconsultas: 
    • En lugar de una expresión, siempre que devuelvan un solo valor o una lista de valores.
    • Que retornen un conjunto de registros de varios campos en lugar de una tabla o para obtener el mismo resultado que una combinación (join).

Hay tres tipos básicos de subconsultas:

  1. Las que retornan un solo valor escalar que se utiliza con un operador de comparación o en lugar de una expresión.
  2. Las que retornan una lista de valores, se combinan con “in”, o los operadores “any”, “some” y “all”.
  3. Los que testean la existencia con “exists”.

Reglas a tener en cuenta al emplear subconsultas:

  • La lista de selección de una subconsulta que va luego de un operador de comparación puede incluir sólo una expresión o campo (excepto si se emplea “exists” y “in”).
  • Si el “where” de la consulta exterior incluye un campo, este debe ser compatible con el campo en la lista de selección de la subconsulta.
  • No se pueden emplear subconsultas que recuperen campos de tipos text o image.
  • Las subconsultas luego de un operador de comparación (que no es seguido por “any” o “all”) no pueden incluir cláusulas “group by” ni “having”.
  • “distinct” no puede usarse con subconsultas que incluyan “group by”.
  • No pueden emplearse las cláusulas “compute” y “compute by”.
  • “order by” puede emplearse solamente si se especifica “top” también.
  • Una vista creada con una subconsulta no puede actualizarse.
  • Una subconsulta puede estar anidada dentro del “where” o “having” de una consulta externa o dentro de otra subconsulta.
  • Si una tabla se nombra solamente en un subconsulta y no en la consulta externa, los campos no serán incluidos en la salida (en la lista de selección de la consulta externa).

 

Una subconsulta puede reemplazar una expresión. Dicha subconsulta debe devolver un valor escalar (o una lista de valores de un campo).

Las subconsultas que retornan un solo valor escalar se utiliza con un operador de comparación o en lugar de una expresión:

 select CAMPOS
  from TABLA
  where CAMPO OPERADOR (SUBCONSULTA);

 select CAMPO OPERADOR (SUBCONSULTA)
  from TABLA;

Si queremos saber el precio de un determinado libro y la diferencia con el precio del libro más costoso, anteriormente debíamos averiguar en una consulta el precio del libro más costoso y luego, en otra consulta, calcular la diferencia con el valor del libro que solicitamos. Podemos conseguirlo en una sola sentencia combinando dos consultas:

 select titulo,precio,
  precio-(select max(precio) from libros) as diferencia
  from libros
  where titulo='Uno';

En el ejemplo anterior se muestra el título, el precio de un libro y la diferencia entre el precio del libro y el máximo valor de precio.

Queremos saber el título, autor y precio del libro más costoso:

 select titulo,autor, precio
  from libros
  where precio=
   (select max(precio) from libros);

Note que el campo del “where” de la consulta exterior es compatible con el valor retornado por la expresión de la subconsulta.

Se pueden emplear en “select”, “insert”, “update” y “delete”.

Para actualizar un registro empleando subconsulta la sintaxis básica es la siguiente:

 update TABLA set CAMPO=NUEVOVALOR
  where CAMPO= (SUBCONSULTA);

Para eliminar registros empleando subconsulta empleamos la siguiente sintaxis básica:

 delete from TABLA
  where CAMPO=(SUBCONSULTA);

Recuerde que la lista de selección de una subconsulta que va luego de un operador de comparación puede incluir sólo una expresión o campo (excepto si se emplea “exists” o “in”).

No olvide que las subconsultas luego de un operador de comparación (que no es seguido por “any” o “all”) no pueden incluir cláusulas “group by”.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: