Una subconsulta no es otra cosa, sino una consulta dentro de otra. Las subconsultas son la forma más sencilla de extraer datos de diferentes tablas relacionadas en un base de datos. Como en muchas ocasiones necesitaremos construir consultas complejas, terminaremos anidando consultas dentro de otras.
Tabla de Contenido
Preparando el escenario para las subconsultas
Crearemos nuestra base de datos con las siguientes tablas:

Haremos primero la tabla de marcas:
create table if not exists marcas(
marId int not null auto_increment,
marNombre varchar(30),
primary key(marId)
);
Después, creamos la tabla de unidades de medida.
-- Crear la tabla de unidades de medida
create table if not exists medidas(
medId int not null auto_increment,
medNombre varchar(30) not null,
medAbreviar varchar(5),
primary key(medId)
);
Ahora toca el turno a la tabla de presentaciones.
-- Crear la tabla de presentaciones
create table if not exists presenta(
preId int not null auto_increment,
preNombre varchar(50) not null,
primary key(preId)
);
Continuamos con la tabla de proveedores.
-- Crear la tabla de proveedores
create table if not exists proveedor(
proId int not null auto_increment,
proNombre varchar(100) not null,
proDomicilio varchar(255) not null,
proTelefono varchar(40) not null,
proCorreo varchar(50),
proRFC varchar(15) not null,
proVendedor varchar(50) not null,
primary key(proId)
);
Inmediatamente, la tabla de productos.
-- Crear la tabla Productos
create table if not exists productos(
proId int not null auto_increment,
proNombre varchar(30) not null,
proMarca int not null,
proCaducidad date not null,
proContNeto int not null,
proDescribe mediumtext not null,
proCodBarras varchar(20),
proInfNutri varchar(255),
proIngred varchar(255),
proProveedor int not null,
proUnidadMed int not null,
proPresenta int not null,
proCantidad int not null,
proPrecio decimal(10,2) not null,
proCosto decimal(10,2) not null,
primary key(proId)
)
Por último, añadimos las correspondientes llaves foráneas.
-- Modificar productos para agregar llave foránea sobre marcas
alter table productos add foreign key(proMarca) references marcas(marId);
-- Modificar producto para agregar la llave foránea sobre proveedores
alter table productos add foreign key(proProveedor) references proveedor(proId);
-- Modificar productos para agregar la llave foránea sobre medidas
alter table productos add foreign key(proUnidadMed) references medidas(medId);
-- Modificar productos para agregar llave foránea sobre presentación
alter table productos add foreign key(proPresenta) references presenta(preId);
Preparando datos para las consultas y subconsultas
Necesitaremos algunos datos. Aquí tenemos primero la tabla de marcas llena de datos.

Ahora los datos para las unidades de medida.

Continuamos con los datos para las presentaciones.

Los proveedores son los siguientes:
Nuestros productos son:
¿Cómo se crean las subconsultas?
Básicamente, la subconsulta puede reemplazar la posición de un campo cualquiera dentro de una consulta principal, en decir, tiene la forma:
select campo, (subconsulta) as alias from tabla
Por ejemplo: imaginemos que queremos una lista de nuestros productos con su nombre, contenido neto y unidad de medida. Para obtener lo que queremos podemos utilizar la siguiente consulta:
select proNombre, proContNeto, proUnidadMed from productos;
Al observar el resultado obtenido, podemos ver que sólo obtenemos el id de cada unidad de medida.

Así que reemplazaremos el último campo (proUnidadMed) por una subconsulta que utilice ese campo dentro de la tabla de unidades de medida. Observe la subconsulta al final.
select proNombre, proContNeto, (select medNombre from medidas where medId = proUnidadMed) as Medida from productos;
El resultado salta a la vista.

Hagamos ejercicios de subconsultas
Ahora que ya sabemos como funciona una subconsulta, hagamos algunos ejercicios interesantes:
Lista de productos que incluye cantidad y presentación
select proNombre, proCantidad, (select preNombre from presenta where preId = proPresenta) as "Presentación" from productos;

Lista de productos con cantidad, precio y proveedor, ordenados por este último criterio.
select proNombre, proCantidad, proCosto, (select proNombre from proveedor where proId = proProveedor) as Proveedor from productos order by proProveedor;

La misma lista anterior, pero incluyendo la marca de cada producto.
select proNombre, (select marNombre from marcas where marId = proMarca) as Marca, proCantidad, proCosto, (select proNombre from proveedor where proId = proProveedor) as Proveedor from productos order by proProveedor;

Lista de productos con presentación, contenido neto y unidad de medida concatenados en una sola oración.
select proNombre as Producto, concat((select preNombre from presenta where preId = proPresenta), " de ", proContNeto, " ", (select medNombre from medidas where medId = proUnidadMed)) as "Información" from productos;

En cuestiones de rendimiento, no se puede asegurar al 100% que las subconsultas sean más efectivas que otros métodos como JOIN o UNION, ya que en realidad esto depende de diversos factores como el manejo de los índices, el tamaño de las tablas, el motor de la base de datos, entre otros. No obstante, proveen una forma bastante interesante de extraer datos.
¡Y eso es todo por ahora! ¿Te ha resultado? Déjanos saber en los comentarios aquí abajo, en nuestra cuenta de twitter @cablenaranja7 o en nuestra página de facebook.

Docente, IT Manager, Blogger & Developer. Escribo por diversión, educo por pasión. | Grandstanding is not my thing.