Está en la página 1de 52

SQL INTERMEDIO

Ing. Elmer Arturo Carballo Ruiz


Ciclo I
Base de Datos
SQL Intermedio

 Expresiones de joins
 Vistas
 Transacciones
 Restricciones de Integridad
 Tipos de Datos y Esquemas
 Autorización
Relaciones de joins

 Las operaciones de combinación toman dos


relaciones y devuelven como resultado otra relación.
 Una operación de combinación es un producto
cartesiano que requiere que las tuplas en las dos
relaciones coincidan (bajo alguna condición). También
especifica los atributos que están presentes en el
resultado de la combinación
 Las operaciones de combinación se utilizan
normalmente como expresiones de subconsulta en la
cláusula from
Operaciones de Joins, ejemplo
 Relación course

 Relación prereq

 Observe que:
La información de prereq le falta CS-315 y
información de curso le falta CS-437
Outer Join

 Una extensión de la operación de combinación que evita la


pérdida de información.
 Calcula la combinación y luego agrega tuplas forman una
relación que no coincide con tuplas en la otra relación con el
resultado de la combinación.
 Utiliza valores nulos.
Left Outer Join

 course natural left outer join prereq


Right Outer Join

 course natural right outer join prereq


Joined Relations
 Las operaciones de combinación toman dos relaciones y
devuelven como resultado otra relación.
 Estas operaciones adicionales se utilizan normalmente
como expresiones de subconsulta en la cláusula from
 Condición de combinación - define qué tuplas en las dos
relaciones coinciden y qué atributos están presentes en el
resultado de la combinación.
 Tipo de Combinación: define cómo se tratan las tuplas en
cada relación que no coinciden con ninguna tupla en la
otra relación (basada en la condición de combinación)..
Full Outer Join

 course natural full outer join prereq


Relaciones combinadas - ejemplo

 course inner join prereq on


course.course_id = prereq.course_id

 ¿Cuál es la diferencia entre lo anterior, y una unión natural?


 course left outer join prereq on
course.course_id = prereq.course_id
Relaciones combinadas - ejemplo
 course natural right outer join prereq

 course full outer join prereq using (course_id)


Vistas
 En algunos casos, no es deseable para todos los usuarios
ver el modelo lógico completo (es decir, todas las relaciones
reales almacenadas en la base de datos).
 Considere una persona que necesita saber un nombre de
instructores y departamento, pero no el salario. Esta persona
debe ver una relación descrita, en SQL, por

select ID, name, dept_name


from instructor

 Una vista proporciona un mecanismo para ocultar ciertos


datos de la vista de ciertos usuarios.
 Cualquier relación que no sea del modelo conceptual sino
que se haga visible a un usuario como una "relación virtual"
se denomina vista.
Definición de la Vista
 Una vista se define mediante la instrucción create view que
tiene la forma

create view v as < expresión de consulta >

deonde <expresion de consulta> Es cualquier expression legal


SQL. El nombre de la vista es representado por v.
 Una vez que se define una vista, el nombre de la vista puede
usarse para referirse a la relación virtual que genera la vista.
 La definición de la vista no es lo mismo que crear una nueva
relación evaluando la expresión de la consulta
 Más bien, una definición de vista causa el ahorro de una
expresión; La expresión se sustituye en consultas mediante
la vista.
Ejemplo de Vistas
 Una vista de los instructores sin su salario
create view faculty as
select ID, name, dept_name
from instructor
 Encuentra todos los instructores en el departamento de Biología
select name
from faculty
where dept_name = ‘Biology’
 Crear una vista de los totales de sueldo del departamento
create view departments_total_salary(dept_name, total_salary) as
select dept_name, sum (salary)
from instructor
group by dept_name;
Definición de Vista utilizando otras Vistas
 create view physics_fall_2009 as
select course.course_id, sec_id, building, room_number
from course, section
where course.course_id = section.course_id
and course.dept_name = ’Physics’
and section.semester = ’Fall’
and section.year = ’2009’;
 create view physics_fall_2009_watson as
select course_id, room_number
from physics_fall_2009
where building= ’Watson’;
Expandiendo Vista
 Expandir el uso de una vista en una consulta / otra vista

create view physics_fall_2009_watson as


(select course_id, room_number
from (select course.course_id, building, room_number
from course, section
where course.course_id = section.course_id
and course.dept_name = ’Physics’
and section.semester = ’Fall’
and section.year = ’2009’)
where building= ’Watson’;
Vistas definidas mediante otras vistas
 Se puede usar una vista en la expresión que define otra vista
 Una relación vista v1 Se dice que depende directamente de
una relación de vista v2 si v2 Se utiliza en la expresión que
define v1
 Una relación vista v1 se dice depende de relación vista v2 Si
tanto v1 depende directamente de v2 o Hay un camino de
dependencias de v1 a v2
 Se dice que una relación de vista v es recursiva si depende de
sí misma.
Vista Expandida
 Una manera de definir el significado de las opiniones
definidas en términos de otras opiniones.
 Permitir que la vista v1 se defina mediante una expresión e1
que, en sí misma, puede contener usos de relaciones de
vista.
 Expandir la vista de una expresión repite el siguiente paso de
reemplazo:
repeat
Encontrar cualquier relación vista vi en e1
Reemplace la relación vista vi por la expression definida
en vi
until no mas relaciones de vistas son representadas en e1
 Mientras las definiciones de vista no sean recursivas, este
bucle terminará.
Actualizar vista
 Agregue una nueva tupla a la vista de la facultad que
definimos anteriormente
insert into faculty values (’30765’, ’Green’, ’Music’);
Esta inserción debe ser representada por la inserción de la
tupla
(’30765’, ’Green’, ’Music’, null)
dentro de la relación instructor
Algunas actualizaciones no se pueden traducir
de manera única
 create view instructor_info as
select ID, name, building
from instructor, department
where instructor.dept_name= department.dept_name;
 insert into instructor_info values (’69987’, ’White’, ’Taylor’);
 Que departamento, si varios departamentos en Taylor?
 ¿Y si no hay departamento en Taylor?
 La mayoría de las implementaciones de SQL permiten actualizaciones
sólo en vistas simples
 La cláusula from tiene sólo una relación de base de datos.
 La cláusula select contiene sólo nombres de atributos de la
relación, y no tiene ninguna expresión, agregado o especificación
distinta.
 Cualquier atributo no listado en la cláusula select puede
establecerse en null
 La consulta no tiene group by o cláusula having.
Y algunos no en absoluto
 create view history_instructors as
select *
from instructor
where dept_name= ’History’;
 ¿Que pasa si insertamos (’25566’, ’Brown’, ’Biology’, 100000)
dentro de history_instructors?
Vistas Materializadas
 Materializar una vista: crear una tabla física que contiene todas las
tuplas en el resultado de la consulta que define la vista
 Si se actualizan las relaciones utilizadas en la consulta, el resultado
de la vista materializada se vuelve obsoleto
 Necesidad de mantener la vista, actualizando la vista cada vez
que se actualizan las relaciones subyacentes.
Transacciones
 Unidad de trabajo
 Transacción atómica
 Ya sea completamente ejecutado o revertido como si nunca hubiera
ocurrido
 Aislamiento de transacciones concurrentes
 Las transacciones comienzan implícitamente
 Terminado por commit o rollback
 Pero por defecto en la mayoría de las bases de datos: cada sentencia
SQL se guarda automáticamente
 Puede desactivar la confirmación automática de una sesión (por
ejemplo, mediante API)
 En SQL: 1999, puede usar: begin atomic .... end
 No es compatible con la mayoría de las bases de datos
Restricciones de integridad
 Las restricciones de integridad protegen contra daños
accidentales a la base de datos, asegurando que los
cambios autorizados en la base de datos no resulten en
una pérdida de consistencia de los datos.
 Una cuenta de cheques debe tener un saldo mayor de $
10,000.00
 Un salario de un empleado del banco debe ser por lo
menos $ 4.00 por hora
 Un cliente debe tener un número de teléfono (no nulo)
Restricciones de Integridad en una Relación
Única
 not null
 primary key
 unique
 check (P), donde P es el predicado
Not Null y Unique Constraints

 not null
 Declara name y budget para ser not null
name varchar(20) not null
budget numeric(12,2) not null
 unique ( A1, A2, …, Am)
 La especificación única establece que los atributos A1, A2, ...
Am forman una clave candidata.
 Se permite que las claves candidatas sean nulas (en
contraste con las claves primarias).
La claúsula Check

 check (P)
donde P es el predicado

Ejemplo: asegúrese de que el semestre es uno de otoño,


invierno, primavera o verano :

create table section (


course_id varchar (8),
sec_id varchar (8),
semester varchar (6),
year numeric (4,0),
building varchar (15),
room_number varchar (7),
time slot id varchar (4),
primary key (course_id, sec_id, semester, year),
check (semester in (’Fall’, ’Winter’, ’Spring’, ’Summer’))
);
Integridad Referencial

 Asegura que un valor que aparece en una relación para un


conjunto dado de atributos también aparece para un cierto
conjunto de atributos en otra relación.
 Ejemplo: Si "Biología" es un nombre de departamento que
aparece en una de las tuplas en la relación instructor,
entonces existe una tupla en la relación de departamento
para "Biología".
 Sea A un conjunto de atributos. Sea R y S dos relaciones que
contienen atributos A y donde A es la clave primaria de S. A
se dice que es una clave externa de R si para cualquier valor
de A que aparece en R estos valores también aparecen en S.
Acciones en cascada de Integridad Referencial

 create table course (


course_id char(5) primary key,
title varchar(20),
dept_name varchar(20) references department
)
 create table course (

dept_name varchar(20),
foreign key (dept_name) references department
on delete cascade
on update cascade,
...
)
 Acciones alternativas para cascada: set null, set default
Violación de restricción de integridad durante
transacciones
 Ej.
create table person (
ID char(10),
name char(40),
mother char(10),
father char(10),
primary key ID,
foreign key father references person,
foreign key mother references person)
 ¿Cómo insertar una tupla sin causar violación de restricción?
 Insertar al padre y la madre de una persona antes de insertar a la
persona
 O, establecer el padre y la madre a null inicialmente, actualizar
después de insertar todas las personas (no es posible si el padre y
la madre atributos fueron declarados no nulo)
 O aplazar la comprobación de restricciones (siguiente diapositiva)
Complex Check Clauses
 check (time_slot_id in (select time_slot_id from time_slot))
 ¿Por qué no utilizar una clave extranjera aquí?
 Cada sección tiene al menos un instructor enseñando la
sección.
 Cómo escribir esto?
 Lamentablemente: la subconsulta en la cláusula de cheque no
es compatible con todas las bases de datos
 Alternativa: disparadores (más adelante)create assertion
<assertion-name> check <predicate>;
 Tampoco es compatible con todos
Tipos de datos pre-construido en SQL
 date: fechas, contiene (4 digitos) año, mes y día
 ejemplos: date ‘2005-7-27’
 time: Tiempo del día, en horas, minutos y segundos.
 Ejemplo: time ‘09:00:30’ time ‘09:00:30.75’
 timestamp: Fecha más la hora del día
 Ejemplo: timestamp ‘2005-7-27 09:00:30.75’
 interval: Período del tiempo
 Ejemplo: interval ‘1’ day
 Restar un valor de fecha / hora / marca de tiempo de otro da
un valor de intervalo
 Los valores de intervalo se pueden agregar a los valores de
fecha / hora / marca de tiempo
Creación de Indice
 create table student
(ID varchar (5),
name varchar (20) not null,
dept_name varchar (20),
tot_cred numeric (3,0) default 0,
primary key (ID))
 create index studentID_index on student(ID)
 Los índices son estructuras de datos utilizadas para acelerar el
acceso a los registros con valores especificados para los
atributos de índice
 e.g. select *
from student
where ID = ‘12345’
Puede ser ejecutado usando el índice para encontrar el
registro requerido, sin mirar todos los registros del
estudiante
Tipos definidos por el usuario

 create type Construir en SQL crea el tipo definido por el


usuario

create type Dollars as numeric (12,2) final

 create table department


(dept_name varchar (20),
building varchar (15),
budget Dollars);
Dominios
 create domain Construye en SQL-92 crea tipos de dominio
definidos por el usuario

create domain person_name char(20) not null

 Los tipos y dominios son similares. Los dominios pueden tener


restricciones, como no nulas, especificadas en ellas.
 create domain degree_level varchar(10)
constraint degree_level_test
check (value in (’Bachelors’, ’Masters’, ’Doctorate’));
Tipos de Objetos Largos
 Los objetos grandes (fotos, videos, archivos CAD, etc.) se
almacenan como un objeto grande:
 Blob: objeto binario grande - objeto es una gran colección
de datos binarios no interpretados (cuya interpretación se
deja a una aplicación fuera del sistema de base de datos)
 Clob: carácter objeto grande - objeto es una gran colección
de datos de caracteres
 Cuando una consulta devuelve un objeto grande, se
devuelve un puntero en lugar del objeto grande en sí.
Autorización
Formas de autorización de partes de la base de datos:
 Read - permite la lectura, pero no la modificación de los datos.
 Insert - permite la inserción de nuevos datos, pero no la
modificación de los datos existentes.
 Update: permite la modificación, pero no la eliminación de datos.
 Delete - permite la eliminación de datos.

Formas de autorización para modificar el esquema de la base de


datos
 Index - permite la creación y eliminación de índices.
 Resource - permite la creación de nuevas relaciones.
 Alter - permite la adición o eliminación de atributos en una relación.
 Drop - permite la eliminación de las relaciones.
Especificación de Autorización en SQL

 La declaración de grant se utiliza para otorgar la autorización


grant <lista de privilegio>
on <nombre de relación o vista> to <lista de usuario>
 <user list> is:
 un user-id
 public, Que permite a todos los usuarios válidos el
privilegio concedido
 Un rol
 La concesión de un privilegio a una vista no implica la
concesión de ningún privilegio sobre las relaciones
subyacentes.
 El otorgante del privilegio debe tener ya el privilegio sobre el
elemento especificado (o ser el administrador de la base de
datos).
Privilegios en SQL

 select: Permite el acceso de lectura a la relación, o la


capacidad de consulta con la vista
 Ejemplo: grant users U1, U2, y U3 select autorización
sobre la relación instructor:
grant select on instructor to U1, U2, U3
 insert: El privilegio de inserter tuplas
 update: El privilegio de actualizar con la sentencia update
 delete: El privilegio de borrar tuplas.
 all privileges: Utilizado como una forma corta para todos
los privilegios permitidos
Revocando autización con SQL

 La declaración de revoke se utiliza para revocar la


autorización.
revoke <lista de privilegio>
on <nombre de relación o vista> from <lista de usuario>
 Ejemplo:
revoke select on branch from U1, U2, U3
 <lista de privilegio> Puede ser todo para revocar todos los
privilegios que el revoke puede sostener.
 SI <revokee-list> incluye public, Todos los usuarios pierden el
privilegio, excepto los concedidos explícitamente.
 Si el mismo privilegio fue concedido dos veces al mismo
usuario por diferentes concesionarios, el usuario puede retener
el privilegio después de la revocación.
 Todos los privilegios que dependen del privilegio que se
revoca también son revocados.
Roles
 create role instructor;
 grant instructor to Amit;
 Privilegios pueden ser otorgador a los roles:
 grant select on takes to instructor;
 Los roles se pueden otorgar a los usuarios, así como a otras roles
 create role teaching_assistant
 grant teaching_assistant to instructor;
 Instructor inherits all privileges of teaching_assistant
 Cadena de roles
 create role dean;
 grant instructor to dean;
 grant dean to Satoshi;
Autorización sobre vistas
 create view geo_instructor as
(select *
from instructor
where dept_name = ’Geology’);
 grant select on geo_instructor to geo_staff
 Suponga que un miembro de geo_staff emite
 select *
from geo_instructor;
 Que pasa si
 ¿Geo_staff no tiene permisos en el instructor?
 Creador de vista no tiene algunos permisos en el
instructor?
Otras características de Autorización
 Privilegios de referencias para crear clave extranjera
 grant reference (dept_name) on department to Mariano;
 Porqué este es requerido?
 Transferir los privilegios
 grant select on department to Amit with grant option;
 revoke select on department from Amit, Satoshi cascade;
 revoke select on department from Amit, Satoshi restrict;
 Tarea leer la sección 4.6 de Silberchatz sexta edición.
Fin
Figura 4.01
Figura 4.02
Figura 4.03
Figura 4.04
Figura 4.05
Figura 4.07

Taylor
Figura 4.06
Figura 4.03

También podría gustarte