Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Autores
Iván Andrés Arias Fonseca (Grupo 1A)
Yenny Mariela Joaquín (Grupo 1A)
Diego Fernando Ladino Villabón (Grupo
1B)
Docente:
Liliana Corredor Roa
permite un mayor control sobre los datos que maneja una empresa, institución o
bases de datos.
Trabajo individual
Con el fin de entender los conceptos fundamentales de la materia, se debe dar respuesta a las
siguientes preguntas, teniendo en cuenta a bibliografía y materia presentado para la actividad:
1. ¿Qué es Normalización?
Las bases de datos pueden clasificarse por su nivel de normalización, del nivel 1 al 5 (hay
Esto significa que el nivel 1, o 1FN, es la forma más básica y simple de normalizar datos,
hasta alcanzar la más sofisticada de todas, o 5NF. Esta última se emplea raras veces y es más
EJEMPLOS:
Una tabla está en 2FN si además de estar en 1FN cumple que los atributos no clave
depende de TODA la clave principal.
Por ejemplo, si tenemos una tabla con Personas, identificadas por su NIF y recogemos su
empresa y dirección de trabajo, la clave sería NIF-Empresa. Pero nos encontraremos con que
una misma persona puede trabajar en varias empresas. Y vemos que la dirección de trabajo no
depende de TODA la clave primaria, sino solo de la empresa. Por lo tanto, no estamos en 2FN.
Tabla de empleados:
Aquí, podemos observar que hemos dividido la tabla en forma 1NF en tres tablas diferentes. la
tabla Empleados es una entidad sobre todos los empleados de una empresa y sus atributos
describen las propiedades de cada empleado. La clave principal de esta tabla es empNum.
De manera similar, la tabla Departamentos es una entidad sobre todos los departamentos de una
empresa y sus atributos describen las propiedades de cada departamento. La clave principal de
esta tabla es deptNum.
En la tercera tabla, hemos combinado las claves primarias de ambas tablas. Las claves
principales de las tablas Empleados y Departamentos se denominan claves externas en esta
tercera tabla.
Si el usuario quiere una salida similar a la que teníamos en 1NF, entonces el usuario tiene que
unir las tres tablas, usando las claves primarias.
3FN – Tercera Forma Normal
En este caso, CALLE y CIUDAD no tienen una relación directa con la clave primaria
ID_ESTUDIANTE, ya que no están directamente relacionados con el estudiante, sino que
dependen totalmente del código postal.
Supongamos que hay múltiples estudiantes ubicados en un mismo código postal, con la tabla
ESTUDIANTE teniendo una inmensa cantidad de registros, y se requiere cambiar el nombre de
la calle o la ciudad, entonces se deberá buscar y actualizar esta calle o ciudad en toda la tabla
ESTUDIANTE.
Por ejemplo, si se requiere cambiar la calle “El Limón” por “El Limón II”, se tendrá que buscar
“El Limón” en toda la tabla ESTUDIANTE y luego actualizarla a “El Limón II”.
Buscar en una tabla enorme y actualizar los registros únicos o múltiples requerirá mucho tiempo
y, por tanto, afectará el rendimiento de la base de datos.
En su lugar, estos detalles se pueden tener en una tabla separada (POSTAL) que esté
relacionada con la tabla ESTUDIANTE usando el atributo CODIGO_POSTAL.
La tabla POSTAL tendrá una cantidad comparativamente menor de registros y solo se tendrá
que actualizar una vez esta tabla POSTAL. Esto se reflejará automáticamente en la tabla
ESTUDIANTE, simplificando la base de datos y las consultas. Así las tablas estarán en 3FN:
En este caso existen dos relaciones de DMV, que son C_OrdenPed y C_Insumo, con
C_Producto, para ello debemos separarlos en tablas distintas junto con sus atributos
relacionados y de esta manera se encuentre en 4FN.
3. ¿Defina porque es tan importante la normalización de una base de datos?
Puede parecer confuso para qué sirve la normalización realmente; éste es un resumen de los
La clave o llave primaria es un campo, o grupo de campos que identifica en forma única
un registro. Ningún otro registro puede tener la misma llave primaria. La llave primaria
se utiliza para distinguir un registro con el fin de que se pueda tener acceso a ellos,
organizarlos y manipularlos. En el caso de un registro de un empleado, él número de
este representa un ejemplo de una llave primaria.
producto_id...nombre_producto..categor…
1....................ceras............…
2....................shampoo..........…
3....................jaboncillos......…
Una clave o llave foránea (o Foreing key FK) es una limitación referencial entre dos tablas. La
clave foránea identifica una columna o grupo de columnas en una tabla (tabla hija o referendo)
que se refiere a una columna o grupo de columnas en otra tabla (tabla padre o referenciada). Las
columnas en la tabla referendo deben ser la clave primaria u otra clave candidata en la tabla
referenciada.
EJEMPLO:
Como se puede observar en el siguiente ejemplo, es necesario definir primero la tabla hacia la
cual se va a referenciar la clave Foránea. Ese es el único requisito.
6. Cite 5 sistemas gestores de bases de datos (nombre, versión, si se maneja online o
de escritorio).
MySQL
Es el sistema gestor de bases de datos relacional por excelencia.
Se ofrece bajo la GNU GPL aunque también es posible adquirir una licencia para empresas que
quieran incorporarlo en productos privativos (Desde la compra por parte de Oracle se está
orientando a este ámbito empresarial).
MariaDB
SQLite
Más que un Sistema Gestor de bases de datos como tal, SQLite es una biblioteca escrita en
C que implementa un SGBD y que permite transacciones sin necesidad de un servidor ni
configuraciones.
Es una biblioteca utilizada en multitud de aplicaciones actuales ya que es open source y las
consultas son muy eficientes.
Las principales características de SQLite son:
El tamaño, al tratarse de una biblioteca, es mucho menor que cualquier SGBD
Reúne los cuatro criterios ACID (Atomicidad, Consistencia, Aislamiento y Durabilidad)
logrando gran estabilidad
Gran portabilidad y rendimiento
La gran desventaja de SQLite es la escalabilidad ya que no soporta bases de datos que sean
muy grandes.
PostgreSQL
Este sistema gestor de base de datos relacional está orientado a objetos y es libre, publicado
bajo la licencia BSD.
Sus principales características son:
Control de Concurrencias multiversión (MVCC)
Flexibilidad en cuanto a lenguajes de programación
Multiplataforma
Dispone de una herramienta (pgAdmin, https://www.pgadmin.org/) muy fácil e intuitiva
para la administración de las bases de datos.
Robustez, Eficiencia y Estabilidad.
La principal desventaja es la lentitud para la administración de bases de datos pequeñas ya que
está optimizado para gestionar grandes volúmenes de datos.
Oracle
Redis
Redis está basado en el almacenamiento clave-valor. Podríamos verlo como un vector enorme
que almacena todo tipo de datos, desde cadenas, hashses, listas, etc.
El principal uso de este SGBD es para el almacenamiento en memoria caché y la
administración de sesiones.
Las características principales son:
Atomicidad y persistencia
Gran velocidad
Simplicidad
Multiplataforma
Cassandra
SQLCopiar
USE AdventureWorks2012;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2012;
GO
SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO
En este ejemplo se devuelven todas las filas (no se ha especificado la cláusula WHERE) y solo
un subconjunto de las columnas (Name, ProductNumber, ListPrice) de la tabla Product de la
base de datos AdventureWorks2019. Además, se agrega un encabezado de columna.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT Name, ProductNumber, ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
En este ejemplo solo se devuelven las filas de Product que tienen una línea de productos de R y
cuyo valor correspondiente a los días para fabricar es inferior a 4.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT Name, ProductNumber, ListPrice AS Price
FROM Production.Product
WHERE ProductLine = 'R'
AND DaysToManufacture < 4
ORDER BY Name ASC;
GO
En los siguientes ejemplos se devuelven todas las filas de la tabla Product. En el primer ejemplo
se devuelven las ventas totales y los descuentos de cada producto. En el segundo ejemplo se
calculan los beneficios totales de cada producto.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT p.Name AS ProductName,
NonDiscountSales = (OrderQty * UnitPrice),
Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName DESC;
GO
Ésta es la consulta que calcula el beneficio de cada producto de cada pedido de venta.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT 'Total income is', ((OrderQty * UnitPrice) * (1.0 - UnitPriceDiscount)), ' for ',
p.Name AS ProductName
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName ASC;
GO
SQLCopiar
USE AdventureWorks2012;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
SQLCopiar
USE tempdb;
GO
IF OBJECT_ID (N'#Bicycles',N'U') IS NOT NULL
DROP TABLE #Bicycles;
GO
SELECT *
INTO #Bicycles
FROM AdventureWorks2012.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO
SQLCopiar
USE AdventureWorks2012;
GO
IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED;
GO
Una subconsulta correlacionada es una consulta que depende de la consulta externa para obtener
sus valores. Se ejecuta varias veces, una vez por cada fila que la consulta externa pueda
seleccionar.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT DISTINCT Name
FROM Production.Product AS p
WHERE EXISTS
(SELECT *
FROM Production.ProductModel AS pm
WHERE p.ProductModelID = pm.ProductModelID
AND pm.Name LIKE 'Long-Sleeve Logo Jersey%');
GO
-- OR
USE AdventureWorks2012;
GO
SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN
(SELECT ProductModelID
FROM Production.ProductModel AS pm
WHERE p.ProductModelID = pm.ProductModelID
AND Name LIKE 'Long-Sleeve Logo Jersey%');
GO
En el ejemplo siguiente se usa IN y se recupera una instancia del nombre y apellido de cada
empleado cuya bonificación en la tabla SalesPerson sea de 5000.00 y cuyos números de
identificación coincidan en las tablas Employee y SalesPerson.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT DISTINCT p.LastName, p.FirstName
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = p.BusinessEntityID WHERE 5000.00 IN
(SELECT Bonus
FROM Sales.SalesPerson AS sp
WHERE e.BusinessEntityID = sp.BusinessEntityID);
GO
SQLCopiar
USE AdventureWorks2012;
GO
SELECT p1.ProductModelID
FROM Production.Product AS p1
GROUP BY p1.ProductModelID
HAVING MAX(p1.ListPrice) >=
(SELECT AVG(p2.ListPrice) * 2
FROM Production.Product AS p2
WHERE p1.ProductModelID = p2.ProductModelID);
GO
En este ejemplo se utilizan dos subconsultas correlativas para buscar los nombres de los
empleados que han vendido un producto específico.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT DISTINCT pp.LastName, pp.FirstName
FROM Person.Person pp JOIN HumanResources.Employee e
ON e.BusinessEntityID = pp.BusinessEntityID WHERE pp.BusinessEntityID IN
(SELECT SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID IN
(SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE ProductID IN
(SELECT ProductID
FROM Production.Product p
WHERE ProductNumber = 'BK-M68B-42')));
GO
F. Usar GROUP BY
SQLCopiar
USE AdventureWorks2012;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Debido a la cláusula GROUP BY, solo se devuelve una fila que contiene la suma de todas las
ventas por cada pedido de venta.
En este ejemplo se busca el precio medio y la suma de las ventas anuales hasta la fecha,
agrupados por Id. de producto e Id. de oferta especial.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS [Average Price],
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY ProductID, SpecialOfferID
ORDER BY ProductID;
GO
En el siguiente ejemplo se colocan los resultados en grupos después de recuperar únicamente las
filas con precios superiores a $1000.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductModelID, AVG(ListPrice) AS [Average List Price]
FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO
En este ejemplo se agrupa por una expresión. Puede agrupar por una expresión si ésta no
incluye funciones de agregado.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT AVG(OrderQty) AS [Average Quantity],
NonDiscountSales = (OrderQty * UnitPrice)
FROM Sales.SalesOrderDetail
GROUP BY (OrderQty * UnitPrice)
ORDER BY (OrderQty * UnitPrice) DESC;
GO
En este ejemplo se busca el precio medio de cada tipo de producto y se ordenan los resultados
por precio medio.
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID, AVG(UnitPrice) AS [Average Price]
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
En esta consulta se utiliza la cláusula LIKE en la cláusula HAVING.
SQLCopiar
USE AdventureWorks2012 ;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $1000000.00
AND AVG(OrderQty) < 3;
GO
Para ver los productos cuyas ventas totales son superiores a $2000000.00, utilice esta consulta:
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Si desea asegurarse de que hay al menos mil quinientos elementos para los cálculos de cada
producto, use HAVING COUNT(*) > 1500 para eliminar los productos que devuelven totales
inferiores a 1500 elementos vendidos. La consulta tiene este aspecto:
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
SQLCopiar
USE AdventureWorks2012;
GO
SELECT pp.FirstName, pp.LastName, e.NationalIDNumber
FROM HumanResources.Employee AS e WITH (INDEX(AK_Employee_NationalIDNumber))
JOIN Person.Person AS pp on e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
SQLCopiar
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours
FROM HumanResources.Employee AS e1
UNION
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
SQLCopiar
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
SQLCopiar
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
/* INCORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* CORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
S. Usar UNION de tres instrucciones SELECT para mostrar los efectos de ALL y los
paréntesis
En los siguientes ejemplos se utiliza UNION para combinar los resultados de tres tablas que
tienen las mismas 5 filas de datos. En el primer ejemplo se utiliza UNION ALL para mostrar los
registros duplicados y se devuelven las 15 filas. En el segundo ejemplo se
utiliza UNION sin ALL para eliminar las filas duplicadas de los resultados combinados de las
tres instrucciones SELECT y se devuelven 5 filas.
SQLCopiar
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO
IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO
IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO