0% encontró este documento útil (0 votos)
65 vistas12 páginas

Crear y Gestionar Tablas y Vistas

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
65 vistas12 páginas

Crear y Gestionar Tablas y Vistas

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Santiago gutierrez mendivelso

Comentarios en negrita.

81 - Crear tabla a partir de otra (create table- select)

Podemos crear una tabla e insertar datos en ella en una sola sentencia
consultando otra tabla (o varias) con esta sintaxis:

create table NOMBRENUEVATABLA


as SUBCONSULTA;

Es decir, se crea una nueva tabla y se inserta en ella el resultado de una consulta
a otra tabla.

Tenemos la tabla "libros" de una librería y queremos crear una tabla llamada
"editoriales" que contenga los nombres de las editoriales.

La tabla "editoriales", que no existe, contendrá solamente un campo llamado


"nombre". La tabla libros contiene varios registros.

Podemos crear la tabla "editoriales" con el campo "nombre" consultando la tabla


"libros" y en el mismo momento insertar la información:

create table editoriales


as (select distinct editorial as nombre from libros);

La tabla "editoriales" se ha creado con el campo "nombre" seleccionado del campo


"editorial" de "libros".

Los campos de la nueva tabla tienen el mismo nombre, tipo de dato y valores
almacenados que los campos listados de la tabla consultada; si se quiere dar otro
nombre a los campos de la nueva tabla se deben especificar alias.

Podemos emplear "group by", funciones de agrupamiento y "order by" en las


consultas. También podemos crear una tabla que contenga datos de 2 o más
tablas empleando combinaciones.

82 - Vistas (create view)

Una vista es un objeto. Una vista es una alternativa para mostrar datos de varias
tablas; es como una tabla virtual que almacena una consulta. Los datos accesibles
a través de la vista no están almacenados en la base de datos, en la base de
datos se guarda la definición de la vista y no el resultado de ella.

Entonces, una vista almacena una consulta como un objeto para utilizarse
posteriormente. Las tablas consultadas en una vista se llaman tablas base. En
general, se puede dar un nombre a cualquier consulta y almacenarla como una
vista.

Una vista suele llamarse también tabla virtual porque los resultados que retorna y
la manera de referenciarlas es la misma que para una tabla.

Las vistas permiten:

<="" p="">

- simplificar la administración de los permisos de usuario: se pueden dar al usuario


permisos para que solamente pueda acceder a los datos a través de vistas, en
lugar de concederle permisos para acceder a ciertos campos, así se protegen las
tablas base de cambios en su estructura.

- mejorar el rendimiento: se puede evitar tipear instrucciones repetidamente


almacenando en una vista el resultado de una consulta compleja que incluya
información de varias tablas.

Podemos crear vistas con: un subconjunto de registros y campos de una tabla;


una unión de varias tablas; una combinación de varias tablas; un subconjunto de
otra vista, combinación de vistas y tablas.

Una vista se define usando un "create view".

La sintaxis básica para crear una vista es la siguiente:

create view NOMBREVISTA as


SUBCONSULTA;

El contenido de una vista se muestra con un "select":

select *from NOMBREVISTA;

En el siguiente ejemplo creamos la vista "vista_empleados", que es resultado de


una combinación en la cual se muestran 4 campos:

create view vista_empleados as


select (apellido||' '||e.nombre) as nombre,sexo,
s.nombre as seccion, cantidadhijos
from empleados e
join secciones s
on codigo=seccion;
Creación de una vista a partir de las tablas, empleados y secciones.

Para ver la información contenida en la vista creada anteriormente tipeamos:

select *from vista_empleados;

Podemos realizar consultas a una vista como si se tratara de una tabla:

select seccion,count(*) as cantidad


from vista_empleados
group by seccion;

Consulta de una vista tal como lo haríamos con una tabla, agrupandolos por
la columna sección.

Los nombres para vistas deben seguir las mismas reglas que cualquier
identificador. Para distinguir una tabla de una vista podemos fijar una convención
para darle nombres, por ejemplo, colocar el sufijo “vista” y luego el nombre de las
tablas consultadas en ellas.

Los campos y expresiones de la consulta que define una vista DEBEN tener un
nombre. Se debe colocar nombre de campo cuando es un campo calculado o si
hay 2 campos con el mismo nombre. Note que en el ejemplo, al concatenar los
campos "apellido" y "nombre" colocamos un alias; si no lo hubiésemos hecho
aparecería un mensaje de error porque dicha expresión DEBE tener un
encabezado, Oracle no lo coloca por defecto.

Los nombres de los campos y expresiones de la consulta que define una vista
DEBEN ser únicos (no puede haber dos campos o encabezados con igual
nombre). Note que en la vista definida en el ejemplo, al campo "s.nombre" le
colocamos un alias porque ya había un encabezado (el alias de la concatenación)
llamado "nombre" y no pueden repetirse, si sucediera, aparecería un mensaje de
error.

Otra sintaxis es la siguiente:

create view NOMBREVISTA (NOMBRESDEENCABEZADOS)


as
SUBCONSULTA;

Creamos otra vista de "empleados" denominada "vista_empleados_ingreso" que


almacena la cantidad de empleados por año:

create view vista_empleados_ingreso (fecha,cantidad)


as
select extract(year from fechaingreso),count(*)
from empleados
group by extract(year from fechaingreso);

Creación de una vista de las columnas fecha, cantidad de empleados por


año.

La diferencia es que se colocan entre paréntesis los encabezados de las columnas


que aparecerán en la vista. Si no los colocamos y empleamos la sintaxis vista
anteriormente, se emplean los nombres de los campos o alias (que en este caso
habría que agregar) colocados en el "select" que define la vista. Los nombres que
se colocan entre paréntesis deben ser tantos como los campos o expresiones que
se definen en la vista.

Las vistas se crean en la base de datos activa.

Al crear una vista, Oracle verifica que existan las tablas a las que se hacen
referencia en ella; no se puede crear una vista que referencie tablas inexistentes.
No se puede crear una vista si existe un objeto con ese nombre.

Se aconseja probar la sentencia "select" con la cual definiremos la vista antes de


crearla para asegurarnos que el resultado que retorna es el imaginado.

Una vista siempre está actualizada; si modificamos las tablas base (a las cuales
referencia la vista), la vista mostrará los cambios.

Se pueden construir vistas sobre otras vistas.

3 - Vistas (información)
Las vistas son objetos, así que para obtener información de ellos pueden
consultarse los siguientes catálogos.

"user_catalog" nos muestra todos los objetos del usuario actual, incluidas las
vistas. En la columna "table_type" aparece "view" si es una vista. Ejemplo:

select *from user_catalog where table_type='VIEW';


Visualizacion de los objetos

"user_objects" nos muestra información sobre todos los objetos del usuario actual.
En la columna "OBJECT_TYPE" muestra "view" si es una vista, aparece la fecha
de creación y demás información que no analizaremos por el momento.

Para ver todos los objetos del usuario actual que son vistas tipeamos:

select *from user_objects where object_type='VIEW';

"user_views" nos muestra información referente a todas las vistas del usuario
actual, el nombre de la vista, la longitud del texto, el texto que la define, etc.

Con la siguiente sentencia obtenemos información sobre todas las vistas cuyo
nombre comience con la cadena "VISTA":

select *from user_views where view_name like 'VISTA%';

84 - Vistas eliminar (drop view)

Para quitar una vista se emplea "drop view":


drop view NOMBREVISTA;
Eliminamos la vista denominada "vista_empleados":
drop view vista_empleados;
Si se elimina una tabla a la que hace referencia una vista, la vista no se elimina,
hay que eliminarla explícitamente.
Ingresemos el siguiente lote de comandos en el Oracle SQL Developer:
drop table empleados;
drop table secciones;

create table secciones(


codigo number(2),
nombre varchar2(20),
sueldo number(5,2),
constraint CK_secciones_sueldo check (sueldo>=0),
constraint PK_secciones primary key (codigo)
);

Creación de tabla secciones, con los atributos codigo, nombre, sueldo, en


donde tenemos dos restricciones de tipo check y primary key.

create table empleados(


legajo number(3),
documento char(8),
sexo char(1),
constraint CK_empleados_sexo check (sexo in ('f','m')),
apellido varchar2(20),
nombre varchar2(20),
domicilio varchar2(30),
seccion number(2) not null,
cantidadhijos number(2),
constraint CK_empleados_hijos check (cantidadhijos>=0),
estadocivil char(10),
constraint CK_empleados_estadocivil check (estadocivil in
('casado','divorciado','soltero','viudo')),
fechaingreso date,
constraint PK_empleados primary key (legajo),
constraint FK_empleados_seccion
foreign key (seccion)
references secciones(codigo),
constraint UQ_empleados_documento
unique(documento)
);
La tabla `empleados` almacena información de empleados, incluyendo
legajo, documento, sexo, nombre, apellido, sección, estado civil y fecha de
ingreso.

insert into secciones values(1,'Administracion',300);


insert into secciones values(2,'Contaduría',400);
insert into secciones values(3,'Sistemas',500);
Insertamos algunos registros.

insert into empleados


values(100,'22222222','f','Lopez','Ana','Colon 123',1,2,'casado','10/10/1990');
insert into empleados
values(101,'23333333','m','Lopez','Luis','Sucre 235',1,0,'soltero','02/10/1990');
insert into empleados
values(102,'24444444','m','Garcia','Marcos','Sarmiento
1234',2,3,'divorciado','07/12/1998');
insert into empleados
values(103,'25555555','m','Gomez','Pablo','Bulnes 321',3,2,'casado','10/09/1998');
insert into empleados
values(104,'26666666','f','Perez','Laura','Peru 1254',3,3,'casado','05/09/2000');

-- Eliminamos la vista "vista_empleados":


drop view vista_empleados;
Eliminación de la vista empleados.

-- Creamos la vista "vista_empleados", que es resultado de una combinación en la


-- cual se muestran 5 campos:
create view vista_empleados as
select (apellido||' '||e.nombre) as nombre,sexo,
s.nombre as seccion, cantidadhijos
from empleados e
join secciones s
on codigo=seccion;

-- Veamos la información de la vista:


select * from vista_empleados;

-- Eliminamos la tabla "empleados":


drop table empleados;

-- Verificamos que la vista aún existe consultando "user_objects":


select * from user_objects where object_name='VISTA_EMPLEADOS';

--Verificamos que la vista "vista_empleados" aún existe consultando


"user_catalog":
select * from user_catalog where table_type='VIEW';

-- Si consultamos la vista, aparecerá un mensaje de error, pues la tabla


"empleados"
-- a la cual hace referencia la vista, no existe:
select * from vista_empleados;

-- Eliminamos la vista:
drop view vista_empleados;

-- Verificamos que la vista ya no existe:


select * from user_catalog where table_name='VISTA_EMPLEADOS';

85 - Vistas (modificar datos a través de ella)

Si se modifican los datos de una vista, se modifica la tabla base.


Se puede insertar, actualizar o eliminar datos de una tabla a través de una vista,
teniendo en cuenta lo siguiente, las modificaciones que se realizan a las vistas:
- no pueden afectar a más de una tabla consultada. Pueden modificarse y
eliminarse datos de una vista que combina varias tablas pero la modificación o
eliminación solamente debe afectar a una sola tabla.
- no se pueden cambiar los campos resultado de un cálculo.
- pueden generar errores si afectan a campos a las que la vista no hace
referencia. Por ejemplo, si se ingresa un registro en una vista que consulta una
tabla que tiene campos not null que no están incluidos en la vista.
Ingresemos el siguiente lote de comandos en el Oracle SQL Developer:
drop table empleados;
drop table secciones;

create table secciones(


codigo number(2),
nombre varchar2(20),
constraint PK_secciones primary key (codigo)
);

Eliminación y creación de tabla secciones.

create table empleados(


legajo number(4) not null,
documento char(8),
sexo char(1),
constraint CK_empleados_sexo check (sexo in ('f','m')),
apellido varchar2(20),
nombre varchar2(20),
domicilio varchar2(30),
seccion number(2) not null,
cantidadhijos number(2),
constraint CK_empleados_hijos check (cantidadhijos>=0),
estadocivil char(10),
constraint CK_empleados_estadocivil check (estadocivil in
('casado','divorciado','soltero','viudo')),
fechaingreso date,
constraint PK_empleados primary key (legajo),
sueldo number(6,2),
constraint CK_empleados_sueldo check (sueldo>=0),
constraint FK_empleados_seccion
foreign key (seccion)
references secciones(codigo),
constraint UQ_empleados_documento
unique(documento)
);
La tabla `empleados` almacena información sobre empleados, incluyendo
legajo, documento, sexo, nombre, estado civil, fecha de ingreso y sueldo,
con restricciones y claves foráneas.

insert into secciones values(1,'Administracion');


insert into secciones values(2,'Contaduría');
insert into secciones values(3,'Sistemas');
Insertamos algunos datos.
insert into empleados
values(100,'22222222','f','Lopez','Ana','Colon 123',1,2,'casado','10/10/1990',600);
insert into empleados
values(101,'23333333','m','Lopez','Luis','Sucre 235',1,0,'soltero','02/10/1990',650);
insert into empleados
values(103,'24444444', 'm', 'Garcia', 'Marcos', 'Sarmiento 1234', 2, 3, 'divorciado',
'07/12/1998',800);
insert into empleados
values(104,'25555555','m','Gomez','Pablo','Bulnes
321',3,2,'casado','10/09/1998',900);
insert into empleados
values(105,'26666666','f','Perez','Laura','Peru
1254',3,3,'casado','05/09/2000',700);
Insertamos datos.

-- Eliminamos la vista "vista_empleados":


drop view vista_empleados;
Eliminación de la vista de los empleados.
-- Creamos la vista "vista_empleados", que es resultado de una combinación en la
cual se muestran 5 campos:
create view vista_empleados as
select (apellido||' '||e.nombre) as nombre,sexo,
s.nombre as seccion, cantidadhijos
from empleados e
join secciones s
on codigo=seccion;
Creación de una vista con combinación de cinco campos.

-- Vemos la información contenida en la vista:


select * from vista_empleados;

-- Eliminamos la vista "vista_empleados2":


drop view vista_empleados2;

-- Creamos otra vista de "empleados" denominada "vista_empleados2"


-- que consulta solamente la tabla "empleados":
create view vista_empleados2
as
select legajo,nombre,apellido,fechaingreso,seccion,sueldo
from empleados
where sueldo>=600;

-- Consultamos la vista:
select * from vista_empleados2;

-- No podemos ingresar un registro en la vista "vista_empleados" porque tal


-- vista tiene campos calculados
-- ("nombre", que es una concatenación de "apellido" y "nombre"),
-- además afecta a 2 tablas ("empleados" y "secciones") y hay campos no
-- accesibles desde la vista que no admiten valores nulos.
-- Si ejecutamos el siguiente "insert", Oracle mostrará un mensaje de error:
insert into vista_empleados values('Pedro Perez','m','Sistemas',2);

-- Podemos ingresar un registro en la vista "vista_empleados2" porque


-- tal vista afecta a una sola tabla y los campos de ""empleados" no
-- accesibles desde la vista admiten valores nulos:
insert into vista_empleados2 values(200,'Pedro','Perez','10/10/2000',2,800);

-- Vemos la tabla "empleados" para comprobar que el nuevo registro insertado


desde
-- la vista está presente en "empleados", los campos para los cuales no se
-- ingresaron datos, almacenan el valor "null":
select * from empleados;

-- Actualizamos el campo "nombre" de un registro de la vista "vista_empleados2":


update vista_empleados2 set nombre='Beatriz' where nombre='Ana';

-- Verificamos que se actualizó la tabla:


select * from empleados;
-- Si intentamos actualizar el campo "nombre" de un empleado a través de la vista
-- "vista_empleados", Oracle no lo permite porque es una columna calculada
-- (concatenación de dos campos):

update vista_empleados set nombre='Lopez Carmen' where nombre='Lopez


Beatriz';

-- Si podemos actualizar otros campos, por ejemplo, el campo "cantidadhijos"


-- de un empleado a través de la vista "vista_empleados":
update vista_empleados set cantidadhijos=3 where nombre='Lopez Beatriz';

-- Verificamos que se actualizó la tabla:


select * from empleados;

-- Eliminamos un registro de "empleados" a través de la vista "vista_empleados2":


delete from vista_empleados2 where apellido='Lopez' and nombre='Beatriz';

-- Verificamos que se eliminó tal registro de la tabla "empleados":


select * from empleados;

--Podemos eliminar registros de empleados a través de la vista


"vista_empleados":
delete from vista_empleados where seccion='Administracion';

-- Verificamos que no hay registros en "empleados" de la sección "1"


("Administracion"):
select * from empleados;

También podría gustarte