SQL Básico. Consultar varias tablas: Cross Join.

En la sección anterior, vimos como obtener la base de datos Chinook que es la base de datos que usaremos de ahora en adelante en el curso, ya que contiene tablas que se relacionan entre sí, es decir, implementa ya lo que es una base de datos relacional, en la que cada tabla tiene relación con las otras.

En la práctica es muy común que los resultados de las consultas SQL combinen los valores de las columnas de las filas de más de una tabla. Hasta el momento en este curso sólo hemos especificado el nombre de una tabla en la cláusula FROM de una sentencia SELECT. En esta sección y algunas subsecuentes vamos a ver los diferentes tipos de combinación, unión o concatenación de las filas y columnas de dos o más tablas.

En esta sección específicamente veremos la combinación más sencilla que es especificar los nombres de las tablas que combinaremos en la consulta. Debes tener ya abierta la base de datos Chinook y el archivo de sql donde hemos estado escribiendo nuestras sentencias SQL de este curso.

Escribe y ejecuta la siguiente sentencia:

Consulta con dos tablas.

Observa que nos dió como resultado 3296 filas el resultado. Si te deslizas hacia la derecha para ver todas las columnas que arroja esta consulta, verás que primero muestra las columnas de la tabla “Employee” (empleado) y al final las columnas pertenecientes a la tabla “Invoice” (factura). Los valores de las columnas de ambas tablas se han combinado. También puedes observar que los valores de las columnas de la fila de la tabla “Employee” que tiene en su columna “EmployeeId” con valor 1 se repite muchas veces. Si te deslizas hacia abajo irán apareciendo el resto de las filas de la tabla “Employee” pero repetidas muchas veces. Deslízate hasta la fila 413 de los resultados, deberás ver lo siguiente:

Mostrando resultados.

Si observas, a partir de la fila 413, los valores de las columnas que pertenecen a la tabla “Employee” (empleado) dejan de repetirse e inician con otro número de “EmployeeId” o identificador del empleado, en este caso el número 2. La fila de la tabla “Employee” la cual tiene el “EmployeeId” 1, se repitió 412 veces. Ahora, si observas los valores de las columnas de la tabla “Invoice” (factura) que aparecen al final de las filas de la consulta de esas primeras 412 filas que repitió los datos del empleado con “EmployeeId” igual a 1, verás que sus valores no se repiten. ¿Por qué? Bueno, lo que pasa es que cuando se combinan dos tablas como lo hicimos en la sentencia SELECT, se produce lo que se llama un “Producto Cartesiano” de las filas de ambas tablas.

¿Que es un “Producto Cartesiano”? Bueno, es combinar cada uno de los elementos de un primer conjunto con todos los elementos de un segundo conjunto. En nuestra consulta, el primer conjunto lo representa la tabla “Employee” y su elementos vienen siendo cada una de sus filas, el segundo conjunto sería la tabla “Invoice” y sus elementos cada una de sus filas. Al final y al cabo el número resultante de filas de la consulta que ejecutamos, es una simple multiplicación de las filas de la primera tabla, por las filas de la segunda. ¿Recuerdas cómo contar las filas de una tabla? Escribe y ejecuta las siguientes sentencias y anota el resultado:

Filas en la tabla “Employee”.
Filas en la tabla “Invoice”.

La tabla “Employee” contiene 8 filas y la tabla “Invoice” contiene 412 filas. Si hacemos la multiplicación de 8 X 412 nos dará como resultado 3296. ¡Que es el número de filas que arroja el resultado de nuestra primera consulta! Efectivamente un “Producto Cruzado” es una multiplicación. En una cláusula FROM no sólo se pueden especificar dos tablas, podemos especificar más separándolas por comas. El número de filas resultantes corresponderá a la multiplicación del total de filas de todas las tablas especificadas. En la siguiente práctica veremos un ejemplo.

Vamos a usar varias veces la tabla de empleados, “Employee”, que es la tabla con menos filas (8), en la cláusula FROM para ejemplificar el caso de más de dos tablas. Le daremos un alias distinto a cada especificación de la tabla “Employee”, así mismo, vamos a limitar los campos a mostrar en el resultado a sólo el identificador, el campo “EmployeeId” de cada tabla, especificándole a cada uno un alias para distinguir a que alias de la tabla “Employees” pertenece. Finalmente vamos a ordenar los resultados. Escribe y ejecuta el siguiente ejemplo:

Combinando la tabla “Employee” tres veces.

En la consulta le estamos dando diferente alias a cada una de las veces que usamos la tabla “Employee”: “e1”, “e2” y “e3”. Y estamos limitando el despliegue de las columnas para que sólo nos muestre el identificador de cada empleado de cada alias de tabla: “e1.EmployeeId”, “e2.EmployeeId” y “e3.EmployeeId”. Puedes ver el uso de alias en la sección “SQL básico. Funciones sobre cadenas de texto en la parte” en la parte “Usando alias en una sentencia SQL”.

Observa que el número de filas que regresó la consulta es de 512 filas. Recuerda que la tabla “EmployeeId” tiene 8 filas o registros. Si multiplicamos las ocho 8 filas que contiene la tabla “Employee” con alias “e1” por las ocho filas de la tabla “Employee” con alias e2 por las ocho filas de la tabla “Employee” con alias e3 nos dará el total de filas de la consulta: 8 x 8 x 8 = 512.

Navega por los resultados de la consulta y observa los valores en cada columna de cada fila, verás cómo se combina cada uno de los identificadores de la la primera tabla , con cada una de los identificadores de la segunda tabla y esta a su vez con cada uno de los identificadores de la tercer tabla.

Cláusula CROSS JOIN. Combinación o concatenación cruzada de filas.

La cláusula CROSS JOIN se usa en la cláusula FROM de una sentencia SELECT. Tienen exactamente el mismo efecto que la coma (,) en las sentencias que hemos escrito anteriormente. Produce un producto cruzado de las filas de cada tabla. Reemplazaremos las comas por la cláusula CROSS JOIN en la sentencia anterior. Escribe y ejecuta la siguiente sentencia para comprobarlo:

Usando CROSS JOIN.

En la sentencia anterior reemplazamos las comas por la cláusula CROSS JOIN. Puedes observar que obtienes las mismas 512 filas y los mismos valores en cada columna y fila. Podemos concluir que con la cláusula CROSS JOIN obtendremos exactamente los mismos resultados que separando cada tabla por una coma (,). Aunque para buenas prácticas y claridad de la sentencia SELECT se recomienda incluir la cláusula CROSS JOIN.

En la siguiente sección, veremos otro tipo de combinación de filas en una sentencia SELECT: la cláusula INNER JOIN.

Recuerda dejar un comentario si tienes alguna duda u observar alguna errata, para mejorar el curso.

¡Hasta la próxima!

IR A LA PAGINA DEL CURSO.

SQL Básico. Descargar base de datos Chinook.

En la sección anterior vimos como agrupar datos y ordenar resultados . Hemos hablado de que SQLite es una base de datos relacional. Hasta ahorita sólo hemos trabajado con una sola tabla, sin embargo en la práctica, las bases de datos cuentan con más de una tabla y a veces hasta decenas o cientos de ellas y que se “relacionan” entre sí. Para la prácticas siguientes del curso usaremos la base de datos Chinook que es gratuita.

La base de datos Chinook, es una base de datos de ejemplo que puede ser usada para demostraciones. Se creo como alternativa a la base de datos de ejemplo llamada Northwind que viene con la instalación de motor de base de datos SQL Server. La base de datos puede ser cargada en distintos motores de bases de datos entre los que se encuentran SQL Server, Oracle, MySQL, PostgreSQL, DB2 y por supuesto SQLite que es el el motor de base de datos que usamos en este curso.

La base de datos Chinook puede ser usada libremente y fue creada por desarrolladores y puesta en le sitio de GitHub. Si quieres visitar el sitio Github de desarrollo de esta base de datos, visita esta liga. Ahí podrás encontrar más información y/o puedes descargar el archivo de la base de datos Chinook en formato SQLite que se encuentra en ese mismo sitio. También puedes descargar la base de datos Chinook en formato SQLite comprimido en un archivo zip en este mismo blog.

Imagen del sitio GitHub de la base de datos Chinook.

Si lo descargas desde la liga del sitio de GitHub, el archivo descargado se llama “Shinook_Sqlite.sqlite” y es la base de datos en formato SQLite. En el caso de que descargues el archivo que se encuentra en este blog, entonces el archivo que descargarás será un archivo comprimido en formato zip llamado “Chinook_Sqlite.zip”. Dentro de este archivo encontrarás la misma base de datos SQLite “Shinook_Sqlite.sqlite”. Descompacta el archivo zip y coloca el archivo de base de datos SQLite en una carpeta de tu preferencia, se recomienda en la carpeta que hemos estado usando en este curso.

Abre la base de datos con el software “DB Browser for SQLite” cómo lo vimos en la sección SQL básico. Agregar datos a una tabla con SQL en la parte titulada “Abriendo una base de datos con DB4S”.

Si observamos la estructura de la base de datos como hemos hecho antes en este curso veras las 11 tablas siguientes:

Tablas de la base de datos Chinook.

Descripción de la la tabla de la base de datos Chinook.

La base de datos simula una tienda de música digital, enseguida se describe el contenido de cada una de ellas.

TABLADESCRIPCION O CONTENIDO
AlbumLos álbumes de música. Su identificador (AlbumId), su título (Title) y el identificador del artista (ArtisiId).
ArtistLos artistas. Su identificador (ArtistId) y su nombre (Name).
CustomerLos clientes que han adquirido tracks. Su identificador (CustomerId), sus datos personales y el empleado que lo atendió ( SupportRepId).
EmployeeLos empleados de la tienda. Su identificador (EmployeeId) y sus datos personales.
GenreLos géneros de música. Su identificador (GenreId) y el nombre del género musical (Name).
InvoiceLas facturas. El identificador de la factura (InvoiceId) , el identificador del cliente que hizo la compra (CustomerId) y los datos de la factura.
InvoiceLineEl detalle de la factura, cada artículo comprado. Su identificador (InvoiceLineId), el identificador de la factura ala que pertenece (InvoiceId), el identificador del track de música adquirido (TrackId), el precio unitario (UnitPrice) y la cantidad (Quantity).
MediaTypeEl tipo de archivo de música. Su identificador (MediaTypeId) y su nombre (Name).
PlaylistListas de reproducción. Su identificador (PlaylistId) y el nombre de la lista (Name).
PlaylistTrackLas pistas de música dentro de cada lista de reproducción. El identificador de la lista de reproducción (PlaylistId) y el identificador de la pista de música (TrackId).
TrackLas pistas de música. El identificador de la pista (TrackId) y los datos de la pista.
Descripción de las tabla de la base de datos Chinook.

En la siguiente sección veremos como consultar varias tablas usando esta base de datos y veremos en la práctica como se relacionan entre sí.

¡Hasta la próxima!

IR A LA PAGINA DEL CURSO.

SQL básico. Agrupando datos y ordenando resultados.

En la sección anterior vimos como agrupar datos. En esta sección veremos cómo mostrar esos mismos resultados pero en orden.

Combinando las cláusulas GROUP BY y ORDER BY en una sentencia SELECT.

En una sentencia SELECT la cláusula ORDER BY debe aparecer siempre después de la cláusula GROUP BY, recuerde que la primera sirve para mostrar los resultados ordenados y la segunda para agrupar los resultados.

Usaremos una consulta que vimos en la sección anterior:

Resultados agrupados en desorden.

En dicha consulta los resultados de la columna “núm productos” aparece en desorden. La modificaremos un poco y agregaremos la cláusula ORDER BY para mostrar un mejor resultado.

Agrupando y ordenando.

Como puede observar en la sentencia, la cláusula ORDER BY que es la encargada de ordenar los resultados, aparece después de la cláusula GROUP BY. Esto es lógico porque GROUP BY necesita conocer los resultados que va a ordenar.

También puedes observar que a diferencia del ORDER BY que usamos en la sección “Cómo ordenar los resultados de una consulta” de este mismo curso, donde especificábamos el nombre de un campo o columna para indicarle por cual de ellos ordenar, aquí usamos un número. ¿Qué representa ese número? Representa el número de la columna de la lista de columnas en la cláusula SELECT numerándolas de izquierda a derecha comenzando por el número 1. En nuestro ejemplo el 2 representa la segunda columna en los resultados, es decir la columna “núm. productos”.

Las siguientes sentencias son equivalentes a la anterior:

Ordenando por el contenido de la columna.
Ordenando por el alias de la columna.

SQLite permite especificar la columna de ordenamiento tanto por el número de columna como vimos en la primera sentencia donde usamos el ORDER BY, por el contenido de la columna, en este caso la función COUNT(), como en el segundo ejemplo o por el alias de la columna, somo se muestra en la última sentencia arriba.

En caso de otros motores de datos, es posible que no soporte todos estos casos. Consulte la documentación específica de cada uno de esos motores de base de datos.

Hasta el momento sólo hemos hecho consultas sobre una tabla, pero en la práctica, las bases de datos relacionales, como su nombre lo indica, trabaja con relaciones, es decir, tablas relacionadas. En la siguiente sección veremos como descargar una base de datos más real, con tablas relacionadas, que nos servirán en las próximas prácticas.

¡Hasta pronto!

IR A LA PAGINA DEL CURSO.