0

Pues estoy estudiando MySQL haciendo updates en una tabla, y no sé exactamente cuando usar inner join y cuando usar where.

Me he leído la teoría y he visto algunos ejemplos, pero no me queda claro las diferencias y cuando usar uno u otro.

Por ejemplo, en varios ejercicios que he hecho, he visto que podía llegar al mismo resultado de ambas formas, con la condición en el join y con una condición en el where, así que me he confundido incluso más.

En el siguiente ejercicio:

Rebaja en un 5% el precio de todos los productos que cuesten menos de 1000 € y cuyo nivel de existencias sea mayor del doble de la media de las existencias de todos los productos.

No sabría que usar, si inner join o un set con una condición where.

Para aclarar un poco más, pongo la primera parte de ejercicio:

Añadir una nueva tabla, llamada ejercicio31, a la BD Ventas. Esta nueva tabla contendrá los códigos de todos los productos existentes, sus precios y sus existencias, así como el número total de unidades vendidas

Creo que tendría que hacer un set en precio de la tabla ejercicio y una condición, que tampoco estoy seguro de cómo hacer. ¿O es mejor utilizar un join?

Perdonad por tanta parrafada. Y muchas gracias.

Tablas:

CREATE TABLE `producto` (
  `IDPRODUCTO` varchar(6) NOT NULL,
  `DESCRIPCION` varchar(15) NOT NULL,
  `PRECIO` int DEFAULT NULL,
  `EXISTENCIAS` int unsigned DEFAULT NULL,
  PRIMARY KEY (`IDPRODUCTO`),
  UNIQUE KEY `DESCRIPCION_UNIQUE` (`DESCRIPCION`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `ejercicio31` (
  `CodProducto` varchar(6) NOT NULL,
  `PRECIO` int DEFAULT NULL,
  `Existencias` int DEFAULT NULL,
  `CantidadVendido` int DEFAULT '0',
  PRIMARY KEY (`CodProducto`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Lo que he probado:

update ejercicio31 e, 
(
    select avg(existencias) ex
    from ejercicio31 
) e2
set precio = precio * 0.95
where existencias > e2.ex * 2;
BetaM
  • 30,571
  • 7
  • 32
  • 50
Manuel
  • 668
  • 1
  • 6
  • 15
  • 1
    Por favor lee [ask] y de paso checa el [tour]; al momento tu pregunta luce amplia y basada en opiniones lo cual generaría su cierre, por otro lado si agregas no solo el texto de tu ejercicio sino además lo que has intentado, tus tablas y los errores obtenidos tal vez tu pregunta tenga mas chances de seguir abierta y recibir apoyo – BetaM Feb 01 '20 at 19:22
  • 1
    [Aqui te dejo el post, donde se pregunto](https://es.stackoverflow.com/questions/52530/cual-es-la-diferencia-entre-joins-impl%C3%ADcitos-y-expl%C3%ADcitos) – Infa Feb 01 '20 at 19:23
  • Perdón y gracias a ambos. No estaba seguro de cómo preguntar. Voy a ver si puedo mejorar la pregunta. – Manuel Feb 01 '20 at 19:31
  • 1
    Al margen de lo que los expertos te puedan recomendar, creo que una de las maneras mas objetivas de medir el rendimiento de tu consulta es agregar el EXPLAIN al inicio de la misma para ver en terminos reales el rendimiento de la misma – BetaM Feb 01 '20 at 19:35

1 Answers1

1

Básicamente, un INNER JOIN se utiliza para obtener información que involucra mas de una tabla. Un INNER JOIN traerá la información de ambas tablas donde una de sus propiedades coincida.

En cambio, un WHERE es utilizado para obtener registros que solo cumplan la condición que se les indique, y puede ser utilizado en una sola tabla, o en conjunto con un INNER JOIN para obtener información más completa.

En relación a lo que creo intentas realizar, pienso que es mejor utilizar un WHERE, como lo haz hecho, puesto que es una sola tabla en la que tienes lo información de existencias y precios.

  • En teoría los distintos tipos de joins también sirven para obtener información bajo ciertos criterios – BetaM Feb 01 '20 at 20:02
  • 1
    Ademas, un inner join (y en general cualquier tabla) se puede relacionar con otras o consigo mismas (relación reflexiva) por lo que es posible obtener resultados en la condición del ON y del WHERE – Jakala Feb 01 '20 at 20:20
  • Gracias por la ayuda y la aclaración. Sigue probanndo, pero no consigo hacerlo funcionar. Me sale este aviso: 0 row(s) affected, 1 warning(s): 1265 Data truncated for column 'ex' at row 1 Rows matched: 3 Changed: 0 Warnings: 1 – Manuel Feb 01 '20 at 21:10