Ejercicios resueltos de consultas SQL con C y MySQL: clientes, empleados y propietarios
Resumen
Colección de ejercicios resueltos de consultas SQL sobre bases de datos de clientes, productos, compras, empleados, proyectos y propietarios de viviendas. Cada ejercicio incluye el enunciado, la consulta SQL correspondiente y el código en C con la librería de MySQL que la ejecuta y muestra los resultados. Sirve para practicar consultas con varias tablas, condiciones y parámetros introducidos por el usuario.
Puntos clave
- Las consultas combinan varias tablas (clientes, productos y compras; empleados, proyectos y participaciones; propietarios, propiedades y viviendas) mediante condiciones de igualdad entre claves.
- El primer ejercicio busca los clientes que han comprado al menos dos unidades del producto PPP.
- En los programas en C se usa sprintf para construir la consulta con el valor introducido por el usuario.
- Tras ejecutar la consulta con mysql_query, mysql_store_result guarda el resultado y mysql_fetch_row lo recorre fila a fila.
- El ejercicio de proyectos filtra los empleados con rol de secretario en proyectos cuyo presupuesto es inferior al límite indicado.
Cliente (id / nombre) Producto (id / nombre / precio) Relación compra (idC / idP / númeroU)
“Dame los nombres de los clientes que han comprado más de dos unidades del producto PPP”
SELECT nombreC FROM clientes, productos, compras WHERE ((nombreP = 'PPP') AND (idProducto=idP) AND (cantidad>=2) AND (idCliente=idCli))
Pedir nombre cliente y listar cantidades y precio que ha comprado.
printf ("Escribe el nombre del cliente: ");
scanf ("%s", nombre);
printf ("%s",nombre);
sprintf (consultasql, "SELECT nombreP, cantidad, precio FROM clientes, productos, compras WHERE ((nombreC = '%s') AND (idCliente=idCli) AND (idProducto=idPro))", nombre);
if (err!=0)
{
printf ("Error al consultar datos de la base %u %s\n",mysql_errno(conn), mysql_error(conn));
exit (1);
}
resultado = mysql_store_result (conn);
if (resultado == NULL)
printf ("No se han obtenido datos en la consulta\n");
else
{
printf ("Producto, Cantidad y precio\n");
row = mysql_fetch_row (resultado);
while (row !=NULL)
{
int c = atoi (row[1]);
int p = atoi (row[2]);
printf ("Producto: %s, Cantidad: %d, Precio: %d\n",row[0],c,p );
row = mysql_fetch_row (resultado);
}
}
B3
Empleado (nombre / edad / salario) Proyecto (titulo / presupuesto / duracion)
Relacion(idE / idP / Rol)
Obtener nombre secretario con proyectos presupuesto < 1000000
SELECT Empleados.Nombre FROM Empleados, Proyectos, Participaciones WHERE Proyectos.Presupuesto < 1000000 AND Proyectos.Nombre = Participaciones.Proyecto AND Participaciones.Rol = 'Secretario' AND Participaciones.Empleado = Empleados.Nombre
Pedir presupuesto y buscar nombre secretarios
printf ("Dame el limite de presupuesto\n");
scanf ("%f",&limite);
strcpy (consulta,"SELECT Empleados.Nombre FROM Empleados, Proyectos, Participaciones WHERE Proyectos.Presupuesto <");
sprintf (consulta, "%s%f",consulta,limite);
strcat (consulta,"AND Proyectos.Nombre = Participaciones.Proyecto AND Participaciones.Rol = 'Secretario' AND Participaciones.Empleado = Empleados.Nombre");
err=mysql_query (conn, consulta);
if (err!=0)
{
printf ("Error al consultar datos de la base %u %s\n", mysql_errno(conn), mysql_error(conn));
exit (1);
}
resultado = mysql_store_result (conn);
row = mysql_fetch_row (resultado);
if (row == NULL)
printf ("No se han obtenido datos en la consulta\n");
else
{
while (row !=NULL)
{
printf ("Secretario: %s\n", row[0]);
row = mysql_fetch_row (resultado);
}
}
B6
Propietario(id, nombre, dni, mail) y Vivienda(id, dirección)
Dame nombres propietarios que comparten alguna propiedad con el propietario cuyo dni es 45789854Z.
SELECT Propietarios.Nombre FROM Propietarios, Propiedades WHERE Propiedades.Vivienda IN (SELECT Propiedades.Vivienda FROM Propietarios,Propiedades WHERE Propietarios.DNI = '45789854Z' AND Propietarios.Id = Propiedades.Propietario) AND Propiedades.Propietario = Propietarios.Id
Pedir nombre propietario y escribir las direcciones de viviendas de las cuales es propietario.
char nombre [20];
printf ("Dame el nombre del propietario\n");
scanf ("%s",&nombre);
strcpy (consulta,"SELECT Viviendas.Direccion FROM Propietarios,Propiedades,Viviendas WHERE Propietarios.Nombre = ' ");
sprintf (consulta, "%s%s",consulta,nombre);
strcat (consulta," ' AND Propietarios.Id=Propiedades.Propietario AND Propiedades.Vivienda = Viviendas.Id);
if (row == NULL)
printf ("No se han obtenido datos en la consulta\n");
else
{
while (row !=NULL)
{
printf ("Direccion: %s\n", row[0]);
row = mysql_fetch_row (resultado);
}
}
Descargar
PDF Word HTMLPreguntas frecuentes
¿Cómo se ejecuta una consulta SQL desde C con MySQL?
Se construye la sentencia SQL como cadena, por ejemplo con sprintf, y se ejecuta con mysql_query pasando la conexión. Después se obtiene el resultado con mysql_store_result y se recorre con mysql_fetch_row.
¿Qué consulta SQL devuelve los clientes que compraron más de dos unidades de PPP?
La consulta selecciona nombreC de las tablas clientes, productos y compras, filtrando por nombreP = 'PPP', por cantidad mayor o igual a 2 y por las claves que relacionan las tablas.
Ponte a prueba
Tarjetas de repaso
Pulsa una tarjeta para ver la respuesta.
Test
Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.