Fundamentos de SQL

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 41

Fundamentos de SQL

Terminología Básica
En las bases de datos relacionales existe un vocabulario específico con el objetivo de que
las personas dedicadas a esta actividad puedan entender de qué se trata cada uno de los
elementos involucrados. A continuación se definen algunos de estos conceptos.

Definición 1

Dato: Un dato es considerado la unidad mínima de información. Por sí mismo no provee un


significado particular, simplemente es un ente que requiere de una interpretación para dar
lugar a la información.

 Por ejemplo: 36 o Enchiladas Suizas por sí mismos, son datos cuyo significado
desconocemos.

Definición 2

Información: Es un conjunto de datos que a través del procesamiento adecuado adquieren


un significado en un contexto determinado.

 Por ejemplo, en los datos anteriores, 36 es la edad de Mark Zuckerberg y


Enchiladas Suizas es la comida favorita de la Abuelita de Batman. Es decir, le
estamos dando un significado a los datos y obteniendo información.

Definición 3

Base de datos: Es un conjunto de datos con alguna característica en común, puede ser un
tema, situación geográfica o algún elemento que los relacione, además de que pueden estar
almacenados de manera tradicional (impresos en papel) o en formato digital como un
archivo.

 ¿Sabías que las bases de datos relacionales se basan en el Modelo relacional,


propuesto por Edgar F. Codd en los años setenta?. Veamos algunos de sus
principales elementos más adelante, te presentamos un ejemplo para que puedas
observar los elementos de manera más clara):

Definición 4

Tabla: Una tabla o relación es una entidad con atributos, campos o columnas y tuplas,
registros o renglones. Una tabla representa a un número indefinido de elementos descritos
con características en común, cada uno en un diferente renglón.

Definición 5
Registros: Los registros, también llamados tuplas o renglones, se refieren a la descripción
de cada ente de la tabla. Son instancias particulares, por ejemplo, si tenemos una tabla
Persona, un registro contendrá una persona sus datos particulares.

Definición 6

Campo: Los campos o atributos se refieren a las columnas de las tablas y representan una
característica particular de cada entidad. Por ejemplo,w para una persona podrían haber
campos para el nombre, edad, dirección, etc. Es importante recordar que los campos son
comunes a todos los registros de una tabla.

Definición 7

Dominio: El dominio se refiere al número de valores que puede obtener una columna, por
ejemplo si tuviéramos un campo para almacenar el estado civil, su dominio sería 2 en el
caso de tener los valores soltero o casado.

Definición 8

Cardinalidad: Es el número de registros que tiene una tabla.

Definición 9

Grado: Es el número de campos que tiene una tabla.

Veamos un ejemplo para asegurarnos que has comprendido estos conceptos. Tenemos la
siguiente tabla que representa un conjunto de usuarios almacenados en una base de datos.

En la tabla anterior, tenemos:

 Seis columnas que describen a cada usuario, por lo tanto el grado es en efecto 6. Ya
que el número de campos de una tabla es el grado. En este caso las seis columnas
son: id, nombre, apellido_paterno, apellido_materno, correo y contraseña.
 Se tienen tres registros, que describen a tres usuarios distintos y el dominio del
campo id, en este caso es 3, pues tienen tres valores distintos. → id = al número de
registros.
Existen varios sistemas que permiten diseñar, crear y administrar en general bases de datos
relacionales, este tipo de software recibe el nombre de Sistema Gestor de Bases de Bases de
Datos (SGBD). Algunos de los sistemas más populares hoy en día son:

 Oracle Database
 MySQL
 MariaDB
 PostgreSQL
 Microsoft SQL Server

No es muy importante que reconozcas todas las características de cada una, pero en cada
nombre encontrarás hipervínculos donde puedes revisar sus descripciones.

Conexión a una Base de Datos


Las bases de datos por lo general tienen cientos y miles de registros. Por ejemplo, ¿puedes
imaginar cuantos registros tiene la base de datos de los usuarios de Facebook? ¡Miles de
millones!

Para almacenar las bases de datos, por lo general, una computadora personal como nuestra
vieja y confiable laptop no son suficientes, de manera tal que necesitamos alojarla en un
servidor.

Un servidor es, en pocas palabras, un equipo de cómputo súper potente que que forma parte
de una red de computadoras y que provee distintos servicios a otros equipos llamados
“clientes”.

A los servidores que almacenan bases de datos se les llama Servidores de Bases de Datos.
Para conectarnos a un servidor, necesitamos de cuatro cosas esenciales:

 La dirección del servidor, también llamada host.


 El usuario con el cual nos vamos a conectar.
 Una contraseña de acceso.
 Y el puerto a través del cual realizaremos la conexión.

En esta primera parte del módulo, usaremos como cliente a Workbench. Workbench es un
cliente de MySQL que permite conectarse con servidores de bases de datos para crear
nuevas bases de datos, hacer consultas, crear tablas, entre muchas otras tareas.

Para conectarse a un servidor de bases de datos, Workbench provee la siguiente pantalla:


Una vez que nos conectemos al servidor de bases de datos, podemos encontrar muchas
bases dentro del mismo, por ejemplo, si fuera un servidor de bases de datos para un
restaurante, podríamos encontrar una base de datos para el inventario, otra para la nómina
de los empleados, otra para el menú, entre muchas otras.
Comunicación con la base de datos
Las bases de datos relacionales, tiene su propio lenguaje, con este nos podemos comunicar
con ellas y pedirles que realicen algunas acciones, este lenguaje es llamado SQL y es un
estándar para bases de datos relacionales. Cada SGBD tiene su propia implementación de
SQL, añadiendo características especiales, pero sigue en general un estándar.

La primera instrucción de SQL que estudiaremos será USE que permite conectarse a una
base de datos. Su sintaxis es la siguiente:

USE <nombre_de_la_base>;

Por ejemplo, para conectarnos a la base de datos del inventario del restaurante podríamos
escribir algo como:

USE inventario;

Para saber qué bases de datos hay en un servidor, se puede usar el comando:

SHOW DATABASES;

Observa que todas las instrucciones deben terminar con un punto y coma. Esto está
diseñado de esa manera pues en SQL pueden definirse pequeños procedimientos que
ejecutan varios comandos a la vez y esta es la forma en la que el lenguaje detecta donde
termina e inicia una instrucción.

Estructura de una Tabla


Una vez conectados a la base de datos y dependiendo de cómo esté definida, podremos ver
todas las tablas contenidas en la misma, mediante el comando:

SHOW TABLES;

Como mencionamos antes, una tabla se conforma de un conjunto de columnas que


describen cada registro que se almacena en la misma. Para conocer los campos de una
tabla, puede usarse el comando DESCRIBE que muestra los campos de la misma y el tipo
de dato a almacenar.

DESCRIBE <nombre_tabla>;
Por ejemplo, supongamos que existe en una base de datos, la tabla movies. Al ejecutar el
comando DESCRIBE sobre la misma, podríamos obtener un resultado como:

DESCRIBE movies;

En realidad, MySQL arroja más resultados cuando realizamos una operación DESCRIBE.
Sin embargo, hasta este punto basta con que analicemos estos dos campos.

El resultado de la descripción, nos indica que la tabla incluye tres campos: id, título y
género y nos muestra el tipo de dato que almacena cada uno. Los tipos de datos nos
permiten manipular de forma más eficiente los datos almacenados, por ejemplo, si tenemos
un campo numérico, esto facilitará que podemos hacer alguna operación aritmética con ella.

En nuestro ejemplo se muestran dos tipos de datos: int y varchar que indican que cada
campo almacena números enteros y cadenas de caracteres respectivamente.

Para conocer más de los tipos de datos que se le asignan a una columna, puedes consultar la
documentación de MySQL: Data Types.

Estructura Básica de una Consulta


Ahora que sabemos cómo está definida la estructura de una tabla podemos obtener los
registros que tiene. Para hacer esto, haremos uso de la instrucción SELECT que permite
obtener registros de una tabla a partir del nombre de los campos y de la tabla. A
continuación se muestra la estructura de un SELECT en su forma más básica.

SELECT <campo1>, <campo2>, …


FROM <tabla>;

Esta estructura permite seleccionar (algunos autores lo llaman proyectar) los registros. La
primera parte , , … indica los campos que se mostrarán, separados por comas. Por otro lado
la parte indica la tabla de la cual tomaremos los datos.

Por ejemplo, supongamos que queremos visualizar los registros almacenados en la columna
título de la tabla movies, tendríamos que escribir la instrucción:
SELECT titulo
FROM movies;

Este tipo de instrucciones recibe el nombre de “consulta” pues como su nombre lo indica,
se realiza una consulta de los registros que hay en la tabla correspondiente.

Observa que los resultados de una consulta siempre se muestran en una tabla, aún cuando
sólo contengan un único registro.

Si quisiéramos traer todos los campos de una tabla, pueden reemplazarse los nombres de las
columnas por un asterisco, por ejemplo:

SELECT *
FROM movies;

También podemos aplicar filtros a los resultados con el fin de facilitar la búsqueda de datos.
Por ejemplo, supongamos que queremos los datos de aquellos registros cuyo nombre es
“Toy Story”.

Para filtrar resultados se añade la restricción WHERE a la consulta, por ejemplo:

SELECT *
FROM movies
WHERE titulo = ‘Toy Story’;
Con WHERE podemos utilizar operadores relacionales, lógicos y algunos otros de utilidad
con el fin de hacer combinaciones de filtros. La siguiente tabla muestra algunos de estos
operadores. Es importante que los identifiques y comprendas ya que son los caracteres que
te van a permitir realizar operaciones matemáticas, concatenar cadenas y hacer
comparaciones.
Ordenamientos y Límites
Otras restricciones que pueden aplicarse a las consultas son ORDER BY y LIMIT. La
primera le indica a la consulta la forma en que debe mostrar los datos, ordenando los
mismos por un campo de forma ascendente (ASC) o descendente (DESC). Por defecto, los
resultados siempre son ordenados de forma ascendente. La segunda restricción, indica el
número de registros máximo que traerá la consulta.

Por ejemplo, la siguiente consulta, ordena los resultados por el campo edad de forma
descendente y limita los registros a 3.

SELECT *
FROM persona
WHERE estatura = 1.75
ORDER BY edad DESC
LIMIT 3;

Por otro lado las siguiente consulta, ordenan de forma ascendente. Son equivalentes.

SELECT *
FROM persona
WHERE estatura = 1.75
ORDER BY edad
LIMIT 3;

SELECT *
FROM persona
WHERE estatura = 1.75
ORDER BY edad ASC
LIMIT 3;

Agregaciones y consultas
Búsqueda de patrones
La búsqueda de patrones es una técnica ampliamente utilizada por distintos lenguajes de
programación y Sistemas Gestores de Bases de Datos. En bases de datos, consiste en, dado
un patrón representado mediante cadenas encontrar un registro dentro de la base de datos en
donde el campo coincida con el patrón buscado.

Cuando una cadena caza con el patrón a buscar, se dice que este caza con el patrón
buscado.
En MySQL, podemos hacer búsqueda de patrones mediante la restricción LIKE que puede
usarse en combinación de la cláusula WHERE de una consulta. La sintaxis de esta
restricción es la siguiente:

<expresión> LIKE <patrón>

La expresión representa la columna sobre la cual queremos realizar la búsqueda y el patrón


es una cadena que incluye el patrón correspondiente. En MySQL los patrones que podemos
encontrar, usan los siguientes símbolos:

 % Caza con cualquier cadena, de cualquier longitud, incluso cadenas vacías.


 _ Caza con un único carácter.

Veamos algunos ejemplos:

SELECT nombre
FROM persona
WHERE apellido_paterno LIKE ‘S%’;

Esta consulta, obtiene el campo nombre de la tabla persona siempre y cuando el apellido
paterno inicie con la letra S. Recordar que el % indica que puede ser reemplazado por
cualquier cadena. Por ejemplo, puede encontrar las cadenas ‘Sánchez’, ‘Soto’, ‘Saldivar’.

SELECT nombre
FROM persona
WHERE apellido_materno LIKE ‘%am%’;

Esta consulta, obtiene el campo nombre de la tabla persona siempre y cuando el apellido
materno, contenga la subcadena am. Los símbolos % indican que el inicio y el final de la
cadena puede ser reemplazado por cualquier otra, pero siempre debe haber una subcadena
am en medio. Por ejemplo, puede encontrar las cadenas ‘Ramírez’ o ‘Samaniego’.

SELECT nombre
FROM persona
WHERE apellido_materno LIKE ‘Mendoz_’;

Esta consulta obtiene el campo nombre de la tabla persona siempre y cuando el apellido
materno, contenga subcadena Mendoz. El símbolo _ indica que puede ser reemplazado por
cualquier caracter. Por ejemplo, puede encontrar las cadenas ‘Mendoza’, ‘Mendoze’,
‘Mendozo’, etc.

SELECT nombre
FROM persona
WHERE apellido_paterno NOT LIKE ‘%a’;
Como puede apreciarse en la consulta anterior, podemos combinar la restricción LIKE con
los operadores lógicos. En este caso se traen los nombres de aquellas personas cuyo
apellido no termina con a.

Funciones de agrupamiento
Es posible aplicar distintas funciones a los campos con el fin de agruparlos para obtener
valores específicos. Para ello se tienen varias funciones, en esta sesión veremos los
siguientes:

 SUM: suma todos los valores de una columna.


 COUNT: cuenta los valores de una columna.
 MIN: obtiene el valor mínimo de una columna.
 MAX: obtiene el valor máximo de una columna.
 AVG: obtiene el promedio de los valores de una columna.

Veamos algunos ejemplos:

SELECT sum(salario) AS “Salario Total”


FROM empleados
WHERE salario > 5000;

Esta consulta obtiene la suma de los salarios de los empleados de una empresa y sólo
considera aquellos salarios mayores a 5000. La columna resultante se nombra como
sum(salario), sin embargo, este nombre no es claro, por lo que la restricción AS nos permite
agregar un alias a la columna y llamarla en su lugar Salario Total.

SELECT count(ocupacion) AS “Número de ocupaciones”


FROM persona;

Esta consulta cuenta el número de ocupaciones que hay en la columna ocupación. Es


importante mencionar que la función count únicamente cuenta registros que no son nulos.

SELECT max(edad) AS “Mayor”


FROM persona;

SELECT min(edad) AS “Mayor”


FROM persona;

Estas consultas obtienen la edad más grande y más pequeña, respectivamente, en un


conjunto de personas.
SELECT avg(calificacion) “Promedio”
FROM estudiantes
WHERE calificacion >= 6.0;

La consulta anterior, calcula el promedio de los estudiantes cuya calificación fue


aprobatoria.

Como puedes apreciar, en general, la sintaxis de una función es:

funcion(parámetros)

En el caso de las funciones de agrupamiento, éstas sólo reciben un parámetro pues toman
una columna, sin embargo existen muchas más funciones que tienen otras utilidades.
Llamamos a estas funciones de agrupamientos, pues reducen los valores de una columna a
un único valor.

https://www.techonthenet.com/mysql/functions/

Agrupamientos
Ahora que sabes cómo operan las funciones de agrupamiento, estás listo para hacer tus
primeros agrupamientos. Un agrupamiento, toma valores distintos de una columna y
permite hacer un análisis detallado mediante las funciones de agrupamiento.

Por ejemplo, supongamos que existe una tabla que almacena la ocupación de un conjunto
de personas y quisiéramos saber cuántas personas hay por cada ocupación. Bueno, pues
podemos hacer un agrupamiento y auxiliarnos de la función count.

Para usar un agrupamiento, se debe usar la restricción GROUP BY que indica los campos
por los cuales se realizará el agrupamiento. Los campos por los cuales se agrupará, deben
aparecer en la consulta y debe haber al menos una función de agrupamiento proyectada.

SELECT ocupacion, count(*) “Total”


FROM persona
GROUP BY ocupacion;

El símbolo * en la función count, le indica a MySQL que se deben tomar todos los registros
de la tabla. De esta forma el resultado luce como:
Subconsultas
Una subconsulta consiste de consultas que incluyen otras consultas en su interior. Una
subconsulta puede aparecer en la parte SELECT, en la parte FROM o en la parte WHERE
de una consulta. Veamos algunos ejemplos.

SELECT nombre, correo


FROM contactos
WHERE direccion IN
(SELECT direccion
FROM ubicaciones
WHERE codigo_postal = ‘01060’);

Esta consulta consta de una subconsulta, que se ejecuta primero. De esta forma, primero
obtenemos todas las direcciones que se encuentran dentro del código postal 01060 y con los
resultados obtenidos (un tabla), filtramos aquellos contactos que viven en esas direcciones.

SELECT (Calificacion / Alumnos) AS “Promedio”


FROM
(SELECT sum(calif) AS “Calificacion”, count(*) AS “Alumnos”
FROM alumnos) AS subconsulta;

En esta consulta tomamos las columnas resultantes de la subconsulta. En este tipo de


consultas MySQL pide poner un nombre a la subconsulta para poder referenciar, en caso de
que sea necesario. Esta consulta primero calcula la suma de las calificaciones y el total de
alumnos de una tabla y posteriormente se usan estos datos para calcular el promedio.

Notamos también que es posible usar operaciones aritméticas, como es el caso de la suma,
resta, división y multiplicación.

Joints y vistas
Llaves primarias y foráneas
Para poder relacionar tablas, necesitamos poder identificar cada uno de los registros de
manera única. No podríamos hacer esto usando todos los campos de un registro pues da pie
a registros duplicados. Para hacer esto en SQL, se define un concepto llamado llave
primaria.

Una llave primaria permite identificar de manera única cada uno de los registros de una
tabla. Puede usarse un campo que no se repita, por ejemplo, un número de cuenta, un correo
electrónico, un código postal, entre otros. Sin embargo, es usual que se añada un campo
adicional durante el diseño al que se llama identificador de tipo entero, de esta forma el
identificador se incrementa en uno cada que un nuevo registro es añadido.

Para identificar la llave primaria de una tabla podemos aprovechar la instrucción


DESCRIBE. Por ejemplo, la siguiente tabla, Persona, incluye un campo id que representa a
la llave primaria.

DESCRIBE Persona;

Por otro lado, se tienen las llaves foráneas, este tipo de llaves, representan justamente la
relación que pudiera haber entre dos tablas. Por ejemplo, supongamos que se tiene una tabla
Mascota y se necesita asociar a cada una de estas con su dueño, es decir, con algún registro
dentro de la tabla Persona.

Una forma muy común y que se da usualmente en las hojas de cálculo, es la de manejar
toda la información en un sólo registro, por ejemplo:
Esta forma de almacenar la información, es útil pues se tienen todos los datos a la mano, sin
embargo, si el dueño Manuel, tuviera más de una mascota, se duplicaría su información en
varios registros.

La forma en la que SQL evita esta duplicidad de datos, es justamente con el uso de llaves,
de esta forma, en lugar de almacenar todos los datos de una persona almacenamos
únicamente el campo que lo identifica de manera única, es decir, su llave.

Cuando una tabla almacena la llave primaria de otra tabla, llamamos a esta llave foránea.
De esta forma, la tabla Mascota tendría la siguiente descripción.

De hecho, una tabla puede tener varios campos como llaves primarias, siempre y cuando, la
combinación de sus valores, sea única.

Tipos de relaciones
Uno a muchos

Esta forma de relacionar tablas da pie a distintas formas de relacionarlas, por ejemplo. Para
el caso de las mascotas y su dueño, una mascota tiene un único dueño, pero un dueño
(persona) puede tener muchas mascotas. Esto puede apreciarse en la tabla mascota, pues el
id de una persona puede aparecer varias veces. Gráficamente esto luce como:
Muchos a muchos

Este tipo de relación permite unir dos tablas que en un principio no tienen relación directa.
Por ejemplo, una mascota siempre tiene un dueño, por lo tanto podríamos añadir
directamente el identificador dentro de su tabla. ¿Pero qué pasa cuando esto no sucede así?

Supongamos ahora, que tenemos una tabla de estudiantes y una tabla de materias.
Queremos inscribir a un estudiante dentro de una materia. No podemos relacionarlas
agregando una llave foránea pues un estudiante no tiene una materia ni una materia tiene un
estudiante como campo.

Lo que se hace en este tipo de caso es crear una tabla intermedia que funciona como la
unión de dos tablas. Esto luce así:

Dependiendo del Sistema Gestor de Bases de Datos, debe añadirse una llave primaria a la
tabla de unión, en el caso de MySQL no es necesario.

Uno a uno

Este es el tipo de relación que menos se utiliza, pues quiere decir que ninguna tabla puede
repetir registros de la otra. De esta forma, ambas tablas podrían combinarse en una sola.
Son creadas con fines muy específicos a partir del contexto en el que fueron creadas, pero
son muy poco comunes.
Por ejemplo, supongamos que tenemos una tabla de personas y la queremos relacionar con
su credencial INE. El INE sólo está asociado a una persona y al mismo tiempo una persona
sólo puede tener un INE, por lo tanto la relación es uno a uno. Esto luce así:

Joins
Ahora, usaremos estos conceptos para obtener información de distintas tablas, mediante lo
que se conoce como join que se traduce en ocasiones como reunión. En MySQL tenemos
tres tipos de join:

 INNER JOIN (o simplemente JOIN).


 LEFT OUTER JOIN (o simplemente LEFT JOIN).
 RIGHT OUTER JOIN (o simplemente RIGHT JOIN).

JOIN

Un join, relaciona dos tablas, trayendo todos los campos de éstas siempre y cuando se
cumpla la condición de relación. Visualmente un join, luce así:
Por ejemplo, la consulta:

SELECT *
FROM persona
JOIN mascota
ON persona.id = mascota.id_persona;

Obtiene una tabla con todos los campos de la tabla persona, todos los campos de la tabla
mascota y agrega únicamente aquellos registros donde el id de la persona sea igual al id de
la persona asociada a la mascota.

LEFT JOIN

Un join izquierdo, relaciona dos tablas siempre y cuando se cumpla la condición de


relación, sin embargo, traerá todos los registros de la tabla izquierda y únicamente aquellos
registros que cumplan con la condición de relación de la otra tabla. Visualmente un join
izquierdo, luce así:

Por ejemplo, la consulta:

SELECT *
FROM persona
LEFT JOIN mascota
ON persona.id = mascota.id_persona;

Obtiene una tabla con todos los registros de la tabla persona, pero sólo aquellos de la tabla
mascota en donde el id de persona sea igual.

RIGHT JOIN

Un join derecho es inverso al join izquierdo, relaciona dos tablas siempre y cuando se
cumpla la condición de relación, sin embargo, traerá todos los registros de la tabla derecha
y únicamente aquellos registros que cumplan con la condición de relación de la otra tabla.
Visualmente un join derecho, luce así:
Por ejemplo, la consulta:

SELECT *
FROM persona
RIGHT JOIN mascota
ON persona.id = mascota.id_persona;

Obtiene una tabla con todos los registros de la tabla mascota, pero sólo aquellos de la tabla
persona en donde el id de persona sea igual.

Vistas
A diferencia de una tabla, una vista es la representación virtual de una consulta en formato
de tabla o dicho de otro modo, es el resultado de guardar una consulta para poder
consultarla como a cualquier otra tabla. Son útiles cuando el tiempo de procesamiento de
una consulta es alto y por lo tanto no tenemos que ejecutarla una y otra vez pues estará
disponible.

Para crear una vista, basta con darle un nombre a la consulta que estamos tomando como
base, por ejemplo, la siguiente vista toma la consulta que asocia mascotas con su dueño,
llamamos a esta vista, duenios.

CREATE VIEW duenios AS


SELECT *
FROM persona
JOIN mascota
ON persona.id = mascota.id_persona;

Una vez creada, podemos consultar los campos que arroja la consulta asociada a una vista,
pero en lugar de llamar a la consulta, llamamos a la vista con el nombre que se le dio.

SELECT *
FROM duenios
WHERE id_persona = 2;
Configuración de bases de datos locales
Configuración de bases de datos en
MySQL
Comienza instalando el servidor de MySQL en tu equipo, tal y como te mostramos en el
siguiente enlace.

Blog de BEDU

Una vez que instales el servidor de MySQL en tu equipo, el siguiente paso es configurar la
arquitectura de tu base de datos. Algo muy útil en las bases de datos relacionales es el uso
de diagramas entidad-relación que modelan las tablas de la base de datos y la relación entre
estas.

A partir de estos diagramas, podemos detectar los tipos de relaciones entre tablas (uno a
muchos, muchos a muchos, uno a uno) y por ende el tipo de llaves primarias que
almacenará.

Por supuesto, el diseño de bases de datos es todo un proceso que va más allá de los alcances
de este curso, sin embargo, con que entiendas las nociones básicas es más que suficiente.
Dentro del diagrama, también debemos analizar, cuantos campos tendrá cada tabla y de qué
tipo son.

Creación de bases de datos

Una vez definida la arquitectura, debes crear una base de datos dentro del servidor, también
llamada esquema. Para crear una base de datos, usamos el comando:

CREATE DATABASE <nombre>;


Creación de tablas

Para crear tablas, debes especificar un nombre para la tabla, para cada campo y el tipo
asociado a cada uno de estos.
CREATE TABLE <nombre> (
id_<nombre> TIPO PRIMARY KEY,
campo TIPO,

campo TIPO
);

Por convención, el primer campo de una tabla, por lo general, representa a la llave primaria,
y recibe el nombre id. Por ejemplo id_empleado, id_usuario, etc. Sin embargo, esto
dependerá de tus necesidades.

Puedes tener más de una llave primaria, siempre y cuando la combinación de éstas
identifiquen de forma única a los registros de la tabla.

Si necesitas hacer referencia a un campo dentro de otra tabla, al final de la definición de las
tablas, deberás añadir la llave foránea con la siguiente sintaxis:

FOREIGN KEY (campo__destino) REFERENCES tabla(campo_origen);


Inserción de registros

Para insertar registros en una tabla, se usa el comando:

INSERT INTO <TABLA> (campo1,campo2,...) VALUES (valor1,valor2,...);

Por ejemplo:

INSERT INTO empleados (id_empleado,nombre) VALUES (1,”Juanito”);

Para cargas masivas de datos, emplearemos la herramienta de importación de MySQL


Workbench, sin embargo, debes tener la estructura de las tablas ya definida. Se aceptan
varios formatos para cargar información, el más usado es CSV de manera que si tu fuente
de datos está en este formato, será sencillo cargarlos.

Elementos de MongoDB
MongoDB es un Gestor de Bases de Datos no relacionales orientado a documentos que
hace uso de la orientación llave/valor. Su nombre proviene del inglés humongous y usa el
formato BSON (JSON compilado) para almacenar datos. Es uno de los gestores más
conocidos, al mismo nivel que MySQL de las bases de datos relacionales. A continuación
se listan algunas definiciones básicas de este gestor.

Definición 1
 JSON: Es un formato compacto de representación de objetos. Es un formato de
intercambio de información y su uso nació del lenguaje JavaScript.

Definición 2

 Documento: Es un conjunto de datos semiestructurados, que contienen parejas de la


forma llave/valor, usando BSON como formato de almacenamiento.

Definición 3

 Colección: Es un conjunto de documentos.

Podemos dar una comparación de esta terminología con las bases de datos relacionales:

Tabla -> Colección

Registro -> Documento

Columna -> Llave

Configuración de bases de datos en


MongoDB
Para MongoDB configuraremos un cluster mediante la plataforma MongoDB Atlas que
permite configurar servidores de bases de datos, con solo unos clics. Por supuesto hay una
versión gratuita y una de paga.

Para los fines del curso la versión gratuita, nos vendrá bastante bien. Durante el work
trabajaremos en la configuración de este servidor, de momento te dejamos esta liga por si
quieres conocer más de esta plataforma.
Inserción de registros

En MongoDB no es necesario que generemos la estructura de la base de datos pues no


existe como tal ese concepto, recordemos que son bases de datos no relacionales. Por lo
tanto, necesitamos tener la base de nuestros documentos previamente definida y con valores
concretos. Para cargar datos en Compass podemos usar archivos en formato CSV o JSON
debido a la naturaleza de los documentos.

De aquí podemos notar la preferencia del uso de MongoDB en ciertos proyectos con una
estructura previamente definida, pues la carga de datos consiste en subir un archivo sin
necesidad de especificar la estructura primero.

Carga y exportación masiva de datos


En general, cuando hablamos de análisis de datos es poco común que se nos proporcione
una base de datos con unos cuantos registros, pues esto no garantiza un análisis correcto.
Debido a esto es común que se carguen archivos con grandes volúmenes de datos y por lo
general el primer reto al que nos enfrentamos es a la limpieza de datos.

De esta forma, es importante que antes de cargar un archivo CSV o JSON a tu base de
datos, verifiques que su estructura sea correcta, que tenga los campos que necesitas, que la
codificación sea la adecuada entre otras.

Aquí te dejamos una referencia para que limpies datos desde consola. Pregunta al experto
otras alternativas en caso de dudas.

https://www.datacamp.com/community/tutorials/shell-commands-data-scientist

Fundamentos de Mongo DB
Bases de datos no relacionales
Las bases de datos no relacionales están diseñadas para modelos específicos y no tienen un
lenguaje de consulta en común como es el caso de las base de datos relacionales que hacen
uso de SQL. Debido a esto, este tipo de bases de datos son llamadas en ocasiones, bases de
datos NoSQL.

La principal diferencia con las bases de datos relacionales, es que no existe una estructura
común para el almacenamiento (tablas) y de hecho, no es necesario realizar un esquema
previo, la estructura de datos se va generando conforme se van insertando valores.

Existen distintos tipos de bases de datos no relacionales, a continuación se describen


algunas de éstas.
Bases de datos orientada a documentos

Este tipo de base de datos se basan en la definición de lo que se conoce como Documento
que sigue un formato específico. Los formatos más utilizados son JSON y BSON. Cada
documento es similar a un registro en una base de datos relacional, sin embargo, dos
documentos, no tienen porqué tener un esquema idéntico aunque almacene la misma
colección de datos.

Por ejemplo, el siguiente documento almacena los datos de una persona en formato JSON.

{
id: 1,
nombre: “Mauricio Escutia”,
edad: 24,
peso: 65.0,
estatus: 1.75
}

Al usar JSON se usa un modelo llave/valor. Esto es equivalente al valor de una columna en
una base de datos relacional.

Bases de datos orientadas a llave/valor

Este tipo de bases de datos es muy similar a las bases de datos basadas en documentos, pues
se usan documentos para almacenar información, la diferencia radica en que estos
documentos se almacenan en una llave, con la cual puede recuperarse el documento. Por
ejemplo, el siguiente documento se almacena en una llave persona1.

persona1 => {
id: 1,
nombre: “Mauricio Escutia”,
edad: 24,
peso: 65.0,
estatus: 1.75
}

De esta forma cambia ligeramente el modo de recuperar información y de hecho puede


usarse a la par con bases de datos orientadas a documentos, lo cual es posible mediante el
uso de Sistemas Gestores de Bases de Datos híbridos.

Bases de Datos Orientadas a Gráficas

Este tipo de bases de datos tratan los datos mediante lo que se conoce en matemáticas como
gráfica y se manipulan según dicta la Teoría de Gráficas. Cada base de datos se compone
de vértices (representados por círculos) y aristas (representadas por líneas que relacionan
los vértices).
Este tipo de bases de datos sólo permiten relaciones binarias, pues un vértice sólo puede ser
conectado con otro mediante una arista. A continuación se muestra la gráfica de una base
de datos.

Sistemas Gestores de Bases de Datos No Relacionales

 Orientadas a documentos
o MongoDB
o CouchDB
o RavenDB
 Orientadas a llave valor
o Apache Cassandra
o Riak
o Redis
 Orientadas a gráficas
o NEO4J
o Dex
o Sones GraphDB

Sistemas Gestores de Bases de Datos No Relacionales

Orientadas a documentos:

 MongoBD.
 CouchBD.
 RavenBD.

Orientadas a llave valor:

 Apache Cassandra.
Grafos en algunas partes de habla hispana y graphs en inglés.

 Riak.
 Redis.

Orientadas a graficas.

 NEO4J.
 Dex.
 Sones GraphBD.

Conexión a una base de datos MongoDB


Al igual que con las bases de datos relacionales, es común que los datos se encuentren en
servidores, por lo tanto, se necesitan los mismos datos para realizar la conexión con un
servidor de bases de datos:

 La dirección del servidor, también llamada host.


 El usuario con el cual nos vamos a conectar.
 Una contraseña de acceso y el puerto a través del cual realizaremos la conexión.

En esta segunda parte del módulo, usaremos como cliente a MongoDB Compass.
MongoDB Compass es un cliente de MongoDB que permite conectarse con servidores de
bases de datos para crear nuevas bases de datos, hacer consultas, crear documentos, entre
muchas otras tareas.

Para conectarse a un servidor de bases de datos. Compass provee la siguiente pantalla:


Una vez que nos conectemos al servidor de bases de datos, podemos encontrar muchas
bases dentro del mismo, por ejemplo, si fuera un servidor de bases de datos para un
restaurante, podríamos encontrar una base de datos para el inventario, otra para la nómina
de los empleados, otra para el menú, entre muchas otras.
Elementos de MongoDB
MongoDB es un Gestor de Bases de Datos no relacionales orientado a documentos que
también hace uso de la orientación llave/valor. Su nombre proviene del inglés humongous y
usa el formato BSON (JSON compilador) para almacenar datos. Es uno de los gestores más
conocidos, al mismo nivel que MySQL de las bases de datos relacionales. Recordemos
algunas definiciones básicas importantes:

Definición 1

 JSON: Es un formato compacto de representación de objetos. Es un formato de


intercambio de información y su uso nació del lenguaje JavaScript.

Definición 2

 Documento: Es un conjunto de datos semiestructurados, que contienen parejas de la


forma llave/valor, usando BSON como formato de almacenamiento.

Definición 3

 Colección: Es un conjunto de documentos.

Podemos dar una comparación de esta terminología con las bases de datos relacionales:

Tabla -> Colección

Registro -> Documento

Columna -> Llave

Documentos JSON
Para representar documentos se hace uso de JSON. Un documentos JSON está formado por
los siguientes elementos:

Objetos. Son conjuntos desordenados de pares llave/valor. Cada objeto inicia con una llave
que abre { y finaliza con una llave que cierra }. Cada par se separa con una coma.

Valores. Pueden ser cadenas, números, booleanos, null, objetos o arreglos. Estos pueden
anidarse.
Arreglos. Son una colección de valores. Comienzan con un corchete izquierdo [ y finalizan
con un corchete derecho ]. Cada valor se separa por una coma.

Por ejemplo, se tiene el siguiente documento JSON con los datos de un Pokémon.

{
id: 1,
nombre: “Bulbasaur”,
tipo: [“Hierba”, “Venenoso”]
}

Es importante que estés muy familiarizado con el formato JSON para que puedas abordar
MongoDB con facilidad. Si no te sientes cómodo con la sintaxis de JSON, puedes ir a este
link.

Consultas
Para facilitar el proceso de consulta, Compass provee una interfaz gráfica que permite
interactuar de forma sencilla e intuitiva con las distintas colecciones.

En esta sesión haremos uso de proyecciones, filtros, ordenamiento y limitaremos el número


de documentos por consulta. Para realizar consultas usaremos JSON como lenguaje de
intercambio de información.

Actividad

Durante la clase haremos uso de las bases de datos de muestra de MongoDB Atlas, para
ello, debes ingresar a atlas y dar clic en el botón de los tres puntos y pedirle a Atlas que
cargue las bases de datos.
Consultas en mongo DB
Expresiones regulares
Una expresión regular es una cadena que describe un patrón de caracteres. Se basan en la
técnica de búsqueda de patrones a partir de una cadena de texto, en este caso almacenada en
un documento.

La sintaxis para una expresión regular es la siguiente:

/pattern/modifiers

El patrón describe la estructura que deben tener las cadenas a buscar y los modificadores
permiten establecer modificadores, como buscar por mayúsculas o minúsculas
indistintamente. A continuación se muestran algunos de estos modificadores:

Para hacer uso de expresiones regulares se usan filtros. Vemos algunos ejemplos:

 Dada una colección de usuarios, obtener todos los documentos que contienen el
nombre “Pepito”.

{nombre: “/Pepito/”}

En este caso, la búsqueda se realiza por coincidencia exacta.

 Dada una colección de usuarios, obtener todos los documentos que contienen el
nombre “Pepito”, realizar la búsqueda ignorando mayúsculas y minúsculas.

{nombre: “/Pepito/i”}

En este caso, se ignora si “Pepito” tiene mayúsculas o minúsculas.


 Dada una colección de direcciones, obtener todos los documentos que finalizan con
06.

{cp: “06$”}

El símbolo $ indica el final de una línea.

 Dada una colección de direcciones, obtener todos los documentos que inician con
06.

{cp: “^06”}

El símbolo ^ indica el inicio de una línea.

 Dada una colección de direcciones, obtener todos los documentos que incluyen un
06 en alguna parte.

{cp: “.*06.*”}

El símbolo .* indica que en ese espacio puede haber cualquier cadena.

Consultas a objetos anidados


Existen documentos que pueden tener objetos anidados, es decir que dentro de su definición
incluye otros objetos ya sea dentro de un solo campo o dentro de un arreglo, por ejemplo.

En estos casos, es usual que necesitemos recuperar valores de estos objetos, con cual
usaremos la notación punto. Por ejemplo, supongamos que dentro de una colección
persona, se encuentra un arreglo, de contactos con objetos de la persona:

{
nombre: “...”,
telefono: “...”,
correo: “...”
}

Para acceder a los teléfonos de todos los contactos, usamos un proyección con la siguiente
estructura:

{“contacto.telefono” = 1}

Observa cómo el campo de la proyección se encuentra delimitado por comillas dobles a


diferencia de cómo lo hacíamos antes. Si omites las comillas, Mongo aplicará la proyección
buscando un campo llamado contacto.telefono en lugar de aplicar la notación punto.
Mientras más niveles tenga la anidación de objetos u arreglos, más puntos deberás añadir.

Introducción a las agregaciones


De la misma forma en que hacíamos subconsultas en SQL, es posible utilizar los resultados
de otras consultas dentro de Mongo. Para ello, se define el concepto de agregación.

Las agregaciones son divididas por lo que se conoce como capa. Cada capa puede ver las
columnas de la capa anterior y en cada paso se genera una nueva colección con los
resultados correspondientes.

Con capas podemos agregar nuevos campos, proyectar campos, ordenar colecciones, filtrar
información, realizar agrupamientos entre otras. Podemos pensar en las capas como una
tubería (pipeline) que inicia en la colección original y después de ciertos procesamientos
genera el resultado final.

Para realizar una agregación en MongoDB Compass, se debe seleccionar la colección y


presionar la pestaña superior llamada “Aggregations”.

Agregaciones
Agrupamientos
Como recordarás de las sesiones de MySQL y la última de MongoDB, un agrupamiento
nos permite aplicar una función a una columna en el caso de las tablas o al campo de una
colección en el caso de los documentos.

Esto es similar a cuando aplicamos una función en las columnas de los documentos en
Excel.
La única restricción es el uso de funciones de agrupamiento. En MongoDB los
agrupamientos tienen requieren la siguiente sintaxis:

{
_id: <expresión>, // Campo por el cual agrupar
<Nuevo campo>: {<accumulador>: <expresión1>},
...
}
Al igual que en SQL, necesitamos especificar el campo por el cual agrupar, y después
indicar uno por uno los acumuladores y a qué columna o valor serán aplicados. Por
acumulador nos referimos a las funciones de agrupamiento, en MongoDB son llamadas
acumuladores, pero es lo mismo.

Por ejemplo, supongamos que queremos el promedio de las calificaciones de los distintos
grupos de un profesor. Para ello usamos una agregación $group con los siguientes datos:

{
_id: grupo,
promedio: {$avg: calificacion},
...
}

De esta forma, por cada grupo asignado al profesor, se calculan los promedios generando
documentos con la siguiente estructura:

{
grupo: 401
promedio: 7.2
},

Otros acumuladores que se pueden usar con esta agrupación son: $max, $min, y $sum por
ejemplo. Puedes consultar más acumuladores y su funcionamiento en la documentación de
MongoDB.

https://docs.mongodb.com/manual/reference/operator/aggregation/group/

Consultas a múltiples colecciones


En SQL usamos las distintas variantes de JOIN para relacionar tablas. En MongoDB no
existe como tal la operación JOIN, sin embargo, podemos relacionar colecciones por sus
campos usando un tipo de agregación llamado $lookup.

Esta operación requiere la siguiente sintaxis:

{
from: <colección derecha>,
localField: <campo de la colección izquierda>,
foreignField: <campo de la colección derecha>,
as: <arreglo de salida con los resultados>
}
En SQL al hacer un JOIN se obtenía una nueva colección. En MongoDB, se genera un
arreglo con los documentos que coinciden en la colección derecha y se agregan como
nuevo campo a la colección izquierda.

Vistas
Las vistas en MongoDB funcionan de la misma manera que en SQL, es decir, se genera una
colección virtual con los resultados de una consulta. En este caso en lugar de consulta se
genera una colección con los resultados del pipeline de una agregación.

Para crear vistas, en la vista de agregaciones seleccionaremos el botón [Save] y daremos


clic en la opción [Create a view], damos un nombre a la colección y ¡Listo! tenemos
nuestra vista creada.

Puedes visualizarla en el listado que se muestra a la izquierda y abrirla como si se tratara de


cualquier colección.

Query competition
Preparación
 Usando la plataforma Kaggle, busca una fuente de datos que sea de tu agrado. De
preferencia escoge alguna donde la fuente de datos sea un archivo CSV.

 Analiza los datos de la fuente de datos que escojas, limpia los datos en caso de ser
necesario, esto es, si no está bien separado, si tiene comas mal colocadas, etc.

 Elige la base de datos de tu preferencia, puede ser tanto MySQL como MongoDB.
Como sugerencia analiza los datos primero: si tu fuente de datos tiene una
estructura bien definida y relaciona distintos elementos, usa MySQL, si por el
contrario, la fuente de datos no cuenta con una estructura bien definida usa
MongoDB.

 Carga la base de datos, si estás usando SQL recuerda definir correctamente la


estructura de las tablas y de preferencia define llaves primarias y foráneas si te es
posible hacerlo.

 Define consultas de interés sobre la base de datos que elegiste y practica. Recuerda
todo lo que sabes acerca de los tipos de consultas que existen tanto en SQL como en
MongoDB.

https://github.com/beduExpert/A1-Introduccion-a-Bases-de-Datos-Santander2021

También podría gustarte