Sei sulla pagina 1di 9

Facultad de Ingeniería

Gestión de Bases de Datos - Laboratorio #4: SQL 2: Subconsultas

Metodología:
Se debe elaborar un informa del trabajo realizado, para ello deberá describir cada una de las actividades
que se realizó y responder a las preguntas formuladas. El laboratorio debe ser desarrollado en grupos de
máximo 3 personas.
Se debe presentar un informe que debe contener las instrucciones SQL para cada punto y además
una o varias imagen(es) como evidencia de la ejecución.

1. Aspectos Básicos I
Diseño e implementación de un Esquema:
Un esquema es la forma de organizar lógicamente los objetos de una base de datos relacionados,
describiendo las principales características de dichos objetos. Un esquema puede contener: Tablas,
Vistas, Dominios, Índices, etc.

Creación de Tablas
El comando (SQL) CREATE TABLE define una tabla y debe incluir el nombre de la tabla, sus atributos,
valores por defecto y las opciones del atributo. También puede incluir otros atributos como llaves o
restricciones de comprobación (Integridad de columna). Su sintaxis general es:

CREATE TABLE [nombre de la tabla](


[nombre del atributo] [tipo] [opciones],
[nombre del atributo] [tipo] [opciones],
[nombre del atributo] [tipo] [opciones],
[otras columnas. . . . . . . . ]
);

Donde [opciones] puede ser: NOT NULL, UNIQUE, DEFAULT o PRIMARY KEY

Los tipos de dato se encuentran definidos en el manual, pero los que usará más frecuentemente son:
VARCHAR: Tipo de cadena (string) de longitud variable pero con un determinado máximo.
CHAR: Tipo de cadena de longitud fija, necesita especificar un tamaño máximo.
INTEGER: Tipo de dato entero, no necesita especificar un tamaño máximo.
SMALLINT: Entero pequeño, su rango va desde –32000 hasta 32000 aprox.
BIGINT: Entero grande, de –9000000000000000000 hasta 9000000000000000000 aprox.
FLOAT: Tipo de dato real, no necesita especificar un tamaño máximo (De 1E-37 a 1E+37)
DATE: Tipo de dato que encapsula tanto la hora como la fecha (Formato: '26-05-1997')
DOUBLE PRECISION: Tipo de dato real, de doble precisión (desde 1E-307 a 1E+308.)
DECIMAL O NUMERIC (t,d): Dato real, guarda un valor exacto. El primer argumento indica el total de dígitos y el
segundo, la cantidad de decimales.
TIME: Tipo de dato fecha, (hora en horas, minutos, segundos y centésimas)
BOOL: Tipo de dato lógico o booleano (true/false).

Vamos a crear la primera Tabla:

ASIGNATURA
codA nombreA precio depto
number Varchar(50) Float VarChar(12)
Para ello digitamos las siguientes instrucciones:

CREATE TABLE Asignatura (


codA NUMBER NOT NULL,
nombreA VARCHAR (50) NOT NULL,
precio FLOAT NOT NULL,
depto VARCHAR,
PRIMARY KEY (codA)
);

1. Bases de datos de Notas de Alumnos en Materias


Teniendo en cuenta el siguiente esquema relacional y los tipos de datos, cree estas tablas en la base
de datos. Escriba las sentencias SQL que permitan crearlas:

ASIGNATURA
codA nombreA precio depto
number Varchar(50) Float VarChar(12)

ALUMNO
nAlum nombre apellido direccion telefono
Varchar(4) Varchar(20) Varchar(20) Varchar(30) Varchar(12)

NOTAS
nAlum codA fecha nota
number Varchar(50) Date Decimal (4,1)
FK FK

Asignatura Notas
codA nombreA precio Depto nAlum CodA Fecha nota
1 Programación 91.500 InvYDes 0338 1 02-02-2013 3.6
2 Dibujo 28.000 Diseño 0254 2 02-02-2013 2.8
3 Ingles 38.000 Lenguas 0168 2 02-02-2013 4.9
0338 2 02-02-2013 2.5
Alumno 0338 3 02-06-2013 5.0
nAlum nombre apellido direccion teléfono 0254 1 02-06-2013 4.1
0338 Ana Pérez Gómez CL23 # 9-60 92478596 0168 1 02-06-2013 3.3
0254 Rosa López López C5 #45-10 92458796 0168 3 02-06-2013 1.9
0168 Juan García García T.22 #7-98 92477863

Trabajo #1 Esquema de base de datos (10 puntos)


Entre a su DBMS y trabaje los siguientes puntos:

1. Muestre la tabla ASIGNATURA.[3]


2. Cree la tabla ALUMNO. Muestre como se ve la tabla.[3]
3. Cree la tabla NOTAS. Muestre como se ve la tabla.[2]
4. No olvide crear las llaves primarias para cada tabla!!...Como se hace?[2]
2. Aspectos Básicos II
Inserción de Datos
Una vez creado el esquema de la base de datos se procede, la mayoría de las veces, a realizar la carga
de los datos dentro de las tablas.

La forma más fácil de introducir los datos en la tabla es utilizar el comando de inserción INSERT. Cuya
sintaxis es la siguiente:
INSERT INTO nombre_de_la_tabla ( atributos_a_insertar ) VALUES ( valores_a_insertar );

La cláusula (atributos_a_insertar) es opcional, solo se usa cuando los atributos a los que se le va a
insertar valores no son todos los atributos de la tabla.

Digite:
INSERT INTO ASIGNATURA (codA, nombreA, precio) VALUES (1, ‘Programación’, 91500);

El DBMS mostrará un mensaje de ejecución exitosa.


Para ver todos los registros ingresados a la tabla Asignatura, escriba:
select * from Asignatura;

Trabajo #2 (12 puntos)


5. Ahora cargue las tablas creadas anteriormente con los registros sugeridos en el enunciado y muestre los
resultados finales. Recuerde que debe “cargar” los datos previamente, porque más adelante hay consultas
que debe resolver. Escriba las instrucciones SQL necesarias. (6 pts)

6. Escriba las sentencias SQL para insertar correctamente 10 registros en la tabla Asignatura. (2 pts)
7. Insertar correctamente 10 registros nuevos en la tabla Alumno, uno de ellos con nAlum = 1111. (2 pts)
8. Insertar correctamente 10 registros en la tabla Notas. (2 pts)

3. Aspectos Básicos III


Actualización de Información
Para la actualización de los datos existentes en la base de datos, se pueden usar las sentencias
estándar para borrado (DELETE) y actualización (UPDATE) de datos.

La primera permite la eliminación de una o más filas de una tabla, y su sintaxis es la siguiente:
DELETE FROM [nombre de la tabla]
WHERE [condiciones para el borrado];

Digite la instrucción:
DELETE
FROM Alumno
WHERE nAlum = 1111;

El resultado de la instrucción anterior será la eliminación del registro que corresponde al alumno con
identificación 1111. Puede verificar lo anterior?
Para realizar la actualización de los datos de un registro, se utiliza la sentencia UPDATE la cual
permite modificar los valores de las columnas en una o más filas de una tabla, su sintaxis de uso es:
UPDATE [nombre de la tabla]
SET [atributo a cambiar = nuevo valor, atributo a cambiar = nuevo
valor,...] WHERE [condición para ejecutar la actualización];
Digite la instrucción:
UPDATE Asignatura
SET precio = 43250
WHERE codA = 3;

Ahora realice una consulta sobre la tabla modificada para que observe que sucede al
ejecutarse la instrucción anterior, así:
SELECT * FROM Asignatura
WHERE codA = 3;

Se podrá observar que ahora el nuevo precio de la asignatura con identificación 3.

Trabajo #3 (12 puntos)


Escriba las sentencias SQL para hacer las siguientes operaciones:
9. Modificar el departamento de la Asignatura codA = 5 a ‘Sistemas’ [2]
10. Modificar la dirección del alumno con nAlum 2000 a ‘Dg32 #12-87’ [2]
11. Eliminar las notas que se hayan obtenido antes del año 2013 [2]
12. Borrar las asignaturas que tengan un precio superior a $100.000 [2]
En cada caso muestre mediante una consulta el estado anterior a la operación y el posterior.
13. En algunos de los atributos aparece el modificador NOT NULL, investigue qué significa y de un ejemplo
de una tupla que no puede ser insertada en la tabla Alumno por la existencia del NOT NULL. [2]
14. Trate de insertar la siguiente tupla en la tabla Asignatura:
1, ‘Programación Avanzada’, 99000, ‘Sistemas’
A qué se debe el mensaje de error que aparece? [2]

Recuerde que debe crear los datos que permitan dar una respuesta a las consultas.
Consulta sin respuesta no se tendrá en cuenta.

4. Aspectos Básicos IV
Subconsultas en SQL
Las sentencias SELECT pueden "anidarse" unas dentro de otras, usando en las más externas el resultado de
las más internas. Una subconsulta provee como resultado un conjunto de valores, que puede ser usado como
argumento de búsqueda en un predicado de pertenencia IN o EXISTS. Veamos los siguientes ejemplos
básicos de una subconsulta:

Predicado IN Predicado EXISTS


SELECT codA, nombreA, precio SELECT nombre, apellido, telefono
FROM Asignatura FROM Alumno
WHERE codA IN WHERE EXISTS
(SELECT codA (SELECT *
FROM Notas FROM Notas
WHERE cod > 5); WHERE Notas.nAlum =
Alumno.nAlum);
Consulta que muestra el código, el nombre y el Consulta que muestra el nombre, apellido y
precio de la asignatura que ha sido cursada por teléfono de los alumnos que tienen notas.
alumnos con codA mayor a 5.
Algunas de las consultas que se plantean a continuación exigen que se prepare un “paquete de datos”
que permita comprobar el funcionamiento de la consulta. Asegúrese de ingresar los datos para poder
demostrar que la consulta funciona correctamente.

Trabajo #4 (7 puntos)
En el entorno SQL desarrolle los anteriores ítems:
15. Por medio de una subconsulta, obtenga el nombre y departamento de las asignaturas que han sido
aprobadas, durante el año 2013. (utilice el predicado IN o EXISTS). [3]

16. Usando subconsultas, obtenga la información de los alumnos que han aprobado asignaturas
pertenecientes al departamento de ‘Sistemas’. [2]

17. Usando subconsultas, obtenga la información de los alumnos que han obtenido una nota superior
promedio de notas del año 2013. (utilice el predicado IN o EXISTS). [2]

Recuerde que debe crear los datos que permitan dar una respuesta a las consultas.
Consulta sin respuesta no se tendrá en cuenta.

5. Aspectos Básicos V
Vistas
Una vista es un objeto o una tabla lógica que presenta datos de una o más tablas; se puede usar para mostrar
todas las filas y columnas de una tabla, de modo que para motivos de seguridad proteja el nombre de su
tabla de origen, también puede mostrar un subconjunto de filas y columnas de una o más tablas, permitiendo
proteger algunos datos de ciertas tablas. Otra de sus formas de uso es para simplificar la codificación de
aplicaciones, pues con estas puede unir datos de diferentes tablas y hacerlas ver como si estuvieran
relacionadas, o mostrar datos derivados que no están realmente en una tabla especifica.

La sintaxis básica para crear una vista es:


CREATE VIEW nombre_vista AS
SELECT instrucciones...
FROM nombre_Tabla | nombre_vista
[WHERE (condición)];

Digite la instrucción:
CREATE VIEW vistaAlumno AS
SELECT codEst, nombEs, apelEs
FROM Alumno;

Ahora realice una consulta sobre la vista que se acaba de crear. Muestre en su informe el resultado.

Trabajo #5 (4 puntos)
18. Cree una vista de las asignaturas, con el nombreA y depto, del departamento de Sistemas, llámela
ViewAsignaturasSmas. [2]
19. Cree una vista de los alumnos que contenga los el nAlum, el nombre, el apellido y el teléfono. Asígnele
VistaAlumno como nombre a la vista. [2]
6. Aspectos Básicos VI

Triggers
Un trigger es un procedimiento almacenado que se asocia con una tabla específica, es un fragmento de
código en el que se le indica al DBMS (Postgres) que corra antes de, o después de, que una tabla sea
modificada. Un trigger tiene la función de:
 Asegurar que una columna contiene valores predefinidos
 Asegurar que una fila de auditoría sea insertada en otra tabla
 Luego de encontrar que la nueva información es inconsistente con otras cosas en la base de datos,
levanta un error que causaría; que toda la transacción se aborte

Para crear un trigger se usa el comando CREATE TRIGGER, así:

CREATE [OR REPLACE] TRIGGER <nombreTrigger> Nombre del Trigger


BEFORE | AFTER Tiempo del evento
{{INSERT |[OR]| UPDATE} [OF columna(s)] |[OR]| DELETE} Eventos disparadores
ON <nombreTabla>
FOR EACH ROW Tipo de Trigger
[WHEN (<condición>)] Restricción al Trigger
<Bloque SQL> Cuerpo del trigger
END; Fin del disparador

Temporalidad del evento


Puede tomar dos valores: BEFORE o AFTER que indicará si el cuerpo del disparador debe ejecutarse
antes o después del evento que causa la activación del disparador. Ambos valores pueden aplicarse
tanto para disparadores a nivel de fila como a nivel de instrucción. La opción BEFORE/AFTER debe
acompañarse de la operación que causa la activación del disparador. Estas pueden ser operaciones de
inserción (INSERT) y/o borrado (DELETE) y/o modificación (UPDATE) respecto a una tabla o respecto
a una columna de una tabla. Cuando se quiere especificar más operaciones, estas se pueden unir
utilizando los operadores OR y AND. La forma general de la temporalidad del evento será:

BEFORE/AFTER INSERT/UPDATE/DELETE [OF nombreColumna] ON nombreTabla.

Ejemplo:
BEFORE INSERT ON Ciudad
BEFORE INSERT OR DELETE ON Ciudad
BEFORE UPDATE ON existencia ON Inventario

Esta última se activará para una operación como:


UPDATE Inventario SET existencia = existencia + cantidad;
Y también para:
UPDATE Inventario SET existencia = existencia;
Pero no para:
UPDATE Inventario SET codArticulo = ‘A1001’;

La cláusula OF nombre_columna puede utilizarse tanto a nivel de fila como a nivel de instrucción.

Granularidad del Evento - WHEN condición


Permite distinguir si el disparador es a nivel de fila o a nivel de instrucción. Un disparador se define a
nivel de fila cuando el cuerpo del disparador se debe aplicar fila a fila de la tabla afectada y se define a
nivel de instrucción cuando se debe aplicar a toda la tabla a la vez. Si queremos definir el disparador a
nivel de fila, la granularidad deberá especificarse con la cláusula FOR EACH ROW a la que habrá que
acompañar de la condición que debe cumplir la fila para aplicar el cuerpo del disparador. Esta condición
se indica en la orden SQL mediante la cláusula WHEN condición. Cuando no exista definición del
granularidad del evento, significará que el disparador está definido a nivel de instrucción.
Ejemplos:
CREATE TRIGGER A_nivel_fila_sin_condición
AFTER DELETE OF existencia ON Inventario
FOR EACH ROW

BEGIN
... ;

CREATE TRIGGER A_nivel_fila_con_condición


AFTER DELETE OF existencia ON Inventario
FOR EACH ROW
WHEN Inventario.existencia < 10

BEGIN
... ;

Si se quiere hacer mención en la condición WHEN al valor de la fila a borrar, se debe hacer referencia
mediante las variables NEW y OLD. Así, para el ejemplo anterior, el disparador estaría correctamente
definido de la siguiente manera:
CREATE TRIGGER A_nivel_fila_con_condición
AFTER DELETE OF existencia ON Inventario
FOR EACH ROW
WHEN (OLD.existencia < 10)

BEGIN
... ;

Variables especiales en PL/pgSQL


Cuando una función escrita en pgSQL es llamada por un disparador tenemos ciertas variables especiales
disponibles en dicha función. Estas variables son las siguientes:

NEW
Tipo de dato RECORD; variable que contiene la nueva fila de la tabla para las operaciones
INSERT/UPDATE en disparadores a nivel de fila. Esta variable es NULL en disparadores a nivel de
instrucción.

OLD
Tipo de dato RECORD; variable que contiene la antigua fila de la tabla para las operaciones
UPDATE/DELETE en disparadores a nivel de fila. Esta variable es NULL en disparadores a nivel de
instrucción.

Con OLD.nombreColumna (OLD.existencia) se referencia:


• El valor que tenía la columna antes del cambio debido a una modificación (UPDATE)
• El valor de una columna antes de una operación de borrado sobre la misma (DELETE)
• El valor NULL para operaciones de inserción (INSERT)
Con NEW.nombre_columna referenciamos:
• El valor de una nueva columna después de una operación de inserción (INSERT)
• El valor de una columna después de modificarla mediante una instrucción (UPDATE)
• El valor NULL para una operación de borrado (DELETE)

Dentro del cuerpo de un disparador podemos incluir sentencias de borrado (DELETE), inserción (INSERT) o
modificación (UPDATE) pero también se puede poner cualquier otra sentencia SQL (SELECT) e incluso un
programa escrito en pgSQL. Dentro de este cuerpo también se puede hacer referencia a las variables OLD y
NEW sólo que en este caso habrá que utilizarlas con “:” delante de tales variables. Ejemplo:

BEGIN
DELETE FROM tabla2
WHERE tabla2.cod = :OLD.cod;
END;

Un procedimiento PL/pgSQL usado en un Trigger


El siguiente ejemplo de disparador asegura que cada vez que se inserta una fila o actualiza en la tabla
Inventario, se actualiza para la tabla emp, en la fila, el nombre de usuario y la hora actual. Y se
comprueba que se le asigne el nombre de un empleado y que el salario sea un valor positivo
CREATE TABLE emp (
empname text,
salary integer,
last_date timestamp,
last_user text
);

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$


BEGIN
18. Check that empname and salary are
given IF NEW.empname IS NULL THEN
RAISE EXCEPTION 'empname cannot be null';
END IF;
IF NEW.salary IS NULL THEN
RAISE EXCEPTION '% cannot have null salary', NEW.empname;
END IF;

19. Who works for us when she must pay for it?
IF NEW.salary < 0 THEN
RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;
END IF;
19. Remember who changed the payroll when
NEW.last_date := current_timestamp; NEW.last_user
:= current_user;
RETURN NEW;
END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp


BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW
EXECUTE PROCEDURE emp_stamp();

Uno de los usos de los disparadores es mantener una tabla de resumen de otra tabla. El resumen
resultante se puede utilizar en lugar de la tabla original para determinadas consultas - generalmente con
tiempos de ejecución muy reducidos. Esta técnica se utiliza comúnmente en almacenamiento de datos
(Data Warehousing), donde las tablas de datos medidos u observados (llamadas tablas de hechos)
pueden ser extremadamente grandes.

EJERCICIO 2 (Uso De Triggers) (5 puntos)


La empresa AutoFacil dedicada al alquiler de vehículos necesita una base de datos que le permita
manejar automáticamente el estado de los vehículos que puede ser ‘alquilado’ o ‘libre’. A continuación,
se muestra el esquema relacional:
Vehiculo (placa, color, modelo, marca, estadoVehiculo)
Alquiler (idAlquiler, fecha, numHoras, valor, placaVehiculo, estadoAlquiler)

20. Cree un trigger que cuando se inserte o modifique un registro en la tabla alquiler automáticamente
se debe modificar el estado del vehículo. Cuando se inserta un nuevo alquiler el campo
estadoAlquiler por defecto es ‘iniciado’, entonces el trigger debe cambiar el estado del vehículo
a ‘alquilado’. Cuando el vehículo es devuelto el campo estadoAlquiler se actualiza a ‘terminado’
y el trigger debe cambiar automáticamente el campo estadoVehiculo a ‘libre’. [5]

Potrebbero piacerti anche