sql >> Base de Datos >  >> RDS >> Mysql

Rendimiento de MySQL:Introducción a JOIN en SQL

En este artículo, aprenderemos los conceptos básicos para unir tablas en SQL. Aprenderemos sobre los JOINs izquierdo, derecho, interior y exterior y daremos ejemplos de cómo usarlos.

Los datos en un RDBMS (Sistema de gestión de bases de datos relacionales) se agrupan en tablas. Estas tablas tienen una definición rígida del tipo de datos que se pueden almacenar en ellas. Para conectar diferentes tablas y, por lo tanto, diferentes tipos de datos que pueden relacionarse entre sí, usaremos la cláusula JOIN.

Tipos de JOIN

Hay cuatro tipos básicos de JOIN:INNER, OUTER, LEFT y RIGHT. Al conectar dos tablas, cada una devolverá un subconjunto diferente de las tablas correspondientes según la condición de la cláusula ON.

  • LEFT y RIGHT JOIN realizan una tarea similar. Ambos devuelven la totalidad de una sola tabla con información relacionada con la segunda tabla.
  • INNER y OUTER JOIN realizan tareas muy diferentes. INNER JOIN produce un resultado muy limitado, mientras que OUTER devuelve un conjunto de datos completo.
Nota:Al momento de escribir este artículo, MariaDB y MySQL no admiten OUTER JOIN. Sin embargo, proporcionaremos un ejemplo de una forma de producir esta salida de una manera diferente.

En este ejemplo, estamos usando el ejemplo de un departamento de ventas para este tutorial, empleando tres tablas:vendedores, pedidos y clientes.

La tabla de vendedores tendrá tres columnas:id, nombre y tasa de comisión.

A continuación, la tabla de pedidos contendrá cuatro columnas:la identificación del pedido, el costo total del pedido, el cliente y, si está disponible, el vendedor.

La tabla de clientes contendrá dos columnas:identificación e información básica de contacto.

Entonces, ahora tenemos múltiples tablas de información que son útiles para diferentes personas de diferentes maneras. Usando estas tres tablas (vendedores, pedidos y clientes), proporcionaremos ejemplos de cómo cada uno de los JOIN podría ser útil.

ÚNETE A LA IZQUIERDA

Probablemente el tipo de JOIN más utilizado es LEFT JOIN. Si piensa en las dos tablas unidas, la mencionada en la cláusula FROM está a la izquierda. El mencionado en la cláusula JOIN está a la derecha. En LEFT JOIN, cada fila de la tabla LEFT (o FROM) se devuelve en el resultado y se vincula con las filas correspondientes de la tabla RIGHT (o JOIN) que coinciden con la cláusula ON.

Tenga en cuenta que algunas filas de la IZQUIERDA pueden no tener datos coincidentes en la DERECHA. En ese caso, los campos que se habrían completado desde la tabla DERECHA en el resultado se completarán con un valor NULL.

Además, si varias filas de la tabla DERECHA coinciden con las filas de la tabla IZQUIERDA, se incluirán varias filas en el conjunto de resultados. Un diagrama de Venn muestra cómo se vería una UNIÓN IZQUIERDA:

El Director de Marketing te pide un informe de todos los pedidos desglosados ​​por cliente. Puede usar LEFT JOIN para esto:

SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;

Esta consulta solicita todos los datos en la tabla "pedidos" vinculados con las filas en la tabla "cliente", donde la identificación del cliente es igual a la identificación_cliente en orden. El resultado se vería así:

Observe que para el cliente de Widgets LLC, hay tres entradas porque tenían tres pedidos. Jolly Inc. hizo dos pedidos y Acme Inc hizo uno. Cheapo no aparece en esta lista porque no se realizaron pedidos.

UNIÓN DERECHA

RIGHT JOIN es muy similar a LEFT JOIN, excepto que devuelve todas las filas de la tabla RIGHT (JOIN) y solo las filas correspondientes de la tabla LEFT (FROM). Nuevamente, si no hay datos en la tabla IZQUIERDA, esas columnas se completarán con valores NULL.

Si hay varias filas en la tabla IZQUIERDA, habrá varias filas en el conjunto de resultados. Su diagrama de Venn se vería así:

Si la gerencia quiere un informe con CADA cliente; incluso si no hicieron un pedido, podríamos usar un RIGHT JOIN.

SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;

Nuevamente, comenzamos con la tabla de "pedidos" y la UNIMOS a la tabla de clientes. Debido a que usamos RIGHT JOIN, obtendremos al menos una fila para cada entrada en la tabla RIGHT (JOIN), cliente. Cuando hay una coincidencia entre customer.id y orders.customer_id, se completa la información.  Los resultados incluyen Cheapo Co con valores NULL en las columnas de pedido:

UNIÓN INTERNA

Un INNER JOIN devuelve solo las filas de cada columna que coinciden con la cláusula ON. Si no hay una coincidencia en la DERECHA, se excluyen las filas de la IZQUIERDA y viceversa. El diagrama de Venn para un INNER JOIN se ve así:

Es día de pago y el departamento de nómina necesita saber cuánta comisión pagar. Para ello, necesitará conocer los pedidos que se realizaron a través de cada vendedor. Tenga en cuenta que no todos los pedidos pasaron por un vendedor, por lo que no nos preocupamos por ellos. Para esto podemos usar un INNER JOIN:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

De nuevo empezamos con la tabla de pedidos. Esta vez lo estamos uniendo con la mesa de vendedores. Si hay una entrada en la tabla de pedidos que coincide con una entrada en la tabla de vendedores, se incluirá la fila. En lugar de completar filas no coincidentes con valores NULL, esas filas se ignoran en los resultados.

Tenga en cuenta que le estamos diciendo a la base de datos que no solo devuelva el monto de la venta y la tasa de comisión, sino también la comisión calculada. Los resultados se verían así:

UNIÓN EXTERNA

Un OUTER JOIN devuelve todo sin importar si hay una coincidencia. Si tuviera que combinar los resultados de una UNIÓN IZQUIERDA y DERECHA, obtendría una UNIÓN EXTERNA. El diagrama de Venn para OUTER JOIN se ve así:

Ahora es fin de mes y el gerente de ventas quiere saber TODAS las ventas así como todas las comisiones que se pagaron. Para ello utilizaremos un OUTER JOIN:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Al igual que el informe de nómina, empezamos con los pedidos y ÚNASE a los vendedores. La diferencia es que con OUTER JOIN obtendrá resultados de las tablas IZQUIERDA y DERECHA con NULL rellenado donde no hay una coincidencia correspondiente. Los resultados se ven así:

Ahora, recuerde que dijimos que MariaDB y MySQL no son compatibles con OUTER JOIN. También dijimos que si agrega un LEFT JOIN a un RIGHT JOIN obtendrá un OUTER JOIN. El truco en esos dos sistemas es hacer precisamente eso. Logramos esto con la cláusula UNION. Agrega los resultados de una consulta a otra:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Los resultados se verían así:

UNIONES MÚLTIPLES

JOIN también le permite conectar más de dos mesas. Si queremos un informe de ventas completo con información de clientes y vendedores, simplemente hacemos otro JOIN al final.

SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;

En este ejemplo, comenzamos con la tabla de pedidos y la conectamos a la tabla de vendedores como lo hicimos antes. El siguiente paso es UNIR la mesa a la mesa del cliente. Esto completará toda la información que se puede vincular a la tabla de pedidos.

Este artículo es una breve introducción y no pretende ser una discusión exhaustiva de cómo se puede usar JOIN en SQL.

¡Haga clic a continuación para usar este conveniente cupón hoy!

Liquid Web tiene algunos de los servidores de bases de datos más potentes de la industria. Estos servidores se pueden utilizar para ejecutar desde el negocio doméstico más pequeño hasta los clústeres de múltiples bases de datos más grandes para corporaciones de escala empresarial.

¡Llámenos al 800.580.4985, o abra un chat o un ticket con nosotros para hablar con uno de nuestros asesores de alojamiento o soluciones con experiencia para aprender cómo puede aprovechar estas técnicas hoy!

Navegación en serie<