Volver a la lista de artículos Artículos
Lectura de 5 minutos

Aprenda a escribir una subconsulta SQL correlacionada en 5 minutos

Si estás familiarizado con la famosa muñeca rusa de anidación, entonces las subconsultas correlacionadas de SQL deberían ser pan comido de entender: las subconsultas son simplemente consultas anidadas dentro de otras consultas. Una subconsulta SQL suele llamarse consulta "interna"; la consulta principal suele llamarse consulta "externa". Este artículo cubre todo lo que necesitas saber sobre las subconsultas correlacionadas.

¿Qué es exactamente una subconsulta SQL correlacionada?

Una subconsulta SQL correlacionada es simplemente una subconsulta que se ejecuta varias veces-una por cada registro (fila) devuelto por la consulta externa (principal). En otras palabras, la consulta externa devuelve una tabla con múltiples filas; la consulta interna se ejecuta una vez por cada una de esas filas. Si la consulta externa devuelve 10 filas, la consulta interna se ejecutará 10 veces. Y si su consulta externa devuelve 100 filas, la consulta interna se ejecutará 100 veces.

¿Cuándo se debe utilizar una subconsulta SQL correlacionada?

Algunas preguntas sobre datos sólo pueden responderse con subconsultas correlacionadas. Esto es particularmente cierto cuando se hacen preguntas de datos negativas.

Las preguntas negativas de datos surgen cuando buscamos registros que no satisfacen una condición particular. Un ejemplo de pregunta de datos negativa simple es: "Obtenga los nombres de todas las películas no producidas por Steven Spielberg".

En este artículo resolveremos un ejemplo de pregunta de datos negativos. Antes de hacerlo, revisemos primero las tablas involucradas. Tenemos dos tablas: la tabla employee y la tabla payment_history tabla. La segunda tabla tiene una columna llamada payment_type que denota si un pago es parte de un salario regular, un bono o un premio. Veamos algunos datos de ejemplo de las tablas que utilizaremos:

employee

employee_id payment_type amount_paid payment_date
100 salary 2000.00 2018-Mar-02
101 salary 1800.00 2018-Mar-02
102 salary 1900.00 2018-Mar-02
101 award 500.00 2018-Mar-08
102 adjustment 124.70 2018-Mar-10

payment_history

employee_id payment_type amount_paid payment_date
100 salary 2000.00 2018-Mar-02
101 salary 1800.00 2018-Mar-02
102 salary 1900.00 2018-Mar-02
101 award 500.00 2018-Mar-08
102 adjustment 124.70 2018-Mar-10

Esta es la pregunta de datos negativos que nos gustaría responder:

"Obtener los nombres de los empleados que nunca han recibido un premio"

La consulta SQL que responde a la pregunta anterior es la siguiente:

SELECT last_name, first_name
FROM    employee e1
WHERE NOT EXISTS (SELECT ph.last_name 
                                      FROM payment_history ph 
                                      WHERE ph.employee_id = e1.employee_id 
                                      AND ph.payment_type = 'award')

Subconsultas correlacionadas SQL Vs. Subconsultas simples

La principal diferencia entre una subconsulta SQL correlacionada y una subconsulta simple es que una subconsulta SQL correlacionada hace referencia a columnas de la tabla de la consulta externa.

En el ejemplo anterior ph.employee_id = e1.employee_id es una referencia a la tabla de la subconsulta externa (e1). Para identificar una subconsulta correlacionada, basta con buscar este tipo de referencias. Si encuentra al menos una, ¡tiene una subconsulta correlacionada!

La parte negativa de una pregunta de datos suele resolverse en una subconsulta correlacionada SQL utilizando el operador NOT EXISTS en la cláusula WHERE. EXISTS es un operador que siempre va seguido de una subconsulta. Si la subconsulta devuelve al menos un registro, entonces EXISTS se evalúa como TRUE. Si la subconsulta devuelve un conjunto vacío, entonces EXISTS se evalúa como FALSE. Tenga en cuenta que utilizamos NOT EXISTS, que es simplemente lo contrario de EXISTS.

El resultado de la consulta anterior es:

first_name last_name
John Smith
Alice Johnson

Otro ejemplo de subconsulta correlacionada

En este ejemplo, trataremos de obtener los nombres de todos los empleados que ganaron sueldos más altos en marzo de 2018 que sus sueldos mensuales promedio de todos los meses anteriores utilizando una subconsulta correlacionada de SQL. Esta es la consulta que ejecutaremos:

SELECT    first_name, last_name 
FROM       employee e1, payment_history ph
WHERE    e1.employee_id = ph.employee_id 
     AND     amount_paid > = (
                               SELECT AVG(amount_paid) FROM payment_history ph2
                               WHERE ph2.employee_id = e1.employee_id
                                     AND ph2.payment_date  < '01/03/2018'
                                     AND ph2.payment_type = 'salary' 
                               )
     AND    month(ph.payment_date) =3 
     AND    year(ph.payment_date) = 2018 
     AND    ph.payment_type ='salary'

Basta de negatividad. ¿Qué pasa con las preguntas de datos positivos?

¿Debemos utilizar una subconsulta correlacionada SQL para responder a una pregunta de datos positivos? No, no es necesario. Sin embargo, puede hacerlo si lo desea. Para las preguntas positivas, normalmente podemos utilizar simplemente una condición de JOIN o una relación entre dos tablas.

Cambiemos nuestra pregunta anterior por una positiva y resolvámosla con una JOIN en lugar de una subconsulta correlacionada. La pregunta se convierte en: "Obtener los nombres de los empleados que recibieron pagos de premios". Y la consulta SQL (sin subconsultas correlacionadas) que responde a esta pregunta es:

SELECT    first_name, last_name 
FROM       employee e1 
                 JOIN payment_history ph ON  ph.employee_id = e1.employee_id 
WHERE    ph.payment_type =award'

El resultado es:

first_name last_name
Kate Miller

Advertencia: Su subconsulta SQL correlacionada es probable que sea lenta

Me gustaría mencionar que tratamos de no abusar de las subconsultas correlacionadas SQL, si es posible. Recordemos que una subconsulta correlacionada se ejecuta una vez por cada registro devuelto por la consulta externa. Si la consulta externa devuelve miles y miles de registros, puede imaginar lo rápido que se ralentizará el rendimiento de su consulta. En general, sólo debería utilizar una subconsulta correlacionada SQL si es absolutamente necesario.

Pruebe usted mismo una subconsulta correlacionada SQL

Hemos visto que las subconsultas correlacionadas son una parte importante del lenguaje SQL y pueden ayudarnos a responder a diferentes preguntas sobre datos, especialmente las negativas. También hemos explicado cómo reconocer una subconsulta correlacionada de SQL y por qué deberíamos intentar evitar generalmente las subconsultas correlacionadas, si es posible, por razones de rendimiento.

Para mejorar tus habilidades de subconsulta, prueba el curso LearnSQL.es's SQL para principiantes. Tenemos una sección específica dedicada a las subconsultas, con multitud de ejercicios prácticos y ejemplos de subconsultas correlacionadas que te ayudarán a dominar el contenido.