26 abril 2007

Arrejuntando datos

Hace tiempo que escribí acerca de muchas opciones que tiene la instrucción SELECT de SQL para hacer consultas. Sin embargo, solo eran consultas simples, sin mayor chiste ya que esas consultas solo consultan (valga la redundancia) una tabla. Pero, ¿qué pasa cuando tengo datos en diferentes tablas y quiero un solo reporte que contenga datos de ellos? Para eso existe la instrucción INNER JOIN que se escribe en un SELECT.

Vamos a ver como funciona esta onda. Estas es la sintaxis para unir dos tablas (luego lo extendemos para usar datos de más tablas, pero vámonos despacio porque llevamos prisa, diría Napoleón):

SELECT lista_de_campos_de_las_tablas FROM tabla1 INNER JOIN tabla2 ON campo_tabla1=campo_tabla 2

Al final puedo poner un WHERE, ORDER BY o lo que sea (bueno, lo que sea que sea válido, valga la repetidera de "que seas").

¿Qué hace esta instrucción? En primer lugar, enlista los campos que quieres obtener en la consulta, sin importar de qué tabla son. Si hay campos que se llaman igual en ambas tablas, hay que escribir el nombre de la tabla seguido de un punto y luego el nombre del campo. Más a delante lo vemos en un ejemplo. Después del FROM viene el INNER JOIN seguido de la tabla que se quiere adjuntar, mezclar, pegar, añadir, o como le quieras decir. Hasta aquí todo es felicidad y alegría, con la excepción de que el SELECT no va a saber cómo relacionar los registros de las dos tablas. Para esto, entra en acción el tremendo ON que iguala los campos que tienen el mismo valor de ambas tablas.

Sé que los choros mareadores les aburren, así que les voy a explicar con un ejemplo sencillito. Supongamos que una librería tiene un sistema que controla los libros. Esta sería la esctructura y datos de las tablas Libros, Editoriales y Autores (ahorita uso Libros y Editoriales, luego usamos los Autores):


Supongamos que quiero saber todos los títulos cuyo título comience con la letra W. Quiero ver el título, el precio y la editorial. La consulta SELECT Titulo,EditorialID,Precio FROM Libros WHERE Titulo LIKE "W*" me arrojaría este conjunto de registros:


Muy padre pero, ¿qué editorial es la 5? ¿y la 7? Quien sabe. No es información útil para el simple mortal. Ahora intentemos con un INNER JOIN a ver que pasa. Esta sería la instrucción SQL:

SELECT Titulo,Nombre,Precio FROM Libros INNER JOIN Editorial ON Libros.EditorialID=Editorial.EditorialID WHERE Titulo LIKE "W*"

y me devolvería estos datos:


Mucho mejor, ¿no? Solo le estoy diciendo que los campos requeridos (Titulo, Nombre y Precio) están en las tablas Libros y Editorial y lo que tienen en común es el campo EditorialID. Nótese que no tengo que decir de que tabla es cada dato siempre y cuando no hayan campos con el mismo nombre en las tablas que se unen en la consulta.

Ahora vámonos complicando la existencia un poco para facilitársela al usuario y como el usuario es quien paga, hay que hacerle caso. Un reporte que se me hace muy útil para una tienda que vende libros es el de los libros y las cantidades de libros que se tienen. Por lo tanto, necesitamos crear la instrucción SQL que devuelva el titulo, autor, editorial y cantidad de libros buscados, ordenados por un campo. Suponiendo que hago pedidos a editoriales diversos, seguramente me conviene ordenar los registros por editorial. Por lo tanto, podría usar esta instrucción SQL, la cual une a las 3 tablas:

SELECT Titulo,Autores.Nombre As Autor, Editorial.Nombre As Editor,Cant FROM (Libros INNER JOIN Autores ON Libros.AutorID=Autores.AutorID) INNER JOIN Editorial ON Libros.EditorialID=Editorial.EditorialID ORDER BY Editorial.Nombre


Primero uno las tablas Libros y Autores y cuando ya están unidos en una sola consulta (la computadora hace esta consulta primero) le "arrejunta" la tabla Editorial. La tabla que generaría como resultado sería esta:


Espero que esta explicación no deje tantas dudas. Si no entendiste algo, avísame. Déjame un comentario y/o escríbeme por i-meil. ¡Hasta la próxima!
Publicar un comentario
Related Posts Plugin for WordPress, Blogger...