CURSO 95/96 Universidad de Navarra

Introducción a

SQL y ORACLE

Centro de Tecnología Informática

Ignacio Coupeau, Cristina Pueyo y Jesús Used

21/9/95

CONCEPTO DE BASE DE DATOS

El concepto básico en el almacenamiento de datos es el registro. El registro agrupa la información asociada a un elemento de un conjunto, y está compuesto por campos. Así por ejemplo, un registro correspondiente a un libro no es más que un elemento de un conjunto: biblioteca, elenco bibliográfico, etc. A su vez, ese registro contiene toda la información asociada al libro, clasificada en campos: título, autor, fecha de edición, etc.

Se puede hablar de propiedades características o campos característicos, y propiedades secundarias o campos secundarios según definan o complementen el elemento representado por el registro.

Por ejemplo, el registro empleados tiene los siguientes campos: DNI, Nombre, Apellidos, Edad, Población, Sueldo. Los campos DNI, Nombre y Apellidos son elementos o campos característicos. Los restantes son secundarios.

Un fichero o tabla es un conjunto de registros homogéneos con la misma estructura:

Cuando se tienen varias tablas o ficheros con algún campo en común, entonces pueden relacionarse y constituyen una base de datos relacional:

En el ejemplo anterior, puede extraerse la información relacionada en las dos tablas, por medio del campo común DNI; por ejemplo:

"Buscar en la tabla los puestos de trabajo desempeñados y la antigüedad del empleado con nombre = Luis"

Hasta hace un tiempo, y siempre que se deseara una base de datos especialmente diseñada, se utilizaban bases de datos con estructura jerárquica o de red, mediante anillos interconectados. La información afín está organizada en anillos (listas cíclicas), por ejemplo empresas, ciudades, trabajos... De cada anillo se pasa otro anillo de conceptos subordinados. Por ejemplo una base de datos de una empresa para su personal en varias ciudades puede ser:

Este tipo de bases son especialmente eficientes en búsquedas acordes con su estructura, por ejemplo: "[[questiondown]]qué ajustadores trabajan en Valencia"; pero ante otras preguntas como "[[questiondown]]Cuántas personas tiene contratadas mi empresa?" la búsqueda se hace bastante más difícil.

Además, las bases de datos en red y jerárquicas requieren un diseño específico ajustado a las consultas, por lo que no suele usarse ante las dificultades técnicas que plantea su desarrollo.

Un ejemplo de bases de datos jerárquica, aunque no basada en anillos múltiples, sería el de una base de datos construida según la organización jerárquica de las piezas que componen un vehículo:

El modelo relacional, basado en tablas, tiene en la actualidad una difusión mayor. Las búsquedas pueden ser mucho más flexibles, basadas en cualquier campo (DNI, Nombre, etc.). Para hacer búsquedas rápidas deben definirse campos índice. Los campos comunes por donde se conectan las tablas deben tener un índice definido.

Se conoce como gestor de bases de datos al programa de ordenador que sirve para definir, diseñar y utilizar los registros, ficheros y formularios de la base de datos. Generadores de bases de datos muy conocidos son ORACLE, SyBase, INFORMIX, FOX BASE, PARADOX, ACCESS...

EL LENGUAJE DE GESTIóN DE BASES DE DATOS SQL

Hasta la década de los 80, las personas que preparaban las consultas e informes de una base de datos debían ser programadores. Al aparecer las bases de datos con lenguajes de consulta sencillos y estandarizados, semejantes al lenguaje natural, el proceso de consulta puede hacerlo cualquier usuario mediante un lenguaje escrito asequible.

El lenguaje de gestión de bases de datos más conocido en la actualidad es el SQL, Structured Query Language, que es un lenguaje estandar internacional, comúnmente aceptado por los fabricantes de generadores de bases de datos. En concreto, el gestor de bases de datos Oracle utiliza el lenguaje SQL.

El SQL trabaja con estructura cliente/servidor sobre una red de ordenadores. El ordenador cliente es el que inicia la consulta; el ordenador servidor es que atiende esa consulta. El cliente utiliza toda su capacidad de proceso para trabajar; se limita a solicitar datos al ordenador servidor, sin depender para nada más del exterior. Estas peticiones y las respuestas son transferencias de textos que cada ordenador cliente se encarga de sacar por pantalla, presentar en informes tabulados, imprimir, guardar, etc., dejando el servidor libre.

El SQL permite:

* Definir una base de datos mediante tablas

* Almacenar información en tablas.

* Seleccionar la información que sea necesaria de la base de datos.

* Realizar cambios en la información y estructura de los datos.

* Combinar y calcular datos para conseguir la información necesaria.

SQL es el lenguaje de comunicación entre el programa cliente y programa servidor; Oracle es un programa servidor, en el que está la base de datos propiamente dicha. El usuario accede con alguno de los programas cliente disponibles para consultar Oracle.

En este manual se explica como emplear SQL para:

* Crear y modificar la estructura de una tabla de datos.

* Seleccionar información de una tabla.

* Añadir datos a una tabla.

* Introducir información en una tabla.

* Realizar consultas entre tablas con campos comunes.

Estructura de una base de datos

Una base de datos Oracle está formada por tablas. Los ejemplos de este manual se basan en las tablas de departamentos DEPT y empleados EMP de una empresa.

DEPT:

EMP:

Creación de una tabla

Antes de cualquier consulta a una base de datos debe crearse una tabla e introducir la información. En nuestro caso creamos las dos tablas que vamos a utilizar como ejemplo:

CREATE TABLE DEPT (DEPTNO NUMBER(2),

DNAME CHAR(14),

LOC CHAR (13));

El comando crear tabla (CREATE TABLE) indica al servidor Oracle que nombre queremos poner a la tabla, los nombres de las columnas de la tabla (n[[ordmasculine]] de departamento, nombre del departamento y localidad) y el tipo de información que cada columna va a contener. La columna DEPTNO tendrá información numérica (2 dígitos), DNAME tendrá 14 caracteres y LOC tendrá 13 caracteres; de este modo especificamos la longitud máxima de cualquier dato que pueda ser almacenado en las columnas de la tabla.

Se procede de forma análoga con la tabla empleados EMP con el comando CREATE TABLE:

CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,

ENAME CHAR(10),

JOB CHAR(9),

MGR NUMBER(9),

HIREDATE DATE,

SAL NUMBER(7,2),

COMM NUMBER(7,2),

DEPTNO NUMBER(2));

En esta tabla se ha definido la columna n[[ordmasculine]] de empleado (EMPNO) como no nula, esto significa que cada campo de esa columna debe contener un valor. Esta especificación NOT NULL es un ejemplo de como ORACLE analiza los valores que se introducen en cada campo y comprueba que se cumple lo especificado.

Aunque el número máximo de caracteres definido para un campo sea -por ejemplo- 14, si sólo se ocupan 4, ORACLE solo utiliza cuatro en disco. Los valores nulos no ocupan espacio.

Introducción de la información

Tan pronto como se ha creado la tabla, puede comenzarse a introducir líneas o registros de información mediante comando INSERT:

INSERT INTO DEPT VALUES (30,'SALES','CHICAGO);

En este comando, primero se nombra la tabla de la base de datos en la que quieren insertarse los datos (DEPT), y a continuación la lista de valores que van a ir en cada columna (30, 'Ventas', 'Chicago')

Búsqueda de información en una tabla

La operación más común en una base de datos es pedir información, y se denomina búsqueda o Query. El comando Select va seguido de FROM y en ocasiones de WHERE. SELECT especifica las columnas, FROM especifica las tablas y WHERE especifica las condiciones. Si no hay condiciones de búsqueda se presentarán las columnas completas, sin restricciones. En este ejemplo, el comando Headers() especifica que el listado ponga los nombres de las columnas (DNAME, DEPTNO, LOC); PrintAll, imprime los datos.

Si se quiere ver el contenido de toda la tabla EMP, puede sustituirse toda la lista de columnas por un asterisco:

En los ejemplos, para facilitar la lectura, se escriben los comandos en diversas líneas, pero puede hacerse en una sola línea, por ejemplo:

SELECT * FROM DEPT; Headers(); PrintAll;

BúSQUEDA DE INFORMACIóN EN UNA TABLA

El orden en el que vemos las columnas (DNAME, DEPTNO) es en el que se ha puesto en el comando SELECT:

Para seleccionar determinados registros o filas de la base de datos, debe añadirse una condición con el comando WHERE al usar SELECT... FROM:

SELECT *

FROM EMP

WHERE DEPTNO=30;

Headers(); PrintAll;

obtiene todas las columnas pero de los empleados del Departamento número 30:

WHERE obliga a ORACLE a buscar en la información de la tabla y mostrar solo aquellas líneas o registros que cumple la condición.

Condiciones múltiples para una búsqueda

A veces WHERE va seguido de más de una condición:

SELECT ENAME, JOB, SAL FROM EMP

WHERE JOB = 'SALESMAN' AND SAL >=100;

En este caso se piden los datos del nombre, trabajo, salario de aquellos empleados de la tabla cuyo empleo sea 'SALESMAN'[1] y su salario mayor o igual que 100:

Para las condiciones alternativas, negativas (excluyentes) se utilizan los comandos OR, y NOT. Así por ejemplo:

pide los datos de empleados con categoría manager o que su salario sea mayor que 100:

El siguiente ejemplo pide un listado con los nombres, categorías y número de departamento de los empleados cuyo trabajo sea clerck (oficinista) y su departamento sea distinto[2] del 30,

y su resultado es el siguiente:

Mediante los comandos BEETWEEN y AND pueden pedirse datos comprendidos en un rango determinado. El ejemplo siguiente facilita los el nombre y el salario de los empleados cuyo salario esté comprendido entre 800 y 900:

SELECT ENAME, SAL

FROM EMP WHERE SAL BETWEEN 800 AND 900;

El comando IN permite seleccionar líneas cuyo campo contenga uno de los valores de una lista especificada entre paréntesis:

SELECT * FROM DEPT WHERE DEPTNO IN (10,30);

En este ejemplo, como la lista está compuesta por sólo 2 valores, podría haberse empleado OR para realizar la misma búsqueda:

SELECT * FROM DEPT WHERE DEPTNO='10' OR DEPTNO='30';

Búsquedas por palabras incompletas

Pueden seleccionarse líneas de información mediante búsquedas de palabras incompletas: buscar empleados en cuyo nombre tenga una 'R' en 3[[ordmasculine]] lugar:

SELECT ENAME FROM EMP WHERE ENAME LIKE '__R%';

Headers();

PrintAll;

En este ejemplo se utiliza el operador LIKE de SQL. Además, mediante guiones se especifican las dos posiciones ('__R%'), y el signo % indica que puede seguir cualquier cadena de caracteres.

Los operadores BETWEEN, IN y LIKE, pueden ir precedidos por NOT y unidos con AND y OR, para formar una búsqueda tan completa como se necesite.

Cómo se ordena el resultado de una búsqueda

En todos los ejemplos hasta ahora, las líneas resultado de las búsquedas han estado en un orden aleatorio, determinado por el programa ORACLE. Puede controlarse el orden de las líneas seleccionadas añadiendo la opción ORDER BY al final de nuestro comando SELECT.

Como ejemplo suponga que desea obtener una lista de los empleados que trabajan en el departamento 30 pero ordenados por su salario. Esta ordenación no está limitada a un orden ascendente o a un único criterio, así por ejemplo, pueden ordenarse los empleados por puesto de trabajo, y dentro de esta ordenación ( los trabajos) por orden de salarios:

SELECT JOB,SAL,ENAME

FROM EMP

ORDER BY JOB,SAL DESC;

Headers();

PrintAll;

donde DESC indica orden descendente (de mayor a menor), y cuyo resultado es el siguiente:

Cómo se evitan las líneas repetidas en un listado

Supóngase que se desea obtener una lista de los trabajos en la empresa. Si se pide una columna completa

SELECT JOB

FROM EMP;

Headers();

PrintAll;

al no haber ninguna condición en nuestra búsqueda, ORACLE trae a la pantalla todos los valores de la columna trabajos. En la lista obtenida hay repeticiones que pueden eliminarse especificando DISTINCT al escribir la búsqueda:

SELECT DISTINCT JOB FROM EMP;

Headers(); PrintAll;

BúSQUEDA DE INFORMACIóN EN VARIAS TABLAS: JOIN QUERY

Hasta ahora se han efectuado búsquedas en una sola tabla, pero puede ocurrir que la información que buscamos no esté almacenada en una sola tabla. Como ORACLE es una base de datos relaciona permite seleccionar información de más de una tabla y combinar los resultados en un listado. La búsqueda combinada en más de una tabla se denomina búsqueda relacional o join query.

En las bases de datos jerárquicas y en anillo, las relaciones son estáticas porque están perfectamente definidas en la estructura de la base de datos desde el diseño, por lo que las consultas deben seguir ese mismo esquema. En las bases de datos relacionales como ORACLE, las relaciones son dinámicas; se establecen en el momento de la consulta, y es posible extraer información según convenga en cada caso.

Por ejemplo, si se desea saber el nombre del departamento donde trabaja determinado empleado, y se intenta buscar en la tabla EMP (empleados), puede verse que no tiene columna con el nombre de departamento; sin embargo, la tabla de departamentos tiene el departamento (número y nombre). Como las dos tablas tienen una columna en común -el n[[ordmasculine]] de departamento-, es posible relacionar las dos tablas. Puede hacerse con dos búsquedas:

SELECT ENAME, DEPTNO

FROM EMP

WHERE ENAME = 'WARD';

SELECT LOC FROM DEPT WHERE DEPTNO = 30;

Pero puede llegarse al mismo resultado mediante una única búsqueda indicando la tabla y la columna separados por un punto. El ejemplo siguiente

SELECT ENAME,LOC FROM EMP,DEPT

WHERE ENAME='KING' AND EMP.DEPTNO =DEPT.DEPTNO;

Headers();

PrintAll;

busca los empleados en la tabla EMP cuyo nombre es KING y utiliza el valor del código del empleado localizado para buscar en la otra tabla (DEPT) el nombre del departamento de trabajo, y busca los registros donde coinciden los valores de las columnas EMPTO y DEPTO:

En el ejemplo anterior, en la tabla EMPL se busca la fila que contiene al empleado 'KING', se determina el número de departamento al que pertenece DEPTNO, y con el número de departamento, en la tabla DEPT se extrae el registro con el mismo valor de DEPTNO. La cláusula

EMP.DEPTNO =DEPT.DEPTNO

especifica que los registros de las tablas EMP y DEPT deben coincidir en el valor del campo o columna DEPTNO.

EXPRESIONES ARITMéTICAS Y FUNCIONES PARA EL MANEJO DE TEXTO

Expresiones aritméticas

Para construir una expresión aritmética deben combinarse nombres de columnas y constantes numéricas con una operación aritmética. En el ejemplo siguiente

SELECT ENAME,SAL,COMM,SAL+COMM

FROM EMP

WHERE JOB='SALESMAN';

Headers();

PrintAll;

se obtiene un listado con una tercera columna que es la suma de salario y comisiones. La columna de la suma no es una columna real, es decir no está almacenada en nuestra base de datos, pero se construye dinámicamente como resultado de una búsqueda, y se puede operar con la columna resultado como si se tratara de una columna real.

Se adjuntan las principales funciones aritméticas:

Funciones aritméticas significado

+ suma

- resta

* producto

/ división

POWER exponenciación

ROUND redondeo

TRUNC trunca a entero

ABS valor absoluto

Funciones para el manejo de textos

Las funciones aritméticas nos permiten manipular información numérica, de forma parecida las funciones para manejo de texto character strings functions permiten manipular los campos que contienen texto.

El ejemplo siguiente busca en la tabla EMP los registros cuyo campo ENAME suene parecido a 'SCHMIDT':

SELECT ENAME FROM EMP

WHERE SOUNDEX(ENAME)=SOUNDEX('SCHMIDT');

Headers(); PrintAll;

Se adjuntan las principales funciones de texto:

Funciones de texto significado

| concatena textos

LENGTH mide la longitud de un texto

SUBSTR corta un texto

INSTR inserta un texto dentro de otro

UPPER pone en mayúsculas

LOWER pone en minúsculas

SOUNDEX sonido de un texto

FORMATO DE FECHA Y NúMERO

Formato de fecha

Al crear la tabla emp se definió la columna hiredate como información tipo fecha (HIREDATE DATE). El formato estándar será Día-mes-año (03-Sept-93), pero pueden utilizarse otros formatos. Para cambiar de formato, ORACLE tiene el operador TO_CHAR(nombre_de_columna name, formato).

En el siguiente ejemplo se listan algunos datos de los empleados que trabajan en el Depto 30 y la fecha en formato DY DD MM YY (día de la semana, día, mes, año):

SELECT ENAME,JOB,

TO_CHAR(HIREDATE,'DY DD MON YYYY') HIREDATE

FROM EMP WHERE DEPTNO = 20;

Headers(); PrintAll;

ORACLE permite una amplia variedad de formatos:

Formato de fecha ejemplo

estándar 22-OCT-93

DAY MONTH DD, YYYY WEDNESDAY OCTOBER 17, 1993

Day DD Mon YYYY Wed 22 Oct 1993

DY "the" ddth "of" Month YYYY Wednesday the 22nd of October 1993

Operaciones aritméticas con fechas

Además de poder dar formato a la fecha, pueden realizarse operaciones aritméticas en los campos de fechas:

SYSDATE siempre nos da la fecha del día (fecha interna del ordenador). La expresión HIREDATE+ 4500 suma 4500 días a la fecha. La consulta muestra aquellos registros cuya fecha HIREDATE es de hace 4500 días.

ORACLE permite: calcular días, meses o años entre fechas; calcular la última fecha del mes; calcular la fecha del día siguiente.

FUNCIONES PARA EL MANEJO DE GRUPOS DE FILAS

Las funciones para grupos permiten seleccionar información a partir de grupos de líneas o registros. Por ejemplo, pueden agruparse todos los empleados que pertenezcan al mismo departamento y entonces calcular el salario máximo en cada grupo de departamentos:

SELECT DEPTNO,MAX(SAL)

FROM EMP GROUP BY DEPTNO;

Headers(); PrintAll;

En una búsqueda de grupos, cada línea en el resultado de la búsqueda, corresponde a un grupo de líneas de nuestra tabla, la columna que se pone a continuación de group by es aquella por la que queremos agrupar las líneas de la tabla. En el ejemplo anterior cada línea de la tabla EMP se incluye en uno de los tres grupos, uno para cada departamento, dependiendo de su valor en el campo DEPTO: todas las líneas de su mismo grupo tienen el mismo número de departamento.

Podemos combinar las funciones de grupo con las búsquedas relacionales. Además, hay tres funciones que pueden utilizarse con los grupos:

* SUM : Para sumar los valores de los campos, dentro de los grupos definidos por GROUP BY.

* COUNT: Para contar el número de líneas que entran en cada uno de esos grupos.

* AVG: Para saber la medida de los valores de campos específicos en cada grupo.

El siguiente ejemplo tiene como objetivo saber cuantos empleados están trabajando en cada categoría en cada departamento, cuantos secretarios hay en el departamento de ventas y, en esos grupos, cuál es la suma y media de los salarios:

SELECT DNAME,JOB,SUM(SAL),

COUNT(*),

AVG(SAL)

FROM EMP,DEPT

WHERE EMP.DEPTNO=DEPT.DEPTNO

GROUP BY DNAME,JOB;

Headers(); PrintAll;

Condiciones de búsqueda de un grupo de líneas: HAVING

Así como el operador WHERE se especifican las condiciones para las búsquedas con líneas individuales, con HAVING pueden especificarse las condiciones de búsqueda para grupos de líneas.

Supongamos que interesa una búsqueda como la anterior, pero en la que sólo se necesita ver aquellos grupos que tengan al menos dos empleados:

SELECT ENAME,JOB,SUM(SAL),COUNT(*),AVG(SAL)

FROM EMP

WHERE EMP.DEPTNO = DEPT.DEPTNO

GROUP BY DNAME,JOB

HAVING COUNT(*)>=2

Headers(); PrintAll;

SUBBúSQUEDAS O SUBQUERIES

Supóngase, por ejemplo, que se desea obtener una lista con todos los empleados que tienen el mismo empleo que Jones; puede omitirse el empleo de Jones y ORACLE lo busca, en lo que constituiría una búsqueda subordinada o subbúsqueda:

SELECT ENAME,JOB

FROM EMP

WHERE JOB =

(SELECT JOB

FROM EMP

WHERE ENAME = 'KING'));

ORACLE realiza las subbúsquedas antes, por que necesita el resultado de estas para las búsquedas.

Como ejemplo adicional puede buscarse el empleado que gana más que la media de todos los salarios de los empleados:

SELECT ENAME,SAL

FROM EMP

WHERE SAL >

(SELECT AVG(SAL)

FROM EMP);

Headers(); PrintAll;

MODIFICACIóN DE LA INFORMACIóN ALMACENADA

Como se ha visto antes, el comando SELECT permite ver un grupo de registros de una o más tablas. Con SQL también pueden añadirse o modificarse líneas:

* UPDATE: Cambia valores almacenados en tablas.

* INSERT: Añade líneas a una tabla.

* DELETE: Borra líneas a una tabla.

Actualización de datos en la tabla

Si se desease subir el sueldo a todos los oficinistas, sería necesario actualizar o cambiar el valor del salario. Es decir, se debe actualizar, en la tabla de empleados, el campo de salario en aquellas líneas en que el trabajo sea oficinista. El comando UPDATE se escribe seguido por la tabla donde realizamos el cambio y para indicar la actualización, se escribe Set seguido por el cambio, y finalmente la condición (opcional) en la que se indican las líneas que se van a modificar:

UPDATE EMP

SET SAL=SAL+100

WHERE JOB='CLERCK';

Headers(); PrintAll;

un mensaje confirmará que la actualización ha tenido lugar.

Cómo insertar nuevos registros en una tabla

El comando INSERT se ha utilizado hasta ahora para introducir líneas de información, pero una línea cada vez. Sin embargo, puede usarse este comando para añadir un conjunto de líneas desde una tabla hacia otra. Puede hacerse esto utilizando una búsqueda para definir el conjunto de líneas que se van a insertar en la tabla.

Supongamos que en nuestra base de datos tenemos una tercera tabla llamada PROMOCIóN, con algunas de las columnas de la tabla DEPT y queremos introducir en ella la información de todos los vendedores que tengan de comisión una cifra superior al 25% de su salario, copiando la información desde la tabla EMP:

INSERT INTO PROMOCION (ENAME,JOB,SAL,COMM)

SELECT ENAME,JOB,SAL,COMM

FROM EMP

WHERE COMM > 0.25 * SAL;

El comando Insert utiliza una subbúsqueda.

Borrado de registros de una tabla

Para borrar se emplea la orden Delete y se puede utilizar con where para determinar los registros que se quieren borrar. Así por ejemplo, para borrar el departamento 40 se haría lo siguiente:

DELETE FROM DEPT WHERE DEPTNO=40;

Cuando ORACLE ha realizado la orden aparece 1 record deleted. Puede pedirse un listado de todos los departamentos para comprobarlo:

SELECT * FROM DEPT;

Las condiciones para todos esos comandos demuestran como SQL emplea la misma sintaxis tanto para las búsquedas como para la manipulación de la información. En los comandos SELECT, UPDATE, INSERT y DELETE, la condición con WHERE es opcional.

CAMBIOS EN LA ESTRUCTURA DE UNA BASE DE DATOS

ORACLE proporciona los comandos necesarios que se necesitan para modificar la estructura de una base de datos. En esta sección utiliza SQL para:

* ALTER TABLE ADD: Añadir una columna a una tabla existente.

* ALTER TABLE MODIFY: Hacer una columna existente más larga.

Siguiendo con los ejemplos anteriores, se va a aumentar la base de datos modelo para poder asignar empleados a proyectos de igual forma que hay empleados asignados a departamentos. Se trata en definitiva de crear una nueva tabla y practicar los comandos ALTER TABLE en su diseño.

El cambio en la estructura de la base de datos exige varios pasos. Primero, con el comando CREATE, hay que añadir la tabla proyectos a la base de datos:

CREATE TABLE PROJ (PROJNO NUMBER(3) NOT NULL,

PNAME CHAR(5), BUDGET NUMBER(7,2));

En segundo lugar, con el comando INSERT, se introducen algunas líneas:

que son los proyectos en curso dentro de la empresa. Los datos introducidos en la nueva tabla, pueden examinarse con el comando SELECT actuando sobre la nueva tabla proyectos (PROJ):

SELECT * FROM PROJ;

Headers(); PrintAll;

Finalmente para que puedan hacerse búsquedas relacionales sobre las tablas PROY y EMP, debe añadirse una columna a EMP denominada número de proyecto (PROJNO), para que las tablas tengan alguna columna en común. Con este fin se utiliza el comando ALTER TABLE:

ALTER TABLE EMP ADD (PROJNO NUMBER(3));

A este comando se le indica el nombre de la tabla a modificar, la columna que se quiere añadir, y el tipo de información y su longitud máxima. Ahora puede seleccionarse la tabla EMP y ver que en cada línea hay un campo más.

SELECT * FROM EMP;

Headers(); PrintAll;

Como ejemplo del comando UPDATE, van a asignarse todos los empleados del Depto 20 y todos los vendedores al proyecto 101:

UPDATE EMP SET PROJNO=101 WHERE DEPTNO =20 OR JOB='SALESMAN'

9 records updated.

Puede consultarse la tabla para confirmar la actualización:

Para completar el ejemplo, se asignan el resto de empleados -los que no tienen proyecto asociado- al proyecto 102:

UPDATE EMP

SET PROJNO=102

WHERE PROJNO IS NULL;

5 records updated

La actualización de las líneas con el número de proyecto, completa la modificación de la base de datos ejemplo y permite relacionar los empleados con los proyectos como antes se hacía con los departamentos.

Es posible, ahora que las tablas tienen un campo común, el número de proyecto, hacer búsquedas relacionales:

SELECT ENAME,JOB,DEPTNO,PNAME

FROM EMP,PROJ WHERE EMP.PROJNO = PROJ.PROJNO;

Headers(); PrintAll;

Cómo modificar la capacidad de los datos de una columna

En la definición de la tabla de datos se asigna a cada columna una capacidad (2, 14, 13):

CREATE TABLE DEPT (DEPTNO NUMBER(2),

DNAME CHAR(14),

LOC CHAR (13));

Pero puede plantearse en un momento dado, cambiar el ancho o capacidad de una columna. En el ejemplo siguiente, al intentar actualizar una columna con el valor 105000,

el SQL notifica un error debido a que esa columna sólo tiene capacidad para 7 dígitos incluyendo la coma y los dos decimales (7,2). Se necesita modificar la definición de la columna budget, manteniendo el tipo de información que contiene pero haciéndola más ancha:

ALTER TABLE PROJ MODIFY BUDGET NUMBER(8,2);

y aparece: 1 record updated.

Una vez modificada la capacidad, la orden

se procesa correctamente.

VISTAS ALTERNATIVAS DE INFORMACIóN

ORACLE permite diseñar y almacenar presentaciones alternativos para un conjunto de información dentro de la base de datos.

Las presentaciones o vistas (views) son tablas virtuales, como ventanas, a través de las cuales, vemos información almacenada en la base de datos. Los views no contienen información propia, pero puede operarse con ellas como si fueran tablas reales.

La utilización de views tiene tres ventajas:

* Simplifica el acceso a la información.

* Independencia de la información.

* Privacidad de la información.

Como ejemplo va a crearse un view como un subconjunto de la tabla completa, que nos muestre solamente algunas columnas de algunos empleados (los del Dpto n[[ordmasculine]] 10).

CREATE VIEW asigna un nombre al view y define su contenido en forma de una búsqueda.

Búsqueda de información en un view

Puede utilizarse un view como si de una tabla se tratase. Para recuperar la información agrupada en un view se procese con el comando SELECT:

Asegurar la integridad de la información en los views

Cuando hemos creado el view con la cláusula WITH CHECK OPTION, Oracle asegura que toda la información que se añada a la tabla cumplirá la condición con la que se creó, WHERE DEPTNO='10'.

Si intentamos introducir un empleado del dpto 20:

da un error que indica que ese dato es incompatible con las condiciones de construcción del view.