Está en la página 1de 64

UTN - frsf

Gestión de Datos
Material de estudio

Camila Blanc Fick


26/12/2016
INTRODUCCIÓN

Sistema de Gestión de Base de Datos (DBMS: Data Base Management System) que está compuesto
por un conjunto de programas y archivos del Sistema Operativo que realizan operaciones de
compilación y traducción de sentencias, implementan la integridad referencial, control de
concurrencias, recuperación automática ante fallas, seguridad a diversos niveles.

MOTIVACIÓN PARA LOS SISTEMAS DE BASES DE DATOS

Problemas en un sistema de archivos convencional:


 Redundancia e inconsistencia de los datos
 Dificultad para tener acceso a los datos
 Aislamiento de los datos
 Anomalías del acceso concurrente
 Problemas de seguridad
 Problemas de integridad

CONCEPTOS BÁSICOS DE BASES DE DATOS

MODELO DE DATOS

Conjunto de reglas y herramientas conceptuales que se emplean para describir datos, las relaciones
entre los datos, el significado de los mismos y las restricciones sobre los mismos

CATEGORÍAS DE LOS MODELOS DE DATOS

 Modelos de alto nivel o modelos conceptuales:


Están relacionados de modo que los usuarios perciben los datos (E-R, OO).

 Modelo de datos representacionales (implementacioneales):


Están relacionados de tal modo que los usuarios perciben los datos pero a la vez, están
relacionados con la forma que son representados físicamente en la computadora.

 Modelos de bajo nivel o modelos de datos físicos:


Describen en detalle como son almacenados los datos en la computadora.

1
MODELO DE DATOS IMPLEMENTACIONALES

• Jerárquico(IMS)
•estructura jerárquica, de árbol
1970 •implementa punteros para relacionar datos

• Red o network (CODASYL DBTG)


• estructura de grafo
• implementa punteros
• Relacional (ORACLE, SyBase, DB2, SQL Server, Informix)
1980 • estructura de tablas: filas y columnas
• no tiene punteros, se relaciona a través de atributos claves

• Orientada a objetos (OO)


•calses, herencia, polimorfismo
1990 •asociaciones, agregación, composición

• Objeto-Relacional (ORACLE, DB2, Informix)


•estructura de tablas: filas y columnas
2000 •no tiene punteros, se relaciona a través de atributos claves

ARQUITECTURA DE TRES NIVELES

Vista abstracta de los datos: ocultar detalles de cómo se almacena y mantienen los datos.

Niveles de abstracción:
 Nivel físico: es un nivel interno, con estructura de archivos, índices, etc.
 Nivel conceptual: define la base de datos a nivel global.
 Nivel de vista: es un nivel externo, con subconjuntos de la base de datos global para una
aplicación determinada.

Vista 1 Vista 2
Vista n
Nivel Externo
Nivel conceptual Mapeo externo/conceptual

Los tres niveles no Nivel conceptual


están aislados Nivel físico
Mapeo conceptual/interno
completamente.
Nivel interno
2
INDEPENDENCIA DE DATOS
 Independencia física de datos. Es la capacidad de modificar el esquema físico sin provocar
cambios en el nivel conceptual o externo. Esto puede ocurrir cuando se deben reorganizar los
datos para crear estructuras de acceso diferentes.
 Independencia lógica de datos. Es la capacidad de modificar el esquema conceptual sin
provocar cambios en el nivel externo o en los programas de aplicación. Esto puede ocurrir
cuando se agregan o quitan datos (agregando/quitando registros o ítems de datos).

Lo que cambia en realidad es el mapeo entre los diferentes niveles. Muy pocas Bases de Datos
comerciales tienen implementado a full la arquitectura de tres niveles, por el alto costo que se paga en
eficiencia para tener un mapeo completo entre los distintos niveles.

LENGUAJES
Todo DBMS cuenta con dos tipos de lenguajes
 Lenguaje de Definición de Datos (DDL: Data Definition Language) me permite definir los
datos a nivel conceptual, se genera un archivo especial denominado diccionario de datos
(DATA DICTIONARY)
 Lenguaje de Manipulación de Datos (DML: Data Manipulation Language) tiene sentencias
que permiten recuperar la información como también ingresar, modificar y eliminar datos.

Huésped: se pueden ingresar sentencias del DML en un lenguaje estándar como C++,
COBOL, Visual Basic, etc.
Interrogación: lenguajes propios que sirven para manipular datos en la BD.

Procedurales: se debe especificar qué datos se necesitan y cómo obtenerlos (SQL)


No-Procedurales: se especifican los datos que se necesitan sin especificar cómo obtenerlos (QBE).

CICLO DE VIDA DE LOS SISTEMAS DE INFORMACIÓN


El ciclo de vida de los SI incluye al ciclo de vida de las BD.

Análisis de factibilidad: analizar las posibles de áreas de aplicación, hacer un estudio de costos-
beneficios, determinar la complejidad de datos y procesos.

Análisis de requerimientos: se recolectan los requerimientos interactuando con los distintos


grupos de usuarios para identificar sus problemas y necesidades. Se identifican las dependencias entre
aplicaciones, su comunicación y los reportes.

Diseño:
1. Diseño de la Base de Datos
2. Diseño de las aplicaciones del sistema (procesos)

Implementación: del SI, se cargan los datos en la BD y se hacen pruebas de las aplicaciones (test de
las distintas transacciones).

Validación y aceptación: la aceptación del sistema en el cumplimiento de los requerimientos de los


usuarios, la performance y las especificaciones.

3
Operación y mantenimiento: involucra el entrenamiento de los usuarios. La operación comienza
cuando se han validado todas las funciones. El monitoreo de la performance, y el mantenimiento del
sistema son las actividades más importantes de la fase operacional.

Definición del sistema: se definen el alcance de la BD, sus usuarios y aplicaciones. Se identifican las
interfaces de varias categorías de usuarios, las necesidades de almacenamiento y procesamiento.

Diseño de BD: al final de esta fase se completa el diseño lógico y físico de la BD en el DBMS elegido.

Implementación de la BD: comprende la definición de la BD en sus aspectos conceptual, externo e


interno, creando archivos de BD vacíos y la implementación de las aplicaciones.

Carga/conversión de datos: se cargan datos en la BD directamente o por medio de la conversión de


archivos existentes.

Conversión de las aplicaciones: las aplicaciones de sistemas previos se convierten al nuevo.

Monitoreo y mantenimiento: similar al SI. La BD puede ser modificada de tanto en tanto.

Operación: la BD y sus sistema se pone en operación (nuevo y viejo trabajan en paralelo por un
tiempo).

Validación y testeo: se evalúa el nuevo sistema.

ETAPAS DEL DISEÑO DE LA BD

1- Colección de los requerimientos y análisis

2- Diseño Conceptual de la BD

3- Elección de un DBMS

4- Mapeo del modelo de Datos (Diseño Lógico)

5- Diseño Físico de la BD

6- Implementación del sistema de BD y afinamiento (tuning)

4
FASES DEL DISEÑO DE UNA BD (PARA BD GRANDES)

DIAGRAMAS ENTIDAD-RELACIÓN

Objetos básicos:

 Entidades:
- “Cosas” del mundo real con existencia independiente.
- Existencia física: persona, casa, auto empleado.
- Existencia conceptual: compañía, trabajo, curso.
- Objetos de datos principales de los que se desea guardar información.

 Atributos:
- Características de las entidades y relaciones que los describen y le agregan detalle.
- Tipos de atributos:

o Identificador/descriptor,

o Simple/compuesto,

o Simple/multivaluado,

o Derivado.

5
 Relaciones:
Representan asociaciones entre una o más entidades, no tienen una existencia conceptual o
física, si se elimina una de las entidades que las soporta desaparece la relación.

Símbolo Objeto del E-R Definición

Es algo que puede identificarse y que es importante


para el sistema que se va a desarrollar. Son los
objetos de datos más importantes de los que se va a
Entidades obtener información. Por lo general representan
una persona, lugar, cosa, evento o información de
interés.

Representan asociaciones del mundo real entre


una o más entidades, no tiene otra existencia física
o conceptual que no sea la de relacionar (asociar)
dos entidades. Un rol es definido como la función
que una entidad juega en una relación, por ejemplo
entre empleado y departamento se tiene el rol
Relaciones pertenece_a ó trabaja_en. El rol y el nombre de la
relación deben ser equivalentes. Por convención, el
rol debe ser un verbo entre dos sujetos que
representan
a las entidades para ser más legible el diagrama. Se
lee arriba-abajo izquierda-derecha.

Los atributos son características de las entidades y


de las relaciones que le agregan detalles
Atributo descriptivos. Por ej.: DNI, apellido, dirección,
identificador teléfono, etc. Un identificador se emplea para
determinar de manera única una instancia de una
entidad o relación de otra.

Un descriptor se emplea para especificar una


Atributo
característica no-única de una instancia de una
descriptor
entidad.

Su existencia depende de la existencia de otra


entidad (fuerte). Su identificador está asociado con
el identificador de la entidad fuerte de la cual
Entidad débil
deriva. Familiar_a_cargo depende del empleado
mientras el empleado exista, el familiar también
existirá en los datos del sistema.

6
RELACIONES

La descripción de las relaciones se completa en términos de grado, cardinalidad y existencia.

 Grado:

o Unaria:

o Binaria:

o Ternaria:

o N-aria

 Cardinalidad:
Indica la cantidad de ocurrencias de entidades conectadas a ambos lados de la asociación.
La cardinalidad en una relación ternaria o n-aria merece especial atención. Por ejemplo en
una relación ternaria se considera que una entidad tiene una cardinalidad de 1 si está
relacionada solo con una instancia de las otras dos entidades asociadas.

 Cardinalidad de una relación: Mapeos

7
 Existencia de una relación:

La existencia de una entidad en una relación puede ser definida como obligatoria u opcional
(Participación: total o parcial).

o Si una ocurrencia de una entidad ya sea en el lado “uno” o en el lado “muchos” debe
existir para que sea incluida en una relación -> obligatoria. Define una cardinalidad
mínima (existencia) de 1.

o Si una ocurrencia de una entidad ya sea en el lado “uno” o en el lado “muchos” puede
no existir para que sea incluida en una relación -> opcional. Define una cardinalidad
mínima (existencia) de 0.

La cardinalidad máxima puede estar representada por un número entero, cuando así
corresponda, o por una letra (por lo general n o m) indicando un valor genérico desconocido
(muchos).

8
 Atributos de una relación:
Las relaciones pueden tener atributos propios que surgen de la asociación que se establece
entre las entidades.

 Generalización: Supertipos y Subtipos:

Se emplea para entidades que contienen ciertos atributos comunes que pueden ser
generalizados en una entidad de nivel más alto: la entidad superclase ó supertipo. Las clases
de nivel más bajo son los subtipos y especializan el concepto generalizado en el supertipo,
agregándole los atributos que los describen con más precisión.

Al concepto se lo llama también jerarquía supertipo/subtipo.

 Restricciones y características de la Generalización-Especialización:

Definida por predicado: cuando se puede especificar poniendo una condición en el valor de
un atributo a que subclase pertenece una entidad (Empleado-Tipo de trabajo).

o Definida por usuario: cuando no se tiene una condición para determinar la


membresía.

o Disyunto: las subclases deben ser disyuntas, una entidad puede ser miembro a lo
sumo de una de las subclases de la especialización, sino son superpuestas.

o Especialización total: toda entidad en la superclase debe ser miembro de alguna


subclase en la especialización.

9
o Especialización parcial: alguna entidad en la superclase puede no ser miembro de
las subclases en la especialización.

o Disyunta – Total

o Disyunta - Parcial

o Superpuesta – Total

o Superpuesta – Parcial

TRANSFORMACIÓN DE UN MODELO E-R EN TABLAS DE UNA BD


RELACIONAL

Las ENTIDADES fuertes del modelo se transforman en una relación (TABLA) que incluye todos los
atributos de la entidad. Uno de sus atributos debe ser la clave primaria de la tabla.

Para las asociaciones BINARIAS con cardinalidad 1:1 donde participan las entidades S y T, se debe
elegir una de las entidades, S por ejemplo, e incluir en como clave foránea en S, la clave primaria de T.
Es preferible elegir como S a la entidad que participa en la asociación con existencia obligatoria
(existencia 1). Los atributos propios de la asociación también se deben incluir en S. De la
transformación resultan dos tablas correspondientes a cada una de las entidades que participan de la
relación con el agregado de la clave foránea y los atributos de la asociación correspondientes.

Para las asociaciones BINARIAS con cardinalidad 1:N donde participan las entidades S y T, se debe
identificar la relación S del lado N de la asociación, e incluir como clave foránea de S la clave primaria
de T. Los atributos propios de la asociación también se deben incluir en S. El resultado final es
siempre dos tablas correspondientes a cada una de las entidades S y T que participan de la asociación,
con el agregado de la clave foránea y los atributos propios correspondientes a la asociación.

Para las asociaciones de GRADO BINARIO con cardinalidad N:M y para asociaciones con grado
mayor a 2 (>2) se genera una nueva tabla para la relación donde se incluyen como claves foráneas las
claves primarias de las entidades que participan de la asociación, su combinación constituirá la clave
primaria de la tabla generada. Incluya también los atributos propios de la relación.

Se debe notar que para las asociaciones 1:1 y 1:N también se pueden generar nuevas tablas, esto es
particularmente útil cuando existen pocas instancias de la relación y evitar de esta forma valores nulos
en las claves foráneas.

Por cada atributo multivaluado A se debe crear una nueva tabla. A esta tabla se le debe
agregar como clave foránea la clave primaria (K) de la entidad que posee el atributo multivaluado A.
La clave primaria de la tabla generada la constituirá la combinación de A y K.

Transformación en tablas de una generalización:

10
1. Vertical: Crear una tabla para la entidad de nivel más alto, crear una tabla para c/u de las
entidades de nivel más bajo incluyendo la clave de la entidad de nivel más alto como clave
foránea.

Cuenta(Número_cuenta, Saldo)

CajaAhorros(Tasa_interés, Número_cuenta)

CuentaCorriente(Saldo_desc, Número_cuenta)

2. Horizontal: No crear una tabla para la entidad de nivel más alto, en cambio crear una
tabla para cada una de las entidades de nivel más bajo donde además de los atributos
propios se incluyan una columna por cada uno de los atributos de la entidad de nivel más
alto.

CajaAhorros(Tasa_interés, Número_cuenta,
Saldo)

CuentaCorriente(Saldo_desc, Número_cuenta,
Saldo)

3. Plano: Crear una sola tabla que incluya a la


entidad de nivel más alto y todas las entidades
de nivel más bajo con todos los atributos de
unas y otras, mas un atributo t del tipo
discriminador que me indique el tipo de
entidad al que nos estamos refiriendo, la clave
será la clave de la entidad del nivel más alto).

Cuenta(Número_cuenta, Saldo, Tasa Interés,


Saldo_desc, Tipo)

11
Transformación en tablas de una exclusión

La transformación para estas relaciones de exclusión sería:

a) Generar una tabla para cada una de las entidades.

b) En la tabla de la entidad que se encuentra en la parte


superior incorporar las claves de las entidades que forman parte de la relación de restricción
como claves foráneas que pueden admitir valores nulos.

Pedido(Nro. Pedido, clave_revista, clave_libro)

Revista(Clave_revista, editorial, frecuencia)

Libro(Clave_libro, nro_paginas, categoría)

BASES DE DATOS RELACIONALES

CONCEPTOS BÁSICOS

Las tablas son la estructura lógica de una BD Relacional, no su estructura física. La estructura física
constará de archivos (secuenciales, indexados, hash), índices, etc.

La información de las bases de datos está representada de una sola manera, como valores de datos
explícitos. Este es el único medio disponible, no hay punteros conectando una tabla con otra.

Los operadores para la recuperación de datos son operadores que generan nuevas tablas a partir de
las tablas existentes.

Otras propiedades:

- No deben existir filas duplicadas


- Las filas (tuplas) no tienen ningún orden
- Los atributos no están ordenados
- Los valores de los atributos son atómicos

Tupla ==> fila de una tabla


Columna ==> es el atributo de una entidad ó una relación
Dominio ==> es el conjunto de valores desde el cual un atributo (columna de una tabla) puede
tomar el valor actual

12
CLAVES

Este concepto es fundamental en Bases de Datos relacionales ninguna TABLA de una BD


relacional puede prescindir de contar con una clave.

El/los atributo/s que distinguen unívocamente una ocurrencia de una entidad de otra se denomina
superclave. Conjunto de uno o más atributos que permiten identificar de forma única a una entidad.

Propiedades:

- Unicidad: dos tuplas distintas no pueden tener el mismo valor de clave.

- Irreductibilidad: ningún subconjunto de la clave candidata.

Ejemplo:

Entidad: PERSONA superclaves:

a) DNI

b) NyAp + fecha_nacimiento+dirección

c) NyAp + dirección + edad

d) DNI + NyAp

e) DNI + fecha_nacimiento

Si K es una superclave también lo será cualquier súper conjunto de K.

Claves candidatas: aquellas superclaves en la que ningún subconjunto de ella es superclave (a, b, c).
Superclaves mínimas. También se denominan claves únicas. (Para sentencias SQL de creación de
tablas estas son las Unique Key)

Claves primarias: la clave que el diseñador de la BD elige entre el conjunto de claves candidatas
como medio principal para identificar la/las entidades en el conjunto de entidades. (Primary Key)

Las entidades débiles son aquellas que no cuentan con un conjunto de atributos propios suficientes
para formar una clave primaria.

Valores nulos: en una DB relacional se pueden especificar restricciones en las que se permiten
valores nulos o no para un atributo. Un valor nulo por lo general indica desconocimiento de la
información:

Por ejemplo: fecha de nacimiento desconocida a ser anunciado.

¡Por lo general se prohíbe que algún componente de clave primaria contenga valores nulos!

Conjunto de entidades fuerte: conjunto de entidades que tiene una clave primaria.

Discriminador: conjunto de atributos que permite distinguir entre entidades.

13
Claves foráneas: clave que pertenece a otra entidad a la cual está ligada y cuyos valores deben ser
consistentes (Foreign Key) Dada una tabla base R2, una clave foránea en R2 es un subconjunto FK de
atributos de R2 tal que:

- Existe una tabla R1 con una clave candidata CK y en todo momento cada valor de FK en
R2 es idéntico a algún valor de CK en R1.

- Este concepto está directamente relacionado con la transformación en tablas de un E-R y


con la integridad referencial.

OTRAS CONSIDERACIONES – PARA LA DEFINICIÓN DE TABLAS CON SQL

Valores nulos:

No se permiten valores nulos en claves primarias, tampoco en claves foráneas en relaciones que son
obligatorias. Se permiten en los otros casos pero se deben emplear con mucho cuidado.

Restricciones de integridad referencial: se refieren a que se debe hacer con las claves foráneas
cuando se actualiza o se elimina la clave primaria y/o candidata a la que hace referencia:

- on delete/update cascade : se eliminan/actualizan en cascada todas las claves foráneas


que son iguales a la clave primaria/candidata.

- on delete/update set to null : se ponen en nulo todas las claves foráneas que son iguales
a la clave primaria/candidata (en la definición la clave foránea debe aceptar valores nulos).

14
- on delete/update set default: se ponen en el valor por omisión definidos todas las claves
foráneas que son iguales a la clave primaria/candidata.

CRACIÓN DE TABLAS

Se emplea un comando del DDL: CREATE TABLE

CREATE TABLE [esquema.]nombreTabla


(columna tipo_dato [DEFAULT expr] [restricción columna],
...
[restricción_tabla]);

Esquema es el mismo nombre que el del propietario.

nombreTabla es el nombre de la tabla.

DEFAULT expr especifica el valor por omisión si el mismo no está en la sentencia INSERT.

Columna es el nombre de la columna.

Tipo_dato es el tipo de dato y longitud de la columna.

Restricción_columna es una restricción de integridad de la columna.

Restricción_tabla es una restricción de integridad de la tabla y se puede aplicar sobre cualquier


columna de la tabla (excepto NOT NULL).

Ejemplo:

15
TIPOS DE RESTRICCIONES

Las restricciones son importantes para asegurar la integridad de los datos en la Base de Datos. Las
restricciones se chequean cuando se ingresan, actualizan o eliminan datos de una tabla.

Restricción Descripción

Especifica que la columna no puede contener un valor nulo.


NOT NULL Se puede especificar sólo a nivel de columna.
Por omisión las columnas admiten valores nulos.

Especifica que los valores de una columna, o combinación de columnas, deben


UNIQUE
ser únicos para todas las filas en la tabla.

Sólo una clave primaria por tabla. Es una columna, o conjunto de ellas, que
identifica unívocamente a cada fila de la tabla.
PRIMARY KEY Ninguna columna de la clave primaria pueda contener un valor nulo.
Puede definirse a nivel de columna o de tabla.
Una clave primaria compuesta se crea usando la definición a nivel de tabla.
Se crea automáticamente un índice para la columna/s PRIMARY KEY.

Establece y garantiza una relación de clave foránea entre la columna y una


columna de la tabla referenciada.
Foreign Key Integridad Referencial
Designa a una columna/s como clave foránea y establece una relación con una
clave primaria o clave única de la misma tabla o de otra tabla.
El valor de la clave foránea debe ser del mismo tipo que el de la tabla a la que
FOREIGN KEY referencia o debe ser NULL.
Puede definirse a nivel de columna o de tabla.
Una clave foránea compuesta se crea usando la definición a nivel de tabla.
Las claves foráneas se basan en valores de datos y son lógicas (no punteros).
Una clave foránea compuesta por una clave primaria no puede tener valores
Nulos.
La clave foránea se define en la tabla hija, y la tabla que contiene la columna
referenciada es la tabla padre.

CHECK Especifica una condición que debe ser verdadera.

- Las restricciones tienen un nombre y se almacenan en el Diccionario de Datos.

- Se crean en el momento que se generan las tablas.

- Se pueden agregar (ALTER TABLE ADD) después de la creación de tablas y se pueden


activar (ENABLE) o desactivar (DISABLE).

16
- Se pueden definir a nivel de columna o a nivel de tabla.

RESTRICCIÓN FOREIGN KEY:

FOREIGN KEY se usa para definir la columna en la tabla hija, cuando se establece la
restricción a nivel de tabla.

REFERENCES identifica la tabla y columna/s de la tabla padre.

ON DELETE CASADE indica que cuando se borra la fila en la tabla padre las filas
dependientes en la tabla hija, también serán borradas. Sin esta
opción, la fila en la tabla padre no puede ser borrada mientras haya
referencias a ella en la tabla hija.

Ejemplo:

CREATE TABLE emp

(empno NUMBER(4),

ename VARCHAR2(10),

hiredate DATE,

sal NUMBER(7,2),

comm NUMBER(7,2),

deptno CONSTRAINT fk_deptno REFERENCES dept(deptno) );

Previamente se debe haber definido DEPTNO en la tabla DEPT, como clave primaria o única!

Sentencias DML permitidas por las acciones de integridad referencial cuando se ejecutan sobre
claves primarias/únicas de la tabla padre, o sobre claves foráneas de la tabla hijo.

Sentencia DML Ejecutada en la tabla padre Ejecutada en la tabla hijo

Sin problemas si el valor de la


Sin problemas si los valores de clave foránea existe en la tabla
INSERT
la clave son únicos. padre o es parcial o totalmente
nula.

UPDATE Permitida si la sentencia no Permitida si la nueva clave


deja alguna fila en la tabla hijo foránea tiene su valor

17
sin su correspondiente valor en correspondiente en la tabla
la tabla padre. padre.

Permitida si ninguna fila de la


tabla hijo referencia el
DELETE Restrict Sin problemas
valor de la clave en la tabla
padre

DELETE Cascade Sin problemas Sin problemas

RESTRICCIÓN UNIQUE KEY


- Define a una columna o combinación de ellas como una clave única.
- Dos filas en la misma tabla no pueden tener el mismo valor para esta clave
- Se permiten valores nulos aun cuando la clave se base en una sola columna.
- Se pueden definir como restricción a nivel de columna o a nivel de tabla (para claves
compuestas no hay otra opción posible).
- Automáticamente se crea un índice para una restricción UNIQUE.
- En una restricción UNIQUE compuesta que admita valores NULOS dos filas tendrán
igual valor de clave si tienen los mismos valores en los campos que NO SON NULOS.

Ejemplos:

CREATE TABLE dept


(deptno NUMBER(2),
dname VARCHAR2(9) CONSTRAINT unq_dname UNIQUE,
loc VARCHAR2(10) );

ALTER TABLE census ADD CONSTRAINT unq_city_state UNIQUE (city, state);

CREATE TABLE dept


(deptno NUMBER(2),
dname VARCHAR2(9),
loc VARCHAR2(10),
CONSTRAINT unq_dname UNIQUE (dname));

RESTRICCIÓN CHECK

CREATE TABLE dept


(deptno NUMBER CONSTRAINT check_deptno
CHECK (deptno BETWEEN 10 AND 99) DISABLE,
dname VARCHAR2(9) CONSTRAINT check_dname
CHECK (dname = UPPER(dname)) DISABLE,
loc VARCHAR2(10) CONSTRAINT check_loc
CHECK (loc IN (’DALLAS’,’BOSTON’,’NEW YORK’,’CHICAGO’))
DISABLE);

18
MODIFICACIÓN DE TABLAS

Se puede modificar la estructura de las tablas empleando ALTER TABLE

Con este comando es posible también:

 agregar columnas

 modificar la longitud de las columnas

 agregar o eliminar restricciones

 habilitar o deshabilitar restricciones

OTRAS SENTENCIAS SQL RELACIONADAS

DROP TABLE elimina las filas como la estructura de una tabla.

TRUNCATE para eliminar todas las filas de una tabla.

Todos esos comandos son de definición de datos o DDL.

Estas sentencias tienen un commit automático.

No se puede hacer un rollback sobre comandos DDL.

AGREGAR UNA COLUMNA

Se emplea ALTER TABLE con la cláusula ADD.

ALTER TABLE tabla

ADD (columna tipo_dato [DEFAULT expr] [NOT NULL]

[,columna tipo_dato ] ... );

Tabla es el nombre de la tabla.

Columna es el nombre de la nueva columna.

Tipo_dato es el tipo de dato y longitud de la nueva columna.

DEFAUL expr especifica el valor por defecto para una nueva columna.

NOT NULL agrega una restricción de NOT NULL para la nueva columna.

Ejemplo: SQL> ALTER TABLE vendedores_bak

19
ADD ( tipo_doc NUMBER(1) DEFAULT 0,

nro_doc NUMBER(8));

A tener en cuenta:

 Se pueden agregar o modificar columnas, pero no se las puede eliminar.

 No se puede especificar la posición de la columna.

 Si una tabla contiene filas, los campos de la nueva columna se ponen en NULL.

 Solamente se pueden adicionar nuevas columnas NOT NULL en tablas vacías.

MODIFICAR UNA COLUMNA

Se utiliza ALTER TABLE con la cláusula MODIFY

La modificación de la columna puede incluir cambios de:

 tipo de dato

 tamaño

 valor por defecto

 restricción NOT NULL

ALTER TABLE tabla

MODIFY (columna tipo_dato [DEFAULT expr] [NOT NULL]

[,columna tipo_dato ] ... );

tabla es el nombre de la tabla.

columna es el nombre de la columna.

tipo_dato es el tipo de dato y longitud de la columna.

DEFAULT expr especifica el valor por defecto para una nueva columna.

NOT NULL agrega una restricción NOT NULL para la nueva columna.

Ejemplo:

SQL> ALTER TABLE vendedores_bak

MODIFY (tipo_doc VARCHAR2(4));

20
MODIFY ( tipo_doc VARCHAR2(4)

ERROR en línea 2:

ORA-01439: column to be modified must be empty to change datatype

SQL> UPDATE vendedores_bak

SET tipo_doc = NULL;

SQL> ALTER TABLE vendedores_bak

MODIFY (tipo_doc VARCHAR2(4));

Tabla modificada.

AGREGAR RESTRICCIÓN

ALTER TABLE tabla

ADD [CONSTRAINT restricción] tipo (columna);

tabla es el nombre de la tabla.

restricción es el nombre de la restricción.

Tipo es el tipo de restricción.

columna es el nombre de la columna afectada por la restricción.

El nombre de la restricción es opcional.

Ejemplo:

SQL> ALTER TABLE vendedores_bak

2 ADD CONSTRAINT vendedores_tipo_doc CHECK

3 (tipo_doc IN ('DNI','LC','LE','CIPF'));

A tener en cuenta:

 Se puede agregar, eliminar, habilitar o deshabilitar una restricción, pero no se puede


modificar su estructura

 Se puede agregar una restricción de NOT NULL a una columna existente usando la cláusula
MODIFY del comando ALTER TABLE.

21
ELIMINAR UNA RESTRICCIÓN

Se debe usar el comando ALTER TABLE con la cláusula DROP. El nombre de la restricción se puede
obtener examinando las vistas.

USER_CONSTRAINS y USER_CONS_COLUMNS del diccionario de datos

ALTER TABLE tabla

DROP PRIMARY KEY | UNIQUE (columna) |

CONSTRAINT restricción [CASCADE];

tabla es el nombre de la tabla.

columna es el nombre de la columna afectada por la restricción.

restricción es el nombre de la restricción.

La opción CASCADE hace que se elimine cualquier restricción dependiente.

Cuando se elimina una restricción, no está más disponible en el DD.

ELIMINAR UNA TABLA

Se emplea DROP TABLE para la eliminación de una tabla.

DROP TABLE tabla [CASCADE CONSTRAINTS];

SQL> DROP TABLE vendedores_bak CASCADE CONSTRAINTS;

 Se eliminan todos los datos de la tabla.

A tener en cuenta:

 Con el DROP de la tabla la BD pierde todos sus datos y sus índices asociados.

 CASCADE CONSTRAINTS elimina todas las restricciones de integridad dependientes.

 El comando DROP TABLE, una vez ejecutado, es irreversible.

 No se consulta al usuario cuando éste ejecuta el comando DROP.

22
MANIPULACIÓN DE DATOS

El Lenguaje de Manipulación de Datos o DML (Data Manipulation Language) permite agregar,


modificar, o eliminar datos de la base de datos.

Estos comandos están directamente relacionados con las transacciones y el control de los cambios
sobre los datos.

Los comandos de manejo de datos y control de transacciones son:

Comando Descripción

INSERT Agrega una nueva fila a una tabla.

UPDATE Modifica filas de una tabla.

DELETE Elimina filas de una tabla.

COMMIT Hace permanentes todos los cambios pendientes.

SAVEPOINT Permite hacer un rollback a la marca de savepoint.

ROLLBACK Descarta todos los cambios pendientes de los datos.

INSERTAR FILAS NUEVAS EN LA TABLA

Se puede agregar una nueva fila a una tabla por medio del comando INSERT.

INSERT INTO tabla [ (columna [, columna...] ) ]

VALUES (valor [, valor...] );

tabla es el nombre de la tabla

columna es el nombre de la columna en la tabla a completar

valor es el valor correspondiente para esa columna.

Nota: este comando con la cláusula VALUES inserta únicamente una fila por vez en la tabla.

Ejemplo: Insertar una nueva oficina en la tabla OFICINAS_VTAS.

SQL> INSERT INTO oficinas_vtas

VALUES (6, ‘GOLOSINAS SUC. FORMOSA’,

‘S. MARIGHETTI 3021’, ‘NDI‘, NULL, NULL, 3600, 1, NULL);

23
AGREGAR FILAS CON SUBCONSULTAS

Se puede usar la sentencia INSERT para agregar filas a una tabla donde los valores se derivan de
otras tablas ya existentes. En lugar de la cláusula VALUES, se usa una subconsulta.

INSERT INTO tabla [ (columna [, columna...] ) ] subconsulta;

Tabla es el nombre de la tabla.

columna es el nombre de la columna de la tabla a completar.

Subconsulta es la subconsulta que devuelve las filas para anexarlas a tabla.

Ejemplo: Copiar las filas seleccionadas de la tabla VENDEDORES a la tabla HISTORIA_VTAS

SQL>INSERT INTO historia_vtas (id_vend, fecha_copia, cuota_vtas, ventas)

SELECT id_vend, SYSDATE, cuota_vtas, ventas

FROM vendedores;

 El número de columnas en la lista de la cláusula INSERT debe coincidir con el número de


valores en la subconsulta.

ACTUALIZAR FILAS

Se pueden modificar filas existentes en una tabla usando el comando UPDATE.

UPDATE tabla

SET columna = valor [, columna = valor ...]

[WHERE condición];

tabla es el nombre de la tabla.

columna es el nombre de la columna de la tabla a completar.

valor es el correspondiente valor o subconsulta para la columna.

condición identifica las filas a ser actualizadas y está compuesto por nombres de columnas,
expresiones, constantes, subconsultas y operadores de comparación.

Nota: es conveniente usar la clave primaria para identificar a una fila en particular. El uso de otras
columnas puede causar que se actualicen varias filas. Identificar a una fila en la tabla VENDEDORES por
la columna APELLIDOS es peligroso porque varios empleados pueden tener el mismo.

24
Ejemplo: Transferir el vendedor 17 a la oficina 1 y actualizar la identificación del empleado al cual
responderá para que dependa directamente del responsable de esa oficina de ventas.

SQL> UPDATE vendedores

SET id_oficina = 1,

id_vend_responde_a =

(SELECT id_vend

FROM oficinas_vtas

WHERE id_oficina = 1)

WHERE id_vend = 17;

ELIMINAR FILAS

Se pueden eliminar filas usando el comando DELETE.

DELETE [FROM] tabla

[WHERE condición];

tabla es el nombre de la tabla.

condición identifica las filas a ser eliminadas y se compone de nombres de columnas,


expresiones, constantes, subconsultas y operadores de comparación.

Ejemplo: Eliminar toda la información acerca de la oficina 6

SQL> DELETE FROM oficinas_vtas

WHERE id_oficina = 6;

 Si se omite la cláusula WHERE, se eliminarán todas las filas de la tabla, pero la tabla aún
existe como tal.

25
ÁLGEBRA RELACIONAL

 Lenguaje de consulta procedural.

 Conjunto de operaciones que toman una o dos relaciones(tablas) como entrada y producen
una nueva relación(tabla) como resultado.

 Operaciones fundamentales: seleccionar, proyectar, producto cartesiano, unión, intersección


y diferencia de conjuntos.

 Las operaciones se pueden combinar para producir resultados diversos.

Tablas sobre las que se basarán las operaciones de consulta:

26
27
LA OPERACIÓN SELECCIONAR

Operación unitaria, selecciona tuplas que satisfacen un predicado (condición) dado.

Ejemplos:

LA OPERACIÓN PROYECTAR

Operación unitaria que devuelve su relación argumento con ciertas columnas omitidas; se eliminan
las filas duplicadas.

Ejemplos:

LA OPERACIÓN PRODUCTO CARTESIANO

Operación binaria, que combina cada una de las tuplas de una relación con todas las tuplas de la
otra.

OPERACIONES DE CONJUNTO

Las tablas deben ser compatibles para la operación de conjunto, para ello deben cumplir con las
siguientes condiciones:

 Las relaciones deben tener el mismo número de atributos,


 Los dominios de los atributos deben ser los mismos.

UNIÓN DE CONUNTOS

Operación binaria, que contiene las tuplas de que aparecen en ambas relaciones (tablas) eliminando
los duplicados.

Ej.: Encontrar los clientes de la CasaCentral

28
INTERSECCION DE CONJUNTOS

Operación binaria, que contiene las tuplas que son iguales en ambas relaciones (tablas). Las lista
una sola vez.

Ej.: Encontrar los clientes que tienen cuenta y préstamo en la CasaCentral

( )

DIFERENCIA DE CONJUNTOS

Operación binaria, que contiene las tuplas que están en una relación (tabla) pero que no está en la
otra.

Ej.: Encontrar los clientes que tienen cuenta y pero que no tienen préstamo en la CasaCentral

PRODUCTO NATURAL (CONCATENACIÓN-JOIN)

Operación binaria, que contiene las tuplas que son combinación de tuplas de dos relaciones) tablas
pero que tienen un valor igual en un atributo que toma valores del mismo dominio en ambas
relaciones (tablas).
Esta operación surge como un producto cartesiano seguido de una operación de selección. La
selección se realiza forzando la igualdad en aquellos atributos que están en ambas relaciones y que
toman valores del mismo dominio (obviamente de aquellos que interesa aparear).

Ej.: Encontrar los clientes que tienen cuenta o préstamo en la CasaCentral.

Ej.: Encontrar los clientes que tienen cuenta y préstamo en la CasaCentral.

29
DIVISIÓN

Esta operación se establece en consultas que incluyen la frase para todos.

Sea el siguiente ejemplo: se quiere obtener los clientes que tienen cuenta en todas las sucursales de
la ciudad de “Paraná”.

Las sucursales de la ciudad de Paraná se obtiene por medio de:

( )

Los clientes y las sucursales donde tienen cuenta se obtiene por medio de:

La consulta final es:

( )

La respuesta son solo los nombres de los clientes que cumplen con los valores de la sucursal que
corresponden a Paraná.

OPERACIONES RELACIONALES ADICIONALES

OPERACIÓN RENOMBRAR

Se denota por la letra griega r y puede renombrar el nombre de la relación, los nombres de los
atributos o ambos.

Ejemplos:

Renombra la relación R en S y los atributos.

Renombra la relación R en S.

Renombra solo los atributos.

30
DESCOMPOSICIÓN DE UNA SECUENCIA DE SENTENCIAS

A veces es preferible en lugar de escribir una secuencia de sentencias del algebra relacional
descomponerla en una serie de sentencias.

GRUPOS Y FUNCIONES DE GRUPO

Grupo: agrupar tuplas de una relación con el mismo valor en uno/algunos de sus Atributos.

Funciones de grupo: calculan promedios, sumas, cuentas, máximos, mínimos.

atributos de agrupación τ lista de funciones de agrupación (R)


Ejemplos: Calcular el promedio de los saldos de las cuentas en “Casa Central”

Πnombre-sucursal = “Casa Central” (nombre-sucursal τAVG saldo (cuenta))


Ejemplos: Calcular el promedio de los saldos de las cuentas en cada sucursal y la cantidad de
cuentas de cada una.

(nombre-sucursal τAVG saldo, COUNT * (cuenta))

OPERACIONES DE CONSULTA DE LA BASE DE DATOS

SENTENCIAS SQL BÁSICAS

SELECT corresponde a la operación de proyección aquí se especifican las columnas


que se quieren mostrar.

FROM corresponde al producto cartesiano, lista de relaciones (tablas) que se van a


examinar.

WHERE corresponde a la operación de selección y/o producto natural aquí se


especifican las condiciones que deben cumplir las tuplas para que formen
parte de la tabla “respuesta”.

31
OPERACIONES DEL ÁLGEBRA RELACIONAL EN SQL

Select *

from Prestamo Selección pura

where monto > 100000

Select Nombre-sucursal, nombre-cliente

from Prestamo Proyección pura

Select Nombre-sucursal, nombre-cliente Selección + Proyección

from Prestamo (puede ser división dependiendo

where monto > 100000 de cómo se haga la consulta)

Select *

from préstamo, Cliente Producto cartesiano

Select nombre, dirección

from préstamo, cliente JOIN

where cliente.numero-cliente

=préstamo.número-cliente

Las condiciones pueden Select nombre, dirección

ser separadas por los operadores from préstamo, cliente

lógicos and y or y por los operadores where cliente.numero-cliente

de relación =, <>, >=, <=, >, < =préstamo.número-cliente

and cantidad > 100000

32
USO DE DISTINCT-UNION-INTERSECT-MINUS/EXCEPT

Si no se pone distinct los duplicados también se listan.

(select distinct nombre-cliente (select distinct nombre-cliente (select distinct nombre-cliente


from cuenta from cuenta from cuenta
where nombre-sucursal = “Casa where nombre-sucursal = “Casa where nombre-sucursal = “Casa
Central”) Central”) Central”)
union {all} intersect minus
(select distinct nombre-cliente (select distinct nombre-cliente (select distinct nombre-cliente
from préstamo from préstamo from préstamo
where nombre-sucursal = “Casa where nombre-sucursal = “Casa where nombre-sucursal = “Casa
Central”) Central”) Central”)

EL CONECTOR IN EN SQL

El conector IN prueba si se es miembro de un conjunto, donde el conjunto es una colección de


valores producidos por una cláusula SELECT. El conector NOT IN prueba la no pertenencia al
conjunto.

“Encontrar todos los clientes que tienen un “Encontrar todos los clientes que tienen un
préstamo y una cuenta en la sucursal Casa préstamo y pero no tienen una cuenta en la
Central”. sucursal Casa Central”.

select distinct nombre-cliente select distinct nombre-cliente


from prestamo from prestamo
where nombre-sucursal = “Casa Central” where nombre-sucursal = “Casa Central”
and nombre-cliente IN and nombre-cliente NOT IN
(select nombre-cliente (select nombre-cliente
from cuenta from cuenta
where nombre-sucursal = “Casa Central”) where nombre-sucursal = “Casa Central”)

VARIABLES DE TUPLA EN SQL

Las variables de tupla se definen en la cláusula from.

“Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en alguna sucursal”

select distinct T.nombre-cliente, ciudad-cliente

from préstamo S, cliente T

where S.nombre-cliente = T.nombre-cliente

 En consultas que contienen subconsultas, se aplica una regla de ámbito a las variables de
tupla.
 En una subconsulta, está permitido usar sólo variables de tupla definidas en la misma
subconsulta o en cualquier consulta que contenga a la subconsulta.
 Si una variable de tupla está definida tanto localmente como globalmente (en una consulta
que la contiene), se aplica la definición local.

33
 Las variables de tupla son muy útiles para comparar dos tuplas de la misma relación

“Encontrar a todos los clientes que Un camino alternativo para expresar


tienen una cuenta en la misma sucursal esta consulta sería:
en la que Miele tiene una cuenta”
select distinct nombre-cliente
select distinct T.nombre-cliente
from cuenta
from cuenta S, cuenta T
where nombre-sucursal in
where S.nombre-cliente = “Miele” and
(select nombre-sucursal
S.nombre-sucursal = T.nombre-sucursal
from cuenta

where nombre-cliente = “Miele”)

COPARACIÓN DE CONJUNTOS

Sea la consulta “Encontrar los nombres Es una comparación “mayor que”, no


de todas las sucursales que tienen un podemos escribir la expresión usando
activo mayor que alguna sucursal la construcción in.
situada en Santa Fe”.
La frase “mayor que algún” se
select distinct T.nombre-sucursal representa en SQL por > some.

from sucursal T, sucursal S select nombre-sucursal

where T.activo > S.activo and from sucursal

S.ciudad-sucursal = “Santa Fe” where activo > some

(select activo

from sucursal

where ciudad-sucursal = “Santa Fe”)

Lo que se compara aquí es el valor individual de cada tupla con el conjunto de valores que se obtienen
en la subconsulta anidada.

La comparación devolverá verdadero y se mostrará el resultado si la fila individual si la fila individual


de la consulta externa es (mayor, menor, menor-igual, etc.) que ANY (alguno), SOME (alguno) u ALL
(todos) los miembros del conjunto devuelto por la subconsulta.

 SQL también permite las comparaciones < some, <= some, > some, >= some y <> some.
 La palabra clave any es sinónimo de some en SQL.
 Si quisiéramos encontrar los nombres de las sucursales que tienen un activo mayor que
todas las sucursales de Santa Fe, deberíamos usar la construcción > all.

34
Del mismo modo SQL permite las
select nombre-sucursal comparaciones < all, <= all, >all, >= all y <>
all.
from sucursal

where activo > all

(select activo

from sucursal

where ciudad-sucursal = “Santa Fe”)

EXISTS/NOT EXISTS EN SQL

Prueba si una subconsulta tiene alguna tupla en su resultado

 EXISTS retorna verdadero si la subconsulta no está vacía retorna falso si la subconsulta está
vacía.
 NOT EXISTS retorna verdadero si la subconsulta está vacía retorna falso si la subconsulta no
está vacía.

“Encontrar todos los clientes que tienen una cuenta y un préstamo en la sucursal Casa Central”

select nombre-cliente
from cliente
where exists (select *
from cuenta
where cuenta.nombre-cliente = cliente.nombre-cliente
and nombre-sucursal = “Casa Central”)
and exists (select *
from prestamo
where prestamo.nombre-cliente = cliente.nombre-cliente
and nombre-sucursal = “Casa Central”)

Es muy útil para dar respuesta a consultas “para todos”. Supongamos las siguientes tablas:

estudiante(nroLib, NyAP, Dirección)

curso(Id-curso, Profesor, área, horas)

registrado_en(nroLib, Id-curso)

35
“Encontrar el NyAP de los estudiantes que se registraron en todos los cursos”

select NyAP
from estudiante
where not exists
(select *
from curso
where not exists
(select *
from registrado_en
where estudiante.nroLib=
registrado_en.nrolib and curso.id-
curso=registrado_en.id-curso)

Otras maneras de resolver consultas “para todos” son:

SELECT NyAP
FROM estudiante
WHERE not exists
( ( SELECT Id_curso
FROM curso
)
minus (except)
( SELECT Id_curso
FROM registrado_en
WHERE estudiante.nroLib= registrado_en.nrolib
)
);

SELECT NyAP
FROM estudiante, registrado_en
WHERE estudiante.nroLib= registrado_en.nrolib
GROUP By nrolib, NyAP
HAVING count (*) = ( SELECT count (*)
FROM curso )

FUNCIONES DE AGREGACIÓN Y GROUP BY EN SQL

SQL proporciona 5 funciones que pueden ser empleadas con cláusulas de agrupamiento (GROUP
BY) o solas en la cláusula SELECT donde se considera la tabla completa como un grupo. Estas
funciones son:

 mínimo: min
 promedio: avg
 máximo: max
 total: sum
 cuenta: count

select avg (saldo) se determina el promedio de los depósitos

from cuenta del banco

36
Las operaciones como avg se llaman funciones agregación porque se emplean para operar sobre
grupos de tuplas.
El resultado de una función de agregación es un valor único.

“Encontrar el saldo promedio de las cuentas en todas las sucursales”

select nombre-sucursal, avg (saldo)


from cuenta
group by nombre-sucursal

La retención de duplicados es importante al calcular un promedio.

Si queremos eliminar duplicados, usamos la palabra clave distinct en la expresión de agregados.

“Encontrar la cantidad de clientes que tienen cuentas, listados por sucursal”.

select nombre-sucursal, count (distinct nombre-cliente)


from cuenta
group by nombre-sucursal

La cláusula having, seguido de un agrupamiento (group by) sirve para declarar una condición
que se aplica a los grupos más que a las tuplas.

“Encontrar las sucursales que tienen un saldo promedio en las cuentas mayor a $ 1500”

select nombre-sucursal, avg (saldo)


from cuenta
group by nombre-sucursal
having avg (saldo) > 1500

Si en la misma consulta aparecen una cláusula where y una cláusula having, primero se aplica el
predicado de la cláusula where. Las tuplas que satisfacen el predicado where son colocadas en
grupos por la cláusula group by. Después se aplica la cláusula having a cada grupo. Los grupos que
satisfacen el predicado de la cláusula having son utilizados por la cláusula select para generar tuplas
del resultado de la consulta.

“Encontrar el saldo promedio de todos los clientes con cuentas que viven en Santo Tomé

y tienen por lo menos 3 cuentas”.

select avg (saldo)


from cuenta, cliente
where cuenta.nombre-cliente = cliente.nombre-cliente and ciudad-cliente =
“Santo Tomé”
group by cuenta.nombre-cliente
having count (distinct numero-cuenta) >= 3;

37
ORDENAMIENTO DE FILAS (ORDER BY)

La cláusula ORDER BY se emplea para ordenar las filas

SELECT [DISTINCT] {*, columna [alias], ...}

FROM tabla

[ORDER BY {columna, expr} [ASC|DESC] ];

ORDENAMIENTO POR OMISIÓN

 Los valores numéricos se muestran con el valor más bajo en primer lugar, por ejemplo 1 a
999.
 Los valores de fecha se muestran con el valor más temprano en primer lugar, por ejemplo
01/01/1992 antes que 01/01/1995.
 Los valores de caracteres se muestran en orden alfabético, por ejemplo primero la A y último
la Z.
 En ORACLE, los valores nulos se muestran últimos en las secuencias ascendentes y primeros
en las secuencias descendentes.
 Se puede usar un alias de columna en la cláusula ORDER BY.

Otro método para ordenar el resultado de una consulta es por posición. Es útil cuando se ordena por
una expresión larga, se especifica la posición que tiene en la cláusula SELECT.

SQL> SELECT apellidos, id_oficina, fecha_ingreso


FROM vendedores
ORDER BY apellidos;
SQL> SELECT nombre, (objetivo_vtas + 1000) * 6
FROM oficinas_vtas
ORDER BY 2 DESC;

 Se puede ordenar por varias columnas, inclusive por columnas que no aparecen en la
cláusula SELECT.
 Se puede cambiar el ordenamiento para una columna por ejemplo agregando DESC
después del nombre de la columna.

OPERADORES DE COMPARACIÓN

Operador Significado

= Igual a

> Mayor que

>= Mayor o igual que

38
Operador Significado

< Menor que

<= Menor o igual que

BETWEEN… AND… Entre dos valores (inclusive)

IN (lista) Coincide con cualquier valor de la lista

LIKE Coincide con un patrón de caracteres

IS NULL Es un valor nulo

Existen otros operadores como ANY, ALL, SOME, EXISTS que se estudiarán más adelante.

OPERADORES DE COMPARACIÓN (NEGACIÓN)


Operador Significado
!= , <> No igual
NOT nombre-columna = No igual a
NOT nombre-columna > No mayor que
NOT BETWEEN... AND... No está entre los valores especificados
NOT IN (lista) No está dentro de la lista especificada
NOT LIKE No es como la cadena de caracteres de
comparación
IS NOT NULL No es un valor nulo

Ejemplos:

Mostrar el nombre, apellido y fecha de Mostrar el nombre de las localidades


ingreso de los vendedores que cuyos códigos postales sean 3000, 2340
comenzaron a trabajar entre el 01-07- ó 3085.
1999 y el 31-12-1999. SQL> SELECT cod_post, nombre
FROM localidades
SQL> SELECT nombres, apellidos, WHERE cod_post in (3000, 2340,
fecha_ingreso 3085);
FROM vendedores
WHERE fecha_ingreso BETWEEN ‘01-
07-1999’ AND ‘31-12-1999’

OPERADOR LIKE

Me permite seleccionar filas en la que algún campo determinado coincida con un patrón de caracteres

% Representa cualquier secuencia de cero o más caracteres.

_ Denota un solo caracter.

39
Mostrar el salario de todos los empleados cuyo Mostrar el salario de todos los empleados con
nombre comienza con SM. nombre SM%

SELECT sal SELECT sal


FROM emp FROM emp
WHERE ename LIKE ’SM%’ WHERE ’SM%’ LIKE ename

O bien
SELECT sal
FROM emp
WHERE ename = ’SM%’

En la primera consulta se puede ver que el operador LIKE seguido de % toma la secuencia de
caracteres como un patrón, no es igual en los otros dos casos. La búsqueda es sensible a mayúsculas y
minúsculas, se puede utilizar una función UPPER para pasar los valores a minúsculas.

EQUIJOIN

Un equijoin es una operación binaria, combina filas de dos o más tablas pero que selecciona las
filas que tienen valores iguales para ciertas columnas (columnas que toman valores del mismo
dominio en ambas tablas, por lo general sus claves primarias-foráneas).

SELECT tabla1.columna, tabla2.columna, ...


FROM tabla1, tabla2
WHERE tabla1.columna1 = tabla2.columna2;

Aspectos a tener en cuenta:

 Es conveniente preceder el nombre de la columna con el nombre de la tabla por claridad y para mejorar
el acceso a la base de datos.
 Si el mismo nombre de columna aparece en más de una tabla, entonces se debe prefijar con el nombre
de la tabla correspondiente.
 Para combinar tablas, se necesita como mínimo una cantidad de condiciones de igualdad equivalentes a
la cantidad de tablas menos uno.
 Esta regla no aplica si la tabla tiene una clave primaria compuesta.

En las operaciones de equijoin (producto natural) es útil el uso de alias en lugar de repetir los
nombres de las tablas como en el siguiente ejemplo:

Mostrar apellidos, nombres y localidad de todos los clientes cuyo código postal es (3000), ordenados
por apellido.

SQL> SELECT C.apellidos || ‘, ’ || INITCAP(C.nombres) “Cliente”,


2 L.nombre
3 FROM clientes C, localidades L

40
4 WHERE C.cod_post = L.cod_post
5 AND C.cod_post_aux = L.cod_post_aux
6 AND C.cod_post = 3000

7 ORDER BY C.apellidos;

 Los alias de las tablas pueden tener más de 30 caracteres de longitud


 Si se usa un alias para un nombre de tabla en particular en la cláusula FROM se debe sustituir
el nombre por el alias en toda la sentencia SELECT.
 El alias de tabla es válido sólo en la sentencia SELECT actual.
 Los Non-equijoin resultan cuando ninguna columna en una tabla se corresponde
directamente con una columna en la segunda tabla.
 La condición de join contiene un operador distinto del igual (=).
 Crear un non-equijoin para clasificar las localidades según la zona en la que se encuentran. El
código postal de la localidad debe estar entre el rango código postal mínimo y máximo que
identifican a una zona.

SQL> SELECTL.nombre, L.cod_post, Z.descripcion

2 FROM localidades L, zonas Z

3 WHERE L.cod_post BETWEEN Z.cod_post_min

4 AND Z.cod_post_max;

Se podrían usar otros operadores tales como <= y >=, sin embargo BETWEEN es más simple. Los
alias de tablas se especificaron por razones de performance y, no por posible ambigüedad.

LEFT, RIGHT, FULL OUTER JOIN

 Un outer join extiende el resultado de un join común (INNER JOIN).


 Un outer join retorna todas las filas que satisfacen la condición de join mas todas las filas de
una tabla que no satisfacen la condición de join Supongamos un join entre las tablas A y B.
 Para escribir una consulta en donde queremos además de la condición de join, todas las filas
de A que no satisfacen la condición de join empleamos la notación ANSI: LEFT OUTER
JOIN.
 Para ver las filas de B que no satisfacen la condición de join empleamos la notación ANSI:
RIGHT OUTER JOIN.
 Si queremos ver las filas de ambas (A y B) empleamos un FULL OUTER JOIN.

SINTAXIS ANSI
SELECT …
INNER
LEFT [OUTER]
FROM table_name RIGHT [OUTER] JOIN table_name
FULL [OUTER]
ON condición de join

WHERE …

41
SELECT EN EL FROM

 Se puede incluir una cláusula SELECT en el FROM


 Debe encerrarse entre paréntesis
 El resultado es una tabla que debe tener un nombre (se debe asignar un alias al
 resultado)
 El efecto es similar como si estuviéramos usando una vista

SELECT c.apellidos, c.nombres, cl.promedio

FROM clientes c, (SELECT p.id_cliente, avg(cantidad) promedio

FROM pedidos p, renglones_pdo r

WHERE p.id_pedido= r.id_pedido

GROUP BY p.id_cliente) cl

WHERE c.id_cliente=cl.id_cliente

En esta consulta se pide mostrar el apellido y nombre del Cliente y el promedio de las cantidades
compradas.

Las tablas pedidos y renglones de pedido no tienen el nombre el apellido del cliente, pero si el
id_cliente, es por eso que se emplea un SELECT en el FROM, que se ejecuta primero y el resultado es
como si se hubiera empleado una vista. También se podría haber resuelto con una vista.

Ejemplo:

Alumnos (nro-libreta, nombre, especialidad, direccion, ciudad, fecha)

Materias (nro-materia, denominación, área, especialidad)

Examenes (nro-libreta, nro-materia, fecha, nota, Id_profesor)

Profesores (Id_profesor, nombre, cargo, salario)

“Encontrar el nombre del profesor que tiene el menor promedio de notas en los
exámenes”

SELECT P.nombre

FROM Profesor P, Examenes E

WHERE P.Id_profesor=E.Id_profesor

GROUP BY P.Id_profesor, P.nombre

HAVING avg(nota) <= ALL (SELECT avg(nota)

FROM Examenes Ex

GROUP BY Ex.Id_profesor);

42
SELECT P.nombre, AVG(nota)

FROM Profesor P, Examenes E

WHERE P.id_profesor=E.id_profesor

GROUP BY P.idprofesor, P.nombre

HAVING AVG(nota) = ( SELECT MIN(prom)

FROM ( SELECT E.id_profesor, avg(nota) as prom

FROM Examenes E

GROUP BY E.Id_profesor) as PRNOTA);

VISTAS

 Una vista es una tabla lógica basada en una o varias tablas o vistas.
 Una vista no contiene datos propios a través de ella se pueden ver los datos de las tablas.
 Las tablas sobre las que se basa la vista se denominan tablas base.
 La vista se almacena como una sentencia SELECT en el diccionario de datos.

Ventajas de las Vistas

 Restringen el acceso a la base de datos.


 Permiten a los usuarios realizar consultas simples (en la vista) sobre los resultados de
consultas complejas (la generación de la vista).
 Proveen independencia de los datos para los usuarios y aplicaciones. Es independiente de
los cambios que se hagan en las tablas base.
 Proveen el acceso a los datos a grupos de usuarios de acuerdo a un tipo/criterio particular.

SINTAXIS ABREVIADA

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW vista [(alias [, alias]…)]

AS subconsulta

OR REPLACE reformula la vista si ya existe.

FORCE crea la vista sin importar que la tabla base exista o no.

NOFORCE crea la vista si la tabla base existe (opción por omisión) .

vista el nombre de la vista.

alias especifica nombres para las expresiones seleccionadas en la consulta de la


vista. El número de alias debe coincidir con el de expresiones seleccionadas
por la vista.

43
Subconsulta es una sentencia SELECT completa. Se pueden usar los alias para las
columnas en la lista del SELECT.

VISTAS SIMPLES Y COMPLEJAS

 La consulta que define a una vista puede contener una sintaxis SELECT compleja,
incluyendo uniones, grupos y subconsultas.
 La consulta que define la vista no puede contener la cláusula ORDER BY.
 El sistema asigna un nombre por omisión (SYS_Cn) a la restricción WITH CHECK
OPTION.
 La opción OR REPLACE se emplea para cambiar la definición de la vista sin eliminarla y
recrearla, o reasignar los permisos otorgados previamente.

Existen dos calificaciones para las vistas: simples y complejas

Características Vistas simples Vistas complejas


Cantidad de tablas Sólo una Una o más
Contiene funciones No Sí
Contiene grupos de datos
(DISTINCT o funciones de grupo) No Sí

DML por medio de la vista Sí No

Ejemplos:

Crear una vista con los datos Crear una vista con los nombres de
personales de los clientes del oficina, monto de ventas mínimo,
vendedor 11 máximo y promedio por oficina (estos
SQL> CREATE VIEW clientes_vend11_vi últimos tomados de la tabla
2 AS SELECT id_cliente, apellidos, VENDEDORES)
nombres, domicilio SQL> CREATE VIEW oficina_vtas_vi
3 FROM clientes 2 AS SELECT O.nombre OFICINA,
4 WHERE id_vend = 11; 3 MIN(V.ventas) "Vtas. Mínimas",
4 MAX(V.ventas) "Vtas. Máximas",
SQL> SELECT *FROM clientes_vend11_vi; 5 AVG(V.ventas) "Vtas. Promedio"
6 FROM oficinas_vtas O, vendedores V
7 WHERE O.id_oficina = V.id_oficina
8 GROUP BY O.nombre;

SQL> SELECT *FROM oficina_vtas_vi;

MODIFICAR VISTAS

Se emplea la cláusula CREATE OR REPLACE en la sentencia CREATE VIEW.

44
Modificar CLIENTES_VEND11_VI para agregar un alias a los nombres de columna

SQL> CREATE OR REPLACE VIEW clientes_vend11_vi


2 (cliente_nro, cliente_ap, cliente_nom, cliente_dom)
3 AS SELECT id_cliente, apellidos, nombres, domicilio
4 FROM clientes
5 WHERE id_vend = 11;

Los alias deben ser listados en el mismo orden que se pusieron las columnas en la subconsulta.

OPERACIONES DML SOBRE UNA VISTA


Operaciones que se pueden hacer sobre vistas (simples)
 Para eliminar filas, la consulta que genera la vista no debe incluir :
- Funciones de grupo
- Una cláusula GROUP BY
- La cláusula DISTINCT

 Para modificar los datos de una vista, excepto los casos antes mencionadas se agrega lo
siguiente:
- Columnas definidas por expresiones, (por ej. NRO_ATENCIONES * 12)

 Se pueden agregar datos a través de una vista, excepto los casos mencionados y además no
deben existir columnas NOT NULL en la tabla base, no seleccionadas por la vista. Los datos
se agregan directamente en la tabla base.

ELIMINAR UNA VISTA


 Se utiliza el comando DROP VIEW.
 La eliminación de una vista no afecta a las tablas sobre las que se basa la vista
 Las vistas o aplicaciones basadas en la vista eliminada se convierten en inválidas
 Únicamente el creador o un usuario con el privilegio DROP ANY VIEW puede eliminar una
vista.

DROP VIEW vista;

Eliminar la definición de la vista CLIENTES_VEND11_VI

SQL> DROP VIEW clientes_vend11_vi;

45
DEPENDECIAS FUNCIONALES

Es una relación entre uno o más atributos. Si se da el valor de un atributo se pueda obtener el valor
de otro.

Ej.: si se conoce el número de cuenta de un cliente se pueda conocer su saldo, saldo es entonces
funcionalmente dependiente de número de cuenta.

Esto se abrevia de la siguiente manera:

número de cuenta saldo

DNI NyAp, Dirección

Se lee como que número de cuenta determina funcionalmente el saldo o por ejemplo que DNI fija o
determina el nombre y apellido y la dirección de una persona.

Los atributos del lado izquierdo de las flechas se llaman determinantes.

Un valor de un determinante está relacionado con un valor del atributo determinado, por el
contrario, un valor del/los determinados tendrá uno o más diferentes valores del determinante.

En general se dice que si A B, que la relación de valores de A a B es N:1.

Si A Ł B en R, y dadas dos tuplas diferentes t1 y t2, no debe ocurrir que:

t1[A] = t2[A] y que t1[B] C t2[B]

Determinantes y los determinados pueden involucrar un conjunto de atributos:

(número de libreta, curso) calificación

DNI NyAp, Dirección

Definición: Sea R una relación, X e Y subconjuntos arbitrarios del conjunto de atributos de R. Se


dice que Y es funcionalmente dependiente de X (XY) si todo valor legal posible de X tiene
asociado precisamente un valor de Y.

Un diseñador se centra en la relaciones que son semánticamente obvias y genera un conjunto de


dependencias funcionales F, a partir de F se pueden inferir numerosas dependencias funcionales
adicionales.

+
F = conjunto cerrado (o closure) de dependencias funcionales que se pueden inferir del conjunto F.

Reflexividad: si B es subconjunto de A, entonces A B REGLAS

Aumento: si AB, entonces ACBC DE

Transitividad: si A B y BC, entonces AC ARMSTRONG

46
A partir de las reglas de Armstrong se pueden deducir las siguientes reglas:

 Descomposición o proyección: si ABC, entonces AB y AC


 Unión o adición: si AB y AC entonces ABC
 Pseudo-Transitividad: si AB y DBE, entonces DAE

+
En algunos casos es muy difícil, prácticamente imposible determinar F .

CLAUSURAS

Típicamente lo que se hace es:

- especificar el conjunto de dependencias funcionales F que son las más obvias,


- inferir las dependencias funcionales adicionales usando las Reglas de Armstrong.

Supongamos la relación R con atributos A,B,C,D,E,F y las siguientes DF:

A BC A BC (dada)

BàE se puede deducir lo siguiente >> A C por descomposición

CD EF AD CD por aumento

AD EF por transitividad

AD F por descomposición

CLAUSURA DE UN CONJUNTO DE ATRIBUTOS

Dada una relación R, un conjunto de df F y un conjunto de atributos X R

Se define la clausura de X con respecto a F (se denomina X+), como el conjunto de los atributos de A
R tal que X _ A.

CLOSURE (X,R) := X
Hacer
Para cada DF K®Y en R
Hacer
si K es un subconjunto de CLOSURE (X,R) luego
CLOSURE(X,R):= CLOSURE(X,R) union Y
fin-hacer
fin-para
si CLOSURE(X,R) no cambio en la iteración luego EXIT

fin-hacer

47
Dada la relación R con 1. Inicializamos CLOSURE(K,S) = {A,B}
atributos {A,B,C,D,E,F}, y F
(conjunto de dfs) : 2. Hacemos el loop interno 4 veces una para cada DF.

A BC • En la primera iteración determinamos que el lado


E CF izquierdo de ABC es un subconjuntode CLOSURE
B E (K,S) , por lo tanto agregamos los atributos B y C al
CD EF resultado, en esta iteración determinamos que
CLOSURE(K,S) es {A,B,C}.

• En la segunda iteración E CF el lado izquierdo no es


un subconjunto de CLOSURE, este no cambia

• En la tercera iteración agregamos E a la CLOSURE,


ahora es entonces {A,B,C,E}

• En la cuarta iteración CLOSURE no cambia

3. Empezamos el loop interno cuatro veces nuevamente.

• En la primera iteración CLOSURE es la misma.

• En la segunda agregamos F

• En la tercera y la cuarta no cambia. Al final CLOSURE es


{A,B,C,E,F}

4. Ejecutamos el loop interno cuatro veces nuevamente y en esta


loop externo CLOSURE no cambia, por lo tanto la ejecución
termina. Finalmente determinamos que {A,B} no es superclave de
R Porque?

Consecuencias de una clausura de atributos:

+
Sea F un conjunto de dfs y X Y una df, luego X Y es cierta si y solo si Y X

Verificación que un conjunto X de atributos (X R) es una clave de R:


+
- Se computa X
+
- Si X = R se puede concluir que X es una superclave de R

 Las dependencias funcionales están ligadas a la búsqueda de claves y a los Conceptos de


normalización. La búsqueda de las dependencias funcionales para una relación, permitirá
determinar y desarrollar la de manera más apropiada la Normalización de las tablas.
 No hay que confundir el concepto de dependencia funcional con el de clave.
 Se puede saber que AB y que A y B están en la misma relación (tabla), pero todavía no se sabe
si A es único en esa relación.

48
número_cliente nombre
número_cliente localidad Mientras número_cliente es único, nombre no lo es.
nombre localidad

NORMALIZACIÓN

 ¿Qué es normalización?

En general, es un proceso de descomposición, en donde una relación se “descompone” en dos


o más relaciones que satisfacen ciertas condiciones denominadas formas normales.

 ¿Cuál es el propósito de normalizar?


o Generar un modelo lógico de datos eficiente, evitando el comportamiento anómalo
de los datos ante las inserciones, modificaciones y borrado de los mismos.
o Evitar que la estructura que generemos le reste flexibilidad al uso y modificación de
la información.
o Evitar redundancia, minimizar anomalías.
o Mejorar la independencia de los datos, permitiendo la modificación del diseño lógico
de los datos afectando muy poco los programas de aplicación.
 El proceso es reversible, es posible que después de aplicar alguna forma normal podamos
volver hacia atrás y recuperar la forma original Ł que no se pierde información en el proceso
de normalización.

PRIMERA FORMA NORMAL

Una tabla (concepto matemático de relación) debe tener las siguientes propiedades:

 sus atributos (columnas) deben ser simples no debe tener arreglos ni grupos repetitivos
(multivaluados, compuestos)
 un atributo debe corresponderse con un solo dominio
 cada columna debe tener un nombre único
 orden de las columnas no debe ser importante
 no deben existir filas repetidas (no siempre se cumple)
 el orden de las filas no es importante

Si una tabla cumple con las siguientes propiedades se dice que está en primera forma normal ( 1NF).

Definición:

“Una relación (tabla) está en primera forma normal (1FN) si cumple la propiedad que sus dominios
(atributos o columnas) contienen sólo valores atómicos, esto es que no tienen arreglos ni grupos
repetitivos”

49
NORMALIZACIÓN

PRIMERA FORMA NORMAL

PEDIDOS ( Id_pedido, fecha, Id_proveedor, nombre_proveedor, dirección,


Id_producto, descripción-producto, precio_producto, cantidad, total_producto,
total_pedido)

Esta tabla contiene un grupo repetido ya que cada pedido puede tener más de un producto

Se descompone la tabla (relación original) en dos nuevas tablas:

PEDIDOS( Id_pedido, fecha, Id_proveedor, nombre_proveedor, dirección,


total_pedido)

RENGLON_PEDIDO(Id_Pedido, Id_producto, descripción-producto, precio_producto,


cantidad, total_producto)

Observar que ambas relaciones tienen una clave, que existe una clave (id_pedido) que me permite
asociar ambas tablas. La segunda relación tiene una clave compuesta por dos atributos Id_pedido y
Id_producto.

La forma no normalizada se corresponde con una relación (tabla) con atributos multivaluados o con
atributos compuestos.

PEDIDOS( Id_pedido, fecha, Id_proveedor, nombre_proveedor, dirección,


total_pedido)

RENGLON_PEDIDO(Id_Pedido, Id_producto, descripción-producto, precio_producto,


cantidad, total_producto)

Problemas de este modelo en 1NF:

 No se cuenta con la información de un producto hasta que no haya un pedido para ese
producto
 Si se elimina la única fila que contiene un producto determinado se pierde la información
sobre ese producto
 Cada fila de PEDIDOS sobre un mismo producto repite la información de ese producto
(descripción, precio), si se cambia la información sobre el producto se deberán realizar
muchas actualizaciones

SEGUNDA FORMA NORMAL

“Una tabla (relación) está en Segunda Forma Normal si además de estar en 1NF cualquiera de sus
atributos no-claves dependen completamente de cada una de las claves candidatas de la tabla
(relación)”

La dependencia debe ser completa sobre el total de la clave (para claves compuestas) y no para una
parte de ella. 2FN se aplica sólo cuando tenemos claves compuestas.

50
Id_pedido, Id_producto  cantidad, total_producto

Id_pedido, Id_producto  descripción, precio_producto

Id_producto  descripción, precio_producto

Por lo tanto se debe descomponer nuevamente:

PEDIDOS( Id_pedido, fecha, Id_proveedor, nombre_proveedor, dirección,


total_pedido)

RENGLON_PEDIDO(Id_Pedido, Id_producto, cantidad, total_producto)

PRODUCTOS( Id_producto, descripción, precio)

Dependencia funcional total – parcial

PEDIDOS( Id_pedido, fecha, Id_proveedor, nombre_proveedor, dirección,


total_pedido)

RENGLON_PEDIDO(Id_Pedido, Id_producto, cantidad, total_producto)

PRODUCTOS( Id_producto, descripción, precio)

La información sobre un producto se puede insertar, borrar y modificar sin necesidad de tener un
pedido.

En la tabla de PEDIDOS la información de los proveedores presenta problemas similares a la de


RENGLON_PEDIDOS en 1NF:

 No se cuenta con la información de un proveedor hasta que no haya un pedido de ese


proveedor.
 Si se elimina la única fila que tiene la información de un proveedor en la tabla de pedidos se
pierde la información sobre ese pedido.
 Cada fila de PEDIDOS sobre un mismo proveedor repite la información de ese proveedor si
se cambia la información sobre el proveedor se deberán realizar muchas actualizaciones.

TERCERA FORMA NORMAL

“Una tabla (relación) está en Tercera Forma Normal si además de estar en 2NF cualquiera de sus
atributos no-claves no depende transitivamente de las claves candidatas de la tabla (relación)”

Id_pedido Id_proveedor Estas son las dependencias transitivas

Id_proveedor nombre_proveedor A B, B C A C

Id_proveedor dirección

51
Para eliminar las dependencias transitivas:

PEDIDOS( Id_pedido, Id_proveedor , fecha, total_pedido)

RENGLON_PEDIDO(Id_Pedido, Id_producto, cantidad, total_producto)

PRODUCTOS( Id_producto, descripción, precio)

PROVEEDOR (Id_proveedor, nombre_proveedor, dirección)

Con estas formas normales se resuelven la mayor parte de los modelos de datos de la vida real. Pero
se han desarrollado otras formas normales, para casos muy específicos.

OTRAS FORMAS NORMALES

FORMA NORMAL DE BOYCE-CODD

“Una tabla (relación) está en BCNF si cada determinante es una clave candidata”

Claves candidatas: Nro_libreta, Especialidad

Si en la relación existe una sola clave candidata Ł ya está en BCNF.

Determinante: el lado izquierdo de una dependencia funcional.

Dependencia funcional: relación entre atributos en donde, si se fija el valor de uno de ellos
(determinante, lado izquierdo) se puede conocer el valor del otro/s (dependiente/s, lado derecho).

La tabla original se descompone en :

ESTUD-ASE (Nro_Libreta, NombreAs)

ASE-ESPEC (NombreAS, Especialida)

ESTUDIANTE(nro_libreta, Especialidad, Actividad)

Clave: combinación de atributos nro_libreta, especialidad, actividad.

Un estudiante puede inscribirse en varias especialidades y participar en diversas actividades.

• Entre Nro_libreta y Especialidad no existe una


dependencia funcional como tampoco existe
entre Nro_libreta y Actividad

• Un valor de Nro_libreta no fija un único valor


de Especialidad ni de Actividad

Esta dependencia se denomina


dependencia de valores múltiples

52
Dependencias de valores múltiples sólo pueden existir en tablas (relaciones) de al menos tres
atributos, dos de los cuales poseen valores múltiples y sus valores sólo dependen del tercer atributo.

Se grafica de la siguiente forma:

Nro_libreta Especialidad

Nro_libreta Actividad

Problemas:

• Si un estudiante toma otra especialidad se deben generar tuplas para cada una de las actividades y
viceversa.

• Si un estudiante deja una actividad se deben eliminar todas las filas que la contienen. Lo mismo
para las especialidades.

CUARTA FORMA NORMAL

“Una tabla está en 4NF si está en BCNF y no tiene dependencias multivaluadas”

La tabla original se descompone en :

ESTUD-ESPE (Nro_Libreta, Especialidad)

ESTUD-ACTI (Nro_Libreta, Actividad)

53
DESNORMALIZACIÓN

 Las tablas normalizadas evitan los problemas que presentamos y se prefieren a las no
normalizadas.
 De todos modos, en algunos casos la normalización puede ser innecesaria.

CLIENTE (Id-Cliente, nombre, Ciudad, Provincia, Código Postal)

Esta relación no está normalizada y puede descomponerse en:

CLIENTE (Id-Cliente, nombre, Código Postal)

CODIGOS(Código Postal, Ciudad, Provincia)

 Dependerá del caso la tabla no normalizada puede ser más fácil de procesar y no presentaría
muchas dificultades duplicar los datos de Ciudad y Provincia.
 La desnormalización por lo general busca agilizar la performance en la búsqueda y/o
modificación de las tablas.
 Es un recurso que se debe emplear con mucho cuidado, no debe ser un recurso que se emplea
con frecuencia!!!

54
SEGURIDAD

Los datos guardados en la base de datos deben estar protegidos contra los accesos no autorizados,
de la destrucción o alteración malintencionadas además de la introducción accidental de
inconsistencias que evitan las restricciones de integridad. En este apartado se examina el modo en
que se pueden utilizar mal los datos o hacerlos inconsistentes de manera intencionada. Se presentan
luego mecanismos para protegerse de dichas incidencias.

VIOLACIONES DE LA SEGURIDAD

Entre las formas de acceso malintencionado se encuentran:

• La lectura no autorizada de los datos (robo de información)


• La modificación no autorizada de los datos
• La destrucción no autorizada de los datos

La seguridad de las bases de datos se refiere a la protección frente a accesos malintencionados. No es


posible la protección absoluta de la base de datos contra el uso malintencionado, pero se puede elevar
lo suficiente el coste para quien lo comete como para disuadir la mayor parte, si no la totalidad, de los
intentos de tener acceso a la base de datos sin la autorización adecuada.
Para proteger la base de datos hay que adoptar medidas de seguridad en varios niveles:
• Sistema de bases de datos. Puede que algunos usuarios del sistema de bases de datos sólo estén
autorizados a tener acceso a una parte limitada de la base de datos. Puede que otros usuarios estén
autorizados a formular consultas pero tengan prohibido modificar los datos. Es responsabilidad del
sistema de bases de datos asegurarse de que no se violen estas restricciones de autorización.
• Sistema operativo. Independientemente de lo seguro que pueda ser el sistema de bases de datos, la
debilidad de la seguridad del sistema operativo puede servir como medio para el acceso no
autorizado a la base de datos.
• Red. Dado que casi todos los sistemas de bases de datos permiten el acceso remoto mediante
terminales o redes, la seguridad en el nivel del software de la red es tan importante como la seguridad
física, tanto en Internet como en las redes privadas de las empresas.
• Físico. Los sitios que contienen los sistemas informáticos deben estar protegidos físicamente contra
la entrada de intrusos.
• Humano. Los usuarios deben ser autorizados cuidadosamente para reducir la posibilidad de que
alguno de ellos dé acceso a intrusos a cambio de sobornos u otros favores.

Debe conservarse la seguridad en todos estos niveles si hay que asegurar la seguridad de la base de
datos. La debilidad de los niveles bajos de seguridad (físico o humano) permite burlar las medidas de
seguridad estrictas de niveles superiores (base de datos). En el resto de este apartado se aborda la
seguridad en el nivel del sistema de bases de datos. La seguridad en los niveles físico y humano, aunque
importante, cae fuera del alcance de este texto.
La seguridad dentro del sistema operativo se aplica en varios niveles, que van desde las contraseñas
para el acceso al sistema hasta el aislamiento de los procesos concurrentes que se ejecutan en el sistema.
El sistema de archivos también proporciona algún nivel de protección. Las notas bibliográficas hacen
referencia al tratamiento de estos temas en los textos sobre sistemas operativos. Finalmente, la seguridad
en el nivel de la red ha logrado un amplio reconocimiento a medida que Internet ha pasado de ser una
plataforma para la investigación académica a convertirse en la base del comercio electrónico
internacional. Las notas bibliográficas muestran el tratamiento dado por los libros de texto a los
principios básicos de la seguridad de las redes. Se presenta la discusión sobre la seguridad en términos
del modelo relacional de datos, aunque los conceptos de este capítulo son igualmente aplicables a todos
los modelos de datos.

55
AUTORIZACIONES Y VISTAS

Vistas: permiten a un usuario que acceda a una parte de la información almacenada en una relación
(tabla).

Se utiliza a las vistas como medio de proporcionar a un usuario un modelo personalizado de la base
de datos. Una vista puede ocultar los datos que un usuario no necesita ver. La capacidad de las vistas
para ocultar datos sirve para simplificar el uso del sistema y para mejorar la seguridad. El uso del
sistema se simplifica porque se permite al usuario restringir su atención a los datos de interés.
Aunque puede que se niegue el acceso directo a una relación, puede que se le permita el acceso a
parte de esa relación mediante una vista. Por tanto, se puede utilizar una combinación de seguridad
en el nivel relacional y en el nivel de las vistas para limitar el acceso de un usuario precisamente a los
datos que necesita.

En el ejemplo bancario considérese un empleado que necesita saber los nombres de todos los
clientes que tienen un préstamo en cada sucursal. Este empleado no está autorizado a ver la
información concerniente a los préstamos concretos que pueda tener cada cliente. Por tanto, se le
debe negar el acceso directo a la relación préstamo. Pero si va a tener acceso a la información
necesaria se le debe conceder acceso a la vista cliente-préstamo, que consiste sólo en los nombres de
los clientes y las sucursales en los que tienen un préstamo. Esta vista se puede definir en SQL de la
manera siguiente:

create view cliente-préstamo as

(select nombre-sucursal, nombre-cliente

from prestatario, préstamo

where prestatario.número-préstamo

= préstamo.número-préstamo)

Supóngase que el empleado formula la siguiente consulta SQL:

select *

from préstamo-cliente

Evidentemente, el empleado está autorizado a ver el resultado de esta consulta. Sin embargo,
cuando el procesador de consultas traduce la consulta en una consulta sobre las relaciones reales de
la base de datos, se obtiene una consulta sobre prestatario y préstamo. Por tanto, se debe comprobar
la autorización de la consulta del empleado antes de que comience el procesamiento de la misma.

La creación de vistas no necesita la autorización de recursos. El usuario que crea una vista no
recibe necesariamente todos los privilegios sobre la misma. Ese usuario sólo recibe los privilegios que
no proporcionan autorizaciones adicionales respecto de las que ya posee. Por ejemplo, un usuario no
puede recibir la autorización de actualización sobre una vista sin tener la autorización de
actualización sobre las relaciones utilizadas para definir la vista. Si un usuario crea una vista sobre la
que no se puede conceder ninguna autorización, se deniega la solicitud de creación de la vista. En el

56
ejemplo de la vista cliente-préstamo, el creador de la vista debe tener autorización de lectura sobre
las relaciones prestatario y préstamo.

SEGURIDAD DE LA BASE DE DATOS

Seguridad en la base de datos se refiere a autorizar/desautorizar acciones de los usuarios sobre los
objetos de la base de datos.

Privilegio: permiso para acceder a un objeto de una manera determinada.

Usuario: nombre definido en la base de datos que se puede conectar y acceder a los objetos.

Schema: conjunto nominado de objetos tales como tablas, vistas, clusters, procedimientos y
paquetes asociados con un usuario particular.

Por omisión, una vez que el usuario se conecta con la base de datos, tiene acceso a todos los objetos
contenidos en el schema correspondiente.

El usuario se asocia con un schema del mismo nombre. Y a la vez usuario y schema se usan para
referirse a lo mismo.

CREACIÓN DE LOS USUARIOS

El DBA (Administrador de la Base de Datos) debe tomar las siguientes decisiones:

 Si la autenticación del usuario va a ser realizada por la base de datos, el sistema operativo, o el
servicio de autenticación de red.
 Asignar los valores default al usuario y sus tablespaces temporarios.
 Una lista, si existen, de tablespaces temporarios accesibles por el usuario, y las cuotas (límites)
que el usuario tiene.
 El perfil (profile) de recursos del sistema que el usuario tiene disponible.
 Los privilegios y roles que el usuario posee para acceder a los objetos de la base de datos.

PRIVILEGIOS Y ROLES

Un privilegio es un derecho para ejecutar un tipo particular de sentencia SQL o para acceder a un
objeto de otro usuario.

Existen dos maneras de hacerlo:

 Explícitamente: usuario y objeto específico.


 A través de un rol: conjunto nominado de privilegios.

Y dos tipos de privilegios: del sistema y de los objetos del schema.

Un privilegio del sistema es un derecho a realizar una acción particular, o realizar una acción sobre
cualquier objeto de un tipo particular.

57
Ejemplos: los privilegios para crear tablespaces o para borrar filas de cualquier (any) tabal de una
base de datos.

PRIVILEGIOS DE OBJETOS

Un privilegio de objetos es un derecho a realizar una acción particular sobre un objeto específico
()tabla, vista, secuencia, procedimiento, función o paquete).

Algunos objetos como los clusters o los índices no se asocian a privilegios de objetos, sino que son
controlados por privilegios del sistema.

Un usuario posee automáticamente todos los privilegios sobre los objetos de su schema y puede
dárselos (GRANT) a cualquier otro usuario o rol. Asignándole GRANT OPTION estos usuarios pueden
dar estos privilegios a otros usuarios.

ALTER: permite modificar la estructura interna de un objeto. No implica que permite al usuario poder
modificar el contenido de los datos.

DELETE: permite eliminar una p más filas de datos de los objetos.

EXECUTE: permite al usuario ejecutar un paquete, procedimiento o función.

INDEX: permite crear un índice en una tabla. Note que no es suficiente contar con un privilegio
SELECT.

REFERENCES: permite crear o alterar otra tabla que referencia a “ésta” como clave foránea.

DIAGRAMA DE PRIVILEGIOSDE OBJETOS

ÍNDICE

INDEX

TABLA

ALTER REFERENCES SELECT UPDATE INSERT DELETE

58
Para tener privilegios sobre una vista se deben
UPDATE INSERT tener privilegios sobre las tablas por las cuales
se generan las vistas.

VISTA

SELECT DELETE

ASIGNACIÓN DE PRIVILEGIOS DE OBJETOS

GRANT {priv_objeto (, priv_objeto…) | ALL PRIVILEGES}[(columnas)]

ON objeto

TO {usuario [, usuario…] | rol | PUBLIC}

[WITH GRANT OPTION];

Priv_objeto es un privilegio a ser otorgado sobre un objeto.

ALL PRIVILEGES todos los privilegios.

Columnas especifica las columnas de una tabla o vista sobre la que se


otorga un privilegio de actualización o de referencia.

ON objeto es el objeto sobre el cual se otorgan los privilegios.

TO usuario | rol identifica a quién se le otorgan los privilegios.

PUBLIC otorga privilegios sobre objetos a todos los usuarios.

WITH GRANT OPTION permite al beneficiario del privilegio otorgar los


privilegios a otros usuarios y roles.

Ejemplos:

GRANT select ON Prestamo TO U1, U2, U3

GRANT Update (saldo) ON Cuenta TO U1, U2, U3

GRANT References(nombre-sucursal) ON Sucursal TO U1

59
GRANT Select ON Prestamo TO U1 WITH GRANT OPTION

QUITAR PRIVILEGIOS DE OBJETO

REVOKE { object_priv [, object_priv]… | ALL [PRIVILEGES]}

ON [schema.]object

FROM {user | rol | PUBLIC} [,{user | rol | PUBLIC}]

[CASCADE CONSTRAINTS];

Los que asignan privilegios solo pueden quitárselos a aquellos usuarios a los que ellos le han
asignado privilegios.

Cuando se quitan privilegios de objetos estos se quitan es cascada, cuando fueron asignados con
GRANT OPTION. Por ejemplo:

1. USER1 obtiene un privilegio SELECT sobre un objeto con la opción GRANT OPTION de
SCOTT
2. USER1 garantiza el privilegio SELECT sobre la tabla EMP a USER2
3. Se quita el privilegio SELECT a USER1, este también se le quita a USER2.

Ejemplos:

REVOKE select ON Prestamo FROM U1,U2,U3

REVOKE update (saldo) ON Cuenta FROM U1,U2,U3

REVOKE references (nombre-sucursal) ON Sucursal FROM U1

PRIVILEGIOS: CATEGORÍAS FUNCIONALES

Usuario: privilegios para acceder al sistema pero no para crear objetos.

Desarrollador: para crear objetos en la Base de Datos.

Privilegios “any”: privilegios que se aplican solo a objetos que uno genera, sino también a objetos
de otros usuarios. Se aplican para DBAs o para desarrolladores experimentados.

Mantenimiento: se relacionan con el cuidado y la producción de la Base de Datos Asignados por lo


general a DBAs o staff de soporte de computación.

Monitoreo: son los que están atentos con lo que pasa en la Base de Datos. Asignados por lo general
a DBAs.

60
PRIVILEGIOS DE SISTEMA

ASIGNACIÓN DE PRIVILEGIOS DE SISTEMA

system_priv | rol privilegio del sistema a ser otorgado.


TO user | rol identifica a quién se le otorgan los privilegios.
PUBLIC otorga el privilegio o rol a todos los usuarios.
WITH ADMIN OPTION permite al beneficiario del privilegio o rol otorgar
los privilegios a otros usuarios y roles también lo
puede modificar (ALTER) o eliminar (DROP).

61
QUITAR PRIVILEGIOS DEL SISTEMA

REVOKE {syste_priv | role} [, {syste_priv | role}]…

FROM {user | rol | PUBLIC} [, {user | rol | PUBLIC}]…

 El commando REVOKE puede quitar solamente privilegios garantizados con GRANT.


 Quitar privilegios del sistema puede tener efectos sobre objetos dependientes.
 No existe un efecto cascada cuando un privilegio de sistema es quitado.

Ejemplos:

GRANT CREATE TABLE TO U1, U2,U3

GRANT DBA TO U5

GRANT CREATE ANY PROCEDURE TO DBA

GRANT DROP ANY TABLE TO U7 WITH ADMIN OPTION

REVOKE CRATE TABLE FROM U3

PRIVILEGIOS Y CARGOS FUNCIONALES

Usuarios comunes: CREATE SESSION, ALTER SESSION.

Desarrolladores: La mayoría de los CREATE y DROP. Hay que ser cuidadosos en la privilegios que se
brindan a este grupo.

DBA: los DBA deben tener la mayoría de los privilegios “any”.

Algunos privilegios no tan conocidos: ANALYZE ANY, AUDIT ANY, BACKUP ANY TABLE, LOCK
ANY TABLE, COMMENT ANY TABLE.

Mantenimiento de BD: CREATE, ALTER, DROP PROFILE; CREATE ROLE; CREATE, ALTER,
DROP ROLLBACK SEGMENT; CREATE, ALTER, MANAGE TABLESPACE; ALTER, DROP USER; ALTER
Database.

ROLES

Los roles se emplean para asignar privilegios relacionados con los usuarios finales de un sistema

Funcionalidades de los roles:

• puede tener privilegios del sistema y privilegios de objetos del schema

• puede asignarse a otro roles. No obstante un rol no se puede autorizar a sí mismo ni tampoco de
manera circular

62
• a cualquier usuario de la base de datos se le puede asignar un rol

• se puede habilitar y deshabilitar en cualquier momento

• un rol garantizado indirectamente (un rol asignado a un rol) puede ser explícitamente habilitado
o inhabilitado al usuario. No obstante para habilitar un rol que contiene otro roles, los roles
contenidos se habilitan implícitamente habilitando el rol que los contiene.

CREAR Y ASGINAR UN ROL

Primero, el DBA debe crear el rol. Luego puede asignar privilegios al rol y usuarios al rol.

CREATE ROLE rol;

rol nombre del rol a ser creado.

Una vez que el rol está creado, el DBA puede usar el comando GRANT para asignar usuarios al rol
como también asignar privilegios al rol.

DOMINIO DE UN USUARIO

Un usuario tiene privilegios sobre:

 Objetos creados con su propio schema,


 Los privilegios asignados explícitamente al usuario,
 Los privilegios y roles garantizados al usuario que actualmente están habilitados,
 Los privilegios y roles garantizados al grupo de usuarios PUBLIC.

Quienes pueden asignar privilegios y roles:

 Un usuario con privilegio de sistema GRANT ANY ROLE,


 Un usuario con el rol ADMIN OPTION.

63

También podría gustarte