Repositorio de la formación sobre base de datos.
El objetivo principal de las bases de datos es el de unificar los datos que se manejan y los programas o aplicaciones que los manejan. Anteriormente los programas se codificaban junto con los datos, es decir, se diseñaban para la aplicación concreta que los iba a manejar, lo que desembocaba en una dependencia de los programas respecto a los datos, ya que la estructura de los ficheros va incluida dentro del programa, y cualquier cambio en la estructura del fichero provocaba modificar y recompilar programas. Además, cada aplicación utiliza ficheros que pueden ser comunes a otras de la misma organización, por lo que se produce una REDUNDANCIA de la información, que provoca mayor ocupación de memoria, laboriosos programas de actualización (unificar datos recogidos por las aplicaciones de los diferentes departamentos), e inconsistencia de datos (no son correctos) si los datos no fueron bien actualizados en todos los programas. Con las bases de datos, se busca independizar los datos y las aplicaciones, es decir, mantenerlos en espacios diferentes. Los datos residen en memoria y los programas mediante un sistema gestor de bases de datos, manipulan la información. El sistema gestor de bases de datos recibe la petición por parte del programa para manipular los datos y es el encargado de recuperar la información de la base de datos y devolvérsela al programa que la solicitó. Cada programa requerirá de una cierta información de la base de datos, y podrá haber otros que utilicen los mismos datos, pero realmente residirán en el mismo espacio de almacenamiento y los programas no duplicarán esos datos, si no que trabajarán directamente sobre ellos concurrentemente. Aunque la estructura de la base de datos cambiara, si los datos modificados no afectan a un programa específico, éste no tendrá por qué ser alterado. Mediante estas técnicas de base de datos se pretende conseguir a través del Sistema Gestor de Bases de Datos(SGBD):
- INDEPENDENCIA de los Datos: Cambios en la estructura de la Base de Datos no modifican las aplicaciones.
- INTEGRIDAD de los Datos: Los datos han de ser siempre correctos. Se establecen una serie de restricciones (reglas de validación) sobre los datos.
- SEGURIDAD de los Datos: Control de acceso a los datos para evitar manipulaciones de estos no deseadas.
Es una colección de datos referentes a una organización estructurada según un modelo de datos de forma que refleja las relaciones y restricciones existentes entre los objetos del mundo real, y consigue independencia, integridad y seguridad de los datos.
Lo que debemos tener claro es la diferencia entre Base de Datos y SGBD. La base de datos es el almacenamiento donde residen los datos. El SGBD es el encargado de manipular la información contenida en ese almacenamiento mediante operaciones de lectura/escritura sobre la misma. Además las bases de datos no sólo contendrán las tablas (ficheros) de datos, sino que también almacenará formularios (interfaces para edición de datos), consultas sobre los datos, e informes. El SGBD se encargará de manipular esos datos, controlar la integridad y seguridad de los datos, reconstruir y reestructurar la base de datos cuando sea necesario.
Las bases de datos surgen de la necesidad de conservar la información más allá de lo que existe en la memoria RAM.
Las bases de datos basadas en archivos eran datos guardados en texto plano, fáciles de guardar pero muy difíciles de consultar y por la necesidad de mejorar esto nacen las bases de datos relacionales. Su inventor Edgar Codd dejó ciertas reglas para asegurarse de que toda la filosofía de las bases de datos no se perdiera, estandarizando el proceso, Codd invento el algebra relacional
(Contenido adicional) Bases de datos relacionales (RBD)
Es importante que sea fácil de guardar y extraer, anteriormente se usaban bases de datos basadas en archivos, el cuál era texto plano fácil de guardar, pero difícil de extraer, por esto se inventaron las bases de datos relacionales. En 1990 Codd se preocupó porque los sistemas de gestión de bases de datos (SGBD) que decían ser relacionales, no lo eran. En la práctica es difícil cumplir las 12 pero, un SGBD es más relacional cuantas más reglas cumpla
Las Reglas y mandamientos de Edgar Frank Ted Codd
Regla 0: Regla de fundación. a) Cualquier sistema que se proclame como relacional, debe ser capaz de gestionar sus bases de datos enteramente mediante sus capacidades relacionales.
Regla 1: Regla de la información. a) Todos los datos deben estar almacenados en las tablas b) Esas tablas deben cumplir las premisas del modelo relacional c) No puede haber información a la que accedemos por otra vía
Regla 2: Regla del acceso garantizado. a) Cualquier dato es accesible sabiendo la clave de su fila y el nombre de su columna o atributo b) Si a un dato no podemos acceder de esta forma, no estamos usando un modelo relacional
Regla 3: Regla del tratamiento sistemático de valores nulos. a) Esos valores pueden dar significado a la columna que los contiene b) El SGBD debe tener la capacidad de manejar valores nulos c) El SGBD reconocerá este valor diferenciándolo de cualquier otro d) El SGBD deberá aplicársele la lógica apropiada e) Es un valor independiente del tipo de datos de la columna
Regla 4: Catálogo dinámico en línea basado en el modelo relacional. a) El catálogo en línea es el diccionario de datos b) El diccionario de datos se debe de poder consultar usando las mismas técnicas que para los datos c) Los metadatos, por tanto, se organizan también en tablas relacionales d) Si SELECT es una instrucción que consulta datos, también será la que consulta los metadatos
Regla 5: Regla comprensiva del sublenguaje de los datos completo. a) Al menos tiene que existir un lenguaje capaz de hacer todas las funciones del SGBD b) No puede haber funciones fuera de ese lenguaje c) Puede haber otros lenguajes en el SGBD para hacer ciertas tareas d) Pero esas tareas también se deben poder hacer con el “lenguaje completo”
Regla 6: Regla de actualización de vistas. a) Las vistas tienen que mostrar información actualizada b) No puede haber diferencias entre los datos de las vistas y los datos de las tablas base
Regla 7: Alto nivel de inserción, actualización, y cancelación. a) La idea es que el lenguaje que maneja la base de datos sea muy humano b) Eso implica que las operaciones del lenguaje de manipulación de los datos (DML) trabajen con conjuntos de filas a la vez c) Para modificar, eliminar o añadir datos, no hará falta programar de la forma en la que lo hacen los lenguajes de tercera generación como C o Java
Regla 8: Independencia física de los datos. a) Cambios en la física de la BD no afecta a las aplicaciones ni a los esquemas lógicos b) El acceso a las tablas (elemento lógico) no cambia porque la física de la base de datos cambie
Regla 9: Independencias lógicas de los datos. a) Cambios en el esquema lógico (tablas) de la BD no afectan al resto de esquemas b) Si cambiamos nombres de tabla, o de columna o modificamos información de las filas, las aplicaciones (esquema externo) no se ven afectadas c) Es más difícil de conseguir
Regla 10: Independencia de la integridad. a) Las reglas de integridad (restricciones) deben de ser gestionadas y almacenadas por el SGBD
Regla 11: Independencia de la distribución. a) Que la base de datos se almacene o gestione de forma distribuida en varios servidores, no afecta al uso de esta ni a la programación de las aplicaciones de usuario b) El esquema lógico es el mismo independientemente de si la BD es distribuida o no
Regla 12: La regla de la no subversión. a) La base de datos no permitirá que exista un lenguaje o forma de acceso, que permita saltarse las reglas anteriores.
Una entidad es algo similar a un objeto (programación orientada a objetos) y representa algo en el mundo real, incluso algo abstracto. Tienen atributos que son las cosas que los hacen ser una entidad, se diagraman dentro de cuadrados y por convención se ponen en plural.
Entidad Fuerte: No depende de ninguna entidad para existir
Entidades débiles: No pueden existir sin una entidad fuerte y se representan con un cuadrado con doble línea.
- Identidades débiles por identidad: No se diferencian entre sí más que por la clave de su identidad fuerte.
- Identidades débiles por existencia: Se les asigna una clave propia.
Los atributos se representan con óvalos, los que tienen multiples valores llevan dobles óvalos, también existen atributos compuestos, los atributos especiales son óvalos con linea punteada.
Los atributos compuestos son aquellos que tienen atributos ellos mismos.
Los atributos llave son aquellos que identifican a la entidad y no pueden ser repetidos, se diagraman con underline. Existen:
- Naturales: Son inherentes al objeto como el número de serie
- Clave artificial: No es inherente al objeto y se asigna de manera arbitraria
Las relaciones nos permiten ligar o unir nuestras diferentes entidades y se representan con rombos. Por convención se definen a través de verbos.
Las relaciones tienen una propiedad llamada cardinalidad y tiene que ver con números. Cuántos de un lado pertenecen a cuántos del otro lado:
- Cardinalidad: 1 a 1
- Cardinalidad: 0 a 1
- Cardinalidad: 1 a N
- Cardinalidad: 0 a N
Un diagrama es como un mapa y nos ayuda a entender cuáles son las entidades con las que vamos a trabajar, cuáles son sus relaciones y qué papel van a jugar en las aplicaciones de la base de datos.
Tipos de dato
-
Texto: CHAR(n), VARCHAR(n), TEXT
-
Números: INTEGER, BIGINT, SMALLINT, DECIMAL(n,s), NUMERIC(n,s)
-
Fecha/hora: DATE, TIME, DATETIME, TIMESTAMP
-
Lógicos: BOOLEAN
Nota: Char(8) reserva 8 espacios en memoria de forma fija, Varchar(8) hace lo mismo pero crece (1,2,3...8) de manera dinámica conforme los requieres y tiene un limite general de 255 caracteres.
Constraints (Restricciones)
- NOT NULL: Se asegura que la columna no tenga valores nulos - UNIQUE: Se asegura que cada valor en la columna no se repita
- PRIMARY KEY: Es una combinación de NOT NULL y UNIQUE - FOREIGN KEY: Identifica de manera única una tupla en otra tabla
- CHECK: Se asegura que el valor en la columna cumpla una condición dada
- DEFAULT: Coloca un valor por defecto cuando no hay un valor especificado
- INDEX: Se crea por columna para permitir búsquedas más rápidas, tiene la desventaja de que tiene que reindexar los registros cada vez, lo que vuelve muy lenta la operación de la bd.
La normalización como su nombre lo indica nos ayuda a dejar todo de una forma normal. Esto obedece a las 12 reglas de Codd y nos permiten separar componentes en la base de datos:
Primera Forma Normal (1FN)
Esta FN nos ayuda a eliminar los valores repetidos y no atómicos dentro de una base de datos.
Formalmente, una tabla está en primera forma normal si:
- Todos los atributos son atómicos. Un atributo es atómico si los elementos del dominio son simples e indivisibles.
- No debe existir variación en el número de columnas.
- Los campos no clave deben identificarse por la clave (dependencia funcional).
- Debe existir una independencia del orden tanto de las filas como de las columnas; es decir, si los datos cambian de orden no deben cambiar sus significados.
- Se traduce básicamente a que si tenemos campos compuestos como por ejemplo “nombre_completo” que en realidad contiene varios datos distintos, en este caso podría ser “nombre”, “apellido_paterno”, “apellido_materno”, etc.
Se traduce básicamente a que si tenemos campos compuestos como por ejemplo “nombre_completo” que en realidad contiene varios datos distintos, en este caso podría ser “nombre”, “apellido_paterno”, “apellido_materno”, etc.
Los campos deben ser tales que si reordenamos los registros o reordenamos las columnas, cada dato no pierda el significado.
Segunda Forma Normal (2FN)
Esta FN nos ayuda a diferenciar los datos en diversas entidades.
Formalmente, una tabla está en segunda forma normal si:
- Está en 1FN
- Sí los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal. Es decir, que no existen dependencias parciales.
- Todos los atributos que no son clave principal deben depender únicamente de la clave principal.
Lo anterior quiere decir que sí tenemos datos que pertenecen a diversas entidades, cada entidad debe tener un campo clave separado.
Tercera Forma Normal (3FN)
Esta FN nos ayuda a separar conceptualmente las entidades que no son dependientes.
Formalmente, una tabla está en tercera forma normal si:
Se encuentra en 2FN No existe ninguna dependencia funcional transitiva en los atributos que no son clave
Esta FN se traduce en que aquellos datos que no pertenecen a la entidad deben tener una independencia de las demás y debe tener un campo clave propio.
Cuarta Forma Normal (4FN)
Esta FN nos trata de atomizar los datos multivaluados de manera que no tengamos datos repetidos entre rows.
Formalmente, una tabla está en cuarta forma normal si:
- Se encuentra en 3FN
- Los campos multivaluados se identifican por una clave única
Esta FN trata de eliminar registros duplicados en una entidad, es decir que cada registro tenga un contenido único y de necesitar repetir la data en los resultados se realiza a través de claves foráneas.
De esta manera, aunque parezca que la información se multiplicó, en realidad la descompusimos o normalizamos de manera que a un sistema le sea fácil de reconocer y mantener la consistencia de los datos.
Algunos autores precisan una 5FN que hace referencia a que después de realizar esta normalización a través de uniones (JOIN) permita regresar a la data original de la cual partió.
SQL significa Structured Query Language y tiene una estructura clara y fija. Su objetivo es hacer un solo lenguaje para consultar cualquier manejador de bases de datos volviéndose un gran estándar.
Ahora existe el NOSQL o Not Only Structured Query Language que significa que no sólo se utiliza SQLen las bases de datos no relacionales.
SQL tiene dos grandes sublenguajes DDL y DML.
DDL o Data Definition Language que nos ayuda a crear la estructura de una base de datos. Existen 3 grandes comandos:
-
Create: Nos ayuda a crear bases de datos, tablas, vistas, índices, etc.
-
Alter: Ayuda a alterar o modificar entidades.
-
Drop: Nos ayuda a borrar. Hay que tener cuidado al utilizarlo.
3 objetos que manipularemos con el lenguaje DDL:
- Database o bases de datos
- Table o tablas: Son la traducción a SQL de las entidades
- View o vistas: Se ofrece la proyección de los datos de la base de datos de forma entendible.
CREATE
CREATE DATABASE tiendas_aby;
USE DATABASE tiendas_aby;
------------------------------------------------
CREATE TABLE people (
person_id int,
last_name varchar(255),
first_name varchar(255),
address varchar(255),
city varchar(255)
);
------------------------------------------------
CREATE VIEW v_brasil_customers AS
SELECT customer_name, contact_name
FROM customers
WHERE country = "Brasil";
ALTER
ALTER TABLE people
ADD date_of_birth date;
------------------------------------------------
ALTER TABLE people
ALTER COLUMN date_of_birth year;
------------------------------------------------
ALTER TABLE people
DROP COLUMN date_of_birth;
DROP
DROP TABLE people
DROP DATABASE tiendas_aby;
Trata del contenido de la base de datos. Data Manipulation Language.
-- Insert
INSERT INTO people (last_name, first_name, address, city)
VALUES ('Hernández', 'Laura', 'Calle 21', 'Monterrey');
-- Update
UPDATE people
SET last_name = 'Chávez', city= 'Mérida'
WHERE person_id = 1;
UPDATE people
SET first_name = 'Juan'
WHERE city = 'Mérida';
UPDATE people
SET first_name = 'Juan';
-- Delete
DELETE FROM people
WHERE person_id = 1;
DELETE FROM people;
-- Select
SELECT fist_name, last_name FROM people;
Son entidades que no tienen una llave foránea, es una buena práctica comenzar la BD por ellas.
Son entidades que dependen de otra o estan relacionadas con una llave foránea:
ALTER TABLE `platziblog`.`posts`
ADD INDEX `post_usuarios_idx` (`usuario_id` ASC) ;
ALTER TABLE `platziblog`.`posts`
ADD CONSTRAINT `post_usuarios`
FOREIGN KEY (`usuario_id`)
REFERENCES `platziblog`.`usuarios` (`id`)
ON DELETE NO ACTION
ON UPDATE CASCADE;
Una llave foránea se crea en la pestaña foreing key. Las Foreing Key options son las siguientes:
- On update: Significa qué pasará con las relaciones cuando una de estas sea modificada en sus campos relacionados, Por ejemplo, pueden utilizarse los valores: cascade: Si el id de un usuario pasa de 11 a 12, entonces la relacion se actualizará y el post buscará el id nuevo en lugar de quedarse sin usuario.
- _restrict: Si el id de un usuario pasa de 11 a 12, no lo permitirá hasta que no sean actualizados antes todos los post relacionados. set null Si el id de un usuario pasa de 11 a 12, entonces los post solo no estará relacionados con nada. no action: Si el id de un usuario pasa de 11 a 12, no se hará nada. Solo se romperá la relación.
- cascade: Si un usuario es eliminado entonces se borrarán todos los post relacionados.
- set null: Si un usuario es eliminado, entonces los post solo no estará relacionados con nada. no action: Si un usuario es eliminado, no se hará nada. Solo se romperá la relación.
Sirven como puente para unir dos tablas. Estas no contiene contenido semantico.
Es una herramienta que nos permite generar el esquema del cual nos basamos para crear nuestras tablas. Es muy útil para conocer como se creo una base de datos.
Genera el modelo DB:
Las consultas en una base de datos juegan un papel muy fundamental, puesto que facilitan de manera considerable los procesos en cualquier empresa.
La palabra ETL correspondería al acrónimo de:
- Extract (Extraer)
- Transform (Transformar)
- Load (Cargar)
ETL hace parte del proceso de integración de datos, mas aun es un componente muy importante que completa el resultado final en la relación de aplicaciones y sistemas.
Los query son la forma en la que se estructura las preguntas que se hacen a la base de datos. Transforma preguntas en sintaxis. Los query básicamente tienen dos partes SELECT y FROM.
- SELECT: que datos queremos obtener (que columnas/campos de la tabla).
- FROM : de donde los queremos obtener (de que tabla, por ejemplo).
- WHERE : condicion que deben cumplir o filtro que deben pasar los datos a obtener. Es opcional, pero se suele utilizar, ya que sino se obtienen todos los datos sin filtrar ninguno.
Otras sentencias:
- GROUP BY : de que manera agrupamos los datos (en este caso agrupa por ciudad).
- ORDER BY : de que manera ordenamos los datos (en este caso, por poblacion).
- HAVING : otra manera de filtrar los datos.
-- Estructura basica de un query
SELECT *
FROM posts;
-- Estructura extendida de un query
SELECT *
FROM posts
WHERE fecha_publicacion > '2024-00-00 00:00:00';
(*) Indica dentro de la consulta que vamos a seleccionar todo sin filtrar campos
Es la primera parte de la estructura que necesitamos para hacer preguntas a la base de datos. Se encarga de proyectar o mostrar los datos que le pedimos a la base de datos.
SELECT *
FROM posts;
Si escribimos "SELECT " y luego uno o varios nombres de los campos de la tabla, separados por coma, unicamente recibiremos dichos los datos de dichas columnas.
SELECT titulo, fecha_publicacion, estatus
FROM posts;
Por cada campo, podemos agregar un “_AS _ …” (por ejemplo, " titulo AS encabezado ). Esto nos permitira mostrar las columnas con un nombre diferente: en este caso mostrara la columna titulo con el nombre encabezado.
SELECT titulo AS encabezado,
fecha_publicacion AS publicado,
estatus AS estado
FROM posts;
También puedes generar encabezados con espacios encerrando el nombre entre apostrofes, por ejemplo:
SELECT titulo AS encabezado,
fecha_publicacion AS 'publicado en’,
estatus AS estado
FROM posts;
Si indicamos " SELECT COUNT (*)", la funcion COUNT contara todas las filas de la tabla (usualmente se usa con algun filtro, para no elegir todas las columnas de la tabla).
SELECT count(*)
FROM posts;
--------------------------------------------------
SELECT count(*) AS numero_posts
FROM posts;
Indica de dónde se deben traer los datos y puede ayudar a hacer sentencias y filtros complejos cuando se quieren unir tablas. La sentencia compañera que nos ayuda con este proceso es JOIN.
Esta sentencia esta relacionada con la Teoría de Conjuntos, donde se utilizan los diagramas de Venn, que son círculos que se tocan en algún punto para ver dónde está la intersección de conjuntos. Ayudan mucho para poder formular la sentencia JOIN de la manera adecuada dependiendo del query que se quiere hacer.
- Diferencia:
- LEFT Join (Con la intersección): Trae todo los datos de la tabla A, que estén o no estén de la tabla B.
SELECT *
FROM usuarios
LEFT JOIN posts on usuarios.id = posts.usuario_id;
- LEFT JOIN (Sin la intersección): Trae todo los datos de la tabla A, que no estén en la tabla B.
SELECT *
FROM usuarios
LEFT JOIN posts on usuarios.id = posts.usuario_id
WHERE posts.usuario_id IS NULL;
- RIGHT JOIN(Con la intersección): Trae todo los datos de la tabla B, que estén o no estén de la tabla A.
SELECT *
FROM usuarios
RIGHT JOIN posts on usuarios.id = posts.usuario_id;
- RIGHT JOIN(Sin la intersección):Trae todo los datos de la tabla B, que no estén en la tabla A.
SELECT *
FROM usuarios
RIGHT JOIN posts on usuarios.id = posts.usuario_id
WHERE posts.usuario_id IS NULL;
- Intersección:
- INNER JOIN: Solo arrastra valores que estén tanto en la Tabla A como en la Tabla B.
SELECT *
FROM usuarios
INNER JOIN posts on usuarios.id = posts.usuario_id;
- Unión y Diferencia Simétrica__
- UNION: Trae todo de la tabla A y Tabla B. (Unión)
SELECT *
FROM usuarios
LEFT JOIN posts ON usuarios.id = posts.usuario_id
UNION
SELECT *
FROM usuarios
RIGHT JOIN posts ON usuarios.id = posts.usuario_id;
- OUTER JOIN: Trae todo de la tabla A y B; pero solo información que no guarde relación una tabla con la otra. (Diferencia Simétrica)
SELECT *
FROM usuarios
LEFT JOIN posts on usuarios.id = posts.usuario_id
WHERE posts.usuario_id IS NULL
UNION
SELECT *
FROM usuarios
RIGHT JOIN posts on usuarios.id = posts.usuario_id
WHERE posts.usuario_id IS NULL;
Nos ayuda a filtrar registros (filas de la tabla). Podemos filtrar por ejemplo, a partir de cierto numero de ID (con el operador de mayor o menor).
SELECT *
FROM posts
WHERE id < 50;
LIKE: cuando no conocemos la cadena exacta. Podemos filtrar segun alguna caracteristica. Por ejemplo: WHERE titulo LIKE ‘%escandalo%’ lo que hace es buscar aquellos titulos que tengan la palabra escandalo en alguna parte. Sin embargo, como los signos porcentuales indican que hay algo mas, si quitamos, por ejemplo, el del final (quedando ‘%escandalo’), estaremos buscando aquellos titulos que terminen con la palabra ‘escandalo’, ya que indicamos que despues de esta palabra no hay nada mas.
SELECT *
FROM posts
WHERE titulo LIKE '%escandalo%';
BETWEEN: la traduccion de esta palabra al español es ‘entre’. Por lo tanto, como podemos imaginar, filtrara entre dos valores a designar. Por ejemplo: WHERE fechaDePublicacion BETWEEN ‘2019-01-01’ AND ‘2019-01-10’ filtrara las publicaciones con fecha de publicacion entre el 1 de enero de 2019 y 10 de enero de 2019. Puede utilizarse tambien con valores numericos (y por lo tanto, por ejemplo, con los IDs).
SELECT *
FROM posts
WHERE fecha_publicacion BETWEEN '2023-01-01' AND '2025-12-31';
La instruccion GROUP BY, agrupa las filas que tienen los mismos valores en filas de resumen, como por ejemplo saber cuantas personas han comprado un producto. El GROUP BY se utiliza a menudo con funciones de agregado (COUNT(), MAX(), MIN(), SUM(), AVG())
SELECT nombre_columna(s)
FROM nombre_tabla(s)
WHERE condicion
GROUP BY nombre_columna(s)
SELECT estatus, MONTHNAME(fecha_publicacion) AS post_date, COUNT(*) AS post_number
FROM posts
GROUP BY estatus, post_date;
Va a ordenar la consulta en el orden que se determine, puedes utilizar como herramientas:
- <>** para determinar que los datos serán discriminados de mayor o menor que.
- ASC para indicar si el orden según la discriminación sera ascendente.
- DESC para indicar si el orden según la discriminación sera descendente.
- LIMIT esta herramienta nos indicara segun el valor que le asignemos, que datos nos datos nos arrojara dentro de esas especificaciones.
SELECT *
FROM posts
ORDER BY fecha_publicacion ASC;
Tiene una similitud muy grande con WHERE, sin embargo el uso de ellos depende del orden. El filtro como WHERE lo utilizaremos cuando queremos hacer una selección de tuplas; pero si lo que queremos es selecicionar una selección de tuplas agrupados, el mismo no puede ir antes de la agrupación. Cuando se quiere seleccionar tuplas agrupadas únicamente se puede hacer con HAVING.
SELECT MONTHNAME(fecha_publicacion) AS post_month, estatus, COUNT(*) AS post_quantity
FROM posts
GROUP BY estatus, post_month
HAVING post_quantity > 1
ORDER BY post_month;
Los Nested queries significan que dentro de un query podemos hacer otro query. Esto sirve para hacer join de tablas, estando una en memoria. También teniendo un query como condicional del otro.
Este proceso puede ser tan profundo como quieras, teniendo infinitos queries anidados. Se le conoce como un producto cartesiano ya que se multiplican todos los registros de una tabla con todos los del nuevo query. Esto provoca que el query sea difícil de procesar por lo pesado que puede resultar.
SELECT new_table_projection.date, COUNT(*) AS posts_count
FROM (
SELECT DATE(MIN(fecha_publicacion)) AS date, YEAR(fecha_publicacion) AS post_year
FROM posts
GROUP BY post_year
) AS new_table_projection
GROUP BY new_table_projection.date
ORDER BY new_table_projection.date;
¿Cuándo ocupar los Nested queries?
- Cuando tienes un problema que no se puede solucionar simplemente consultando una tabla, o que tiene algunas condiciones que no te permiten obtener los datos que necesitas.
- Se debe tener cuidado utilizando los Nested Queries sin tener en cuenta la escalabilidad de estos. También, se puede caer en un Producto Cartesiano, es decir, se esta haciendo una multiplicación de los registros que estas obteniendo.
La función CASE permite agregar un campo virtual con información generada a partir de condiciones múltiples. Ejemplor, mostrar el idioma, precio de todos los libros, así como agregar una columna de informe que indique si el libro es caro, módico o barato basado en el precio.
SELECT idioma, precio,
CASE
WHEN precio > 1000 THEN "Muy caro"
WHEN precio > 500 THEN "Precio módico"
ELSE "Muy barato"
END AS "informe"
FROM libros;
- SELECT: Lo que quieres mostrar
- FROM: De dónde voy a tomar los datos
- WHERE: Los filtros de los datos que quieres mostrar
- GROUP BY: Los rubros por los que me interesa agrupar la información
- ORDER BY: El orden en que quiero presentar mi información
- HAVING: Los filtros que quiero que mis datos agrupados tengan
Sirve para concatenar todos los registros afectados por un GROUP BY en un solo campo.
Criterios:
- DISTINCT. Evita duplicidad en los valores.
- ORDER BY. Sirve para decidir el orden de concatenación del campo.
- SEPARATOR. Es el separador a utilizar para separar los valores (por defecto, el separador es una coma “,”).
Select posts.Titulo, Group_Concat(Distinct etiquetas.Nombre_Etiqueta
Order By etiquetas.Nombre_Etiqueta
Separator ' - ') As Nom_Etiqueta
From posts
Inner Join posts_etiquetas On posts.Id = posts_etiquetas.Posts_Id
Inner Join etiquetas on etiquetas.Id = posts_etiquetas.Etiquetas_Id
Group By posts.Id;
Firebase es un servicio de Google donde puedes tercerizar muchos elementos en la nube.
Cloud Firestore es una base de datos flexible y escalable para la programación en servidores, dispositivos móviles y la Web desde Firebase y Google Cloud Platform. En una base de datos no relacional basada en documentos el formato de los documentos es BJSON, que es similar a JSON
Jerarquía de datos:
- Base de datos: El punto inicial es la BD que va a contener toda la información que se van a guardar ahí así como las BD relacionales
- Colecciones: las colecciones son similares a las tablas estos almacenan o agrupan los documentos
- Documentos: los documentos son generalmente la información que se quiere guardar, se guarda en un formato similar a JSON. Dentro de los documentos contienen datos y los tipos de datos varían.
Respecto a las bases de datos no relacionales, no existe un solo tipo, aunque se engloben en una sola categoría.
Tipos de bases de datos no relacionales:
- Clave - valor: Son ideales para almacenar y extraer datos con una clave única. Manejan los diccionarios de manera excepcional. Ejemplos: DynamoDB, Cassandra.
- Basadas en documentos: Son una implementación de clave valor que varía en la forma semiestructurada en que se trata la información. Ideal para almacenar datos JSON y XML. Ejemplos: MongoDB, Firestore.
- Basadas en grafos: Basadas en teoría de grafos, sirven para entidades que se encuentran interconectadas por múltiples relaciones. Ideales para almacenar relaciones complejas. Ejemplos: neo4j, TITAN.
- En memoria: Pueden ser de estructura variada, pero su ventaja radica en la velocidad, ya que al vivir en memoria la extracción de datos es casi inmediata. Ejemplos: Memcached, Redis.
- Optimizadas para búsquedas: Pueden ser de diversas estructuras, su ventaja radica en que se pueden hacer queries y búsquedas complejas de manera sencilla. Ejemplos: BigQuery, Elasticsearch.
El modelo de bases de datos no relacionales es un poco más cercano al mundo real en su comportamiento.
- Las top level collections son las colecciones que se tienen de inmediato o entrada en el proyecto.
- Firebase es un servicio que tiene múltiples opciones y está pensado principalmente para aplicaciones móviles y web.
- String: Cualquier tipo de valor alfanumérico
- Number: Soporta enteros y flotantes.
- Boolenan: Los clásicos valores True y False
- Map: Permite agregar un documento dentro de otro.
- Array: Permite agregar un conjunto de datos (soporte multi type) sin nombre e identificador.
- Null: Indica que no se ha definido un valor.
- Timestamp: Permite almacenar fechas (guarda el año, mes, día y hora).
- Geopoint: Guarda una localización geográfica (coordenadas latitud-longitud).
- Reference: Permite referencia un documento (relaciona dos documentos, no importa su colección).