Base de datos de NBA.

Logo de baloncesto simil de base de datos 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.

Base de datos de jugadores y partidos de la NBA americana

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 *.

Como funciona el select para mostrar todos los registros

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.

Ordenamos los registros por nombre de forma alfabética

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.

Ordenamos los registros por nombre y Peso mayor de 200kg de forma alfabética

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.

Ordenamos los registros por nombre, Peso mayor de 200kg de forma alfabética, mostrando los 10 últimos registros

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.

Ordenamos los registros por nombre, Peso mayor de 200kg de forma alfabética, mostrando los 10 últimos registros y que son de España

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:

La cláusula IN nos permite seleccionar valores de un campo de la tabla

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.

Between nos permite ampliar la condición entre dos valores ajustando un rango en la consulta

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 con valor de null IS IS NOT nos permiten comprobar los null en los campos

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.

Filtros con HAVING que sirve para realizar operaciones aritméticas con los campos

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í.

Sacar el número de equipos que tienen más jugadores españoles

Así como podemos sacar todos los equipos en donde hay españoles jugando.

Equipos de la NBA en donde juegan españoles y su número de jugadores españoles.

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);

jugador más pesado de la NBA. Error de sintaxis

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:

jugador más pesado de la NBA pero con diferencias.

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.