UNIVERSIDAD FRANCISCO GAVIDIA
FACULTAD DE INGENIERIA Y
SISTEMAS PRACTICA
CICLO II – 2020
Asignatura: Administración de Base de Datos
Profesor: Ing. Fredy Angulo Fecha desarrollo: semana 8 – 13 al 26 de
septiembre
PRACTICA: USO DE FUNCIONES AVANZADAS, ALMACENADAS Y FORMATOS
FECHA DE ENTREGA: Domingo 26 de septiembre
Nombre de estudiante y numero de carnet:
OBJETIVO:
El objetivo de la práctica es conocer el uso de FUNCIONES Y FORMATOS
utilizando MySQL. Otras bases de datos tendrán otras instrucciones propias
del lenguaje o similares a las que veremos, por lo que es importante leer la
documentación de cada gestor para encontrar las instrucciones equivalentes.
La base de datos northwindmysql.zip puede ser descargada en la Uvirtual:
Descargue la base de datos y descomprimirla con un compresor como Winzip o
WinRar
Pasos para realizar la importación de la Base de Datos:
1. Descargue el archivo northwindmysql.zip y extraiga su contenido en algún lugar de su
computadora. El .zip contiene la base de datos de Northwind Access en un archivo SQL
autónomo llamado "northwindmysql.sql".
2. Abra MySQL Workbench. En Administración , abra la herramienta Importar / Restaurar
datos .
3. En la pestaña Importar desde disco, seleccione Importar desde archivo autónomo . Utilice el
botón de exploración para seleccionar el archivo northwindmysql.sql que extrajo de la
descarga en el primer paso.
4. Seleccione el defecto esquema de destino: . El archivo northwindmysql.sql no tiene un
esquema de destino. Utilice el botón Nuevo para crear un nuevo esquema de destino
llamado "Northwind".
5. Haga clic en el botón Iniciar importación para importar la base de datos
Northwind en el esquema de destino seleccionado. La pestaña Progreso de la importación
mostrará el progreso de la importación.
6. Ahora debería ver una lista de tablas en el esquema de Northwind . La base de datos
Northwind ahora se importa a MySQL.
Favor documentar el proceso y entregar un documento PDF con las evidencias.
=============================================
IMPORTANTE PARA REALIZAR LA PRÀCTICA
La práctica es evaluada, para lo cual deberá entregar evidencia de
cada ejercicio. Para ello debe hacer lo siguiente por cada uno de los
ejercicios:
1. En el contenido deberá colocar el número del ejercicio y su título.
2. Por cada ejercicio capturar la pantalla con la instrucción SQL del ejercicio
(ver el ejemplo del ejercicio 1 de esta guía).
3. Luego de ejecutar el ejercicio capturar el mensaje final que le envía el
proceso.
4. Escribir en una o dos líneas máximas lo realizado en el ejercicio.
Este proceso lo realizará por cada ejercicio.
=============================================
DESARROLLO
EJERCICIO 1. Mostrar los algunos datos de la tabla employees
select titleofcourtesy as titulo,
lastname,
firstname
from employees
En este ejercicio muy sencillo, veremos que lo único que deseamos
es verificar el título que posee cada uno de los registros. Esto será
importante para los próximos ejercicios que se obtendrán de la
tabla, pues en los siguientes ejercicios, esto nos permitirá realizar
consultas con otras características
Utilizando MySQL Workbench
DESARROLLO DE EJERCICIOS
(DEJAR EVIDENCIA)
EJERCICIO 2. El uso de la función IF en MYSQL permite genera datos
condicionales en los campos de resultado. En Oracle se utiliza la
instrucción DECODE.
select if(titleofcourtesy='Mrs.','Sra','Sr') as titulo,
lastname,
firstname
from employees
La sintaxis del IF es el siguiente:
if (condición, resultado si es verdadero, resultado si es falso)
Es de comentar que la instrucción IF puede ser anidada, es decir, que
dependiendo de lo que deseamos obtener, podemos colocar otro if dentro
del área para el resultado si es verdadero o en el área si el resultado es
falso, esto con la finalidad de hacer nuevas evaluaciones. Un ejemplo del
anidamiento sería
if (condición, resultado si es verdadero,
if (condición, resultado si es verdadero,
resultado si es falso))
Un ejemplo sería:
Queremos que si en la columna titleofcourtesy posee los siguientes datos,
que aparezcan los siguientes valores respectivamente:
Mr. -> Sr.
Mrs. -> Sra.
Ms. -> Srita.
Dr. -> Dr.
Por lo que el Query de traducción quedaría como se muestra a
continuación.
Select if (titleofcourtesy = ‘Mr.’, ‘Sr.’,
if (titleofcourtesy = ‘Mrs.’, ‘Sra.’,
if (titleofcourtesy = ‘Ms.’, ‘Srita.’, ‘Dr.’))) as titulo
lastname,
firstname
from employees
EJERCICIO 3. Obtener el detalle de las ventas, calculando el descuento y
lo que deberá cancelarse con el descuento.
select productid,
unitprice,
quantity,
discount,
(unitprice * quantity ) as Total,
(unitprice * quantity ) * ( 1 - discount ) as 'Con descuento'
from order_details
En este ejercicio se quiere destacar que cuando un alias no es una palabra,
sino que un conjunto de palabras, es recomendable colocar el nombre del
alias entre comillas simples, de esta forma ese será el título que se
mostrará
como nombre de columna: en el ejemplo la frase “Con descuento”, se
encuentra entre comillas simples.
EJERCICIO 4. Aplicando formatos de presentación a los datos obtenidos.
select productid, unitprice, Quantity,
concat(discount * 100, '%') as Descuento, (unitprice * Quantity ) as Total,
format ((unitprice * Quantity ) * ( 1 - discount ),2) as 'Con descuento'
from `order details`;
Nota: Order details, es una tabla que no tiene un espacio entre order y
details, por lo que de deberá de encarrar entre comillas simples para que
funcione la consulta `order derails`
EJEMPLO RESUELTO
En este caso, lo que se destaca es que cuando deseamos que un valor
numérico queremos que muestre un formato de presentación como por
ejemplo 1,546.10, se utiliza la función:
Format(valor, decimales)
También, se utiliza la función para concatenar datos, cuya sintaxis es:
concat(valor1, varlo2, ...)
Esta función permite unir textos, constantes, valores, fechas, los cuales
deberán ir separados por comas.
A diferencia de ORACLE, que solo permite dos valores. Sin embargo un
equivalente a este es el uso del || (doble pipe) el cual sí permite
concatenar más de dos valores.
EJERCICIO 5. Aplicando formatos de presentación a los datos obtenidos
resolviendo el caso en que el valor con descuento aparece alineado a la
izquierda, se multiplica por 1 para convertido en número.
select productid,
unitprice,
Quantity,
concat(discount * 100, '%') as Descuento,
(unitprice * Quantity ) as Total,
format ((unitprice * Quantity ) * ( 1 - discount ),2) * 1 as 'Con
descuento'
from `order details`;
EJERCICIO 6. Cuando se necesita que el contenido de una columna que
está en minúscula y queremos pasarla a mayúscula se usa UPPER.
select titleofcourtesy as titulo,
UPPER(lastname) as Apellido,
LOWER(firstname) as Nombre
from employees
En este caso veremos que el resultado que genere, hará que se muestre en
mayúscula los datos de la columna lastname y en minúscula la columna
firstname.
Aclarando que esta instrucción puede ser válida en la instrucción WHERE,
por ejemplo cuando buscamos datos de texto que cumplan con un criterio,
pero los datos pueden estar escritos de diferente manera, por ejemplo:
Where nombre = ‘Julio’
or nombre = ‘JULIO’
or nombre = ‘julio’
Sería mejor escribir la instrucción de la siguiente manera:
Where upper(nombre) = ‘JULIO’
Esto permitiría que indistinto como se encuentre el valor internamente,
siempre comparara con un solo valor.
EJERCICIO 7. Búsqueda de datos en cuyo nombre la segunda posición
posea la letra a.
select titleofcourtesy as titulo,
UPPER(lastname) Apellido,
UPPER(firstname) Nombre
from employees
where firstname like '_a%'
En este caso, además de la función de comodín %, el cual reemplaza
cualquier posible valor, se puede utilizar el guion bajo, el cual indicará que
en esa posición deberá existir cualquier carácter
En ejemplo anterior, podríamos obtener resultados como los siguientes:
Carlos
Sandra
Samuel
Si la instrucción la escribimos así:
firstname like '%e_'
estariamos indicando que requerimos que en la columna nombre termine
con cualquier letra, pero que la penúltima sea la letra “a”. Por ejemplo
estos serían algunos resultados:
Raquel
Samuel
Herber
Y si quisiéramos que si en la columna posee dos nombre pero queremos
que la última letra del primer nombre sea una “a” y la primera del segundo
nombre sea también una “a”, deberíamos escribir
firstname like '%a_A%', veremos los posibles resultados.
Sandra Amanda
Karla Alejandra
EJERCICIO 8. Mostrar las órdenes que fueron realizados por empleados
cuyo título es de señora.
select * from orders
where employeeid in
(select employeeid
from employees
where titleOfCourtesy='Mrs.')
Adelantando un poco el tema de queries anidados, en este ejercicio lo que
se necesita es mostrar los datos de la tabla orders, pero que estas
correspondan a los empleados que en la columna titleOfCourtesy posean el
valor Mrs
EJERCICIO 9. Mostrar las órdenes que no fueron realizados por
empleados cuyo título no sean el valor Mrs.
select * from orders
where employeeid not in
(select employeeid
from employees
where titleOfCourtesy='Mrs')
Este ejercicio básicamente es el mismo que el anterior, la diferencia es que
en este caso queremos los que no sean Señoras (‘Mrs’).
En caso de que no retorne resultados, favor revisar el sql.
EJERCICIO 10. Obtener las ordenes cuya identificación del cliente estén
en una lista predefinida
select *
from orders
where
customerid = 'VINET' or
customerid = 'HANAR' or
customerid = 'ERNSH' or
customerid = 'FOLKO'
Este ejemplo es bastante obvio, sin embargo, es común que se confunda el uso del “or” por
un “and”. Por ejemplo, cuando nos dicen en requerimos aquellos datos que sean VINET y
HANAR y ERNSH y FOLKO, creemos que debemos utilizar un and, lo cual no es correcto pues
un campo no puede tener los 4 valores simultáneamente, sino solo uno. Lo que sucede es
que hay varios registros que pueden tener esos posibles valores.
EJERCICIO 11. Alternativa mejorada para obtener las ordenes cuya
identificación del cliente estén en una lista predefinida
select *
from orders
where customerid in ('VINET','HANAR','ERNSH','FOLKO')
Cuando se tienen valores predefinidos, lo mas recommendable es utilizar la
instrucción de listas, es decir el “in”
EJERCICIO 12. Alternativa mejorada para obtener las ordenes cuya
identificación del cliente NO estén en una lista predefinida
select *
from orders
where customerid not in ('VINET','HANAR','ERNSH','FOLKO')
Este sería similar al ejercicio anterior, pero la diferencia es que no deseamos
esos valores, sino el resto que son diferentes.
FUNCIONES ALMACENADAS
Ahora que hemos aprendido el uso de funciones predefinidas en la instrucción
SELECT y en el WHERE, veremos a continuación que podemos crear nuestras
propias funciones, es decir, funciones personalizadas.
En el siguiente ejercicio 1 vera como se desarrollan los ejercicios de
funciones almacenadas
EJERCICIO 1: Función para calcular el volumen de un objeto
DELIMITER $$
CREATE FUNCTION volumen(radio FLOAT)
RETURNS FLOAT DETERMINISTIC
BEGIN
DECLARE volume FLOAT;
SET volume = (4/5)*PI()*POW(radio,2);
RETURN volume;
END $$
DELIMITER ;
La función la podríamos llamar de la siguiente manera:
Select volumen(5);
Procedimiento
Seleccione la opción Funtions, dar clic derecho y Create
Function..
Luego se presenta una Plantilla de la función que se
deberá de modificar con los datos del ejercicio 1.
Escribiendo y sustituyendo datos egún ejercicio 1
Función para calcular el volumen de un objeto.
Luego dar clic al boton Apply para correr la función. Podrá observar que automáticamente se
agrega DELIMITER $$, END $$ y DELIMITER; (no fue necesario escribirlo)
Luego dar clic en Apply y finalizar, si todo salió bien, deberá de ver la siguiente
pantalla.
Procedimiento para ver el resultado de la Función para calcular
el volumen de un objeto.
La función la podríamos llamar de la siguiente manera:
Select volumen(5);
Haga una consulta a la base de datos northwind y escriba Select volumen(5); y vera el
siguiente resultado:
EJERCICIO 2. Creación de una Función de Base de Datos.
El ejemplo permitirá realizar las 4 operaciones básicas, para lo cual se
requieren dos parámetros de entrada para los cálculos y uno que indica
el tipo de operación:
CREATE FUNCTION operacion (val1 int, val2 int, op int)
RETURNS decimal(10,2)
DETERMINISTIC
BEGIN
DECLARE result decimal(10,2) DEFAULT 0;
CASE op
WHEN 1 THEN SET result = val1 + val2;
WHEN 2 THEN SET result = val1 - val2;
WHEN 3 THEN SET result = val1 * val2;
WHEN 4 THEN SET result = val1 / val2;
ELSE SET result = -1;
END CASE;
RETURN result;
END //
DELIMITER ;
Para probar la función, realizar las siguientes pruebas, en el entendido
que el tercer parámetro indica la operación que debe realizar con los
operando siguientes:
1 = suma
2 = resta
3 = producto
4 = división
Escriba las siguientes instrucciones y verifique el resultado:
a) select operacion(3, 4, 1)//
b) select operación(3, 4, 4)//
Realice otras pruebas con otros parámetros para ver el resultado
Puede realizar otras funciones que realicen otros tipos de cálculos.
EJERCICIO 3: Se necesita calcular el valor de venta de un producto
sabiendo que tiene un costo y porcentaje de ganancia, ejemplo si el
costo es 2,000 y el porcentaje de ganancia es 15, el valor venta seria
2,300.
La función quedaría así:
DELIMITER $$
CREATE FUNCTION calcularvalorventa(costo float, porganancia int)
RETURNS float DETERMINISTIC
BEGIN
DECLARE vventa FLOAT default 0;
SET vventa = costo +costo*porganancia/100;
RETURN vventa;
END $$
DELIMITER ;
Para llamar una funcion se hace dentro del select asi:
select calcularvalorventa(2000,15) as valorventa;
EJERCICIO 4: Ahora utilizaremos la función pero con datos que proceden
de una base de datos.
Esta función se puede usar de la siguiente manera con una tabla.
Cree una tabla llamada productos (código, nombre, costo, porganancia,
cantidad)
Create table productos
(
Codigo int not null primary key,
Nombre varchar(30) not null,
Costo float not null,
Porganancia int not null,
Cantidad float not null
);
Inserte varios datos.
Insert into productos values(1,’arroz libra’,850,15,10);
Insert into productos values(2,’gasesosa 350’,800,20,30);
Insert into productos values(3,’avena alpina vaso’,1300,10,45);
Insert into productos values(4,’menta helada’,25,100,150);
Insert into productos values(5,’salsa tomate fruco 1000gr’,5250,30,8);
Es posible que deba corregir algún carácter.
Ahora usamos la función creada con datos de la tabla, de la siguiente
manera:
select codigo, nombre, costo,
calcularvalorventa(costo, Porganancia) as valorventa
from productos;
EJERCICIO 5 Crear función para calcular ganancia
Se puede crear otra función que calcule la ganancia así:
DELIMITER $$
CREATE FUNCTION calcularganancia(costo float, porganancia int)
RETURNS float DETERMINISTIC
BEGIN
DECLARE ganancia FLOAT default 0;
SET ganancia = costo*porganancia/100;
RETURN ganancia;
END $$
DELIMITER ;
Y lo podría utilizar así:
select codigo, nombre, costo,
calcularvalorventa(costo, Porganancia) as valorventa,
calcularganancia(costo, Porganancia) as ganancia
from productos;
EJERCICIO 6 Crear función para usar un sql con la base de datos
Northwind
delimiter $$
CREATE FUNCTION getLastName (i int) RETURNS TEXT
BEGIN
DECLARE x TEXT;
SELECT LastName INTO x FROM `employees` WHERE EmployeeID = i; RETURN x;
END;
$$
delimiter ;
Y lo podría utilizar así:
select getLastName (1);
Este último ejercicio ilustra las formas en que puede interactuar con la base de
datos.
Suba a la Uvirtual la guía Práctica 1