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

Cómo Practicar Subconsultas SQL

¿Te has preguntado alguna vez qué separa a los principiantes de los usuarios avanzados de SQL? Hay cosas como, por ejemplo, las subconsultas. En este artículo, te explico su importancia y por qué necesitas practicar las subconsultas SQL para convertirte en un experto.

¿Qué es una subconsulta SQL?

SQL es un lenguaje fácil de aprender. Sin embargo, hay ciertas características y técnicas complejas del lenguaje que requieren práctica. Una de estas características es la subconsulta, que añade un gran poder expresivo al lenguaje y a tus proyectos.

En este artículo, repasamos ejemplos para que des tu primer paso en la práctica de las subconsultas. También mencionamos artículos y cursos donde encontrarás más material como clases y ejercicios para seguir mejorando en el uso de las subconsultas.

Si no sabes de qué estoy hablando, empieza por el SQL para principiantes curso. Es el punto de partida perfecto para aprender SQL. Si ya sabes un poco sobre el tema pero no sabes cómo practicar las subconsultas, sigue leyendo.

En términos sencillos, una subconsulta es una consulta dentro de otra consulta. SQL nos permite poner subconsultas en diferentes partes de una consulta SQL, como las cláusulas WHERE y FROM, entre otras. Crear una subconsulta es muy fácil porque su estructura es la misma que la de una consulta normal. Sólo necesitamos conocer algunas reglas sobre cómo conectar la consulta y la subconsulta.

Antes de empezar con los ejemplos, aclaremos algo de vocabulario: en el resto de este artículo, llamaremos "consulta externa" a la consulta externa en la que reside una subconsulta.

Presentemos una base de datos sencilla con dos tablas employee y department.

Tabla employee

employee_idlast_namefirst_namesalarydepartment_id
1001SmithJohn145000.00100
1002BelleMary115000.00101
1003DalePeter155000.00102
1004GarrahanSusan195000.00100
1005GarrahanMary94000.00102
1006FiesJulia92000.00101

Tabla department

department_iddept_namemanager_idbudgetbuilding
100Sales23240000.00CentralPark
101Accounting56130000.00CentralPark
102IT34150000.00Oblivious

Supongamos que queremos obtener el nombre del departamento con mayor presupuesto. Podemos escribir la siguiente consulta, que incluye una subconsulta (en azul ):

SELECT dept_name, budget
FROM   department
WHERE budget = ( SELECT MAX(budget) FROM department )

Tenemos una subconsulta ( en azul) en la cláusula WHERE que devuelve el mayor presupuesto de la department tabla. A continuación, utilizamos este valor en la cláusula WHERE de la consulta externa para compararlo con la columna de presupuesto. Todos los registros de la tabla department que tengan un presupuesto igual al valor máximo del presupuesto.

Observe que la subconsulta está entre paréntesis. En SQL, las subconsultas siempre deben ir entre paréntesis.

Con este ejemplo, hemos visto lo fácil y sencillo que es crear una subconsulta. Sin embargo, hay algunas reglas sobre cómo conectar la subconsulta con la consulta externa. También necesitamos saber dónde debe estar una subconsulta dentro de la sentencia SELECT. Existen diferentes cláusulas (como WHERE, FROM y HAVING) en la consulta externa donde podemos colocar una subconsulta. Estas son algunas de las razones por las que la práctica con subconsultas es tan importante.

Finalmente, para aquellos que buscan recursos para practicar sus habilidades SQL, sugiero el curso Ejercicios prácticos de SQL. Encontrarás más de 80 ejercicios interactivos, que van desde tareas sencillas con sentencias SELECT FROM hasta problemas más avanzados que implican múltiples subconsultas. Otro conjunto interesante de ejercicios SQL se encuentra en la página mensual Ejercicios prácticos de SQLs, donde podrás ver tu código SQL en acción y recibir comentarios inmediatos.

Otro Ejemplo de Subconsulta SQL

Hemos visto una subconsulta que devuelve un conjunto de resultados con un solo registro y una sola columna. Este tipo de subconsulta es bastante común, y es fácil integrar o conectar la subconsulta con la consulta externa utilizando el operador igual (=).

Veamos ahora una subconsulta que devuelve una única columna pero varios registros para contrastarla con una subconsulta que produce un único registro.

Supongamos que necesitamos obtener los ID de los empleados y los nombres de los empleados que trabajan en el edificio CentralPark. Podemos escribir una consulta SQL como la siguiente. De nuevo, la subconsulta aparece en azul.

SELECT employee_id, last_name, first_name
FROM   employee
WHERE department_id IN ( SELECT department_id
                         FROM   department
                         WHERE  building = ‘CentralPark’
                       )

Lo primero que hay que observar es el número de registros que devuelve la subconsulta. Devuelve dos registros porque hay dos departamentos en el edificio CentralPark: Ventas y Contabilidad. Por lo tanto, la subconsulta genera un conjunto de resultados con dos ID de departamento, 100 y 101.

Lo segundo que hay que tener en cuenta es el operador IN utilizado en la cláusula WHERE de la consulta externa. Cuando una subconsulta devuelve varias filas, no podemos utilizar el operador igual (=) como en el primer ejemplo. En su lugar, utilizamos el operador IN, que funciona como el operador "pertenece a". En otras palabras, la condición

department_id IN ( SELECT department_id
                         FROM   department
                         WHERE  building = ‘CentralPark’
                       )

devuelve TRUE cuando el valor de department_id existe en el conjunto de resultados de la subconsulta y FALSE cuando el valor de department_id no está incluido en el conjunto de resultados de la subconsulta.

Intente siempre identificar de antemano cuántos registros devuelve su subconsulta. ¿Se trata de una subconsulta multirregistro o de una subconsulta de un solo registro? A partir de ahí, determine cómo conectarla con la consulta externa. Para conocer más detalles sobre las subconsultas multi-registro y de registro único, le sugiero los artículos "Guía para principiantes sobre la subconsulta SQL" y "¿Cuáles son los diferentes tipos de subconsultas SQL?".

Para aquellos que quieran profundizar en las subconsultas, otro artículo interesante es "Subquery vs. JOIN", donde se aprenden diferentes formas de crear consultas SQL equivalentes utilizando joins y subconsultas.

Uso de Subconsultas SQL en Otras Partes de la Consulta

Hemos mostrado ejemplos de subconsultas en la cláusula WHERE de la sentencia SELECT. En esta sección, mostraremos subconsultas en otras cláusulas.

La cláusula FROM es donde usualmente especificamos la tabla a leer en la consulta. Sin embargo, podemos poner una subconsulta en la cláusula FROM para crear una especie de conjunto de resultados intermedio. Después, este conjunto de resultados puede ser utilizado como una tabla virtual por la consulta externa.

Veamos un ejemplo. Supongamos que tenemos departamentos en los que el salario total de todos los empleados supera el presupuesto del departamento. Para detectar estos casos, queremos obtener el presupuesto y el importe total de los salarios pagados por cada departamento. También añadimos al informe una expresión matemática para obtener la parte no utilizada del presupuesto. Veamos la consulta:

SELECT 	d1.dept_name,
d1.budget,
total.total_salaries,
d1.budget - total.total_salaries AS budget_after_salaries
FROM		( SELECT department_id, SUM(salary) AS total_salaries
		  FROM employee
		 GROUP BY department_id
		) AS total
INNER JOIN    department d1 ON d1.department_id = total.department_id

La subconsulta en azul en la cláusula FROM crea una tabla intermedia llamada total con las columnas department_id y total_salaries. Después, hacemos una JOIN entre la tabla intermedia total y la tabla normal department. En la lista de columnas de SELECT, calculamos la diferencia entre el presupuesto del departamento y el importe total del salario. A este valor lo denominamos budget_after_salaries. Veamos el resultado de la consulta:

dept_namebudgettotal_salariesbudget_after_salaries
Sales240000340000-100000
Accounting28000020700073000
IT2490002500001000

También podemos poner subconsultas en otras cláusulas de la sentencia SELECT, como la cláusula HAVING utilizada para filtrar grupos de registros. Supongamos que queremos mostrar los departamentos cuyo importe salarial total es mayor que la media de los totales de los departamentos. Obtenemos la media de los totales de los departamentos con una subconsulta. Veamos la consulta:

SELECT 	d1.dept_name,
SUM(salary)
FROM		employee e
INNER JOIN  department d1 ON d1.department_id = e.department_id
GROUP BY  d1.dept_name
HAVING SUM(salary) > (
SELECT SUM(salary)/COUNT(distinct department_id)
FROM   employee
   )

Obtenemos el importe salarial total de cada departamento con la expresión SUM(salary). Luego, en la cláusula HAVING, comparamos este importe con la media del total del departamento obtenido en la subconsulta. Los departamentos cuyo SUM(salary) es mayor que el resultado de la subconsulta aparecen en el resultado de la consulta, como vemos a continuación:

dept_nametotal_salaries
Sales340000

Para aquellos que quieran aprender donde se soporta la subconsulta en SQL, los siguientes dos artículos explican otros lugares donde se pueden colocar las subconsultas. El artículo "Subquery vs. CTE: A SQL Primer" explica las CTEs, y en el artículo "How to Use Subqueries in INSERT, UPDATE, and DELETE Statements", como dice el título, se aprenden las subconsultas SQL en otras sentencias como INSERT, UPDATE, y DELETE.

Practique las Subconsultas SQL para Mejorar sus Habilidades

Hemos visto varias subconsultas SQL en diferentes cláusulas. Las subconsultas SQL son usualmente usadas en una sentencia SELECT; sin embargo, es posible usarlas en otras sentencias. Además, existen otros tipos de subconsultas SQL como las subconsultas correlacionadas y las CTEs que añaden aún más expresividad al lenguaje SQL.

Es fácil e intuitivo aprender SQL, sobre todo en los primeros pasos. Pero, como con cualquier otro lenguaje, es necesario practicar para llegar a un nivel en el que puedas manejar y crear todo tipo de consultas e informes. Cuanto más tiempo dediques a resolver problemas en el lenguaje SQL, mayores serán los conocimientos de SQL que adquieras.

Me gustaría terminar con algunos recursos estupendos para aprender SQL. En primer lugar, aquí hay un par de artículos que se centran en la práctica de SQL: "How Much SQL Practice Do You Need to Become a Pro?" y "Why Is the SQL Practice Set my Favorite Online Course?" En ambos artículos, se encuentra una gran cantidad de sugerencias y consejos para la práctica de SQL para alcanzar el nivel de maestro de SQL. En segundo lugar, encontrarás diferentes formas de practicar SQL en LearnSQL.es's Monthly SQL Practice in 2022. Por último, pero no por ello menos importante, el artículo "5 Tips for You From a Senior SQL Data Analyst" describe cómo convertirse en analista de datos, que es una profesión que requiere un sólido conocimiento de SQL.

Mejore sus habilidades e invierta en sí mismo.