Tutoriales SQL – La sentencia SELECT – La clausula FROM
Continuando con los Tutoriales de SQL, en este artículo voy a explicar otra de las clausulas obligatorias de la sentencia SELECT, la clausula FROM.
Como les había comentado en el tutorial anterior, la clausula FROM es la que identifica las tablas desde donde seran obtenidos los datos de nuestra consulta y como éstas tablas se van a relacionar entre si.
Cuando hablamos de tablas, la mayoría de la gente suele pensar que en la clausula FROM solo podemos incluir alguna o algunas de las diferentes tablas que componenen nuestra base de datos; pero la clausula FROM nos ofrece mucha mayor flexibilidad y nos permite incluir, no solo este tipo de tablas, sino también tablas temporales y tablas virtuales. Por tanto podemos decir, que la clausula FROM nos permite incluir los siguientes tipos de tablas:
- Tablas permanentes: que son las que componen el esquema de nuestra base de datos. Las tablas donde se almacenan nuestros datos en filas y columnas. Por ejemplo, dentro de Sakila podemos encontrar las siguientes:
- Tablas temporales: que van a ser aquellas que se van a construir temporariamente a través de una subconsulta. Se crean cuando la consulta es ejecutada y dejan de existir una vez que la consulta principal nos arroja su resultado.
- Tablas virtuales: que son aquellas generadas a través de las vistas que hayamos creado en nuestra base de datos. Si bien las vistas parecen y actuan como tablas permanentes, la diferencia que tienen con éstas, es que en realidad, las vistas no poseen datos, sino que toman sus datos de las tablas permanentes. Las vistas son utilizadas generalmente para optimizar las consultas a nuestra base de datos. Alguna de las vistas que nos trae por defecto Sakila son:
Utilizando tablas permantes:
Este tipo de uso de la clausula FROM se explica por si solo, es el que mayoritariamente se utiliza. En el ejemplo podemos ver que estamos utilizando la tabla “actor”, que es una tabla permanente en nuestra base de datos Sakila.
Utilizando tabla temporales:
Como les comenté, estas tablas se componen de los resultados de subconsultas, las subconsultas no son más que consultas, dentro de otras consultas (una sentencia SELECT dentro de otra sentencia SELECT). En nuestro ejemplo, tenemos un primer SELECT:
1 2 3 4 5 |
SELECT first_name as nombre, last_name as apellido, actor_id as id FROM actor WHERE first_name = 'PENELOPE' |
que lo que hace es seleccionar los campos “first_name”, el cual renombra con el alias “nombre”; “last_name”, el cual renombra con el alias “apellido”; y actor_id, que es renombrado con el alias “id”; de la tabla “actor” y donde el campo “first_name” sea igual a “PENELOPE”. Los resultados de esta primer consulta van a constituir una tabla temporal, que es renombrada con el alias “penelope”, que luego van a ser utilizados por nuestra consulta principal. Nuestra consulta principla luego va a seleccionar los campos “nombre” y “apellido” de todos los registros de la tabla temporal “penelope”.
Algunas cosas a tener en cuenta de este ejemplo son:
- El uso de los alias en la subconsulta, fijense que al utilizar alias para los campos de la subconsulta, estos alias luego constituyen los nombres de los campos de nuestra tabla temporal, nuestra consulta principal selecciona los campos “nombre” y “apellido” en lugar de “first_name” y “last_name”.
- Los parentesis en la subconsulta. Las subconsultas siempre deben ir encerradas entre el par de parentesis; los parentesis son los que le dicen al interprete de SQL de nuestra base de datos que toda la expresion debe ser considerada como un bloque.
- El uso de un alias para nuestra tabla temporal; en MySQL el uso de un alias para las tablas temporales que estamos generando con una subconsulta es obligatorio, de no incluir el alias, la sentencia nos daría un error.
Utilizando tablas virtuales:
Las tablas virtuales estan constituídas por las vistas; las vistas son consultas a las que damos un nombre y que son guardadas en nuestra base de datos. Una vez que creamos una vista, la podemos utilizar como si fuera una tabla permanante (recuerden que a diferencia de las tablas permanentes, no existen datos asociados con las vistas ). Cuando realizamos una consulta utilizando una vista, nuestra consulta se combina con la definición de la vista para formar la consulta principal. Por ejemplo para simplificar la sintaxis de nuestro ejemplo anterior, podríamos primero crear una vista con la definición de la subconsulta y luego utilizar esa vista para armar nuestra consulta final.
En el ejemplo podemos ver que primero creamos una vista llamada “penelope” con la siguiente sentencia:
1 2 3 4 5 6 |
CREATE VIEW penelope AS SELECT first_name as nombre, last_name as apellido, actor_id as id FROM actor WHERE first_name = 'PENELOPE'; |
y luego utilizamos la vista “penelope” que creamos para pedirnos todos sus datos. En el ejemplo también se puede observar que en la columna de la izquierda de nuestro Workbench, donde vemos el esquema de nuestra base de datos, podemos ver a nuestra vista “penelope” listada entre las diferentes vistas que posee nuestra base de datos.
RELACIONANDO TABLAS
Cuando vimos la definición de la clausula FROM, les comente que esta clausula no solo incluye las tablas que vamos a utilizar en nuestra consulta; sino que tambien puede incluir la forma en que estas tablas se van a relacionar entre sí. Incluir las relaciones entre las tablas en la clausula FROM es opcional, ya que también podemos incluir la forma en que se van a relacionar nuestras tablas en la clausula WHERE; aunque las buenas practicas dictan que las relaciones se deberían incluir en la clausula FROM.
Las relaciones entre las tablas en la clausula FROM se realiza a través de la palabra clave JOIN, relacionar tablas a través de JOIN es un tema que da mucho para hablar, por lo que dejaré para próximos artículos la explicacion de los diferentes tipos de JOINs y ahora solo voy a presentarles un ejemplo sencillo para que vean como se relacionan las tablas en la clausula FROM.
En este ejemplo estamos relacionando tres tablas, en primer lugar la tabla “actor”, la estamos relacionando con la tabla “film_actor”, esta relacion la estamos realizando a traves del campo comun entre las dos tablas “actor_id”; luego el resultado de esta combinacion, lo restamos relacionando a su vez con la tabla “film”, aquí la relacion va a ser a través del campo comun “film_id”. Como resultado de esta combinación de estas tres tablas, vamos a poder relacionar a los actores con los títulos de las películas en que trabajaron.
CREANDO ALIAS PARA LAS TABLAS
En el ejemplo anterior podemos ver también otra funcionalidad que nos brinda la clausula FROM, la posibilidad de ponerles alias a las tablas. Esta funcionalidad es fundamental cuando utilizamos más de una tabla, ya que si nuestras tablas poseen campos con el mismo nombre, debemos identificar esos campos de alguna manera para que el interprete de SQL sepa de que campo estamos hablando. En el ejemplo anterior yo utilice el alias “a” para la tabla “actor”, el alias “fa” para la tabla “film_actor” y el alias “f” para la tabla “film”; luego cuando establecí los campos de las relaciones entre las tablas utilice esos alias para decirle al interprete a que tabla debía ir a buscar el dato. (por ejemplo cuando dice a.actor_id = fa.actor_id, le estoy diciendo al interprete de SQL que el campo “actor_id” de la tabla cuyo alias es “a”, en este caso la tabla “actor”; debe ser igual al campo “actor_id” de la tabla con alias “fa”, o sea, de la tabla “film_actor”)
De no utilizar los alias, para que el interprete no nos devuelva un error, deberíamos referencia los campos con los nombres completos de las tablas. En vez de poner “a.actor_id” deberiamos poner “actor.actor_id” para decirle al interprete que debe ir a buscar el campo “actor_id” de la tabla “actor”.
Al igual que como sucede con los alias que utilizamos para los campos en la clausula SELECT, el uso de la palabra AS es opcional y puede ser omitido en la definición del alias de una tabla.
Hasta aquí este tutorial, ahora a practicar!!
Saludos!!
Raulllllllllllllllllllllllllllll te faltaaa la explicacion del JOIN!!!!
quien soy!!! 😉