Introducción al entorno de trabajo en vista Diseño para la creación de consultas.
Creación de una consulta que incluye todas las tablas de la base de datos.
Cómo utilizar funciones dentro de una consulta.
Qué son las vistas y para qué se utilizan.
Consultas avanzadas y vistas
1. Entorno de trabajo en vista Diseño
En la unidad anterior ya trabajamos en modo Diseño (ver figura 6.1), pero ahora vamos a ver en detalle todos los elementos de esta forma de realizar consultas.
Primero, podemos observar que la vista Diseño está dividida horizontalmente en tres partes: la parte superior con la barra de herramientas; la central, donde se muestran las tablas seleccionadas para la consulta; y la inferior, donde cada columna representa cada uno de los campos a mostrar junto con una serie de opciones relacionadas para el filtrado de los resultados.
Figura 6.1 Ventana de creación de consultas en modo Diseño
Los botones específicos para consultas de la barra de herramientas que tenemos disponibles son:
Figura 6.1 bis Botones (o iconos) de la barra de herramientas para consultas en modo Diseño
Alternar modo de edición (modo Diseño): si tenemos activado el modo Diseño, podremos editar el contenido en los paneles para tablas y campos.
Cortar, Copiar y Pegar:
Deshacer y Rehacer:
Ejecutar consulta: muestra el resultado de la consulta sin necesidad de salir del modo de edición. Hay que tener en cuenta que no guarda la consulta.
Activar o desactivar la vista Diseño: si desactivamos el modo Diseño, aparece la consola de edición para el lenguaje SQL, donde podremos escribir el código de la consulta; si está activo, tendremos los paneles para tablas y campos.
Eliminar consulta: borra la consulta y quita todas las tablas de la vista Diseño.
Añadir tabla o consulta: permite agregar alguna otra consulta o más tablas a la consulta actual.
Funciones: activa/desactiva la posibilidad de asociar funciones a los campos. Si se activa, parecerá el renglón Funciones en el panel de los campos.
Nombre de la tabla: activa/desactiva en el panel inferior el renglón Tabla donde se muestra el nombre de la tabla a la que pertenece el campo.
Alias: activa/desactiva en el panel inferior el renglón Alias donde se puede introducir el alias (es decir, un nuevo nombre de columna) de un campo.
Valores diferentes: si se activa, aquellas filas que aparecen repetidas varias veces en el resultado de una consulta solo se mostrarían una vez. Por ejemplo, si hicieramos una consulta que devuelva los géneros de nuestras películas, la fila con el valor “Ciencia-Ficción” aparecería varias veces a menos que activáramos esta casilla y ya solo aparecería una vez.
Límite: esta lista desplegable muestra cuántas filas se devolverán de la consulta. El valor predeterminado es Todos.
Propiedades de la consulta:
En cuanto a los campos del panel inferior y sus distintas opciones tenemos:
Campo: muestra los nombres de los campos que se desean visualizar. En el caso de querer mostrar todos los campos de una tabla, tenemos la posibilidad de poner “Nombre de tabla.*” en lugar de poner uno a uno cada uno de los campos.
Alias: el valor que se escriba se mostrará en la cabecera de la columna de resultados en lugar del nombre del campo que tiene la tabla.
Tabla: muestra la tabla a la que pertenece al campo.
Orden: podemos elegir entre ordenar los resultados por los valores de ese campo de forma ascendente o descendente.
Visible: si queremos que se muestre ese campo en el resultado estará marcada. Los campos con esta opción desmarcada se utilizan para fijar condiciones de filtrado de los resultados.
Función: permiten realizar distintas operaciones sobre los resultados. Hay que tener en cuenta que, una vez que a un campo se le incluye alguna función, el resto de los campos también deben llevar asociada alguna de las funciones disponibles. Concretamente, LibreOffice Base ofrece las siguientes funciones:
Criterio: Especifica un criterio para filtrar las filas (que un campo contenga un valor mayor, menor, igual, etc..) para el campo. Se pueden incluir varios criterios de filtrado para un campo utilizando las subsiguientes filas “o”.
Debido al espacio limitado de cada unidad de este curso, se recomienda a aquellos alumnos que quieran más información acerca de los criterios de filtrado que estudien la página web Diseñar una consulta (https://help.libreoffice.org/latest/es/text/sdatabase/02010100.html) en la Ayuda en línea de LibreOffice, donde en el apartado “Formular las condiciones del filtro” aparecen explicados al detalle.
2. Creación en vista Diseño de consulta sobre varias tablas
Vamos a crear nuestra primera consulta completamente en vista Diseño. En particular, vamos a crear una consulta que nos muestre todos los actores que protagonizan películas junto con los datos de la película, incluido el nombre del género. Es decir, vamos a construir una consulta que utiliza las cuatro tablas de nuestra base de datos.
Para empezar, nos vamos a la ventana principal de LibreOffice Base, y en el panel izquierdo Base de datos hacemos clic en Consultas. Seleccionamos la tarea Crear consulta en vista Diseño…
Nada más entrar en el modo Diseño, nos mostrará el diálogo que nos permite añadir las tablas que queremos incluir en la consulta que se va a crear. En nuestro caso, vamos a añadir las cuatro disponibles y veremos como LibreOffice Base nos muestra las relaciones existentes automáticamente (ver figura 6.2). Para que las líneas que indican las relaciones no se crucen, añada las tablas en el orden que se indica de izquierda a derecha en la figura 6.2.
Figura 6.2 Selección de tablas de la consulta
Los primeros cuatro campos que vamos a incluir son los de la tabla Interpretes como se muestra en la Figura 6.3. Aunque en la ilustración incluimos el campo Id_interprete, este no es realmente necesario en una consulta en el trabjo real. Se incluye aquí con la opción Visible por motivos pedagógicos, pero en un trabajo de la vida real no es necesario mostrar el campo que conecta las tablas, aunque se incluya en la consulta de manera no visible.
Figura 6.3 Inclusión de campos de la tabla Interpretes
Para añadir cada campo basta con hacer doble clic encima de su nombre en el panel de tablas. Si hace docle clic en el el asterisco que está al inicio de cada tabla, agregará un solo campo que representa a todos los campos de la tabla. Pero por el momento no lo haremos de esta última manera porque a dos campos de esta tabla les modificaremos el atributo de Orden.
A continuación vamos a especificar que queremos que los resultados de la consulta se muestren ordenados por los apellidos y el nombre de los intérpretes (ver figura 6.4).
Figura 6.4 Ordenación de resultados por apellidos y nombre
Para incluir los campos de la tabla Peliculas vamos a seleccionar “Peliculas:*” y así no tenemos que incluir los campos uno a uno (ver figura 6.5). De la misma manera como comentamos arriba, el campo Id_pelicula que hemos agregado automáticamente no es necesario en un trabajo de la vida real. Se incluye aquí con fines pedagógicos de manera visible, pero en la consulta puede evitar que sea visible al desmarcar la casilla Visible.
Figura 6.5 Inclusión de todos los campos de la tabla Peliculas
Nuevamente, para seleccionar los campos de la tabla Interpretes no hemos utilizado la posibilidad “Interpretes.*” porque es necesario seleccionar cada campo individualmente, ya que vamos a establecer algún criterio de ordenación en función de alguno de los campos de la tabla. Como en nuestro caso vamos a mostrar los resultados ordenados en función de los apellidos y el nombre de los intérpretes (ver figura 6.4) necesitamos seleccionar uno a uno cada campo de Interpretes.
Para terminar, vamos a seleccionar el campo Nombre de la tabla Generos y, en el alias, vamos a poner “NombreGénero”, para distinguirlo de los campos ya seleccionados, Nombre de la tabla Interpretes y Genero de la tabla Peliculas. (ver figura 6.6.).
Figura 6.6 Inclusión del campo Nombre de la tabla Generos
Salvamos la consulta como ConsultaTotal y al ejecutarla usando el atajo de teclado F5, el resultado es el de la figura 6.7.
Figura 6.7 Resultado de la consulta ConsultaTotal
3. Creación de consultas que incluyen funciones
Vamos a crear una consulta que realiza operaciones sobre los resultados. Así, vamos a crear una consulta que muestre el nombre de cada género almacenado y el total de películas que tenemos de cada género. Es decir, el objetivo es realizar una consulta sobre Generos y Peliculas de manera que agrupemos las filas devueltas en función de cada género para así poder contarlas y poder saber el número de películas asociadas a cada uno de ellos. El resultado de nuestra consulta, con las filas que tenemos actualmente en Generos y Peliculas, debe ser como el de la Figura 6.8.
Figura 6.8 Generos y total de películas de cada género
Para empezar, elegimos las tablas sobre las que vamos a realizar la consulta, Generos y Peliculas (ver figura 6.9).
Figura 6.9 Tablas de la consulta
Los campos que necesitamos son, por una lado Nombre de tabla Generos, que es sobre el que agruparemos los resultados devueltos y, por otro, un campo de la tabla Peliculas que estemos seguros que siempre tendrá un valor (no estará vacío) para cada fila de Peliculas. Por ejemplo, podemos elegir el campo Id_pelicula que siempre va a tener valor para cada película. Los campos seleccionados se muestran en la figura 6.10.
Figura 6.10 Campos seleccionados de ambas tablas
A continuación, debemos asociar la función correspondiente a cada uno de los dos campos. En primer lugar, hemos dicho que queremos agrupar los resultados en función de cada género, para ello vamos a incluirle la función Agrupar asociada al campo Nombre de la tabla Generos. Y, en segundo lugar, lo que queremos es contar las películas relacionadas con cada género. Esto último lo conseguimos asociando la función Recuento al campo Id_pelicula de Peliculas (ver figura 6.11). Algunas veces podrá ver el nombre de esta última función como Conteo o Cantidad; son diferentes traducciones pero la misma función COUNT() del lenguaje SQL.
Figura 6.11 Inclusión de funciones necesarias en cada campo
Guardamos entonces la consulta como Peliculas de cada genero y al lanzarla nos encontramos una pantalla como la de la Figura 6.12.
Figura 6.12 Resultado de la consulta Peliculas de cada Genero
Como vemos, la cabecera con el total de películas está mostrando la función del lenguaje SQL que estamos utilizando junto con el nombre del campo. Si queremos que el resultado aparezca como el que mostrabamos en la figura 6.8, es decir, con una cabecera significativa, debemos añadir el alias Total de Peliculas (ver figura 6.13).
Figura 6.13. Inclusión de alias para el total de películas
4. Vistas. Consultas sobre vistas
Las vistas son un tipo especial de consulta almacenada que para la base de datos es como si fuera una tabla más. Es decir, hasta ahora hemos visto que solo podemos realizar consultas sobre nuestras tablas de la base de datos. Pero, ¿qué tendremos que hacer si necesitamos realizar una consulta no sobre una tabla sino sobre los resultados de otra consulta? Podríamos convertir la consulta en una vista para que se pueda manejar como si de una tabla se tratara, pero también y más sencillo, solo añadimos la consulta a la vista Diseño y añadimos las demás tablas que sean necesarias. Lo único importante que quiero enfatizar es que hay que tener la precaución de relacionar la consulta con la tabla (con el campo correspondiente).
Otra ventaja de las vistas es que al estar almacenadas en la base de datos se "cachean" (se almacenan después del primer uso en una memoria rápida y especial de la computadora llamada caché) con lo que los resultados se obtienen más rápidamente cuando se vuelve a hacer una petición de datos.
Para ver las beneficios de usar vistas, vamos a realizar una consulta que nos devuelva el valor medio de las películas asociadas a cada género. Esta consulta no se puede realizar directamente sobre las tablas Generos y Peliculas, sino sobre la consulta Peliculas de cada genero, una vez convertida en vista. La diferencia conceptual es que las vistas se guardan en la base de datos (la verdadera base de datos) y las vistas se almacenan solamente en el archivo .odb. Esta diferencia se puede ver claramente cuando utilizas una base de datos externa (o fuente de datos externa que llamas en el tema 10), si creas una vista, esta se almacena en el archivo .mdb, pero si creas una consulta no se almacena en el archivo .mdb, sino en el archivo .odb. En el diseño de la nueva consulta no tiene ninguna trascendencia si era una vista o una consulta.
Para convertir una consulta en una vista nos situamos en la ventana principal de LibreOffice Base en la sección Consultas y seleccionamos la consulta que queramos convertir con el botón derecho del ratón. Del menú que se despliega seleccionamos la opción Crear como vista (ver figura 6.14).
Figura 6.14 Convertir una consulta en una vista
Aparecerá un diálogo para poner un nombre a la vista. Escribimos PeliculasCadaGenero y aceptamos. Ya hemos convertido la consulta en una vista y podemos ver que ya es así si nos situamos en la sección Tablas de la ventana principal. Podemos observar que se usa un icono distinto para representar vistas y distinguirlas de las tablas (ver figura 6.15).
Figura 6.15 Vista creada en la sección Tablas
Una vez que ya tenemos la vista, vamos a crear una consulta sobre ella. Para empezar, vemos que al entrar en vista Diseño para crear una nueva consulta, ya nos aparece PeliculasCadaGenero como si de una tabla más se tratara y la elegimos como única tabla de la consulta (ver figura 6.16).
Figura 6.16 Inclusión de la vista PeliculasCadaGenero en la consulta a crear
Como solo queremos que nos devuelva el valor medio de las películas de cada género seleccionamos el campo Total de Peliculas y le asociamos la función Promedio junto con el alias Media de cada género (ver figura 6.17).
Figura 6.17 Inclusión del valor medio del campo Total de Peliculas
Para ver que la consulta hace lo que esperamos en la propia vista Diseño (ver figura 6.18), la lanzamos antes de guardarla utilizando el botón Ejecutar y, si devuelve el valor esperado, ya hemos terminado.
Figura 6.18 Resultado del valor medio de películas por cada género
Ejercicios propuestos
Crear una consulta que arroje cuántas películas hay en formato DVD y cuántas en VHS. (Consejo: usar la funciones Agregar y Recuento)
Convertir a vista la consulta Consulta_Peliculas_Generos y a partir de ella crear otra consulta que arroje solo las películas del siglo XXI.
Preguntas y reportes de problemas frecuentes
¿Cómo hago para que al diseñar una consulta, en vez de introducir el criterio en el campo de criterios, me lo pida en un cuadro de diálogo? Quiero hacer una consulta en la que me pregunte por el valor de un campo, y al yo introducirlo, ejecute la consulta con esa condición. Por ejemplo, que me pregunte por un nombre y en el resultado de la consulta me aparezcan otros campos relacionados con ese: al introducir el valor del campo apellido me aparecerán los campos nombre, apellidos, teléfono que correspondan al valor dado de apellido.
Para que te pida el criterio de búsqueda en un cuadro de diálogo cuando ejecutes la consulta, debes acceder a la edición de la consulta y poner en el campo Criterio (del campo que deseas filtrar) el nombre con el que desees que muestre el cuadro de diálogo antecedido por dos puntos (:). Ejemplo :Buscar_x_Nombre. Esto hará que LibO Base te pregunte en un cuadro de diálogo por el valor para hacer la consulta. No dejes espacios en el parámetro porque no te funcionará.
Me gustaría saber cómo se realiza la suma de tres campos de valores para producir un total y cómo se obtiene una resta de fechas para que me de el resultado en días.
Las consultas que hemos visto en esta unidad agrupan el resultado de la columna completa. Para generar una consulta que ejecute operaciones por fila (es decir, que opere sobre los diferentes campos de una misma fila), hay que crear una columna que mostrará el resultado de la operación a realizar. Esta es una técnica avanzada que se realiza más fácilmente en la consola SQL (que se accede pulsando el botón o icono Activar o desactivar la vista Diseño cuando se está en modo Diseño), es decir, escribiendo el código para la sentencia requerida.
Un ejemplo para obtener el total de la suma de tres valores sería el siguiente. Si tenemos una tabla llamada Emp1 con tres columnas de valores (Val1, Val2 y Val3) que deben sumarse para producir la columna Total por cada fila de la tabla.
La respuesta sería ejecutar el siguiente código SQL en la consola SQL:
SELECT "IDEmpleado", DATEDIFF('day', "FechaInicio", "FechaFin") AS 'TotalDías' FROM "Emp2";
Al ejecutar la consulta me sale todo en blanco. ¿Qué pasa?
Revisa si al agregar las tablas a la consulta estas tienen datos y si has definido relaciones entre ellas.
Cuando genero la consulta de los géneros, me sale el número y no el nombre. He revisado y lo tengo bien (es decir, la tabla Generos tiene los siguientes campos: Id_Genero y Nombre). ¿Qué puedo haber hecho mal?
Revisa qué campo has agregado a la consulta.
Tengo un problema a la hora de sumar campos numéricos de dos tablas. Me explico. Hay 25 campos numéricos que pueden estar o no vacíos. El problema es que intento sumar esos 25 campos y no hay resultado. La consulta sale en blanco. Por lo visto, interpreta los campos vacíos como texto y no me los suma, ya que si algún registro continene números en los 25 campos, entonces sí que me los suma. No sé si me estoy explicando demasiado bien, así que resumiré. ¿Hay alguna forma de sumar en una consulta campos NUMÉRICOS que contengan números e ignore los vacíos?
Las funciones de agregación, como SUM, COUNT, MAX, etc. aceptan valores NULL y realizan el cómputo sin tomarlos en cuenta. Revisa que lo que aparentemente parecen celdas vacías no sean espacios en blanco (cadenas de caracteres).