Está en la página 1de 31

Actividad profundización

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

Fundación Universitaria Compensar


Facultad de ingeniería de sistemas
Construcción de bases de datos
24 de octubre de 2022
INTRODUCCIÓN

Las bases de datos son un sistema de organización y centralización de la

información, es bastante importante y muy utilizado a nivel mundial ya que

permite un mayor control sobre los datos que maneja una empresa, institución o

cualquier entidad que requiera manejar este contenido. Es fundamental tener un

software de una base de datos en una empresa ya que se han convertido en

elementos imprescindibles en la vida cotidiana de la sociedad moderna. Los

sistemas de bases de datos llevan unas normativas que permiten manipular el

contenido de manera lógica y ordenada manteniendo una jerarquía de

organización y fidelidad de la información. Para manipular y gestionar las bases

de datos han surgido herramientas de software como sistemas de gestores de

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?

La normalización es el proceso de organizar los datos de una base de datos. Se incluye la


creación de tablas y el establecimiento de relaciones entre ellas según reglas diseñadas tanto
para proteger los datos como para hacer que la base de datos sea más flexible al eliminar la
redundancia y las dependencias incoherentes.

Los datos redundantes desperdician el espacio de disco y crean problemas de mantenimiento. Si


hay que cambiar datos que existen en más de un lugar, se deben cambiar de la misma forma
exactamente en todas sus ubicaciones. Un cambio en la dirección de un cliente es mucho más
fácil de implementar si los datos sólo se almacenan en la tabla Clientes y no en algún otro lugar
de la base de datos.

2. ¿Cuáles son los Tipos de Normalización y de un ejemplo de cada uno?

Las bases de datos pueden clasificarse por su nivel de normalización, del nivel 1 al 5 (hay

quien incluso habla de 8 tipos distintos).

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

común ver los tres primeros tipos.

 1FN: Elimina duplicados y crea tablas separadas para grupos de datos relacionados.


 2FN: Elimina subgrupos de datos en múltiples filas de una tabla y crea tablas nuevas,
con relaciones entre ellas.
 3FN: Elimina columnas que no dependen de la clave principal.
 4FN: Desaparecen todas las dependencias entre múltiples valores.

EJEMPLOS:

1FN – Primera Forma Normal


Una tabla está en Primera Forma Normal si:

 Todos los atributos son «atómicos». Por ejemplo, en el campo teléfono no


tenemos varios teléfonos.
 La tabla contiene una clave primaria única. Por ejemplo, el NIF para personas,
la matrícula para vehículos o un simple id autoincrementar. Si no tiene clave, no
es 1FN.
 La clave primaria no contiene atributos nulos. No podemos tener filas para las
que no haya clave (por ejemplo, personas sin NIF o vehículos sin matrícula).
 No debe existir variación en el número de columnas. Si algunas filas tienen 8
columnas y otras 3, pues no estamos en 1FN.
 Los campos no clave deben identificarse por la clave. Es decir, que los
campos no clave dependen funcionalmente de la clave. Esto es prácticamente lo
mismo que decir que existe clave primaria.
 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. Por ejemplo, si en la columna 1 tenemos el primer apellido y en la
columna 2 tenemos el segundo, pues no estamos en 1FN. Igualmente, si en la
tercera fila tenemos el tercer mejor expediente y en la quinta fila el quinto, no
estamos en 1FN.

Para que la tabla anterior esté en 1FN y sea una verdadera relación debería


encontrarse en esta forma:

2FN – Segunda Forma Normal

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.

A continuación, se muestra un ejemplo de cómo se vería la tabla de empleados y departamentos:

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

Sea la tabla ESTUDIANTE, cuya clave primaria es la identificación del estudiante


(ID_ESTUDIANTE) y está compuesta por los siguientes atributos: NOMBRE_ESTUDIANTE,
CALLE, CIUDAD y CODIGO_POSTAL, cumpliendo las condiciones para ser 2FN.

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.

Como el estudiante se ubica por el sitio determinado por CODIGO_POSTAL, CALLE y


CIUDAD se relacionan es con este atributo. Debido a este segundo grado de dependencia, no es
necesario almacenar estos atributos en la tabla ESTUDIANTE.

Crear nueva tabla

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:

4FN – Cuarta Forma Normal

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?

La normalización de base de datos es especialmente importante en el entorno del


procesamiento transaccional, sobre todo en el que se lleva a cabo en línea. Esto es
debido a la agilidad con que se llevan a cabo las modificaciones de datos que, además,
suelen darse de forma aleatoria. Inserciones, eliminaciones o actualizaciones afectan
a los datos almacenados pudiendo disminuir el rendimiento de la base de datos si
ésta no se ha normalizado.

Objetivos de la normalización de base de datos

Puede parecer confuso para qué sirve la normalización realmente; éste es un resumen de los

objetivos de la normalización de base de datos:

 Corregir datos duplicados y anomalías en la base de datos.


 Evitar la creación y actualización de relaciones y dependencias no deseadas entre datos.
 Prevenir borrados indeseados de datos.
 Optimizar el espacio de almacenamiento.
 Reducir el tiempo y complejidad de revisión de las bases de datos cuando es necesario
introducir nuevos tipos de datos.
 Facilitar el acceso e interpretación de los datos a los usuarios y aplicaciones que los
usan.

4. ¿Qué es una llave primaria? Cita un ejemplo

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.

Ejemplo: (una llave primaria)


Nombre Tabla : tb_producto
Campos : producto_id, nombre_producto, categoria_id,....
Llave primaria: producto_id (identificador único para diferenciar los productos)
Ejm:

producto_id...nombre_producto..categor…
1....................ceras............…
2....................shampoo..........…
3....................jaboncillos......…

Ejemplo: (dos llaves primarias)


Nombre Tabla : tb_comprobante
Campos : cbte_id,asiento_id,debe,haber,glosa,....
Llaves primarias: cbte_id,asiento_id(identificadores únicos para diferenciar un registro
de otro)
Ejm:

cbte_id | asiento | debe | haber | glosa


1...........1.............40.......0..…
1...........2.............0.........40… de la compra
2...........1.............80.......0..… almuerzo
2...........2.............25.......0..… caja chica
2...........3.............0.........25… caja chica
2...........4.............0.........80… almuerzos

Por ejemplo, tenemos un catálogo de marcas de computadoras, la tabla sería:

En este caso la llave primaria sería idmarca.

5. ¿Defina que es una llave Foránea? Cita un ejemplo

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.

Es un SGBD multihilo y multiusuario utilizado en la gran parte de las páginas web actuales.


Además, es el más usado en aplicaciones creadas como software libre.

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).

Las principales ventajas de este Sistema Gestor de Bases de datos son:


 Facilidad de uso y gran rendimiento
 Facilidad para instalar y configurar
 Soporte multiplataforma
 Soporte SSL
La principal desventaja es la escalabilidad, es decir, no trabaja de manera eficiente con bases de
datos muy grandes que superan un determinado tamaño.

MariaDB

Este SGBD es una derivación de MySQL que cuenta con la mayoría de las características de


este e incluye varias extensiones.
Nace a partir de la adquisición de MySQL por parte de Oracle para seguir la filosofía Open
Source y tiene la ventaja de que es totalmente compatible con MySQL.

Entre las principales características de este Sistema Gestor de Bases de datos se encuentran:


 Aumento de motores de almacenamiento
 Gran escalabilidad
 Seguridad y rapidez en transacciones
 Extensiones y nuevas características relacionadas con su aplicación para Bases de datos
NoSQL.
No tiene desventajas muy aparentes salvo algunas pequeñas incompatibilidades en la migración
de MariaDB y MySQL o pequeños atrasos en la liberación de versiones estables.

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.

Microsoft SQL Server

Es un sistema gestor de bases de datos relacionales basado en el lenguaje Transact-SQL, capaz


de poner a disposición de muchos usuarios grandes cantidades de datos de manera simultánea.

Es un sistema propietario de Microsoft. Sus principales características son:


 Soporte exclusivo por parte de Microsoft.
 Escalabilidad, estabilidad y seguridad.
 Posibilidad de cancelar consultas.
 Potente entorno gráfico de administración que permite utilizar comandos DDL y DML.
 Aunque es nativo para Windows puede utilizarse desde hace ya un tiempo en otras
plataformas como Linux o Docker.
Su principal desventaja es el precio. Cuenta con un plan gratuito (Express) pero lo normal es la
elección de alguno de los planes de pago disponibles (Standard, Developer, Enterprise o SQL
Azure, la versión de SQL Server en la nube).

Oracle

Tradicionamente, Oracle ha sido el SGBD por excelencia para el mundo empresarial,


considerado siempre como el más completo y robusto, destacando por:
 Soporte de transacciones.
 Estabilidad.
 Escalabilidad.
 Multiplataforma.
La principal desventaja, al igual que SQL Server, es el coste del software ya que, aunque
cuenta con una versión gratuita (Express Edition o XE), sus principales opciones son de pago.
Las opciones de pago disponibles son:
1. Standard Edition (SE)
2. Standard Edition One (SE1)
3. Standard Edition 2 (SE2)
4. Personal Edition (PE)
5. Lite Edition (LE)
6. Entreprise Edition (EE)
Sistemas Gestores de bases de datos No Relacionales (NoSQL)

Una base de datos no relacional (NoSQL) es aquella base de datos que:


 No requiere de estructuras de datos fijas como tablas
 No garantiza completamente las características ACID
 Escala muy bien horizontalmente.
Se utilizan en entornos distribuidos que han de estar siempre disponibles y operativos y que
gestionan un importante volumen de datos.
Para la administración de este tipo de bases de datos, actualmente los principales sistemas
gestores de bases de datos (SGBD NoSQL) son:
MongoDB

Estamos ante el Sistema Gestor de Bases de Datos no relacionales (SGBD NoSQL)


más popular y utilizado actualmente.
MongoDB es un SBGD NoSQL orientado a ficheros que almacena la información
en estructuras BSON con un esquema dinámico que permite su facilidad de integración.
Empresas como Google, Facebook, eBay, Cisco o Adobe utilizan MongoDB como Sistema
Gestor de Bases de datos.
Las principales características de MongoDB son:
 Indexación y replicación
 Balanceo de carga
 Almacenamiento en ficheros
 Consultas ad hoc
 Escalabilidad horizontal
 Open Source
Como desventaja principal, MongoDB no es un SGBD adecuado para realizar transacciones
complejas.

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

Al igual que Redis, Cassandra también utiliza almacenamiento clave-valor. Es un SGBD


NoSQL distribuido y masivamente escalable.

Facebook, Twitter, Instagram, Spotify o Netflix utilizan Cassandra.


Dispone de un lenguaje propio para las consultas denominado CQL (Cassandra Query
Languaje).
Las principales características de este SGBD NoSQL son:
 Multiplataforma
 Propio lenguaje de consultas (CQL)
 Escalado lineal y horizontal
 Es un SGBD distribuido
 Utiliza una arquitectura peer-to-peer

7. Consulta las instrucciones de los diferente SELECT y coloca un ejemplo escrito


aplicado la estructura de cada uno. Instrucción: Sintaxis Select * FROM NOMBRE DE
LA TABLA; Ejemplo: Select * FROM Estudiante;

A. Usar SELECT para recuperar filas y columnas

En el siguiente ejemplo se muestran tres fragmentos de código. En el primer ejemplo de código,


se devuelven todas las filas (no se especifica la cláusula WHERE) y todas las columnas (con *)
de la tabla Product de la base de datos AdventureWorks2019.

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

B. Usar SELECT con encabezados de columna y cálculos

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

C. Usar DISTINCT con SELECT

En el siguiente ejemplo se utiliza DISTINCT para evitar la recuperación de títulos duplicados.

SQLCopiar
USE AdventureWorks2012;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO

D. Crear tablas con SELECT INTO

En el primer ejemplo se crea una tabla temporal denominada #Bicycles en tempdb.

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

En el segundo ejemplo se crea la tabla permanente NewProducts.

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

SELECT * INTO dbo.NewProducts


FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;
GO

E. Usar subconsultas correlacionadas

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.

En el primer ejemplo se muestran consultas que son semánticamente equivalentes para


demostrar la diferencia entre el uso de la palabra clave EXISTS y la palabra clave IN. Ambos
son ejemplos de subconsultas válidas que recuperan una instancia de cada nombre de producto
cuyo modelo es un jersey de manga larga con logotipo y cuyos números
de ProductModelID coinciden en las tablas Product y ProductModel.

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

La subconsulta anterior de esta instrucción no se puede evaluar independientemente de la


consulta externa. Necesita el valor Employee.EmployeeID, aunque este valor cambia a medida
que el Motor de base de datos de SQL Server examina diferentes filas de Employee.

Una subconsulta correlativa se puede usar también en la cláusula HAVING de una consulta


externa. En este ejemplo se buscan los modelos cuyo precio máximo es superior al doble de la
media del modelo.

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

En este ejemplo se busca el total de cada pedido de venta de la base de datos.

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.

G. Usar GROUP BY con varios grupos

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

H. Usar GROUP BY y WHERE

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

I. Usar GROUP BY con una expresión

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

J. Usar GROUP BY con ORDER BY

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

K. Usar la cláusula HAVING

En el primer ejemplo se muestra una cláusula HAVING con una función de agregado. Agrupa


las filas de la tabla SalesOrderDetail por Id. de producto y elimina aquellos productos cuyas
cantidades de pedido medias son cinco o menos. En el segundo ejemplo se muestra una
cláusula HAVING sin funciones de agregado.

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

L. Usar HAVING y GROUP BY

En el siguiente ejemplo se muestra el uso de las cláusulas GROUP


BY, HAVING, WHERE y ORDER BY en una instrucción SELECT. Genera grupos y valores
de resumen pero lo hace tras eliminar los productos cuyos precios superan los 25 $ y cuyas
cantidades de pedido medias son inferiores a 5. También organiza los resultados por ProductID.

SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO

M. Usar HAVING con SUM y AVG

En el siguiente ejemplo se agrupa la tabla SalesOrderDetail por Id. de producto y solo se


incluyen aquellos grupos de productos cuyos pedidos suman más de $1000000.00 y cuyas
cantidades de pedido medias son inferiores a 3.

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

Hora Usar la sugerencia del optimizador INDEX

En el ejemplo siguiente se muestran dos formas de usar la sugerencia del optimizador INDEX.


En el primer ejemplo se muestra cómo obligar al optimizador a que use un índice no clúster para
recuperar filas de una tabla, mientras que en el segundo ejemplo se obliga a realizar un recorrido
de tabla mediante un índice igual a 0.

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

-- Force a table scan by using INDEX = 0.


USE AdventureWorks2012;
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
FROM HumanResources.Employee AS e WITH (INDEX = 0) JOIN Person.Person AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO

M. Usar OPTION y las sugerencias GROUP

En el ejemplo siguiente se muestra cómo se usa la cláusula OPTION (GROUP) con una


cláusula GROUP BY.

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

O. Usar la sugerencia de consulta UNION

En el ejemplo siguiente se usa la sugerencia de consulta MERGE UNION.

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

P. Usar una instrucción UNION simple

En el ejemplo siguiente, el conjunto de resultados incluye el contenido de las


columnas ProductModelID y Name de las tablas ProductModel y Gloves.

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

-- Here is the simple union.


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

Q. Usar SELECT INTO con UNION

En el ejemplo siguiente, la cláusula INTO de la segunda instrucción SELECT especifica que la


tabla denominada ProductResults contiene el conjunto final de resultados de la unión de las
columnas designadas de las tablas ProductModel y Gloves. Tenga en cuenta que la
tabla Gloves se crea en la primera instrucción SELECT.
SQLCopiar
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
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

SELECT ProductModelID, Name


FROM dbo.ProductResults;

R. Usar UNION con dos instrucciones SELECT y ORDER BY

El orden de algunos parámetros empleados con la cláusula UNION es importante. En el ejemplo


siguiente se muestra el uso correcto e incorrecto de UNION en dos instrucciones SELECT en
las que se va a cambiar el nombre de una columna en el resultado.

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.

En el tercer ejemplo se utiliza ALL con el primer UNION y los paréntesis incluyen al


segundo UNION que no utiliza ALL. El segundo UNION se procesa en primer lugar porque se
encuentra entre paréntesis. Devuelve 5 filas porque no se utiliza la opción ALL y se quitan los
duplicados. Estas 5 filas se combinan con los resultados del primer SELECT mediante las
palabras clave UNION ALL. Esto no quita los duplicados entre los dos conjuntos de 5 filas. El
resultado final es de 10 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

SELECT pp.LastName, pp.FirstName, e.JobTitle


INTO dbo.EmployeeOne
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeTwo
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeThree
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
SELECT LastName, FirstName ,JobTitle
FROM dbo.EmployeeTwo
UNION ALL
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeThree;
GO

SELECT LastName, FirstName,JobTitle


FROM dbo.EmployeeOne
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO

SELECT LastName, FirstName,JobTitle


FROM dbo.EmployeeOne
UNION ALL
(
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree
);
GO

También podría gustarte