Ejercicios resueltos de consultas SQL con C y MySQL: clientes, empleados y propietarios

InformáticaActualizado el 3,92 KB

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.

Ponte a prueba

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 HTML

Preguntas 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

1. ¿Qué función de la librería de MySQL se usa para ejecutar una consulta en el código de ejemplo?
2. ¿Qué condición exige el primer ejercicio sobre las compras?
3. ¿Qué rol se busca en el ejercicio de proyectos con presupuesto menor que el límite?
4. ¿Qué función se usa para obtener la siguiente fila del resultado?

Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.