1

Breve tutorial sobre SQL y las BB.DD. relacionales

SQL y su origen
SQL o Structured Query Language, es un lenguaje de consulta estructurado. El mismo data desde la década del 70 y tiene cómo fin trabajar con bases de datos relacionales para la consulta, actualización, manipulación y borrado de diferentes fuentes de datos.

Según la propia página de Wikipedia:

Originalmente un acrónimo de “Lenguaje de consulta estructurado” ("Structured Query Language”), fue creado por IBM como un lenguaje unificado para definir, consultar, modificar y controlar los datos en una base de datos relacional. Su nombre se pronuncia oficialmente “ess-cue-ell” (según el American National Standards Institute).

Actualmente SQL pasó por varias versiones del mismo y se utiliza en diversidad de industrias con el fin de hacer consultas a las fuentes de datos, con el fin de poder generar tablas, visuales, responder preguntas de negocio, hacer evaluaciones de desempeño, etc.

Buenas prácticas en bases de datos relacionales
Las bases de datos relacionales son un estándar en la gestión de datos debido a su capacidad para organizar información en tablas interrelacionadas mediante claves primarias y foráneas. La clave para mantener la eficiencia, escalabilidad y consistencia en una base de datos es seguir buenas prácticas de diseño, especialmente en lo que respecta a la normalización. La normalización es el proceso de estructurar una base de datos para minimizar la redundancia de datos y asegurar la integridad referencial. Se basa en descomponer tablas grandes en tablas más pequeñas y vinculadas mediante relaciones. Este proceso, aunque puede parecer tedioso, es esencial para mejorar el rendimiento y reducir las inconsistencias en los datos.

A continuación, se exploran las diferentes formas de normalización (1NF, 2NF, 3NF y BCNF) mediante ejemplos, casos de uso y una metáfora basada en el cuento de Caperucita Roja para ilustrar mejor los conceptos.

Primera Forma Normal (1NF)
La Primera Forma Normal establece que los datos deben estar organizados en tablas de tal manera que cada celda contenga un único valor atómico, es decir, que no haya conjuntos de valores o listas dentro de una columna. Además, cada fila debe ser única y la tabla debe contar con una clave primaria.

Caso de uso: Supón que tienes una tabla con empleados y sus teléfonos, pero algunos empleados tienen más de un número. En lugar de poner múltiples números de teléfono en una sola celda (lo cual viola la 1NF), crearías una tabla separada que asocie los empleados con sus números de teléfono.

Metáfora de Caperucita Roja para 1NF: Imagina que Caperucita lleva una cesta con manzanas, peras y uvas todas mezcladas en un solo compartimento. Para cumplir con la 1NF, necesitaría tener una cesta con compartimentos separados para cada tipo de fruta, de manera que no se mezclen. Lo mismo sucede con los datos: cada celda debe contener solo un valor atómico.

Segunda Forma Normal (2NF)
La Segunda Forma Normal establece que una tabla debe cumplir con la 1NF y, además, todas las columnas que no forman parte de la clave primaria deben depender completamente de la clave primaria. Esto significa que no debe haber dependencias parciales, es decir, donde un atributo dependa solo de una parte de la clave primaria en tablas con claves compuestas.

Caso de uso: Considera una tabla de pedidos donde la clave primaria está compuesta por el id_producto y el id_cliente, pero el nombre del cliente depende solo del id_cliente. Esto viola la 2NF. Para corregirlo, se debe dividir la tabla en dos: una para los detalles del pedido y otra para la información del cliente.

Metáfora de Caperucita Roja para 2NF: Si Caperucita lleva en su cesta una receta de pastel de manzana junto con las manzanas y la harina, pero la harina no depende de las manzanas, tendría que separar la receta (lo que depende de la harina y las manzanas) en otra sección. La harina debe estar en su propio compartimento, ya que no depende completamente de las manzanas, tal como un campo debe depender completamente de la clave primaria en una base de datos.

Tercera Forma Normal (3NF)
La Tercera Forma Normal establece que una tabla debe cumplir con la 2NF y que no debe haber dependencias transitivas entre atributos no clave, es decir, un campo no clave no debe depender de otro campo no clave.

Caso de uso: Si en una tabla de empleados tenemos una columna departamento y una columna nombre_departamento, donde nombre_departamento depende de departamento, esto viola la 3NF. Para corregirlo, se debe crear una tabla separada para los departamentos.

Metáfora de Caperucita Roja para 3NF: Caperucita tiene en su cesta un mapa del bosque y una lista de direcciones, pero si la lista de direcciones depende del mapa, lo más eficiente es crear un mapa aparte. En la base de datos, separarías esas dependencias en tablas individuales para evitar redundancias, tal como Caperucita separa el mapa de las direcciones.

Forma Normal de Boyce-Codd (BCNF)
La Forma Normal de Boyce-Codd (BCNF) es una extensión de la 3NF que garantiza que, incluso en el caso de claves compuestas, no haya dependencias funcionales entre los atributos. Para que una tabla esté en BCNF, cada determinante debe ser una clave candidata.

Caso de uso: Si tienes una tabla con los empleados que también guarda información sobre las ubicaciones de las oficinas, y una oficina puede tener múltiples gerentes, pero cada gerente solo puede trabajar en una oficina, se necesita dividir los datos para cumplir con BCNF.

Metáfora de Caperucita Roja para BCNF: En esta versión de la historia, Caperucita lleva diferentes llaves para abrir diferentes puertas en la casa de la abuela, pero algunas llaves pueden abrir más de una puerta. Para mantener las cosas organizadas (y la abuela segura), cada llave debería abrir solo una puerta y las puertas deberían tener sus propias llaves exclusivas. En términos de base de datos, esto significa que no debe haber dependencias funcionales entre atributos que no sean clave.

Tipos de datos en SQL
Uno de los pilares fundamentales al diseñar bases de datos relacionales es la correcta selección de los tipos de datos. Cada columna de una tabla debe definirse con un tipo de dato adecuado que asegure la eficiencia del almacenamiento, la velocidad de las consultas y la integridad de la información. SQL proporciona una amplia gama de tipos de datos para manejar distintos tipos de información como números, cadenas de texto, fechas y booleanos, entre otros.
A continuación, exploramos los principales tipos de datos en SQL, cómo seleccionar el más apropiado según las necesidades del proyecto y los tipos de consultas más importantes para interactuar con los datos almacenados.

Tipos numéricos
Los datos numéricos en SQL pueden subdividirse en números enteros y números decimales. Seleccionar el tipo correcto es crucial para garantizar la eficiencia en las operaciones aritméticas y el almacenamiento adecuado de los valores.

INT (Enteros): Almacena números enteros sin decimales, comúnmente utilizado para identificadores como id o cantidades que no necesitan fracciones.

FLOAT y DOUBLE: Almacenan números decimales, utilizados cuando se requiere más precisión, como en cálculos financieros o científicos.

DECIMAL(p, s): Especifica un número decimal con precisión exacta, donde p es el número total de dígitos y s es el número de dígitos después del punto decimal. Ideal para valores monetarios o mediciones exactas.

Tipos de texto
Los tipos de datos de texto se utilizan para almacenar cadenas de caracteres como nombres, descripciones, o direcciones. SQL ofrece varios tipos según el tamaño y el uso de la cadena.

CHAR(n): Almacena cadenas de texto de longitud fija. Si la cadena es más corta que el valor definido, se rellena con espacios. Ideal cuando sabes que todas las entradas tendrán una longitud exacta, como códigos de país o abreviaturas.

VARCHAR(n): Almacena cadenas de texto de longitud variable. Es el tipo más usado para nombres, direcciones, descripciones, ya que solo ocupa el espacio que realmente necesita.

TEXT: Almacena cadenas de texto largas. Ideal para grandes volúmenes de texto como artículos o descripciones extensas.

Tipos de fecha y hora
SQL proporciona tipos de datos especializados para manejar fechas y horas, lo cual es esencial para registrar eventos y realizar cálculos temporales.

DATE: Almacena solo la fecha (año, mes y día). Ideal para registros de nacimiento, fechas de eventos o cualquier dato en el que solo se necesite la fecha.

TIME: Almacena solo la hora. Útil para programaciones de horarios o tiempos de eventos.

TIMESTAMP: Almacena tanto la fecha como la hora en un solo campo. Utilizado para registrar eventos que dependen de una precisión temporal como transacciones.

Otros tipos de datos importantes
BOOLEAN: Almacena valores de verdadero o falso, útil para indicadores binarios como “activo/inactivo” o “pagado/no pagado”.
BLOB: Almacena grandes objetos binarios, como imágenes o archivos.

Principales tipos de consultas en SQL
Una vez que los datos están estructurados correctamente utilizando los tipos de datos adecuados, es fundamental interactuar con la base de datos para extraer, insertar, actualizar o eliminar información. SQL ofrece varios tipos de consultas que permiten manipular los datos de manera eficiente.

SELECT
La consulta SELECT es la más básica y utilizada en SQL. Permite extraer datos de una o más tablas. Se puede utilizar junto con las cláusulas WHERE, GROUP BY, HAVING y ORDER BY para personalizar los resultados.

INSERT
La consulta INSERT INTO se utiliza para agregar nuevas filas a una tabla. Se puede especificar tanto las columnas como los valores a insertar.

UPDATE
La consulta UPDATE se utiliza para modificar los datos existentes en una tabla. Normalmente se utiliza con la cláusula WHERE para especificar las filas que deben actualizarse.

DELETE
La consulta DELETE permite eliminar filas específicas de una tabla. Al igual que con UPDATE, se utiliza junto con WHERE para especificar qué filas deben eliminarse.

WHERE
La cláusula WHERE se utiliza en SQL para filtrar los registros que cumplen una condición específica. Aplica las condiciones antes de agrupar o realizar operaciones en los datos, limitando las filas que se seleccionarán o manipulan. Es ideal para establecer criterios de selección precisos sobre una tabla o conjunto de datos.

GROUP BY
La cláusula GROUP BY se utiliza para agrupar filas que tienen los mismos valores en columnas específicas. Se suele usar en combinación con funciones de agregación como COUNT(), SUM(), AVG(), etc., para calcular resultados sobre grupos de datos.

COUNT()
La función COUNT() se utiliza para contar el número total de filas que cumplen con una condición específica. Esta función es útil para obtener el número de registros en una tabla o el número de filas que cumplen una condición específica.

SUM()
La función SUM() se utiliza para calcular la suma total de una columna numérica. Es especialmente útil cuando se necesita calcular totales, como la suma de ventas, salarios o cualquier otro valor cuantitativo.

AVG()
La función AVG() se utiliza para calcular el promedio de una columna numérica. Es ideal para encontrar el valor promedio de un conjunto de datos, como el salario promedio en una empresa o la calificación promedio en un examen.

HAVING
La cláusula HAVING se utiliza en SQL para filtrar grupos de resultados después de que se han agrupado los datos con GROUP BY. A diferencia de WHERE, que filtra filas antes de agrupar, HAVING actúa sobre los grupos de resultados.

ORDER BY
La cláusula ORDER BY se utiliza para ordenar los resultados de una consulta en orden ascendente o descendente, según los valores de una o más columnas. Por defecto, el orden es ascendente, pero se puede cambiar a descendente con la palabra clave DESC.

JOIN
Las consultas JOIN permiten combinar datos de dos o más tablas relacionadas. Los tipos más comunes son:

  • INNER JOIN: Devuelve solo las filas que tienen coincidencias en ambas tablas.

  • LEFT JOIN: Devuelve todas las filas de la tabla izquierda y las coincidencias de la tabla derecha.

  • RIGHT JOIN: Devuelve todas las filas de la tabla derecha y las coincidencias de la tabla izquierda.

  • FULL OUTER JOIN: Devuelve todas las filas cuando hay coincidencia en una de las tablas, y si no hay coincidencia, devuelve NULL en la tabla que no coincida.

  • CROSS JOIN: Devuelve el producto cartesiano de las dos tablas, es decir, combina cada fila de la primera tabla con cada fila de la segunda tabla.

Conclusión
En resumen, dominar los conceptos de normalización, tipos de datos y consultas en SQL es crucial para desarrollar bases de datos relacionales eficientes, escalables y fáciles de mantener. Al igual que Caperucita Roja que debe ser cuidadosa en cada paso que da en el bosque, los diseñadores de bases de datos deben tomar decisiones informadas para evitar la redundancia, garantizar la integridad de los datos y optimizar el rendimiento. Implementar estas buenas prácticas no solo mejora la estructura de los datos, sino que también sienta las bases para la futura escalabilidad y seguridad de cualquier sistema de información.

Escribe tu comentario
+ 2