Tipos de datos
1
Tipos de datos
Los datos o atributos de cada registro de una tabla tienen que ser de
un tipo de dato concreto.
Cuando diseñamos una base de datos tenemos que pensar qué tipo
de dato nos sirve para nuestro modelo.
Cada tipo de dato tiene un tamaño determinado y cuanta más
precisión pongamos a este tipo de dato, más rápido y performante
va a funcionar MySQL.
012345 2020-05-09 Juan Perez
Tipos numéricos Tipos de fecha Tipos de texto
Numéricos sin decimales
TINYINT
-128 a 128, 0 a 255
SMALLINT
-32768 a 32767, 0 a 65535
MEDIUMINT
-8388608 a 8388607, 0 a 16777215
INT
-2147483648 to 214748364, 0 a 4294967295
BIGINT
-9223372036854775808 a 9223372036854775807
0 a 18446744073709551615
Numéricos con decimales
FLOAT
Permite almacenar pequeños números decimales
DOUBLE
Permite almacenar grandes números decimales
DECIMAL
Permite almacenar grandes números decimales de punto
fijo
Booleanos
MySQL guarda los booleanos por detrás, como un cero o como un
uno. Por cuestiones de performance, no se recomienda utilizar este
tipo de dato en MySQL.
En caso de querer guardar valores "verdaderos" y "falsos", podemos
usar el tipo de dato tinyint y usar el 0 para representar el false y el
1 para representar el true.
Datos de tipo fecha
A la hora de almacenar fechas, hay que tener en cuenta que MySQL
no comprueba de una manera estricta si una fecha es válida o no.
DATE
Almacena solamente la fecha en formato YYYY-MM-DD.
TIME
Almacena solamente la hora en formato HH:MM:SS.
DATETIME
Corresponde a una representación completa de fecha y hora, es
decir, algo como el 3 de enero de 1967 a las 8:00 am, lo que se
almacena del siguiente modo: 1967-01-03 08:00:00.
Datos de tipo texto
CHAR(num)
El número entre paréntesis va a indicar la cantidad exacta de
caracteres.
Ejemplo: char(100) → 100 caracteres siempre.
VARCHAR(num)
El número entre paréntesis va a indicar la cantidad máxima de
caracteres.
Ejemplo: varchar(100) → 100 caracteres como máximo.
TEXT
Determina un dato de tipo texto sin límite de caracteres. Se suele
usar para un posteo de un blog, por ejemplo.
Comando CREATE DATABASE
Con CREATE DATABASE podemos crear una base de datos desde
cero.
SQL CREATE DATABASE miprimerabasededatos;
USE miprimerabasededatos;
Comando CREATE TABLE
Con CREATE TABLE podemos crear una tabla desde cero, junto con
sus columnas, tipos y constraints.
CREATE TABLE nombre_de_la_tabla (
SQL nombre_de_la_columna_1 TIPO_DE_DATO CONSTRAINT,
nombre_de_la_columna_2 TIPO_DE_DATO CONSTRAINT
)
CREATE TABLE post (
id INT PRIMARY KEY AUTO_INCREMENT,
SQL
titulo VARCHAR(200)
)
Ejemplo CREATE TABLE
CREATE TABLE peliculas (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(500) NOT NULL,
rating DECIMAL(3,1) NOT NULL,
SQL
awards INT DEFAULT 0,
release_date DATE NOT NULL,
length INT NOT NULL
);
FOREIGN KEY
Cuando creemos una columna que contenga una id foránea, será
necesario usar la sentencia FOREIGN KEY para aclarar a qué tabla y
a qué columna hace referencia aquel dato.
Es importante remarcar que la tabla “clientes” deberá existir antes
de correr esta sentencia para crear la tabla “ordenes”.
CREATE TABLE ordenes (
orden_id INT NOT NULL,
orden_numero INT NOT NULL,
SQL cliente_id INT,
PRIMARY KEY (orden_id),
FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);
Comando DROP TABLE
DROP TABLE borrará la tabla que le especifiquemos en la sentencia.
SQL DROP TABLE IF EXIST peliculas;
Comando ALTER TABLE
ALTER TABLE permite alterar una tabla ya existente y va a operar
con tres comandos:
● ADD: para agregar una columna.
● MODIFY: para modificar una columna.
● DROP: para borrar una columna.
Ejemplos ALTER TABLE
ALTER TABLE peliculas
SQL
ADD rating DECIMAL(3,1) NOT NULL;
Agrega la columna rating, aclarando tipo de dato y
constraint.
ALTER TABLE peliculas
SQL
MODIFY rating DECIMAL(4,1) NOT NULL;
Modifica el decimal de la columna rating. Aunque el resto de las
configuraciones de la tabla no se modifiquen, es necesario escribirlas en la
sentencia.
ALTER TABLE peliculas
SQL
DROP rating;
Borra la columna rating.
Cómo usarlo
Toda consulta a la base de datos va a empezar con la palabra
SELECT.
Su funcionalidad es la de realizar consultas sobre una o varias
columnas de una tabla.
Para especificar sobre qué tabla queremos realizar esa consulta
usamos la palabra FROM seguida del nombre de la tabla.
SQL SELECT nombre_columna, nombre_columna, ...
FROM nombre_tabla;
Estructura de una Query
1
Ejemplo - Tabla Peliculas
fecha_estren
id título rating país
o
1001 Pulp Fiction 9.8 1995-02-16 Estados Unidos
1002 Kill Bill 9.5 2003-11-27 Estados Unidos
De esta tabla completa, para conocer solamente los títulos y ratings
de las películas guardadas en la tabla películas, podríamos hacerlo
ejecutando la siguiente consulta:
SQL SELECT id, titulo, rating
FROM peliculas;
Todas las columnas
Si estamos insertando datos en todas las columnas, no hace falta
aclarar los nombres de cada columna. Sin embargo, el orden en el
que insertemos los valores, deberá ser el mismo orden que tengan
asignadas las columnas en la tabla.
SQL INSERT INTO table_name (columna_1, columna_2, columna_3, ...)
VALUES (valor_1, valor_2, valor_3, ...);
SQL INSERT INTO artistas (id, nombre, rating)
VALUES (DEFAULT, 'Shakira', 1.0);
Columnas específicas
Para insertar datos en una columna en específico, aclaramos la tabla
y luego escribimos el nombre de la o las columnas entre los
paréntesis.
SQ INSERT INTO artistas (nombre)
L
VALUES ('Calle 13');
SQ INSERT INTO artistas (nombre, rating)
L
VALUES (‘Maluma’, 1.0);
UPDATE
UPDATE modificará los registros existentes de una tabla. Al igual que
con DELETE, es importante no olvidar el WHERE cuando escribimos
la sentencia, aclarando la condición.
SQ UPDATE nombre_tabla
L SET columna_1 = valor_1, columna_2 = valor_2, ...
WHERE condición;
SQ UPDATE artistas
L SET nombre = 'Charly Garcia', rating = 1.0
WHERE id = 1;
DELETE
Con DELETE podemos borrar información de una tabla. Es
importante recordar utilizar siempre el WHERE en la sentencia para
agregar la condición de cuáles son las filas que queremos eliminar. Si
no escribimos el WHERE, estaríamos borrando toda la tabla y no un
registro en particular.
SQ
L DELETE FROM nombre_tabla WHERE condición;
SQL DELETE FROM artistas WHERE id = 4;
2
WHERE
La funcionalidad del WHERE es la de condicionar y filtrar las
consultas SELECT que se realizan a una base de datos.
SQ SELECT nombre_columna_1, nombre_columna_2, ...
L FROM nombre_tabla
WHERE condicion;
Teniendo una tabla clientes, podría consultar primer nombre y
apellido, filtrando con un WHERE solamente los usuarios que su
país es igual a Argentina de la siguiente manera:
SELECT primer_nombre, apellido
SQL FROM clientes
WHERE pais = ‘Argentina’;
Operadores
=
>
IS NULL Es nulo
> Igual a
BETWEE Entre dos
= Mayor que N valores
< Mayor o igual que IN Lista de valores
< Menor que LIKE Se ajusta a...
= Menor o igual que
< Diferente a
> Diferente a
!
=
Queries de ejemplo
SELECT nombre, edad
SQL FROM usuarios
WHERE edad > 17;
SELECT *
SQL FROM movies
WHERE title LIKE 'Avatar';
ORDER BY
ORDER BY se utiliza para ordenar los resultados de una consulta
según el valor de la columna especificada. Por defecto, se
ordena de forma ascendente (ASC) según los valores de la columna.
También se puede ordenar de manera descendente (DESC)
aclarándolo en la consulta.
SELECT nombre_columna1, nombre_columna2
SQ FROM tabla
L
WHERE condicion
ORDER BY nombre_columna1;
Query de ejemplo
Teniendo una tabla usuarios, podría consultar los nombres, filtrar
con un WHERE solamente los usuarios mayores de 21 años y
ordenarlos de forma descendente tomando como referencia la
columna nombre.
SELECT nombre, edad
SQL FROM usuarios
WHERE edad > 21
ORDER BY nombre DESC;
BETWEEN
Cuando necesitamos obtener valores dentro de un rango, usamos
el operador BETWEEN.
➔ BETWEEN incluye los extremos.
➔ BETWEEN funciona con números, textos y fechas.
➔ Se usa como un filtro de un WHERE.
Por ejemplo, coloquialmente:
➔ Dados los números: 4, 7, 2, 9, 1
Si hiciéramos un BETWEEN entre 2 y 7 devolvería 4, 7, 2 (excluye el 9
y el 1, e incluye el 2).
LIKE
Cuando hacemos un filtro con un WHERE, podemos especificar un
patrón de búsqueda que nos permita especificar algo concreto que
queremos encontrar en los registros. Eso lo logramos utilizando
comodines (wildcards).
Por ejemplo, podríamos querer buscar:
➔ Los nombres que tengan la letra 'a' como segundo carácter.
➔ Las direcciones postales que incluyan la calle 'Monroe'.
➔ Los clientes que empiecen con 'Los' y terminen con 's’.
Queries de ejemplo
SELECT nombre
SQL FROM usuarios
WHERE edad LIKE '_a%';
Devuelve aquellos nombres que tengan la letra 'a' como segundo
carácter.
SELECT nombre
SQL FROM usuarios
WHERE direccion LIKE '%Monroe%';
Devuelve las direcciones de los usuarios que incluyan la calle 'Monroe'.
Queries de ejemplo
SELECT nombre
SQL FROM clientes
WHERE nombre LIKE 'Los%s';
Devuelve los clientes que empiecen con 'Los' y terminen con 's’.
Alias
Los alias se usan para darle un nombre temporal y más amigable a
las tablas, columnas y funciones. Los alias se definen durante una
consulta y persisten solo durante esa consulta.
Para definir un alias usamos las iniciales AS precediendo a la
columna que estamos queriendo asignarle ese alias.
SQL SELECT nombre_columna1 AS alias_nombre_columna1
FROM nombre_tabla;
Alias para una columna
SELECT razon_social_cliente AS nombre
SQL FROM cliente
WHERE nombre LIKE 'a%';
Alias para una columna
Seleccionamos la
columna
SELECT razon_social_cliente AS nombre razon_social_cliente y
le asignamos el alias
FROM cliente nombre.
WHERE nombre LIKE 'a%';
Alias para una columna
En el FROM elegimos
SELECT razon_social_cliente AS nombre tabla cliente.
FROM cliente Con el WHERE
filtramos los registros
WHERE nombre LIKE 'a%'; de la columna nombre
que empiecen con la
letra a.
Alias para una tabla
SQL SELECT nombre, apellido, edad
FROM alumnos_comision_inicial AS alumnos;
Alias para una tabla
Seleccionamos las
columnas nombre,
SELECT nombre, apellido, edad
apellido y edad.
FROM alumnos_comision_inicial AS
alumnos;
Count
Devolverá la cantidad de filas/registros que cumplen con
el criterio.
SQL
SELECT COUNT(*) FROM movies;
Devolverá la cantidad de registros de la tabla movies
SQL
SELECT COUNT(id) AS total FROM movies WHERE genre_id = 3;
Devolverá la cantidad de películas de la tabla movies con el
genero_id 3 en una columna nombrada total
Avg y Sum
AVG (average) devolverá el promedio de una columna
con valores numéricos.
SUM (suma) devolverá la suma de una columna con
valores numéricos.
SQL
SELECT AVG(rating) FROM movies;
Devolverá el promedio del rating de las películas de la
tabla movies
SQL
SELECT SUM(length) FROM movies;
Devolverá la suma de las duraciones de las películas de la
tabla movies
Función de GROUP BY
GROUP BY se usa para agrupar los registros de la tabla resultante
de una consulta por una o más columnas.
SELECT columna_1
SQL FROM nombre_tabla
WHERE condition
GROUP BY columna_1;
GROUP BY ejemplo
SELECT marca
SQL FROM autos
GROUP BY marca;
4
GROUP BY ejemplo
id marca modelo
1 Renault Clio
marca
2 Renault Megane
Renault
3 Seat Ibiza
Seat
4 Seat Leon
Opel
5 Opel Corsa
6 Renault Clio
Sintaxis
Dado que GROUP BY agrupa la información, perdemos el detalle de
cada una de las filas. Es decir, ya no nos interesa el valor de cada fila,
sino un resultado consolidado entre todas las filas.
La consulta:
SELECT id,marca
SQL FROM autos
GROUP BY marca;
Nos daría un error. Si agrupamos los datos por marca, ya no
podemos pedir el campo id
Por ende, al utilizar GROUP BY, en los campos que se muestran
como resultado en el SELECT solamente podemos indicar:
● Datos agrupados (Columnas que se encuentran tanto en el
Select como en el Group By).
● Funciones de agregación (SUM, AVG, COUNT, MIN, MAX)
Veamos con un ejemplo:
SELECT marca, MAX(precio)
SQL FROM autos
GROUP BY marca;
4
¿Por qué usar JOINS?
Además de hacer consultas dentro de una tabla o hacia muchas
tablas a través de table reference, también es posible y necesario
hacer consultas a distintas tablas y unir esos resultados con JOINS.
Si bien cumplen la misma función que table reference, los JOINS:
● Proveen ciertas flexibilidades adicionales.
● Su sintaxis es mucho más utiliza.
● Presentan una mejor performance.
INNER JOIN
El INNER JOIN hará una cruza entre dos tablas. Si cruzáramos las
tablas de clientes y ventas y hubiese algún cliente sin ventas, el
INNER JOIN no traería a ese cliente como resultado.
CLIENTES INNER JOIN VENTAS
id nombre apellid id cliente_i fecha
o d
1 Juan Perez 1 2 12/03/2019
2 Clara Sanchez 2 2 22/08/2019
3 Marta García 3 1 04/09/2019
Creando un INNER JOIN
Antes escribíamos:
SQL SELECT clientes.id AS id, clientes.nombre, ventas.fecha
FROM clientes, ventas
Ahora escribiremos:
SELECT clientes.id AS id, clientes.nombre, ventas.fecha
SQL
FROM clientes
INNER JOIN ventas
Creando un INNER JOIN (cont.)
La sintaxis del JOIN no utiliza el WHERE si no que requiere la
palabra ON. Es ahí en donde indicaremos el filtro a tener en cuenta
para realizar el cruce.
Es decir, que lo que antes escribíamos en el WHERE ahora lo
escribiremos en el ON.
SELECT clientes.id AS id, clientes.nombre, ventas.fecha
SQL FROM clientes
INNER JOIN ventas
ON clientes.id = ventas.cliente_id
LEFT JOIN
El LEFT JOIN entre dos tablas devuelve todos los registros de la primera
tabla, incluso cuando los registros no cumplan la condición indicada en la
cláusula ON.
SQL
SELECT <columna1>, <columna2>,
…
FROM <tabla A>
LEFT JOIN <tabla B>
ON <condicion>
LEFT JOIN
Para incluir aquellos clientes sin ventas basta cambiar INNER JOIN por
LEFT JOIN. El LEFT JOIN incluirá todos los registros de la primera tabla
de la consulta (la tabla izquierda) incluso cuando no exista coincidencia
con la tabla derecha.
CLIENTES VENTAS
id nombre apellid id cliente_i fecha
o d
1 Juan Perez 1 2 12/03/2019
2 Clara Sanchez 2 2 22/08/2019
LEFT JOIN
3 Marta García 3 1 04/09/2019
LEFT JOIN
SELECT clientes.id AS id, clientes.nombre, ventas.fecha
SQL FROM clientes
LEFT JOIN ventas
ON clientes.id = ventas.cliente_id
cliente
ventas
s
RIGHT JOIN
El RIGHT JOIN entre dos tablas devuelve todos los registros de la segunda
tabla incluso cuando los registros no cumplan la condición indicada en la
cláusula ON.
SQL
SELECT <columna1>, <columna2>,
…
FROM <tabla A>
RIGHT JOIN <tabla B>
ON <condicion>
RIGHT JOIN
Para incluir aquellas ventas sin clientes basta cambiar LEFT JOIN
por RIGHT JOIN. El RIGHT JOIN incluirá todos los registros de la
tabla derecha. Si miramos la query, la tabla ventas aparece
posterior a la tabla de clientes…¡a la derecha!
CLIENTES VENTAS
id nombre apellid id cliente_i fecha
o d
1 Juan Perez 1 2 12/03/2019
2 Clara Sanchez RIGHT JOIN 2 2 22/08/2019
3 Marta García 3 1 04/09/2019
RIGHT JOIN
SELECT clientes.id AS id, clientes.nombre, ventas.fecha
SQL FROM clientes
RIGHT JOIN ventas
ON clientes.id = ventas.cliente_id
cliente
ventas
s
Count
Devolverá la cantidad de filas/registros que cumplen con
el criterio.
SQL
SELECT COUNT(*) FROM movies;
Devolverá la cantidad de registros de la tabla movies
SQL
SELECT COUNT(id) AS total FROM movies WHERE genre_id = 3;
Devolverá la cantidad de películas de la tabla movies con el
genero_id 3 en una columna nombrada total
Avg y Sum
AVG (average) devolverá el promedio de una columna
con valores numéricos.
SUM (suma) devolverá la suma de una columna con
valores numéricos.
SELECT AVG(rating) FROM movies;
SQL
Devolverá el promedio del rating de las películas de la
tabla movies
SQL SELECT SUM(length) FROM movies;
Devolverá la suma de las duraciones de las películas de la
tabla movies
•Data Analytics
HAVING sintaxis
Cumple la misma función que WHERE, a diferencia de
que HAVING se va a poder usar en conjunto con las
funciones de agregación para filtrar datos
agregados.
SELECT columna_1
FROM nombre_tabla
SQL WHERE condition
GROUP BY columna_1
HAVING condition_Group
ORDER BY columna_1;