Base de datos de NBA.
Ya hablamos en el anterior capítulo que los filtros de grupos deben de realizarse mediante la cláusula HAVING, junto con la otra cláusula WHERE. La primara debe de actuar después de la segunda, por lo que ambas cláusulas vienen en la misma consulta.
Para esta clase que servirá de prácticas vamos a usar otra base de datos llamada NBA.sql. Esta base de datos es una base de datos con nombre de jugadores de la NBA americana y lo relacionado con los equipos. Así podremos hacer muchas consultas y anidarlas de manera personalizada.
Esta base de datos tiene 4 tablas y te la puedes bajar desde la el pié de página de esta clase. o pinchando AQUI.
Así que teniendo la base de datos, podemos empezar a jugar.
FILTROS DE GRUPOS.
Un administrador de datos en una base de datos deberá ser capaz de agrupar los datos en cuestión conociendo las acciones y funciones que debe de procesar. Para ello el administrador de base de datos, utilizará las consultas personalizadas. Tu ya sabes que con SELECT, creas consultas de las tablas y que si quieres mostrar todos los datos de una tabla en cuestión utilizas el comodín *.
Puedes ver que la selección de jugadores se muestran en el orden en qué se inscribieron en la tabla. Pero se puede realizar varias operaciones sobre ellos, como por ejemplo ordenarlos por orden alfabético u orden respecto a la columna.
También se pueden ordenar según un dato de su peso en cuestión o a partir de un peso concreto y que esten ordenados los jugadores.
Fijate que la siempre que realicemos una ordenación ORDER BY y una condición WHERE, la cláusula WHERE siempre tiene que ir primero, ya que ORDER BY, HAVING, INNER JOIN, etc., etc., realiza la acción de la condición. Por eso primero la condición y luego la acción.
También en tablas con muchos registros, vamos a tener que limitar la presentación de los datos. Y por ejemplo que nos muestren una pequeña cantidad de datos. Recuerda que de la clase anterior, podiamos limitar los datos con la cláusula LIMIT. Y además podemos hacer que nos muestren los 10 últimos registros empezando por abajo.
Fijate que cada vez que vayamos añadiendo cláusulas las vamos añadiendo más hacia la derecha, con la regla que esté después de la condición más significativa, ya que pueden existir varias condiciones en la instrucción.
Fijate que existen muchas posibilidades y que en todas las consultas se sigue el orden de primero las condiciones y después las cláusulas de dichas condiciones. Y SQL funciona así tanto en un SGBD como en otro.
Tipos de filtros.
Vamos a hablar de una serie de filtros que hemos visto en la anterior clase añadiendo más conocimiento a la creación de filtros.
Filtro con operador de permanencia.Los operadores anteriores también pueden hacer uso del operador de permanencia a conjunto IN, cuyha sintaxis es la siguiente:
nombre_columna IN (value1, value2,...);
Este filtro busca entre los valores introducidos entre paréntesis y devuelve la consulta según la cláusula establecida en la condición. Así que, si queremos que se nos muestren los jugadores de más de 200 kg que jueguen en los Lakers y que sean españoles y eslobenos deberemos hacer la siguiente consulta:
Filtros de operador en rango.Si con LIMIT limitamos el número de registros que nos devuelve la tabla, con el operador BETWEEN podemos establecer un rango en concreto entre dos valores cualquiera. Así que, ahora quiero conocer los jugadores de los Lakers que sean españoles, Congolenses y de texanos que tengan un peso entre 200 y 250kg.
Si le quitas el between a la consulta y pones los jugadores mayores de 200 kg, te saldrán 3 jugadores. Así que al establecer el rango entre los 200 y 250kg, el único jugador que se mete en esa categoría es Gasol.
Esta consulta anterior la podriamos hacer anidando cláusulas AND junto con operadores matemáticos y de asignación de la forma:
SELECT * FROM 'jugadores' where Peso >= 200 and Peso <=250 and Procedencia in ('spain','texas','congo') and Nombre_equipo like'%Lakers%' order by Procedencia;
Pero queda más corta la sentencia establecida.
Filtro con test de valor NULL.Los operadores IS e IS NOT permiten comprobar si un campo es o no es nulo respectivamente. Así se podrían comprobar los campos cuyo valores sean nulos en las tablas.
Filtro de Grupo.Los filtros de grupos se deben de hacer mediante la cláusula HAVING. Esto hace que los filtros se agrupen teniendo en cuenta que la cláusula WHERE va antes de HAVING. Es importante destacar que la cláusula HAVING actúa de manera similar a WHERE, pero con HAVING podemos usar funciones SQL y matemáticas si la usamos entre paréntesis.
Por ejemplo, si queremos que nos muestren jugadores que pesen una media de 220kg, y lo ordenamos de menor a mayor, obtendremos la siguiente lista.
Es habitual usar consultas generales en el uso de HAVING ya que para hacer una consulta pequeña de un campo hay otras formas de conseguirlo. Así por ejemplo en esta tabla, nos gustaría conocer el equipo de la NBA que tiene más de dos jugadores españoles en sus filas. La consulta quedaría así.
Así como podemos sacar todos los equipos en donde hay españoles jugando.
Subconsultas anidadas.
El lenguaje DML te permite hacer varias consultas al mismo tiempo siempre que hagas las preguntas correctas y desarrolles la querie correctamente. Hacer una consulta dentro de otra consulta se llama anidación de consultas.
Para simplificar hemos de coger la subconsulta por separado y observar su resultado. De esta forma, al realizar la comparacion, no pensaremos que comparamos el valor con una consulta,que es algo un poco abstracto, sino con el resultado de esa consulta, que algo mucho más simple como un número o una cadena de texto.
Por ejemplo si queremos saber qué jugador pesa más la consulta simple es básica porque afecta a una tabla específica de jugadores. Tal vez pienses que la instrucción para hacer eso es:
select Nombre from jugadores where Peso = max(Peso);
Puedes ver que te devuelve un error, porque en SQL la asignación no se realiza de esa forma. Sin embargo si sacas el Peso maximo de una consulta, y luego lo aplicas a una consulta principal, la cosa cambia:
Puedes ver que en la segunda consulta (entre paréntesis), está la consulta del máximo Peso que puede pesar un jugador. Así que esa consulta la asignamos a una consulta en la que pidamos el nombre y el peso. Si te das cuenta la consulta es la misma que si hacemos:
Select Nombre, Peso from jugadores where Peso = 325;
Pero en lugar de poner la cifra, hacemos un select anidado.
Existen muchas fórmulas para sacar el máximo peso sin tener que concatenar consultas, como por ejemplo usando la cláusula ALL y asignadola a mayor o igual, ya que dicha cláusula incluye todo los valores del campo preguntado y de ahí realiza la función específica que en este caso queremos el mayor de todos los pesos:
select Nombre from jugadores where peso >= All(select Peso from jugadores);
Seguiremos trasteando con consultas SQL en futuras clases. No olvides compartir el contenido. Así ayudarás a este humilde profesor.