MySQL Subconsulta con ejemplos

⚡ Resumen inteligente

MySQL La sintaxis de subconsultas consiste en colocar una instrucción SELECT dentro de otra, de modo que el resultado interno alimenta la consulta externa. Esta explicación abarca las subconsultas escalares, de filas y de tablas, el orden de ejecución, ejemplos prácticos y la relación entre el rendimiento y las operaciones JOIN.

  • 🔍 Definición básica: Una subconsulta es una instrucción SELECT anidada dentro de otra consulta, y la consulta interna se ejecuta primero para proporcionar valores a la consulta externa.
  • 🧮 Subconsulta escalar: Devuelve una sola fila y una sola columna, por lo que se combina con operadores de comparación como igual a, mayor que o menor que.
  • 📋 Subconsultas de filas y tablas: Una subconsulta de fila devuelve una fila con varias columnas, mientras que una subconsulta de tabla devuelve muchas filas y funciona con el operador IN.
  • 🧩 Profundidad de anidamiento: Las subconsultas pueden anidarse a varios niveles de profundidad, lo que permite localizar valores como el miembro que mejor paga en una sola instrucción.
  • ✍️ Más allá de SELECT: Las sentencias INSERT, UPDATE y DELETE aceptan subconsultas, lo que permite realizar cambios masivos sin necesidad de tablas temporales.
  • Regla de desempeño: Una operación JOIN suele ser mucho más rápida que una subconsulta equivalente, por lo que conviene reservar las subconsultas para la lógica que una operación JOIN no puede expresar.

MySQL subconsulta

¿Qué es una subconsulta en SQL?

A subconsulta Una consulta SELECT interna se encuentra dentro de otra consulta. Generalmente, la consulta SELECT interna se utiliza para determinar los resultados de la consulta SELECT externa, por lo que la base de datos evalúa primero la consulta interna y luego transmite su resultado hacia arriba.

La consulta interna se llama consulta interna o consulta anidada, y la instrucción que la contiene se llama consulta externaAnalicemos la sintaxis de las subconsultas.

MySQL subconsulta

El diagrama anterior muestra la estructura general de la instrucción: la cláusula SELECT externa especifica las columnas que se desean visualizar, y la cláusula SELECT interna entre corchetes especifica el valor o la lista de valores con los que se compara la cláusula WHERE.

¿Por qué usar una subconsulta?

Antes de analizar los diferentes tipos, conviene saber cuándo una subconsulta tiene cabida en una instrucción.

Una subconsulta responde a una pregunta cuyo valor de filtro se desconoce de antemano. Este valor debe calcularse a partir de los datos. Una queja común de los clientes de la videoteca MyFlix es la escasa cantidad de títulos de películas, y la gerencia desea adquirir películas de la categoría con menor número de títulos. Nadie sabe cuál es esa categoría hasta que se consulta la base de datos, por lo que el valor debe calcularse primero y luego utilizarse como filtro.

Las subconsultas están entractivo por tres razones prácticas:

  • Legibilidad: Cada parte de la lógica se encuentra en su propio bloque entre corchetes, por lo que la afirmación se lee como una secuencia de preguntas pequeñas en lugar de una expresión compleja.
  • Aislamiento: Se puede ejecutar una consulta interna de forma independiente para confirmar que devuelve el valor esperado, lo que facilita enormemente las pruebas y la depuración.
  • Flexibilidad: El mismo patrón funciona en las cláusulas WHERE, HAVING, SELECT y FROM, y también dentro de las sentencias INSERT, UPDATE y DELETE.

La desventaja es la velocidad, que se analiza en la comparación con JOIN más adelante en este artículo.

Tipos de subconsultas en MySQL

MySQL Admite tres tipos de subconsultas, cuyo tipo se determina según la estructura del resultado que devuelve la consulta interna. Cada tipo se explica a continuación con un ejemplo práctico en la base de datos myflixdb.

1) Subconsulta escalar

A subconsulta escalar Devuelve exactamente una fila y una columna, lo que significa que devuelve un único valor. Dado que el resultado es un único valor, se puede utilizar en cualquier lugar donde se permita un valor literal. Volviendo al problema de MyFlix mencionado anteriormente, puede utilizar una consulta como esta:

SELECT category_name FROM categories
WHERE category_id = (SELECT MIN(category_id) FROM movies);

Da como resultado:

MySQL subconsulta

Veamos cómo funciona esta consulta.

MySQL subconsulta

Como muestra el diagrama de ejecución, MySQL primeras carreras SELECT MIN(category_id) FROM movies, recibe un valor y solo entonces ejecuta la consulta externa con ese valor. Debido a que se devuelve un único valor, los operadores permitidos son el conjunto de comparación estándar: =, <> (o !=), >, >=, <, y <=.

💡 Consejo: Si una subconsulta colocada después = devuelve más de una fila, MySQL genera el error 1242, La subconsulta devuelve más de 1 fila.. Cambie el operador a INo bien, ajustar la cláusula WHERE interna.

2) Subconsulta de fila

A subconsulta de fila También devuelve una sola fila, pero esa fila puede contener más de una columna. Por lo tanto, la consulta externa compara una fila de valores con un constructor de filas en lugar de con un solo valor.

SELECT full_names, contact_number FROM members
WHERE (membership_number, gender) = (SELECT membership_number, gender FROM members WHERE full_names = 'Janet Jones');

Los operadores permitidos son los mismos operadores de comparación enumerados anteriormente, aplicados a toda la fila a la vez.

3) Subconsulta de tabla

A subconsulta de tabla devuelve varias filas y, a menudo, varias columnas, por lo que la consulta externa debe utilizar un operador de conjunto como IN, NOT IN, ANY, ALL, o EXISTS.

Supongamos que quieres los nombres y números de teléfono de los miembros que han alquilado una película y aún no la han devuelto, para poder llamarlos y recordarles que lo hagan. Puedes usar una consulta como esta:

SELECT full_names, contact_number FROM members
WHERE membership_number IN (SELECT membership_number FROM movierentals WHERE return_date IS NULL);

MySQL subconsulta

Veamos cómo funciona esta consulta.

MySQL subconsulta

En este caso, la consulta interna devuelve más de un resultado, por lo que la lista de números de membresía se entrega a la IN Se devuelve el operador y cada miembro coincidente.

Anidamiento de subconsultas a varios niveles de profundidad

Hasta ahora has visto dos niveles. Una subconsulta también puede contener otra subconsulta, lo que produce una triple sentencia anidada.

Supongamos que la gerencia quiere recompensar al miembro que más paga. Podemos ejecutar una consulta como esta:

SELECT full_names FROM members
WHERE membership_number = (SELECT membership_number FROM payments
    WHERE amount_paid = (SELECT MAX(amount_paid) FROM payments));

La consulta más interna encuentra el pago más grande, la consulta intermedia convierte esa cantidad en un número de membresía y la consulta externa convierte el número de membresía en un nombre. La consulta anterior arroja el siguiente resultado:

MySQL subconsulta

Cómo usar subconsultas con INSERT, UPDATE y DELETE

Las subconsultas no se limitan a las sentencias SELECT. El mismo patrón entre corchetes funciona dentro de las sentencias de modificación de datos, lo que permite modificar un conjunto completo de filas en una sola pasada sin crear una tabla temporal.

INSERTAR con una subconsulta. Una subconsulta puede proporcionar las filas que se insertan, copiando datos de una tabla a otra. La lista de columnas de la sentencia SELECT debe coincidir con la lista de columnas de la sentencia INSERT.

INSERT INTO vip_members (membership_number, full_names)
SELECT membership_number, full_names FROM members
WHERE membership_number IN (SELECT membership_number FROM payments WHERE amount_paid > 5000);

Actualizar con una subconsulta. Aquí, la consulta interna decide qué filas se modifican. El ejemplo siguiente marca a todos los miembros cuyo alquiler aún está pendiente de pago.

UPDATE members
SET reminder_sent = 1
WHERE membership_number IN (SELECT membership_number FROM movierentals WHERE return_date IS NULL);

ELIMINAR con una subconsulta. La misma idea elimina las filas que cumplen una condición almacenada en una segunda tabla.

DELETE FROM members
WHERE membership_number NOT IN (SELECT membership_number FROM movierentals);

⚠️ Advertencia: MySQL No permite que una instrucción modifique una tabla y seleccione datos de la misma tabla dentro de una subconsulta en la cláusula FROM. Si aparece el error 1093, envuelva la consulta interna en una tabla derivada, por ejemplo SELECT * FROM (SELECT ...) AS t, De modo que MySQL materializa el resultado antes de que se aplique el cambio. También es prudente ejecutar primero el SELECT interno por sí solo y confirmar el recuento de filas, antes de ejecutar un ACTUALIZAR BORRAR en producción.

Subconsultas frente a uniones

Tanto una subconsulta como una operación JOIN pueden combinar información de más de una tabla, por lo que la pregunta lógica es cuál utilizar.

En comparación con las uniones, las subconsultas son sencillas de usar y fáciles de leer. No son tan complicadas como Uney por lo tanto son frecuentemente utilizados por Principiantes de SQL.

Sin embargo, las subconsultas presentan problemas de rendimiento. Utilizar una unión en lugar de una subconsulta puede, en ocasiones, mejorar el rendimiento hasta 500 veces, ya que el optimizador puede resolver la unión en una sola pasada en lugar de evaluar la instrucción interna repetidamente.

Punto de comparación subconsulta ÚNETE
Legibilidad Alto, ya que cada bloque responde a una pregunta. Más abajo, ya que todas las tablas aparecen en una sola cláusula.
Rendimiento Más lento, la consulta interna puede ejecutarse para cada fila externa. Más rápido, a menudo por un margen muy amplio.
Columnas de resultados Solo se devuelven las columnas de la tabla externa. Se pueden devolver columnas de todas las tablas unidas.
Uso típico Filtrar por un valor que debe calcularse primero. Combinar filas relacionadas de dos o más tablas
Curva de aprendizaje Suave, familiar para principiantes Más empinado, requiere conocimiento de los tipos de uniones

Si tiene la opción, se recomienda utilizar JOIN en lugar de una subconsulta. Las subconsultas solo deben utilizarse como solución alternativa cuando no se pueda utilizar una operación JOIN para lograr lo anterior.

Subconsultas versus uniones

Las subconsultas también son fáciles de descomponer en componentes lógicos individuales, lo cual es muy útil cuando las pruebas y depurar las consultas.

Preguntas Frecuentes

Una subconsulta correlacionada hace referencia a una columna de la consulta externa, por lo que se evalúa una vez por cada fila externa. Una subconsulta no correlacionada es independiente y se ejecuta solo una vez. Las subconsultas correlacionadas son potentes, pero notablemente más lentas en tablas grandes.

Una subconsulta puede ubicarse en la cláusula WHERE, la cláusula HAVING, la lista SELECT o la cláusula FROM, donde se convierte en una tabla derivada y requiere un alias. También es válida dentro de las sentencias INSERT, UPDATE y DELETE.

A menudo, sí. Asistentes de IA integrados en editores como MySQL Banco de trabajo puede proponer un equivalente ÚNETESiempre compare el número de filas y lea el plan EXPLAIN antes de confiar en la reescritura, ya que el manejo de valores NULL puede variar.

Sí. Los asistentes de conversión de texto a SQL transforman una pregunta como "¿qué categoría tiene la menor cantidad de películas?" en una consulta SELECT anidada. La precisión depende del esquema proporcionado al modelo, por lo que conviene revisar la consulta generada comparándola con los nombres reales de las tablas.

El error aparece cuando una subconsulta colocada después de un operador de comparación devuelve varias filas. Reemplace el operador por IN, ANY o EXISTS, o ajuste la cláusula WHERE interna para que solo se devuelva una fila.

Resumir este post con: