Saltar al contenido
SQL con Python

Subconsultas: Cómo utilizar subconsultas para filtrar y manipular datos de una tabla.

Introducción

Las subconsultas son una herramienta fundamental en SQL que permiten realizar consultas anidadas para filtrar y manipular datos de una tabla de manera más eficiente y compleja. En resumen, una subconsulta es una consulta dentro de otra consulta. De esta forma, podemos utilizar subconsultas para realizar operaciones como contar registros en una tabla, obtener la media de una columna y realizar comparaciones entre distintas columnas. Además, también podemos utilizar subconsultas para combinar información de diferentes tablas en una misma consulta. Las subconsultas pueden ser escritas en diferentes puntos de la consulta principal, ya sea en la parte SELECT, WHERE, HAVING o incluso en la cláusula FROM.

Es importante tener en cuenta que una subconsulta debe devolver como máximo una sola columna y una sola fila. En resumen, las subconsultas son una herramienta poderosa y versátil en SQL que permiten manipular datos de manera eficiente y compleja para obtener información más precisa y detallada de una tabla.

Resumen

Las subconsultas son una herramienta muy útil al trabajar con bases de datos. Una subconsulta es una consulta que se encuentra anidada dentro de otra consulta. En otras palabras, es una consulta que se utiliza como argumento en otra consulta. Las subconsultas pueden ser utilizadas para filtrar y/o manipular datos de una tabla de forma más precisa. Por ejemplo, con una subconsulta podemos hacer que una consulta sólo tenga en cuenta los registros que se cumplen en otra tabla. Así, podemos utilizar el resultado de una consulta como parte de otra consulta. La sintaxis general para una subconsulta en SQL es la siguiente:

SELECT columna1, columna2, ... FROM tabla1 WHERE columna1 IN (SELECT columna2 FROM tabla2 WHERE condición);

En este ejemplo, estamos seleccionando ciertas columnas de tabla1. Sin embargo, estamos limitando los valores que serán seleccionados mediante el uso de una subconsulta en la cláusula WHERE. La subconsulta está seleccionando una columna de tabla2 basada en una cierta condición.

Hay varios tipos de subconsultas como:

  • Subconsultas de una sola fila: Devuelven una única fila y columna. Esta subconsulta puede ser usada como una simple expresión. Por ejemplo, para saber el balance total de la cuenta bancaria de un cliente:
SELECT balance FROM cuentas_bancarias WHERE id_cliente = (SELECT id_cliente FROM clientes WHERE nombre_cliente = 'Juan Perez');
  • Subconsultas de varias filas: Devuelven múltiples filas y columnas. Esta subconsulta debe de ser usada en la cláusula WHERE, así que debe devolver una columna para compararla con otra columna de otra tabla.
SELECT nombre FROM clientes WHERE id_cliente IN (SELECT id_cliente FROM cuentas_bancarias WHERE balance < 1000);

En este caso, estamos seleccionando los nombres de los clientes que tienen una cuenta bancaria con un balance menor a 1000. La subconsulta está seleccionando los IDs de los clientes cuyas cuentas bancarias tienen un balance menor a 1000.

  • Subconsultas correlacionadas: Utilizan valores de la consulta externa en la consulta interna. Se hacen coincidir los valores de la tabla externa con los de la tabla interna.
SELECT nombre FROM clientes WHERE (SELECT COUNT(*) FROM cuentas_bancarias WHERE id_cliente = clientes.id_cliente) > 1;

En este ejemplo la subconsulta está contando el número de cuentas bancarias por cada cliente, y selecciona los clientes que tienen más de una cuenta bancaria.

La utilización de subconsultas hace que las consultas sean más flexibles y poderosas, y con ello, se pueden hacer muchas acciones que no serían posibles de otra forma en SQL.

Aplicación teórica

Aquí te presento un ejemplo de subconsulta: Supongamos que tienes dos tablas en tu base de datos: "customers" y "orders". La tabla "customers" tiene el nombre de los clientes y su ID, mientras que la tabla "orders" tiene el ID del cliente y el ID del pedido. Imaginemos que quieres obtener una lista de los nombres de los clientes que tienen al menos un pedido. Para hacer esto, puedes usar una subconsulta dentro de una cláusula WHERE.

SELECT name FROM customers WHERE id IN (SELECT DISTINCT customer_id FROM orders);

Esta subconsulta devuelve una lista de los IDs de clientes que tienen al menos un pedido en la tabla "orders". La cláusula "DISTINCT" se utiliza para evitar duplicados en la lista. Luego, la consulta principal selecciona los nombres de los clientes cuyos IDs aparecen en la subconsulta. Con esto tendrás una lista de los nombres de todos los clientes que han realizado pedidos en tu tienda en línea. Así es como se pueden utilizar las subconsultas en SQL para filtrar y manipular datos de una tabla en función de los datos en otra tabla.

Aplicación práctica

Un ejemplo sencillo de cómo utilizar subconsultas en Python con SQL utilizando la librería sqlite3:

Supongamos que tenemos dos tablas en nuestra base de datos, una llamada empleados y otra llamada salarios. Queremos obtener el nombre de los empleados que tienen el salario máximo:

import sqlite3

# Conectamos a nuestra base de datos
conn = sqlite3.connect('mi_base_de_datos.db')
c = conn.cursor()

# Primero, obtenemos el salario máximo
c.execute("SELECT MAX(salario) FROM salarios;")
salario_maximo = c.fetchone()[0]

# Luego, utilizamos una subconsulta para obtener los nombres de los empleados que tienen ese salario máximo
c.execute("SELECT nombre FROM empleados WHERE id IN (SELECT id_empleado FROM salarios WHERE salario = ?);", (salario_maximo,))
nombres_empleados_salario_maximo = [row[0] for row in c.fetchall()]

# Imprimimos los resultados
print("Nombre(s) de empleado(s) con salario máximo:", ', '.join(nombres_empleados_salario_maximo))

# Cerramos la conexión a la base de datos
conn.close()

En este ejemplo, utilizamos una subconsulta para obtener los id_empleado de la tabla salarios que tienen el salario máximo utilizando la cláusula IN. Luego, filtramos la tabla de empleados utilizando esos id_empleado para obtener los nombres correspondientes. Espero que este ejemplo te haya sido útil. ¡Buena suerte programando!