Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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:
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).
ASIGNATURA
codA nombreA precio depto
number Varchar(50) Float VarChar(12)
Para ello digitamos las siguientes instrucciones:
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
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);
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)
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;
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:
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.
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
Ejemplo:
BEFORE INSERT ON Ciudad
BEFORE INSERT OR DELETE ON Ciudad
BEFORE UPDATE ON existencia ON Inventario
La cláusula OF nombre_columna puede utilizarse tanto a nivel de fila como a nivel de instrucción.
BEGIN
... ;
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
... ;
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.
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;
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;
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.
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]