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: