Sei sulla pagina 1di 6

Control N2 Segundo Semestre 2016

Ewaldo Gotschlich Enrquez


11 de septiembre de 2016

1.

Creaci
on de la base de datos y la tabla.

Primero se debe crear una base de datos, que se llamara Contabilidad para la creacion de la
tabla, de la siguiente manera:
CREATE DATABASE C o n t a b i l i d a d ;

Luego se fija la base de datos Contabilidad con la sentencia USE y se creara la tabla salarios
con la sentencia CREATE TABLE, que contendra la informacion de 10 trabajadores con ciertos
atributos especificados en la siguiente instruccion:
USE C o n t a b i l i d a d ;
CREATE TABLE s a l a r i o s (
trabajadorID
nombre
apellido
rut
sueldo
cargo
fecha de inicio del contrato
fecha de termino del contrato
PRIMARY KEY ( t r a b a j a d o r I D )
);

INT UNSIGNED
VARCHAR( 2 0 )
VARCHAR( 2 0 )
INT( 8 )
FLOAT( 8 )
VARCHAR( 5 0 )
DATE
DATE

NOT NULL AUTO INCREMENT,


NOT NULL DEFAULT ,
NOT NULL DEFAULT ,
NOT NULL DEFAULT 0 ,
NOT NULL DEFAULT 0 ,
NOT NULL DEFAULT ,
NOT NULL DEFAULT 00000000 ,
NOT NULL DEFAULT 00000000 ,

En donde se define los siguientes atributos:


1. trabajadorID: variable entera, que comienza con cierto valor y se incrementa a medida que se
insertan nuevos registros de trabajadores solo si los nuevos registros no contienen un valor para
este atributo. Da a cada trabajador un numero identificador u
nico y sera la llave primaria para la
tabla.
2. nombre: variable de tipo c
aracter de tama
no variable 20. Es el nombre de cada trabajador. Si los
nuevos registros no contienen un valor para este atributo, por defecto se rellena con un espacio en
blanco.
3. apellido: variable de tipo c
aracter de tama
no variable 20. Es el apellido de cada trabajador. Si los
nuevos registros no contienen un valor para este atributo, por defecto se rellena con un espacio en
blanco.
4. rut: variable entera de tama
no variable 8. Es el rut de cada trabajador. Si los nuevos registros no
contienen un valor para este atributo, por defecto se rellena con un cero.
5. sueldo: variable de tipo flotante de tama
no variable 8. Es el sueldo de cada trabajador. Si los
nuevos registros no contienen un valor para este atributo, por defecto se rellena con un 0.
6. cargo: variable de tipo c
aracter de tama
no variable 50. Es el cargo de cada trabajador. Si los
nuevos registros no contienen un valor para este atributo, por defecto se rellena con un espacio en
blanco.

7. fecha de termino del contrato: Es la fecha en que se inicio el contrato de la persona. Si los
nuevos registros no contienen un valor para este atributo, por defecto se rellena con 0000-00-00.
8. fecha de inicio del contrato: Es la fecha en que el contrato de la persona terminara. Si los
nuevos registros no contienen un valor para este atributo, por defecto se rellena con 0000-00-00.
Luego con las sentencias SHOW TABLES se muestran todas las tablas de Contabilidad y
DESCRIBE salarios describe las columnas de la tabla salarios.
SHOW TABLES ;

DESCRIBE s a l a r i o s ;

2.
2.1.

Inserci
on de informaci
on y consultas
Inserci
on

Primero se insertar
an valores para todas las filas con la sentencia INSERT INTO salarios VALUES:
INSERT INTO s a l a r i o s VALUES
( 1 0 0 1 , Pedro , P i c a p i e d r a , 1 5 8 9 2 7 4 8 , 5 0 0 0 0 0 , Ayudante de c o c i n a , 20120624 ,
20171231 ) ,
(NULL, Pablo , Marmol , 1 6 8 9 2 7 4 8 , 3 0 0 0 0 0 , C o n s e r j e , 20131005 , 20160928 ) ,
(NULL, F r a n c i s c a , L i r a , 1 7 3 4 5 9 8 2 , 4 5 0 0 0 0 , Ayudante de c o c i n a , 20160401 ,
20180610 ) ,
(NULL, D a n i e l , Lopez , 1 8 6 7 8 4 2 3 , 5 0 0 0 0 0 , C a j e r o , 20160215 , 20170123 ) ,
(NULL, E l v i s , Cochuelo , 1 4 7 5 6 3 4 5 , 5 0 0 0 0 0 0 , Gerente , 20110620 , 20191014 ) ,
(NULL, P e n e l o p e , Cruz , 1 8 3 4 6 9 3 1 , 7 0 0 0 0 0 , Gerente , 20131005 , 20160928 ) ,
(NULL, Z o i l a , Cerda , 1 7 3 4 5 8 7 6 , 1 0 0 0 0 0 0 , Chef , 20090722 , 20161111 ) ,
(NULL, Juan , Topo , 1 4 1 2 3 5 8 7 , 6 0 0 0 0 0 , C a j e r o , 20140222 , 20190813 ) ,
(NULL, Camila , G a r c i a , 1 6 8 5 3 7 9 5 , 4 0 0 0 0 0 , Ayudante de c o c i n a , 20171201 ,
20180929 ) ,
(NULL, W i l l , Smith , 1 4 1 2 3 5 8 7 , 2 0 0 0 0 0 0 , Chef , 20080301 , 20200701 ) ;

Todos los datos expuestos anteriormente entran en los dominios de cada atributo, sin generar
errores e informacion sin sentido.

Lo anterior resulta en la siguiente tabla usando la sentencia SELECT *FROM


SELECT FROM s a l a r i o s ;

2.2.
1.

Consultas.

SELECT FROM s a l a r i o s WHERE s u e l d o > 500000 ORDER BY s u e l d o DESC;

Muestra a todos los trabajadores que tengan un sueldo mayor a $500.000 desde la tabla salarios,
ordenados por su sueldo de manera descendiente.

2.

SELECT nombre , a p e l l i d o , s u e l d o FROM s a l a r i o s WHERE nombre LIKE P % ;

Muestra el nombre, apellido y sueldo de aquellos trabajadores en que su nombre comienze con la
letra P desde la tabla salarios.

3.

SELECT cargo , MAX( s u e l d o ) AS El s u e l d o mas a l t o de cada c a r g o


FROM s a l a r i o s GROUP BY c a r g o
HAVING MAX( s u e l d o ) < 1000000 ;

Muestra los sueldos mas altos por cargo, donde la clausura HAVING MAX(sueldo) filtra los
sueldos mas altos que son menores a 1000000.

4.

SELECT rut , nombre , a p e l l i d o FROM s a l a r i o s


WHERE DATEDIFF( f e c h a d e t e r m i n o d e l c o n t r a t o , f e c h a d e i n i c i o d e l c o n t r a t o ) >= 733
ORDER BY r u t DESC;

Rescata aquellos RUT de los trabajadores para los cuales el contrato dura al menos dos a
nos y
tres das, donde la funci
on DATEDIFF calcula la diferencia entre dos fechas y entrega el valor
en das.

3.

Funci
on

La siguiente funci
on tiene como objetivo calcular el monto total a pagar en imposisciones (20 %
sobre el salario bruto) durante todo el periodo de contrato para un trabajador determinado. Note que
el resultado mostrar
a a todos los trabajadores.
DELIMITER |
CREATE FUNCTION t o t a l i m p o ( x FLOAT, y DATE, z DATE)
RETURNS FLOAT
DETERMINISTIC
BEGIN
DECLARE TI FLOAT;
SET TI = ( 0 . 2 ) x (PERIOD DIFF( EXTRACT( YEAR MONTH FROM y ) ,
EXTRACT( YEAR MONTH FROM z ) ) ) ;
RETURN TI ;
END;
| DELIMITER

En donde la funci
on llamada total impo es creada por la clausula CREATE FUNCTION con los
parametros x de tipo flotante y z e y de tipo fecha. La funcion es DETERMINISTIC para que produsca el mismo resultado con los mismos parametros ingresados y retorna en un valor de tipo flotante.
El cuerpo de la funci
on incia con la instruccion BEGIN, luego se declara la variable TI de tipo
flotante, que ser
a el total de imposiciones. Despues se define el calculo de TI mediante:
TI = ( 0 . 2 ) x (PERIOD DIFF( EXTRACT( YEAR MONTH FROM y ) ,EXTRACT( YEAR MONTH FROM z ) ) ) ;

En donde 0.2 es la tasa de imposiciones, la funcion YEAR MONTH() devuelve el a


no y mes de una
fecha en la forma yyyymm y la funci
on PERIOD DIFF() devuelve la diferencia en meses entre dos
fechas con el formato yyyymm. Por ultimo la funcion devuelve el valor TI, el cuerpo termina con la
instruccion END y para que no haya problemas con el resto del codigo en el Query, se delimita con
DELIMITER.

Ahora se ejecutara
a la funci
on con el siguiente comando:
SELECT nombre , a p e l l i d o , t o t a l i m p o ( s u e l d o , f e c h a d e t e r m i n o d e l c o n t r a t o ,
fecha de inicio del contrato )
AS m o n t o t o t a l a p a g a r e n i m p o s i c i o n e s FROM s a l a r i o s ORDER BY nombre ;

En donde se seleccionan las columnas nombre, apellido desde la tabla salarios, se crea una nueva
llamada monto total a pagar en imposiciones que es la funcion total impo antes se
nalada, y se
ordena todo por el nombre.

4.

Gatillante o trigger.

El siguiente trigger tiene como objetivo actualizar el sueldo de un empleado siempre y cuando este
sea superior al antiguo, sino no actualizar
a y lanzara un mensaje de error. Tiene la siguiente forma:
DELIMITER //
CREATE TRIGGER n u e v o s u e l d o
BEFORE UPDATE ON s a l a r i o s
FOR EACH ROW
BEGIN
DECLARE a VARCHAR( 2 0 ) ;
DECLARE s u e l d o FLOAT( 8 ) ;
DECLARE b VARCHAR( 3 0 ) ;
IF (NEW. s u e l d o > OLD. s u e l d o ) THEN SET s u e l d o=NEW. s u e l d o ;
ELSEIF (NEW. s u e l d o = OLD. s u e l d o ) THEN SET b = El s u e l d o e s e l mismo ;
SIGNAL SQLSTATE 45000 SET MESSAGE TEXT = b ;
ELSE SET a = El s u e l d o ha ba jad o ;
SIGNAL SQLSTATE 45000 SET MESSAGE TEXT = a ;
END IF ;
END
// DELIMITER ;

Donde el trigger llamado nuevo sueldo es creado con la clausula CREATE TRIGGER, es
disparado antes de la actualizaci
on con BEFORE UPDATE ON sobre la tabla salarios y se ejecutar
a
por cada fila. El cuerpo del trigger se incia con la instruccion BEGIN, se declaran tres variables
llamadas a, sueldo, b,que son de tipo c
aracter de tama
no 20, flotante de tama
no 8 y caracter de
tama
no 30 respectivamente. Luego el trigger procedera segun las siguientes condiciones, que se inician
con la instrucci
on IF o ELSEIF:
1. Si el usuario actualiza el sueldo, siendo este mayor que el antiguo sueldo, el trigger reemplazar
a el
antiguo sueldo por el nuevo sueldo.
IF (NEW. s u e l d o > OLD. s u e l d o ) THEN SET s u e l d o=NEW. s u e l d o ;

2. Si el usuario actualiza el sueldo, siendo este igual al antiguo sueldo, el trigger no permitir
a la
actualizacion y el editor de mysql lanzara el siguiente mensaje de error El sueldo es el mismo.
ELSEIF (NEW. s u e l d o = OLD. s u e l d o ) THEN SET b = El s u e l d o e s e l mismo ;
SIGNAL SQLSTATE 45000 SET MESSAGE TEXT = b ;

En donde la instruccion SIGNAL SQLSTATE 45000 es una forma para que retorne un error
con el mensaje El sueldo es el mismo con la instruccion SET MESSAGE TEXT.
3. Si el usuario actualiza el sueldo, siendo este menor al antiguo sueldo, el trigger no permitir
a la
actualizacion y el editor de mysql lanzara el siguiente mensaje de error El sueldo ha bajado.
ELSE SET a = El s u e l d o ha ba jad o ;
SIGNAL SQLSTATE 45000 SET MESSAGE TEXT = a ;

La explicacion del mensaje de error es la misma que en el punto 2.


Luego las condiciones terminan con la instruccion END IF y el cuerpo con END. Para que no
haya problemas con el resto del codigo se tiene que delimitar con DELIMITER.
Como ejemplo se utilizar
a los siguientes comandos:
1. Caso uno: El nuevo sueldo es mayor que el viejo sueldo.
UPDATE s a l a r i o s SET s u e l d o = 600000 WHERE t r a b a j a d o r I D = 1001 ;

Cambia a:

2. Caso dos: El nuevo sueldo es igual al viejo sueldo.


UPDATE s a l a r i o s SET s u e l d o = 600000 WHERE t r a b a j a d o r I D = 1001 ;

Se produce un error:

3. Caso tres: El nuevo sueldo es menor al viejo sueldo.


UPDATE s a l a r i o s SET s u e l d o = 500000 WHERE t r a b a j a d o r I D = 1001 ;

Se produce nuevamente un error:

Potrebbero piacerti anche