Subconsultas SQL: ejemplo y definición

Rodrigo Ricardo Publicado el 14 noviembre, 2020 6 minutos y 14 segundos de lectura

Subconsultas

A veces parece que tenemos que trabajar con demasiados datos. Con el crecimiento de las bases de datos, obtener datos de esas bases de datos puede ser un desafío. Necesitamos algún tipo de filtro para obtener los resultados que queremos, especialmente a partir de conjuntos de datos más grandes.

Piense en una gran empresa, con datos para empleados y sus planes de beneficios. Digamos que se almacenan en tablas etiquetadas como empleado y beneficios. Si se le pide que consulte los datos para que solo los empleados se inscriban en un plan de salud, puede escribir dos consultas, luego copiar los datos en otro lugar y realizar una comparación.

¡Eso es demasiado trabajo!

En su lugar, escribamos una subconsulta . Piense en esto como un filtro. Además, refina los resultados a lo que realmente se necesita. A veces, las subconsultas se denominan consultas anidadas , porque se encuentran dentro de la consulta SQL principal.

También verá el término INNER SELECT utilizado para una subconsulta. Nuevamente, esto se debe a que está anidado dentro de las principales declaraciones de selección de SQL.

Una consulta SQL básica contiene algunos componentes estándar: SELECT, FROM y WHERE. También hay dos declaraciones de actualización: UPDATE (editar un registro existente) e INSERT (crear una nueva entrada en la base de datos).

Las subconsultas se pueden utilizar en cualquiera de estos. Comenzaremos con los usos más comunes y continuaremos desde allí.

DÓNDE

En nuestro primer ejemplo, echemos un vistazo a nuestra pregunta original: ¿Cómo incluir solo empleados en el plan de salud sin tener que realizar pasos adicionales? El siguiente ejemplo de SQL muestra la subconsulta anidada dentro de la cláusula WHERE. El código primero comienza seleccionando empleados, luego realiza el filtro / subconsulta en la tabla de beneficios.

La siguiente declaración es del sistema de administración de bases de datos de SQL Server.

SELECT emp.empID, emp.empName 
FROM employee emp
DONDE emp.employeeID IN
 (SELECT ben.empID
  FROM Benefits ben
  WHERE ben.planCode = "Health"
 );

DESDE

También puede colocar la subconsulta dentro de la cláusula FROM de la instrucción SQL. Nuevamente, el objetivo es filtrar nuestros resultados para obtener una cantidad de información más manejable.

En el siguiente ejemplo (también de SQL Server), hemos creado un alias para la subconsulta, llamado subconsulta1.

En este caso, el alias hace exactamente lo que pensaría: crea otro nombre para la subconsulta. Esto en realidad es muy importante porque ahora podemos hacer referencia a esta consulta en otras declaraciones. ¡Incluso podemos hacer referencia a la subconsulta desde dentro de la declaración de consulta principal! SQL lee la declaración completa.

El alias es importante porque le permite hacer referencia a esa subconsulta, incluso desde la consulta principal. Observe cómo la instrucción SELECT incluso selecciona el valor de recuento de subconsulta1. Si no le hubiéramos dado un nombre, no habría funcionado.

A continuación, se muestra cómo funcionaría una subconsulta dentro de una instrucción FROM:

SELECT emp.empID, emp.empName 
FROM employee
 (SELECT planCode, COUNT (empID) as emp_count
  FROM Benefits
  GROUP BY plancode) subconsulta 1
WHERE subconsulta1.empID = employee.empID;

Ahora saquemos la subconsulta y veámosla sola: el alias se define FUERA de la subconsulta, después del paréntesis de cierre.

(SELECT planCode, COUNT (empID) como emp_count 
FROM beneficios
GROUP BY plancode) subconsulta 1

El nombre de alias de subconsulta1 ahora se puede usar para hacer referencia a cualquier campo de esta subconsulta. De hecho, si miramos hacia atrás en la primera instrucción SELECT, hicimos referencia a esta consulta:

SELECT empName, subconsulta1.emp_count

Si no hubiéramos nombrado correctamente la subconsulta, esta declaración no se habría procesado.

SELECCIONE

Otra ubicación para una subconsulta es la instrucción SELECT. Tener la subconsulta dentro de la instrucción SELECT es útil cuando desea completar algún tipo de función agregada como parte de la subconsulta, y no la consulta principal. Es decir, un recuento, resumen o valor mínimo / máximo. Podría ser el salario más alto, el precio más bajo del producto o el número de empleados.

Echemos un vistazo a un ejemplo y luego desglosémoslo. Nuevamente, esto es de SQL Server.

SELECT o1.order_id, o1.order_code 
 (SELECT MAX (order_amount)
  FROM orders o2
  WHERE o1.order_id = o2.order_id) subconsulta2
FROM orders o1;

Saquemos la subconsulta y echemos un vistazo:

SELECCIONE MAX (order_amount) 
FROM orders o2
  WHERE o1.order_id = o2.order_id) subconsulta2

De nuevo, hemos creado un alias (esta vez llamándolo subconsulta2).

NOTA: En la instrucción SELECT, la subconsulta solo puede devolver UN valor. Al usar la función Recuento, solo obtendremos un valor, y ese es el recuento total.

Aunque hemos estado analizando la sintaxis de SQL Server, el concepto es el mismo para otras herramientas. Echemos un vistazo rápido a otra base de datos popular, MySQL, y cómo se puede usar una subconsulta en una instrucción UPDATE o INSERT.

MySQL: actualización de subconsultas

A continuación, se actualiza una tabla de artistas basada en la cantidad de votos que recibió el artista en una encuesta en línea. En realidad, la subconsulta se considera parte de la instrucción UPDATE.

ACTUALIZAR tblArtist 
 (SELECT count (*) AS votos, user_id
  FROM tblVoteCount GROUP BY artist_id) AS votecount
  SET tblArtist.votes = votecount.votes
  DONDE tblArtist.artist_id = tblVoteCount.artist_id;

Aunque la sintaxis es un poco diferente, el concepto es el mismo: la subconsulta está incorporada dentro de otra declaración SQL principal. En este caso, se trata de un filtro en la declaración UPDATE: solo agregue al total de votos si el usuario realmente votó por el artista.

La lógica es similar con la instrucción INSERT: la instrucción que crea un nuevo registro en la base de datos.

INSERT INTO tblAlbums (artist_id, album_title, rating) 
 VALUES
  (SELECT * FROM tblBackup
   WHERE rating <5);

En este ejemplo, la consulta selecciona álbumes con una calificación inferior a 5. Estos se eligen de una tabla de respaldo (probablemente eliminados porque eran malos, pero ahora queremos volver a escucharlos). La subconsulta está dentro de la instrucción INSERT principal.

Resumen de la lección

Una subconsulta de SQL es una consulta dentro de una consulta. Se puede pensar en un filtro. Otro término utilizado es INNER SELECT ya que la consulta está dentro de una consulta principal. Las subconsultas también se denominan consultas anidadas porque están anidadas dentro de la consulta principal. Las subconsultas nos permiten refinar aún más la consulta principal realizando una consulta secundaria en otra tabla (o incluso en la misma tabla). Las subconsultas se pueden colocar dentro de las instrucciones WHERE, FROM o SELECT. En las declaraciones FROM y SELECT, use un aliaspara hacer referencia a la subconsulta. De esa forma, se puede hacer referencia a él en la consulta principal o mediante otras declaraciones. Nos hemos centrado en SQL Server en esta lección, pero el ejemplo de MySQL muestra cuán universal es el concepto. Una vez que lo aprende en una herramienta, ese conocimiento se puede aplicar a otros sistemas de bases de datos.

Explora más sobre este tema

Selecciona un tema y sigue aprendiendo...

Rodrigo Ricardo
Rodrigo Ricardo Editor y fundador