Select: Parte 2
Entonces, hay un montón de información relacionada a la liga de fútbol soccer.
Bueno, pero entonces ¿cómo empezamos a hacer consultas a la base de datos? Dijimos que vamos a utilizar nuestro objeto conexión.
Entonces, a conexión le podemos decir "dame un curso".
El cursor lo pueden imaginar como si fuera el puntero del mouse de una computadora, va a apuntar a una posición específica de una tabla o de una base de datos.
Entonces, podemos nosotros hacer un cursor y lo vamos a llamar objeto cursor.
Es un elemento específico.
Y le vamos a decir "objeto cursor, ejecuta la siguiente consulta SQL", y esta consulta SQL tiene que tener la estructura o la sintaxis que les mencionamos acá arriba: select estas columnas de la tabla.
Entonces, qué le estamos pidiendo, le estamos diciendo "selecciona el nombre del jugador de la tabla player".
La tabla player la tenemos aquí.
¿Qué columnas tiene? pues todas estas de aquí.
Y en específico hay una que se llama player name.
Entonces, estamos diciendo a la base de datos "dame todos los nombres de la tabla jugadores.
Una vez que se ejecutó esta consulta le tenemos que decir fetchall.
Fetchall lo que nos va a hacer es: va a ir a la base de datos y nos va a traer todos los registros, es decir, todos los jugadores pero delimitados, solamente a las columnas específicas que queremos.
Y lo vamos a meter en un ciclo for, ¿para qué? para que primero imprima el primer registro, luego el segundo registro, hasta que recorra todos los registros de la tabla, y luego los imprimimos.
Entonces, si lo hacemos nos va a dar directamente los jugadores de las diferentes ligas de la liga europa...
y ya nos da todos estos que son muchísimos.
Ahora, pero tal vez queremos no un nombre, tal vez queremos las alturas.
Bueno, repetimos el mismo proceso.
Le decimos "conexión, dame un cursor", le llamamos objeto cursor, le decimos "ejecuta la siguiente consulta: selecciona la altura de la tabla player", y decimos "dame todos y recorrelos dentro de un ciclo for", a cada registro le vamos a llamar row, y lo imprimimos.
Entonces nos da todos esos valores.
Ahora, si se dan cuenta lo que está haciendo Python es que cada registro nos lo está dando dentro de este conjunto de paréntesis, nos está dando una tupla.
Esta tupla tiene una coma, esto es lo que está identificando como una tupla.
Ese es el valor de efecto porque por lo general no estamos esperando un solo valor, estamos esperando tal vez el nombre y el peso, el nombre y la altura.
Entonces por eso la manera de dárnoslo de una manera consistente es darnos una tupla por cada registro.
Entonces podemos usar esto en nuestra ventaja, ¿por qué? porque esto estos elementos de aquí es la posición cero de la tupla.
Entonces, vamos a utilizar otra vez esa consulta vamos a usar select, seleccionar, la altura de la tabla jugador o player, y le vamos a decir "cursor, tráeme toda la información de esa consulta".
Dámela, como usualmente, en filas, pero sólo vamos a guardar el primer elemento de esa fila, es decir, el que tenga el índice 0, y eso lo vamos a guardar en una variable que es llamada player_height, o altura del jugador.
Esto ya es un arreglo...
es un arreglo de enteros.
En particular no es un arreglo como tal, es una lista, pero para nosotros, nuestro vocabulario que hemos estado utilizando, esto lo podemos ver como un conjunto de números.
Debido a eso podemos usar funciones como min o max o promedio o media o moda.
Vamos a utilizar en las primeras que mencioné: min y max.
Entonces le podemos decir "imprime el mínimo de la player_height, que es en la lista que acabamos de crear, y el máximo.
Ok, entonces ahora tenemos que de nuestra consulta en la base de datos el jugador con la menor altura es de 157 centímetros y el más alto es de 208 centímetros.
Entonces, nosotros ya tenemos la altura de los jugadores en una lista.
Nosotros podemos utilizarlo con la librería Numpy para crear un arreglo básicamente optimizado el cual podemos hacer consultas más rápidamente.
Entonces, vamos a usarlo "import numpy as np" como lo hemos estado haciendo anteriormente, y vamos a decirle "np.array, y lo vamos a pasar como parámetro la lista que ya teníamos, y lo vamos a sobreescribir, si se fijan es la misma variable, estamos sobreescribiendo la lista original con un arreglo de numpy.
Ok, lo ejecuto, lo hace sin ningún problema, no nos imprime nada, no es necesario, y ahora ya tenemos acceso a mayor número de funciones, por ejemplo, podemos usar el promedio de numpy, podemos usar el mínimo, el máximo e incluso podemos usar funciones como cuartiles.
Le estamos diciendo "de la player_height, el arreglo de alturas, dame estos cuartiles", que le estamos pidiendo el primer cuartil, el segundo cuartil y el tercer cuartil, que es 25%, 50% y 75%.
Ok, se lo pedimos y aquí están las alturas.
Entonces, podemos decir que los jugadores promedio en Europa tienen la altura de uno de 181 centímetros.
El más chaparrito es de 157, ya lo habíamos confirmado eso, el más alto de 208, y el primer cuartil es de 177, el segundo de 182 y el tercero es de 185.
Ok.
Bueno, pero hasta el momento sólo hemos consultado un valor a la vez, hemos consultado el nombre o la altura.
¿Qué pasa si queremos consultar dos elementos simultáneamente? Bueno, lo podemos hacer igualito como lo habíamos hecho, solamente le vamos a agregar coma y el segundo atributo que queremos, la segunda columna.
En este caso queremos la altura y el peso de la tabla jugador.
Entonces, lo ejecutamos y vamos a imprimir nada más los cinco primeros...
y la obtenemos directamente.
Nos da el primer elemento, que tiene una altura de 182 con un peso de 187, el segundo jugador tenemos la altura de 170 con un peso de 146, y así nos da los primeros cinco elementos.
Similarmente lo podemos pasar a una forma de arreglo con numpy y, como ya lo tenemos organizado ahí, podemos utilizar las funciones de alto nivel de numpy.
Entonces les vamos a pedir el promedio, el mínimo y el máximo de los cuartiles.
La diferencia a como lo hemos estado usando con una sola columna es que ahora hay que especificarle en qué eje queremos que aplique estas operaciones.
¿Cómo que en qué eje? Bueno, el eje 0 se refiere a los renglones, el eje 1 se refiere a las columnas.
La diferencia es que le vamos a estar pidiendo "dame el promedio de los jugadores por filas", es decir, va a tomar la fila 1, fila 2, fila 3 y de eso va a sacar promedio de la primera columna, luego va a hacer lo mismo para la segunda columna y ahí terminó.
Entonces, esto ya es algo que tenemos que empezar a pensar cuando hagamos consultas u operaciones ya en matrices de datos.
Hay que especificar cómo queremos que apliquen las funciones.
Ok, y nos dice que el promedio de los valores en su altura es de 181, que es el mismo que habíamos pedido antes.
Ahora la diferencia es el peso.
Tenemos un peso promedio de 168 kilos, un mínimo de 117, un máximo de 243, los cuartiles se encuentran en 159, 168 y 179.
¿A quién más le podemos hacer consultas? Bueno, podemos utilizar, así mismo como usamos la tabla jugadores, podemos usar la tabla países.
Podemos decirle "selecciona el nombre de país".
¿Cómo se que se usa la columna nombre? Bueno, en nuestra descripción original dice que para country tiene las columnas Id y nombre.
Entonces yo puedo hacerlo y nos va a dar sin ningún problema.
¿Qué tal si me equivoco aquí? ¿Qué es lo que va a pasar si le puse names? Pues me va a decir que no encuentra la columna names.
Entonces es algo que hay que tener en cuenta.
Siempre que no sea un error hay que leerlo y analizar qué es lo que pudo haber estado mal.
Ok.
De forma similar la liga tiene el Id del país y el nombre de la liga.
Simplemente lo ejecutamos y nos da los valores sin ningún problema.
Entonces esta es una versión resumida de lo que es la función select en cuanto es SQL.
Más adelante vamos a ver funciones como lo es insert, update, delete que hacen diferentes cosas y vamos a volver a revisar lo que es el select pero ya como una condicional: selecciona estos valores de acuerdo a esta condición.
Pero eso ya lo veremos un poco más adelante.
INSERT
Hola.
En este video vamos a ver la función insert que, acompañado con select, es una función más importante a la hora de hablar de bases de datos.
Eso nos va a permitir hacer, como dice la palabra, inserciones a la base de datos de valores nuevos.
Es como se va a llenar principalmente la base de datos y es la que nos va a permitir interactuar directamente con ella.
Entonces, para ver esta función vamos a utilizar un cuaderno en nuestra carpeta de Jupyter llamada "insert".
Entonces, vamos a abrirlo.
Ya una vez que abrió vamos a ver un poquito de la sintaxis de lo que es insert.
Insert lleva una segunda palabra llamada into que no va a decir inserta en...
y siguiente a eso lleva el nombre de la tabla en la cual vamos a hacer la inserción, a la cual le queremos agregar datos nuevos.
Seguido de eso vamos a indicarle las columnas en las cuales queremos hacer la inserción de datos, si tenemos por ejemplo...
nada más queremos insertar, regresando a lo que son los jugadores, nada más el nombre y el peso, pues nada más especificamos esas dos columnas.
En seguida de eso viene la palabra reservada values la cual me va a decir qué valores van a resaltar en las columnas que acabamos de especificar.
Ahora, aquí hay que tener mucho cuidado.
Si nosotros especificamos tres columnas hay que especificar tres valores, y hacen relación en el mismo orden, por ejemplo, para la columna 1 es el valor 1, para la columna 2 es el valor 2, etcétera.
Una vez insertados los datos podemos regresar a utilizar nuestra función select que, como recordatorio, es select más algo de la tabla, ok.
Entonces, vamos a utilizar el mismo ejemplo la vez pasada.
Si no recuerdan es el que está aquí, es el european soccer data base, es una base de datos que sacamos de kaggle y viene en formato de SQL lite, tiene diferentes tablas y diferentes columnas para cada una en las tablas.
Lo vamos a utilizar de una manera muy similar a como lo usamos en el cuaderno pasado, que era el de select, donde importamos SQL lite 3, especificamos el nombre del archivo seguido de la ruta de ese archivo.
Recordemos que lo tenemos en la carpeta data/soccer/database_sqllite si tienen dudas de donde salió este archivo en el video anterior lo hicimos.
Además usamos un archivo de conexión que es SQL 3 connect y utilizamos el archivo que hemos utilizado en la sección anterior y le llamamos conexión.
Hasta el momento es idéntico a lo que hemos estado usando.
Ahora vamos a hacer nada más una consulta de select para ver qué es lo que contiene la tabla country.
Si nosotros lo ejecutamos simplemente nos dice el ID y el país, entonces nos está diciendo que Bélgica es el 1 e Inglaterra es el 1,729, Francia es el 4,769, este número de la izquierda es solamente para identificar ese renglón, no quiere decir que uno sea más que otro tenga un orden específico.
Seguido de eso vamos a empezar a utilizar la función insert.
Como dijimos es primero insert into, estamos diciendo: inserta en la tabla country estos valores.
¿Qué valores? nosotros le pusimos pregunta pregunta.
Nosotros podemos ponerle directamente 2 y México...
México pero una manera de hacerlo más sencillo es decirle a python que sus valores los vamos a completar después.
¿Dónde es después? Pues justo aquí, nada más le estamos diciendo el primer value va a hacer 2 y el segundo va a ser México.
Entonces, si lo ejecutamos nos dice esto de aquí, nos devuelve el cursor no nos dice fue satisfactorio o no.
Entonces vamos a comprobarlo, vamos a hacer un select.
Selecciona todo de la tabla country, exactamente a la celda que tenemos acá arriba, y nos da aquí un valor, nos dice que México tiene el ID número 2.
Entonces la inserción que hicimos acá arriba fue efectiva y ya la podemos consultar gracias a nuestra instrucción select.
Bueno, vamos a insertar a otra tabla, vamos a insertar, por ejemplo, en la tabla player el nombre Pelé y vamos a darle un número identificador 120,350, es un número inventado, no sé a la altura de Pelé pero le puse 180 y un peso de 178, que obviamente no lo es, verdad, pero pues solamente es para interactuar con la base de datos.
Entonces le decimos "inserta en la tabla player, en los campos ID, player_name, altura y peso estos cuatro valores, que son signos de interrogación.
Pero ahora verán que es muy diferente no estamos pasando los valores separados por comas, le estamos pasando una variable.
Bueno, esta variable es la que creamos de acá arriba.
Le podemos pasar directamente vectores o arreglos o duplas a esta ejecución y Python sabrá que va a respetar el orden de ese arreglo y lo va a reemplazar sobre estos signos de interrogación.
Entonces nos facilita mucho las cosas.
Lo ejecutamos, nos devuelve el cursor que no representa nada significativo para nosotros pero podemos utilizar un select para ver si Pelé existe o no.
Esta cláusula web la vamos a ver en otro video que nos específica: quiero que el jugador...
el nombre del jugador sea idéntico a Pelé.
Sólo entonces selecciónalo.
Entonces, lo hacemos y nos da tres valores.
Al parecer ya había dos jugadores llamados Pelé, pero recordemos que el nuestro tiene una altura de 180 y un peso de 178.
Entonces hizo la inserción correctamente a la base de datos.
Bueno, vamos a intentar otra.
Vamos a decir inserta a Diego Maradona con el número indicador 103, una altura de 165 y un peso de 180.
Entonces, hacemos la inserción idéntico a Pelé, nos va a dar un error, nos va a decir que hay una restricción que se está incumpliendo y es esta palabra "unique".
"Unique" nos está diciendo que ese campo en específico tiene que ser único, si esa es la base datos no se puede hacer la inserción, y ¿cuál es el campo que no estaba causando conflicto? Player_id.
Eso significa que en la base de datos ya hay un jugador con ese identificador único.
Entonces, vamos a consultar quién es.
Selecciona todo de "jugador" dónde ID es igual a 103.
Y ya había uno.
Adam Federici, este ya tiene un identificador de 103, una altura de 187 y un peso de 198.
Entonces ya está ocupado ese valor, por lo tanto no podemos realizar la inserción.
Entonces, esto concluye rápidamente lo que es la función insert, más adelante vamos a ver las funciones que nos faltan pero recuerden que esto lo estamos viendo a un nivel superficial.