AnteriorPosterior

9 - Subconsultas

Por: Nacho Cabanes
Actualizado: 17-04-2019 10:55
Tiempo de lectura estimado: 6 min.

 

SQL y MySQL

9.1. ¿Qué es una subconsulta?

A veces tenemos que realizar operaciones más complejas con los datos, operaciones en las que nos interesaría ayudarnos de una primera consulta auxiliar que extrajera la información en la que nos queremos basar. Esta consulta auxiliar recibe el nombre de "subconsulta" o "subquery".

Por ejemplo, si queremos saber qué clientes tenemos en la ciudad que más habitantes tenga, la forma "razonable" de conseguirlo sería saber en primer lugar cual es la ciudad que más habitantes tenga, y entonces lanzar una segunda consulta para ver qué clientes hay en esa ciudad.

Como la estructura de nuestra base de datos de ejemplo es muy sencilla, no podemos hacer grandes cosas, pero un caso parecido al anterior (aunque claramente más inútil) podría ser saber qué personas tenemos almacenadas que vivan en la última ciudad de nuestra lista.

Para ello, la primera consulta (la "subconsulta") sería saber cual es la última ciudad de nuestra lista. Si suponemos que los códigos numéricos son crecientess, y lo hacemos tomando la ciudad que tenga el último código (el mayor de ellos), la consulta podría ser:

SELECT MAX(codigo) FROM ciudades;

Vamos a imaginar que pudiéramos hacerlo en dos pasos. Si llamamos "maxCodigo" a ese código obtenido, la "segunda" consulta podría ser:

SELECT * FROM personas WHERE codciudad = maxCodigo;

Pero estos dos pasos se pueden dar en uno: al final de la "segunda" consulta (la "grande") incluimos la primera consulta (la "subconsulta"), entre paréntesis, así

SELECT * FROM personas WHERE codciudad = (
  SELECT MAX(codigo) FROM ciudades
);

 

9.2. Subconsultas que devuelven conjuntos de datos

Si la subconsulta no devuelve un único dato, sino un conjunto de datos, la forma de trabajar será básicamente la misma, pero para comprobar si el valor coincide con alguno de la lista, no usaremos el símbolo "=", sino la palabra "in".

Por ejemplo, vamos a hacer una consulta que nos muestre las personas que viven en ciudades cuyo nombre tiene una "a" en segundo lugar (por ejemplo, serían ciudades válidas Madrid o Barcelona, pero no Alicante).

Para consultar qué letras hay en ciertas posiciones de una cadena, podemos usar SUBSTRING (en el próximo apartado veremos las funciones más importantes de manipulación de cadenas, pero podemos anticipar ya que recibe tres datos: el nombre del campo, la posición inicial y la longitud). Así, una forma de saber qué ciudades tienen una letra A en su segunda posición sería:

SELECT codigo FROM ciudades 
WHERE SUBSTRING(nombre,2,1)='a';

Como esta subconsulta puede devolver más de un resultado, deberemos usar IN para incluirla en la consulta principal, que quedaría de esta forma:

SELECT * FROM personas 
WHERE codciudad IN 
(
  SELECT codigo FROM ciudades WHERE SUBSTRING(nombre,2,1)='a'
);

9.3. Ejercicios propuestos

  • 9.1. Partiremos de la base de datos "ejercicio8", que creaste en el ejercicio 8.1. Si no lo habías hecho, crea ahora una nueva base de datos "ejercicio9", que tendrá una única tabla "ordenadores". De cada ordenador se desea guardar un código (que será la clave primaria), una marca (no nula), un modelo y un año de lanzamiento (mira los datos de ejemplo para deducir los tipos de datos necesarios).
  • Añade los ordenadores:
    • ATM, Oric, Atmos, 1984
    • ZX80, Sinclair, ZX80, 1980
    • VIC20, Commodore, VIC-20, 1981
    • VG8235, Philips, VG8235 MSX2, 1985
    • C64, Commodore, 64, 1982
    • 520ST, Atari, 520ST, 1985
  • 9.3. Muestra la(s) marca(s) de la(s) que tenemos más ordenadores.
  • 9.4. Muestra los modelos de los ordenadores pertenecientes a la(s) marca(s) de la(s) que tenemos más ordenadores.
  • 9.5. Muestra los modelos de los ordenadores pertenecientes a la(s) marca(s) a la que pertenece el ordenador más reciente, ordenados alfabéticamente (usando el modelo como criterio de ordenación).
  • 9.6. Muestra todos los datos de los ordenadores de la primera marca (alfabéticamente, ordenadas de la A a la Z).
  • 9.7. Muestra los modelos de los ordenadores que no pertenezcan a las marcas que comienzan con letra A, usando una subconsulta.

331 visitas desde el 17-04-2019

AnteriorPosterior