La hoja de consulta rápida

4 comentarios

En inglés le llaman “cheat sheet” (hoja tramposa) a un gráfico donde puedes encontrar lo más importante de un lenguaje o de un programa. Es muy útil para de un rápido vistazo encontrar lo que se busca.

La “cheat sheet” de Firebird 2.x puedes ver a continuación:

Firebird-2-Cheat-Sheet

Muchas de las principales características de Firebird las puedes visualizar allí.

 

Ejemplo Nº 006 – Usando LEFT JOIN e INNER JOIN

1 comentario

Los INNER JOIN (o solamente JOIN para abreviar) y los LEFT JOIN pueden usarse repetidas veces en una sola consulta, por ejemplo:

SELECT
   P.PRD_CODSUC,
   S.SUC_NOMBRE AS PRD_NOMSUC,
   P.PRD_CODMAR,
   M.MAR_NOMBRE AS PRD_NOMMAR,
   P.PRD_CODIGO,
   P.PRD_NOMBRE
FROM
   PRODUCTOS  P
JOIN
   SUCURSALES S
      ON P.PRD_CODSUC = S.SUC_CODIGO
LEFT JOIN
   MARCAS     M
      ON P.PRD_CODSUC = M.MAR_CODSUC AND
         P.PRD_CODMAR = M.MAR_CODIGO

En el SELECT de arriba hay un INNER JOIN (la palabra INNER no se escribió pero está implícita) y un LEFT JOIN. El INNER JOIN relaciona a la tabla de PRODUCTOS con la tabla de SUCURSALES. El resultado de esa relación es a su vez relacionado con la tabla de MARCAS mediante el LEFT JOIN.

¿Qué significa eso?

Que el primer conjunto de resultados (llamémosle CR1) estará compuesto por todas las filas de la tabla de PRODUCTOS cuyos valores en la columna PRD_CODSUC tengan un valor correspondiente en la columna SUC_CODIGO de la tabla de SUCURSALES. Por lo tanto:

    • Si en la columna PRD_CODSUC tenemos el número 5 y ese número 5 no existe en la columna SUC_CODIGO, esa fila de la tabla de PRODUCTOS no será mostrada
    • Si en la columna SUC_CODIGO tenemos el número 9 y el número 9 no existe  en la columna PRD_CODSUC, esa fila de la tabla de SUCURSALES no será mostrada

Este conjunto de resultados CR1 puede estar compuesto por todas las filas de la tabla PRODUCTOS (en el caso de que todos los valores de la columna PRD_CODSUC tengan un valor igual en la columna SUC_CODIGO) o por solamente algunas filas de la tabla PRODUCTOS (si algunos valores de PRD_CODSUC no tienen un valor igual en SUC_CODIGO) o inclusive por ninguna fila (eso sería en el caso de que ningún valor en PRD_CODSUC tenga un valor igual en SUC_CODIGO)

Este conjunto de resultados CR1 es luego relacionado con la tabla de MARCAS mediante un LEFT JOIN. Como es un LEFT JOIN el conjunto de resultados CR2 estará compuesto por todas las filas del conjunto de resultados CR1, sí o sí. ¿Por qué eso? porque el LEFT JOIN siempre devuelve todas las filas de la tabla, vista, stored procedure seleccionable que se encuentra a la izquierda. Por lo tanto:

CR1 —> LEFT JOIN (una Tabla, una vista, un stored procedure seleccionable, un conjunto de resultados) —> CR2

El conjunto de resultados CR2 estará compuesto por todas las filas de CR1 y desde esas filas se podrá relacionar a las filas de la tabla, vista, stored procedure seleccionable, que se encuentra a continuación de la palabra JOIN

Ejemplo Nº 005 – Usando LEFT JOIN

3 comentarios

Como sabes, en SQL para relacionar a dos tablas entre sí se puede usar la palabra JOIN. El modificador LEFT JOIN (unir por la izquierda) significa lo siguiente: “devuélveme todas las filas de la tabla de la izquierda y solamente las filas de la tabla de la derecha cuyo valor también exista en la tabla de la izquierda”.

LEFTJOIN1

(haciendo click en la imagen la verás más grande)

La tabla A es la tabla de la izquierda, la tabla B es la tabla de la derecha. Como puedes ver, todas las filas de la tabla A serán mostradas. Recuerda que la tabla de la izquierda es la que se encuentra a continuación de la cláusula FROM y la tabla de la derecha es la que se encuentra a continuación de la palabra JOIN.

SELECT
   P.PRD_CODIGO,
   P.PRD_NOMBRE,
   P.PRD_PROCED,
   Q.PRO_NOMBRE AS PRD_NOMPRO
FROM
   PRODUCTOS P
LEFT JOIN
   PROCEDENCIAS Q
      ON P.PRD_PROCED = Q.PRO_IDENTI

Este SELECT mostrará a todas las filas de la tabla PRODUCTOS y solamente los nombres de los países de procedencia que hayan sido registrados en la tabla de PRODUCTOS. Si de un producto no se conoce cual es su país de procedencia, o si el identificador de ese país no se encuentra en la tabla de PROCEDENCIAS, entonces la columna PRO_IDENTI será NULL y por lo tanto el nombre de dicho país no será mostrado sino que se mostrará NULL. Las tablas PRODUCTOS y PROCEDENCIAS están relacionadas mediante las columnas PRD_PROCED y PRO_IDENTI, porque en ambas columnas se guarda el identificador del país de procedencia.

Este SELECT podría mejorarse un poco así:

SELECT
   P.PRD_CODIGO,
   P.PRD_NOMBRE,
   P.PRD_PROCED,
   COALESCE(Q.PRO_NOMBRE, "procedencia desconocida") AS PRD_NOMPRO
FROM
   PRODUCTOS P
LEFT JOIN
   PROCEDENCIAS Q
      ON P.PRD_PROCED = Q.PRO_IDENTI

Entonces, si PRD_PROCED es NULL no encontrará ese valor en la columna PRO_IDENTI de la tabla PROCEDENCIAS, por lo tanto PRO_NOMBRE también será NULL y la función COALESCE() devolverá el string “procedencia desconocida”, haciendo más fácil la lectura del SELECT.

Recuerda que para que el JOIN funcione ambas tablas deben tener una columna (o más de una columna) con valores comunes. Por ejemplo, en la tabla de PROCEDENCIAS tenemos:

 LEFTJOIN2

entonces en la tabla de PRODUCTOS, en la columna PRD_PROCED deberíamos tener uno de estos números: 0, 1, 2, 3, 4. Si allí hay otro número o si allí hay NULL entonces no podrá saberse cual es el país de procedencia del producto.

Para estos casos, o sea cuando queremos ver todas las filas de una tabla y de la otra tabla solamente las filas relacionadas, es que se usa LEFT JOIN.