Manejo de subconsultas en MySQL - CableNaranja

¡Comparte nuestro contenido!

¡Haz clic para puntuar esta entrada!
(Votos: 3 Promedio: 3.3)

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.

Preparando el escenario para las subconsultas

Crearemos nuestra base de datos con las siguientes tablas:

Manejo de subconsultas en MySQL - CableNaranja

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.

Manejo de subconsultas en MySQL - CableNaranja

Ahora los datos para las unidades de medida.

Manejo de subconsultas en MySQL - CableNaranja

Continuamos con los datos para las presentaciones.

Manejo de subconsultas en MySQL - CableNaranja

Los proveedores son los siguientes:

Manejo de subconsultas en MySQL - CableNaranja

Nuestros productos son:

Manejo de subconsultas en MySQL - CableNaranja

¿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.

Manejo de subconsultas en MySQL - CableNaranja

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.

Manejo de subconsultas en MySQL - CableNaranja

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;
Manejo de subconsultas en MySQL - CableNaranja

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;
Manejo de subconsultas en MySQL - CableNaranja

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;
Manejo de subconsultas en MySQL - CableNaranja

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;
Manejo de subconsultas en MySQL - CableNaranja

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.

¡Comparte nuestro contenido!

Entradas relacionadas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *