Ejemplo Nº 001 – Usando INNER JOIN

4 comentarios

Supongamos que tenemos una tabla llamada SUCURSALES con estas columnas:

SUC_CODIGO

SUC_NOMBRE

y otra tabla llamada PRODUCTOS con estas columnas:

PRD_CODSUC

PRD_CODIGO

PRD_NOMBRE

La primera tabla guarda los códigos y los nombres de las sucursales. Por ejemplo:

0 = Asunción

1 = Buenos Aires

2 = Londres

3 = Nueva York

En la segunda tabla tenemos guardados los códigos de las sucursales donde se encuentran los productos, pero no los nombres de dichas sucursales. Por ejemplo:

0, 1, ‘Televisor Philips de 2o pulgadas’

0, 2, ‘Televisor Sony de 20 pulgadas’

2, 3, ‘Televisor Philips de 29 pulgadas’

En la primera columna el número 0 indica que el producto se encuentra en la sucursal de Asunción y el número 2 indica que se encuentra en la sucursal de Londres.

Lo que queremos ahora es ver el nombre de la sucursal, el código del producto y el nombre del producto. Lo que tenemos registrado en la tabla de PRODUCTOS es el código de la sucursal pero eso no es lo que nos interesa ver, lo que nos interesa ver ahora es el nombre de la sucursal.

SELECT
   S.SUC_NOMBRE,
   P.PRD_CODIGO,
   P.PRD_NOMBRE
FROM
   PRODUCTOS  P
JOIN
   SUCURSALES S
      ON P.PRD_CODSUC = S.SUC_CODIGO

Como ambas tablas comparten valores comunes entonces las podemos relacionar. El resultado que obtendremos será:

Asunción, 1, Televisor Philips de 2o pulgadas

Asunción, 2, Televisor Sony de 20 pulgadas

Londres, 3, Televisor Philips de 29 pulgadas

Como las tablas SUCURSALES y PRODUCTOS tienen una columna que tiene el mismo significado (la columna SUC_CODIGO es el código de la sucursal y la columna PRD_CODSUC también es el código de la sucursal) entonces ambas tablas pueden ser relacionadas mediante esa columna en común. Si están relacionadas entonces en el SELECT se pueden usar todas las columnas de la tabla SUCURSALES y también todas las columnas de la tabla PRODUCTOS.

Para evitar malentendidos a ambas tablas se les asignó un alias. ¿Qué es un alias? es un nombre alternativo, generalmente abreviado, que se usa para referirse a una tabla.

El alias de la tabla PRODUCTOS es P. El alias de la tabla SUCURSALES es S.

Usar alias no es obligatorio, también podríamos haber escrito:

PRODUCTOS.PRD_CODIGO

pero es más corto escribir:

P.PRD_CODIGO

El alias puede tener varias letras e inclusive números, todos estos son alias aceptables:

P, P1, PROD, MIPROD, TABLAPRODUCTOS

si sabes que en ambas tablas no existen columnas que tienen exactamente el mismo nombre entonces puedes evitar los alias aunque por legibilidad lo recomendable es que sí los uses. El autor de este blog siempre usa alias.

El SELECT anterior también podría haber sido escrito así y funcionaría perfectamente:

SELECT
   SUC_NOMBRE,
   PRD_CODIGO,
   PRD_NOMBRE
FROM
   PRODUCTOS
JOIN
   SUCURSALES
      ON PRD_CODSUC = SUC_CODIGO

o sea, sin usar alias. En consultas sencillas como esa no habría mayor inconveniente en evitar los alias pero en consultas más complicadas, donde hay varias tablas relacionadas, si no usas alias puedes encontrarte con graves problemas difíciles de solucionar porque no podrás fácilmente saber a cual tabla pertenece cada columna.

El autor de este blog siempre usa alias.

Anuncios

Introducción a los SELECTs para intermedios

1 comentario

Los SELECTs que encontrarás en esta categoría son más complicados que los SELECTs para principiantes que tienes en:

https://firebird21.wordpress.com/category/principiantes/ejemplos-de-selects-para-principiantes/

Los SELECTs para intermedios usan más de una tabla porque es raro que en la vida real todos los datos que necesites estén en una sola tabla, lo normal es que estén en dos o más tablas.

En SQL para relacionar a dos tablas entre sí se utiliza la cláusula JOIN. Al resultado obtenido a su vez le puedes hacer un JOIN con otra tabla. Y a ese nuevo resultado le puedes hacer otro JOIN. Y así sucesivamente. Por lo tanto una sola consulta (un solo SELECT) puede tener muchos JOIN.

Para que el JOIN pueda efectuarse debe existir una columna (o más de una columna) igual o similar entre ambas tablas. Si tus tablas están bien diseñadas (o sea, si están normalizadas) entonces esas columnas seguro que existen.

También es posible relacionar una tabla con sí misma. Para ello necesitarás que dos (o más) columnas tengan alguna relación entre ellas.

La cláusula JOIN puede tener un modificador, los modificadores posibles son:

  • INNER o dejar en blanco porque es el valor por defecto
  • LEFT o LEFT OUTER (son sinónimos)
  • RIGHT o RIGHT OUTER (son sinónimos)
  • FULL o FULL OUTER (son sinónimos)

El modificador INNER devuelve las filas cuya columna/s de relación se encuentran en ambas tablas. Es lo mismo que hace el comando SET RELATION en el lenguaje Visual FoxPro. Este es el modificador por defecto o sea el modificador que se usará en el JOIN si ninguno es especificado.

El modificador LEFT devuelve todas las filas que se encuentran en la tabla de la izquierda (o sea, la tabla escrita a continuación de la cláusula FROM) y solamente las filas de la tabla de la derecha que cumplen la relación.

El modificador RIGHT devuelve todas las filas que se encuentran en la tabla de la derecha (o sea, la tabla escrita a continuación de la cláusula JOIN) y solamente las filas de la tabla de la izquierda que cumplen la relación.

El modificador FULL devuelve todas las filas de la tabla de la izquierda (o sea, la tabla escrita a continuación de la cláusula FROM) y todas las filas de la tabla de la derecha (o sea, la tabla escrita a continuación de la clásula JOIN).

El siguiente gráfico te ayudará a entender mejor a esos modificadores:

Visual_SQL_JOINS

(haciendo click en el gráfico lo verás más grande)

Siempre que tengas alguna duda sobre como funcionan los modificadores del JOIN (INNER, LEFT, RIGHT, FULL) revisa este gráfico que te ayudará a entender.

Recuerda que si no escribes un modificador se usará INNER.

En los siguientes artículos de esta categoría veremos muchos ejemplos del uso de JOIN.

Ejemplo Nº 050 – Más sobre el uso de DISTINCT

1 comentario

En el ejemplo Nº 049 que puedes leer aquí:

https://firebird21.wordpress.com/2013/05/03/ejemplo-no-049-usando-distinct/

hemos visto una forma de usar la cláusula DISTINCT, aquí tenemos otra:

SELECT
   COUNT(DISTINCT PRD_UNIMED)
FROM
   PRODUCTOS

Mediante este SELECT podemos conocer la cantidad de unidades de medida distintas que están registradas en la tabla de PRODUCTOS. Por ejemplo, si en dicha tabla tenemos las unidades de medida: KLG, LTS, MTS, UNI, (kilogramos, litros, metros, unidades) entonces el resultado que obtendremos será 4.

Si en nuestra tabla de PRODUCTOS tenemos una columna llamada PRD_PROCED donde se registran los países de procedencia de nuestros productos entonces escribiendo:

SELECT
   COUNT(DISTINCT PRD_PROCED)
FROM
   PRODUCTOS

podremos saber de cuantos países distintos proceden los productos de nuestro stock.

No solamente podemos escribir DISTINCT dentro de la función COUNT(), también podemos escribirlo dentro de cualquiera de las otras funciones agregadas: AVG(), MAX(), MIN(), SUM()

También es posible escribir una función dentro de otra función, como en este ejemplo.

SELECT
   COUNT(DISTINCT Left(PRD_NOMBRE,3))
FROM
   PRODUCTOS