Saltar la navegación

3.8. Multitabla

Muchas consultas útiles solicitan datos procedentes de dos o más tablas en la base de datos.

Por ejemplo, las siguientes consultas extraen los datos de varias tablas:

  • Lista los productos y la categoría a la que pertenecen (tablas PRODUCTOS y CATEGORIAS).
  • Lista los pedidos mostrando el importe del pedido, el nombre del cliente que lo ordenó y el nombre del producto solicitado (tablas PEDIDOS, CLIENTES, DETALLES DEL PEDIDO y PRODUCTOS).
  • Muestra todas los pedidos aceptados enviados a Alemania, mostrando la descripción del producto y el vendedor (tablas PEDIDOS, DETALLES DEL PEDIDO, EMPLEADOS y PRODUCTOS).

SQL permite recuperar datos que responden a estas peticiones mediante consultas multitabla que componen (JOIN) datos procedentes de dos o más tablas. Por ejemplo, la consulta “lista todos los pedidos, mostrando su número, nombre del cliente, producto vendido e importe" se realiza de cualquiera de las siguientes formas:

SELECT IdPedido, NombreCompañía, Producto, Cargo FROM pedidos, clientes WHERE clie=num_clie

SELECT IdPedido, NombreCompañía, Producto, Cargo FROM pedidos INNER JOIN clientes ON clie=num_clie;

Luego se pueden utilizar todo lo aprendido hasta ahora para filtrar los resultados que se desean obtener.

Consultas sobre 3 o más tablas

SQL puede combinar datos de tres o más tablas utilizando las mismas técnicas básicas utilizadas para las consultas de dos tablas. Un "sencillo" ejemplo es el siguiente:

SELECT Pedidos.IdPedido, Cargo, NombreCategoria

FROM Pedidos, `Detalles de pedidos` AS Detalles, Productos, Categorias

WHERE Pedidos.IdPedido = detalles.IdPedido AND detalles.IdProducto = Productos.idProducto AND Productos.IdCategoria = Categorias.IdCategoria AND Cargo > 120;

INNER, LEFT y RIGHT JOIN

La selección multitabla anterior se basa en el producto cartesiano de los elementos de cada tabla separada por coma filtrados por la coincidencia de los campos clave y foráneo (ajeno). El siguiente ejemplo muestra el producto cartesiano de la tabla Camisas y la tabla Pantalones.

SELECT Camisas.*, Pantalones.* FROM Camisas, Pantalones;

Cuando se aplica la condición mediante la sentencia WHERE, se escogen únicamente los registros en los que el valor de un campo en Camisas sea igual al valor de otro campo en Pantalones.

Por ejemplo, ... WHERE ID_Camisas=ID_Pantalones extraería sólo los registros en los que la primera y cuarta columnas fuera iguales (2 registros como se puede observar).


Se debe evitar el uso de este método en tablas muy grandes debido al gasto computacional que supone. En vez de ello se usan las cláusulas INNER JOIN, LEFT JOIN y RIGHT JOIN que seleccionan durante el proceso gracias a la comparación entre dos campos (al igual que en el método anterior) mediante la cláusula ON.

  • INNER JOIN: Devuelve todas las filas cuando hay al menos una coincidencia en ambas tablas.
  • LEFT JOIN: Devuelve todas las filas de la tabla de la izquierda, y las filas coincidentes de la tabla de la derecha.
  • RIGHT JOIN: Devuelve todas las filas de la tabla de la derecha, y las filas coincidentes de la tabla de la izquierda.

INNER JOIN

INNER JOIN selecciona todas las filas de las dos columnas siempre y cuando haya una coincidencia entre las columnas en ambas tablas. Es el tipo de JOIN más común.

SELECT nombreColumna(s)
FROM tabla1
INNER JOIN tabla2
ON tabla1.nombreColumna=table2.nombreColumna;

LEFT JOIN

LEFT JOIN mantiene todas las filas de la tabla izquierda (la tabla1). Las filas de la tabla derecha se mostrarán si hay una coincidencia con las de la izquierda. Si existen valores en la tabla izquierda pero no en la tabla derecha, ésta mostrará NULL.

SELECT nombreColumna(s)
FROM tabla1
LEFT JOIN tabla2
ON tabla1.nombreColumna=tabla2.nombreColumna;

RIGHT JOIN

Es igual que LEFT JOIN pero al revés. Ahora se mantienen todas las filas de la tabla derecha (tabla2). Las filas de la tabla izquierda se mostrarán si hay una coincidencia con las de la derecha. Si existen valores en la tabla derecha pero no en la tabla izquierda, ésta se mostrará null.

SELECT nombreColumna(s)
FROM tabla1
RIGHT JOIN tabla2
ON tabla1.nombreColumna=tabla2.nombreColumna;