You are on page 1of 95

I.E.S.

TRASSIERRA
Crdoba
http://www.iestrassierra.com

Departamento de Informtica

APUNTES DE SQL
Etapa:

Formacin Profesional Especfica.

Ciclo:

Desarrollo de Aplicaciones Web.

Nivel:

Superior.

Mdulo:

Bases de Datos.

Profesor:

Salvador Prez Jorge

INDICE:
Tema 1.- El lenguaje SQL .................................................................................. 1
Tema 2.- Sentencias SQL .................................................................................. 6
Tema 3.- El lenguaje de manipulacin de datos LMD ................................ 12
Tema 4.- Funciones ......................................................................................... 28
Tema 5.- Consultas sobre varias tablas ........................................................ 44
Tema 6.- Archivos de comandos e informes ................................................ 55
Tema 7.- Sentencias de actualizacin de datos y transaccionales ............... 66
Tema 8.- Lenguaje de definicin de datos LDD ............................................ 73
Bibliografa ....................................................................................................... 93

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 1.- EL LENGUAJE SQL.1.1.- Qu es SQL.


1.2.- Uso de SQL.
1.3.- Principales caractersticas.
1.4.- Sublenguajes SQL.
1.5.- El editor de SQL *Plus.

1.1.- QU ES SQL.El SQL es un lenguaje que permite comunicarnos con un SGBDR. A pesar de que su nombre
proviene de las iniciales Structured Query Languaje (Lenguaje Estructurado de Consultas),
actualmente el SQL es un lenguaje capaz de ser usado para consultas, para actualizacin y
definicin de datos y para el control, consistencia y confidencialidad de los datos.
El modelo de base de datos relacional fue enunciado por Codd en los aos 70. El lenguaje
SQL (originalmente SEQUEL2) fue desarrollado en 1976 por IBM en un prototipo de base de
datos relacional llamada SYSTEM R. En 1979 Oracle Corporation comercializa el primer
producto de este lenguaje, vigente hasta la actualidad.
Hoy, SQL est implementado en muchas grandes empresas y es aceptado como estndar
cumpliendo las normas ANSI/ISO/FIPS. No obstante y como en cualquier otro lenguaje los
estndares que no siempre son seguidos por los fabricantes de este tipo de productos con lo
que nos encontramos con gran variedad de versiones.

1.2.- USO DE SQL.Las peticiones sobre los datos se expresan mediante sentencias que deben estar escritas segn
las normas sintcticas y semnticas de este lenguaje.
SQL puede ser usado como sentencias de un programa escrito en otro lenguaje (SQL
embebido). Esta forma de trabajo est ms orientada a los programadores que adems de
conocer la sintaxis SQL debern conocer el lenguaje de programacin correspondiente
(COBOL, FORTRAN, PL71, C, etc.). Pero adems de embebido en un programa, SQL puede
usarse de forma interactiva, esto es, ejecutando la sentencia de consulta y recibiendo
instantneamente el resultado de la misma por pantalla. Esta posibilidad dota al lenguaje de
mucha flexibilidad para su uso por parte de personal poco especializado (usuarios finales).
Hay dos tcnicas para utilizar el SQL embebido en programas. En una de ellas, llamada SQL
esttico, las sentencias incluidas en el programa no pueden cambiar durante su ejecucin. En
la otra, llamada SQL dinmico, una sentencia puede ser modificada total o parcialmente por
el propio programa durante su ejecucin. La mayora de los programas pueden codificarse
empleando SQL esttico, ms sencillo y eficiente que el dinmico. ste, en cambio,
Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

proporciona una mayor flexibilidad, que puede ser til en algunos casos especiales, y suele
requerir tcnicas de programacin ms avanzadas en el manejo dinmico de memoria.
Oracle tiene una extensin procedural llamada PL/SQL que mezcla el SQL estndar con
comandos puramente procedimentales (goto, while, for, ..). De esta forma se permite tratar
una a una las tuplas devueltas por una sentencia SQL.
El principal uso que harn del lenguaje los programadores y usuarios consistir en la
realizacin de consultas y actualizaciones sobr datos almacenados en tablas relacionales.
Pero tambin hay otras tareas que se pueden realizar mediante sentencias SQL, aunque
pertenecen ms a las responsabilidades del Administrador de Bases de Datos o ABD (en
ingls DBA). Son las siguientes:
1) Definicin y destruccin de objetos.
Antes de poder usar una tabla para almacenar o consultar datos en ella, hay que
describirla al SGBD, dndole su nombre y caractersticas. Esto se hace definindola.
Hay otros muchos objetos que maneja un SGBD, tales como espacios para ficheros
fsicos, ndices, etc. Todos ellos se definen con sentencias SQL. Normalmente, la
definicin de tablas y vistas corre a cargo del ABD, pero en algunos casos se permite a
algunos usuarios definir tablas para datos de uso privado.
2) Gestin de las autorizaciones de acceso.
Un usuario final no podr consultar o actualizar datos de una tabla si previamente no
ha sido autorizado para ello. Tampoco podr hacerlo un programa si la persona que ha
solicitado su ejecucin no ha sido previamente autorizada. Estas autorizaciones se
conceden o deniegan mediante sentencias SQL.
Normalmente, las autorizaciones las concede el ABD, pero puede haber casos en que
lo haga un usuario con respecto a sus datos privados, si se le permite tenerlos.

1.3.- CARACTERISTICAS.SQL es un lenguaje no procedural (se le indica qu hacer, no como hacerlo), en el cual hay
que dar muy pocas instrucciones para manejar la base de datos. No es procedural (no admite
estructuras de programacin) porque:
-

Su potencia estriba en que procesa varias filas a la vez.

La navegacin para buscar los datos es automtica, utilizando el optimizador.

SQL es un lenguaje relacionalmente completo, pues permite realizar cualquier consulta de


datos: la consulta puede devolver una tabla completa, una fila (tupla), una columna (atributo),
una celda (valor de un atributo para una tupla concreta) o un subconjunto de la tabla.
SQL es un lenguaje muy sencillo y parecido al idioma ingls y los comandos bsicos pueden
aprenderse en poco tiempo.
Adems dispone de las mismas sentencias para cualquier tipo de usuario: administrador,
programadores y usuarios finales.

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

1.4.- SUBLENGUAJES SQL.SQL se compone de tres sublenguajes especializados cada uno de ellos en un tipo de
operaciones sobre las tablas de la B.D.:

SQL

L.M.D. Lenguaje de Manipulacin de datos. (Consultas).


L.D.D. Lenguaje de Descripcin de datos. (Creacin de tablas).
L.C.D. Lenguaje de Control de datos. (Confidencialidad).

1.4.1.- L.M.D.Agrupa a los comandos que permiten realizar consultas, modificaciones, inserciones y
borrados sobre las tablas.
Comando
SELECT
UPDATE
INSERT
DELETE

Accin
Consultar datos (sin modificarlos) de una o varias tablas
Actualizar uno o varios valores de una o mas filas de una tabla.
Aadir una o varias tuplas a una tabla.
Borrar una o varias filas de una tabla.

Las sentencias UPDA TE, INSERT y DELETE deben validarse contra la Base de Datos o
deshacerse empleando los comandos COMMIT o ROLLBACK.
1.4.2.-L.D.D.Contiene los comandos utilizados para definir, borrar, reemplazar o alterar estructuras de la
base de datos.
Comando
CREATE
ALTER

Accin
____
Definir nuevos objetos, por ejemplo una tabla,
Modificar las caractersticas de un objeto ya existente, Por ejemplo
aadir una columna a una tabla,
REPLACE Reemplazar el objeto por uno nuevo si existiese previamente. *
DROP
Borrar un objeto. Por ejemplo una tabla completa, no solo las filas.
RENAME
Cambiar de nombre de un objeto, Por ejemplo una tabla, vista,
procedimiento o sinnimo,
TRUNCATE Borra las filas de una tabla o ndice sin borrar su estructura. La tabla
permanece pero vaca.

1.4.3.- LCD.Comandos utilizados por el administrador o por el dueo de un objeto para conceder o
suprimir privilegios de acceso a la Base de Datos o a un objeto,
Comando
GRANT
REVOKE

Accin
Concede autorizaciones a los usuarios para acceder a objetos.
Suprime (revoca) autorizaciones.

____

Solo vlido para ciertos objetos

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

1.5.- EL EDITOR DE SQL *PLUS.SQL *Plus es la herramienta de Oracle para ejecutar comandos SQL.

Comando CONNECT.-

Una vez iniciados los servicios, ejecutamos el programa Ejecutar lnea de comandos y tras el
prompt SQL> escribimos el comando de conexin seguido del usuario y contrasea que
hayamos indicado en la instalacin:
SQL> conn[ect] [usuario/password]
Si no especificamos el usuario/password, nos ser solicitado por la propia herramienta.
Para trabajar en entorno grfico deberemos ejecutar el programa Ir a la Pgina Inicial de
Bases de Datos que nos solicitar el usuario y clave. A continuacin deberemos picar sobre el
icono SQL y despus sobre Comandos SQL.
El editor de lneas proporcionado por SQL*Plus es bastante rudimentario y similar al edlin
del MS-DOS, no obstante el usuario puede elegir el editor de texto que desee. Desde el
prompt de SQL*Plus pueden ejecutarse comandos, algunos de los cuales pueden realizarse
mediante las opciones de la ventana de SQL*Plus.

Comando EXIT.-

Sale de SQL *Plus. Sintaxis:


SQL> exit

Comando HELP.-

Proporciona ayuda sobre los comandos de SQl *Plus. Para obtener ayuda genrica:
SQL> help index
Para obtener ayuda de un comendo:
SQL> help <comando>

Comando EDIT.-

Llama al editor activo del sistema operativo. Se puede elegir el editor utilizando:
SQL> define_editor = <nombre_editor>
Para activar el editor bastar con teclear
SQL> ED[IT]
Si tras el comando no se indica un nombre de fichero, se crear el temporal "afiedt.buf". Si se
especifica un nombre, se genera un fichero con ese nombre y una extensin sql.

Comando SPOOL.-

El comando SPOOL se utiliza para almacenar el RESULTADO de la ejecucin de una


SELECT en un fichero.

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

Para activarlo se escribe:


SQL> SPOOL <nombre_fichero>
Y para desactivarlo:
SQL> SPOOL OFF
Genera un fichero, con extensin por defecto .lst, con el resultado de la SELECT ejecutada.
Si en vez de a un fichero queremos mandar el resultado a la impresora, para activarlo:
SQL> SPOOL ON
Y para desactivarlo:
SQL> SPOOL OUT

Comando SAVE.

El comando SAVE guarda en un fichero el contenido de la sentencia SQL que est


actualmente en el buffer. Su sintaxis es:
SQL> SAVE <nombre_fichero> [REPLACE]
Esto crea un fichero de sistema operativo con extensin sql con la SELECT escrita
anteriormente.

Comando START.

El comando START permite ejecutar un fichero de comandos creado previamente y que


contenga ms de una sentencia SQL. Su sintaxis es:
SQL> START <nombre_fichero>

Comando GET.

Lleva al buffer SQL el fichero indicado. Si la extensin del nombre del fichero a editar no es
SQL hay que indicar el nombre completo. Su sintaxis es:
SQL> GET <nombre_fichero>

Comando DESCRIBE.

El comando DESCRIBE o DESC muestra la estructura de una tabla. Su sintaxis es:


SQL> DESC <nombre_tabla>

Comando HOST.

Permite ejecutar un comando de sistema operativo sin salir de la sesin de SQL*Plus. Su


sintaxis es:
SQL> HOST [comando]
Si se omite el comando se sale temporalmente al S.O.. Para regresar a SQL*Plus deberemos
usar el comando EXIT que nos devolver a la sesin de la base de datos.

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 2.- SENTENCIAS SQL.2.1.- Elementos de SQL.2.1.1.- Objetos de un esquema.


2.1.2.- Reglas para nombrar objetos.
2.1.3.- Reglas para referenciar objetos.
2.2.- Elementos de una sentencia SQL.
2.3.- Tipos de datos.
2.4.- Valores nulos.
2.5.- Constantes.
2.6.- Variables de entorno.

2.1.- ELEMENTOS SQL.Antes de estudiar las sentencias SQL *Plus debemos familiarizarnos con ciertos conceptos:
2.1.1.- Objetos de un Esquema.
Un esquema es un conjunto de objetos y estructuras de datos propiedad de un usuario. Cada
usuario tiene su propio esquema que coincide con el nombre del usuario que crea el objeto.
Los objetos se crean y modifican su estructura con el lenguaje LDD e incluyen los siguientes
tipos de objetos:
Tablas.

ndices

Secuencias.

Vistas.
Sinnimos.

Dep. de Informtica

Unidad bsica de almacenamiento en un sistema de gestin de


bases de datos relacionales. Una tabla consta de una o ms
unidades de informacin (filas), cada una de las cuales contiene el
mismo tipo de valores (columnas).
Objeto de base de datos creado para aumentar el rendimiento de
recuperacin de datos. Proporciona una ruta de acceso rpida a
los datos de una base de datos. Los ndices apuntan directamente
a la ubicacin de las filas que contienen los datos especificados.
Una secuencia genera una lista en serie de nmeros nicos para
las columnas numricas de una tabla de base de datos. Por
ejemplo, si dos usuarios desean insertar nuevos nmeros de
empleado en una tabla, la secuencia genera automticamente el
valor correcto para cada usuario.
Presentacin personalizada de los datos de una o ms tablas.
Alias de una tabla, vista, secuencia o unidad de programa.
Sinnimo privado: Sinnimo de un objeto de base de datos
definido por un usuario de Oracle para que otros usuarios
seleccionados de la base de datos puedan acceder a dicho objeto.
Sinnimo pblico: Sinnimo de un objeto de base de datos
definido por un administrador de base de datos para que todos los
usuarios de la base tengan acceso a dicho objeto.
6

I.E.S. TRASSIERRA - Crdoba

Agrupaciones.

Procedimientos
Funciones
almacenados (*).

SQL

Estructura de base de datos que contiene una o ms tablas con una


o ms columnas en comn. Las filas de una o ms tablas que
comparten el mismo valor en estas columnas comunes se
almacenan fsicamente juntas en la base de datos.
y Procedimiento:
Juego de sentencias SQL y PL/SQL agrupadas para solucionar un
problema especfico o realizar un conjunto de tareas relacionadas.

Funcin almacenada:
Juego de sentencias PL/SQL que puede llamarse por un nombre.
Las funciones son similares a los procedimientos, con la diferencia
de que una funcin devuelve un valor al entorno desde el que se
llama.
Paquetes (*).
Conjunto encapsulado de procedimientos, funciones y otros
objetos de programa relacionados almacenados juntos en la base
de datos.
Disparadores
Procedimiento almacenado que se dispara (ejecutado
almacenados en Base implcitamente) al emitir una sentencia INSERT, UPDATE o
de Datos (*).
DELETE para la tabla asociada.
Rplicas y Rplicas Copia local de una tabla maestra remota. Las rplicas pueden
Lgicas (*) (+).
utilizarse para replicar (copiar) toda la tabla o parte de ella, o para
replicar el resultado de una consulta en varias tablas. Las rplicas
pueden ser tanto actualizables como de slo lectura. Ambas son
copias de la tabla maestra. Una rplica de slo lectura se puede
refrescar peridicamente para reflejar los cambios realizados en la
tabla maestra. Los cambios realizados en una rplica actualizable
pueden propagarse a la tabla maestra y a cualquier otra copia.
Enlaces de Base de Un enlace de base de datos es un objeto de la base de datos que
Datos
permite acceder a objetos de una base de datos remota.
(*) Objetos disponibles si PL/SQL est instalado.
(+) Objetos disponibles con opcin distribuida.

Existen otros objetos que se crean y manipulan a travs de SQL y que se almacenan en la
Base de Datos pero no son creados dentro del esquema de un usuario ni son propiedad de
nadie. Estos objetos son:
Perfiles.
Roles.
Segmentos de Rollback.
Tablespaces.
Usuarios.
Directorios.
Algunos objetos tienen partes, as por ejemplo una columna es una parte de una tabla o vista.
Una particin es parte de una tabla o un ndice. Una restriccin de integridad es parte de una
tabla. Procedimientos y funciones son parte de un paquete.
Las tablas y los ndices pueden particionarse. Cuando ocurre esto, los objetos estn formados
por un cierto nmero de piezas llamadas particiones que tienen los mismos atributos lgicos.
Por ejemplo, todas las particiones de una tabla tienen las mismas definiciones de columnas y
restricciones, y todas las particiones del un ndice tienen las columnas indexadas.
Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

2.1.2. Reglas para Nombrar Objetos


Los nombres de objeto tienen que seguir las siguientes reglas:

Deben tener una longitud entre 1 y 30 caracteres, excepto el nombre de una base de
datos que est limitado a 8 caracteres y el de un enlace de base de datos a 128.

No puede estar entre parntesis, ni entrecomillado.

Pueden escribirse en maysculas o minsculas. Oracle no es sensible a esto.

Debe comenzar con un carcter reconocible por el conjunto de caracteres de la base de


datos, a menos que vaya acotado por dobles comillas.

Solo debe contener caracteres alfanumricos y el guin bajo _ .Tambin se admiten


los caracteres $ y # aunque no es aconsejable utilizarlos.

No puede coincidir con una palabra reservada.

Se puede nombrar un objeto con un nombre alternativo o sinnimo, y a una columna con un
nombre alternativo temporal denominado alias que se detallarn ms adelante.

2.1.3.- Reglas para Referenciar Objetos


Para referenciar un objeto se utiliza la siguiente sintaxis general:
[ esquema.]nombre-objeto [.parte-objeto ]
En el caso de que el objeto sea una tabla, deber anteponerse el nombre del usuario y un
punto al nombre de la tabla. Solo si la tabla pertenece (la cre) al usuario que realiza la
consulta se admite la omisin de la referencia (nombre de usuario propietario).
As por ejemplo el usuario PACO se referir a la tabla de su propiedad de nombre emple,
simplemente por su nombre:
SELECT * FROM emple ;
Si la usuaria MARIA quiere acceder a la misma tabla (suponiendo que el propietario la haya
autorizado a ello) tendr que referirse a ella como PACO.emple.
SELECT * FROM PACO.emple ;
En las consultas sobre una sola tabla no es necesario referenciar las columnas, basta con
indicar el nombre de la misma, pero si la consulta se refiere a varias tablas con columnas
sinnimas, el referenciado de columnas se torna en necesidad. La forma de referenciar una
columna es anteponindole el nombre de la tabla a la que pertenece y un punto.
hospital.codenf
indica que se trata de la columna codenf de la tabla hospital.
En la sentencia SELECT es frecuente asignar alias a las tablas (para acortar las sentencias) y a
las columnas (para que se visualicen ttulos de columna distintos a los nombres de campo).
Estos alias no son permanentes y solo se activan en esa sentencia

Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

Alias de nombre de tabla.La forma de asignar un alias al nombre de una tabla es escribiendo el nombre del alias a
continuacin del de la tabla (separados con un espacio). Por ejemplo:
SELECT
FROM
WHERE

E.numem, E.nomem, D.nomde


emple E, depar D
E.numdep=D.numdep;

No debe confundirse un alias de tabla, que solo tiene vigencia en la sentencia en que se
define, con un sinnimo que es un objeto consistente en un nombre alternativo para una
tabla o vista y que permanece mientras no se borre ese objeto.

Alias de nombre de columna.La forma de asignar un alias a una columna, principalmente para mejorar la presentacin
del resultado, es escribiendo el alias tras el nombre de columna y un espacio. Por
ejemplo:
SELECT E.numemp N DE EMPLEADO,
E.nomemp EMPLEADO,
D.nomdep DEPARTAMENTO
FROM
emple E, depar D
WHERE E.numdep = D.numdep;
Solo es necesario entrecomillar el alias cuando su nombre incluye espacios en blanco.

2.2.- ELEMENTOS DE UNA SENTENCIA SQL.Los elementos que componen una sentencia SQL son:
Palabras predefinidas.- Son palabras con un significado concreto en SQL: SELECT,
WHERE, INTO, etc.... Toda sentencia SQL comienza por una palabra predefinida.
Nombres de tablas y columnas.- Son definidas por el administrador cuando crea la B.D.
Constantes o literales.- Son series de caracteres que representan un determinado valor. Si
no representan valores numricos deben ir entre comillas simples.
Signos delimitadores.- Son caracteres especiales que sirven para delimitar los anteriores
elementos dentro de una sentencia cuando no van entre comillas. El ms usado es el
espacio, pero tambin lo son la coma y los operadores aritmticos, alfanumricos y de
comparacin.

2.3.- TIPOS DE DATOS.Cada

valor de columna que se manipula es un tipo de dato. Cada tipo de dato tiene una serie
de caractersticas asociadas.
Al crear una tabla se especifica el tipo de datos acoger cada columna. Luego, en funcin del
tipo de dato, podremos insertar ciertos valores o establecer ciertas comparaciones.
Dep. de Informtica

I.E.S. TRASSIERRA - Crdoba

SQL

Los tipos de datos son:


Cdigo Dato

Descripcin

Cadena de caracteres de longitud variable. Tamao mximo es


4000 bytes y el mnimo uno. Es obligatorio especificar precisin.
Cadena de caracteres de longitud variable teniendo un mximo de
longitud expresado en caracteres o bytes, depende del juego de
caracteres nacional indicado. El tamao mximo viene
determinado por el nmero de bytes requerido para almacenar
cada carcter. El lmite superior es 4000 bytes. Hay que
especificar precisin.
Numero de tamao 'n' (hasta 38) y , opcionalmente, 'd' decimales
(de -84 a 127).
Cadena de caracteres de longitud variable de hasta 2 Gb.
Fecha en formato DD:MM:AA:HH:MM:SS. Depende de las
variables "NLS". Siete bytes numricos. Rangos vlidos son desde
1 de Enero de 4712 adC al 31 de Diciembre de 4712 ddC.
Dato binario de longitud variable. Tamao mximo 2000 bytes. Se
debe indicar precisin.
Cadena binaria de longitud variable de hasta 2 Gb.
Cadena hexadecimal que representa la direccin nica de una fila
en una tabla. Este tipo se usa para almacenar los valores devueltos
por la pseudocolumna ROWID.
Cadena alfanumrica de longitud fija. Tamao mximo 2000
bytes. Si no se indica precisin el valor mnimo y valor por defecto
es 1 byte.

VARCHAR2(tam)
NVARCHAR2(tam)

NUMBER(n[,d])

8
12

LONG
DATE

23

RAW(tam)

24
69

LONGRAW
ROWID

96

CHAR(tam)

Los cdigos de los tipos de datos son para utilizacin interna. El cdigo interno de un dato se
muestra cuando se utiliza la funcin DUMP

2.4.- VALORES NULOS.Independientemente del tipo de datos definido en una columna (atributo) de una tabla, el valor
nulo puede ser admitido o no entre sus valores, en funcin de que se omitiera o incluyera la
clusula NOT NULL en la creacin de la tabla.
Un campo nulo es aquel que no contiene caracteres o valores. Un campo nulo no es lo mismo
que una cadena de caracteres de longitud cero () o un campo con el valor 0. Un campo se
establece con valor nulo cuando el contenido del campo es desconocido. Por ejemplo, un
campo en el que deba aparecer la fecha de entrega de un prstamo de biblioteca, podra
dejarse con valor nulo hasta que el libro fuese devuelto.
El comportamiento de los valores nulos en las distintas operaciones en que puedan intervenir
se ir describiendo conforme se describan stas.

2.5.- CONSTANTES.Las constantes o literales son secuencias de caracteres que representan un valor determinado
de tipo numrico, alfanumrico o fecha:
Dep. de Informtica

10

I.E.S. TRASSIERRA - Crdoba

SQL

Numricas:

Nmeros. Ejemplo:

Alfanumricas:

Serie entrecomillada de hasta 254 caracteres. Ejemplo:


'Francisco'

Francisco
'BAR PACO''S'

BAR PACOS

Fechas:

Nmeros y caracteres especiales de fecha representados entre


comillas. Ejemplo:
'04-10-2011'

4
-586.21

La comparacin de valores es frecuente en las consultas SQL, tanto en las condiciones de


filtro (clusula Where) como en el orden de presentacin de resultados (clusula Order by).
La comparacin de dos valores requiere que ambos sean del mismo tipo. Dos valores nulos
son considerados como iguales. Dos valores alfanumricos vacos se consideran iguales.
Las normas que se siguen son las tpicas. En los valores alfanumricos no nulos se toman en
orden creciente del cdigo ASCII. La comparacin se hace carcter a carcter, comenzando
por la izquierda y completando con blancos por la derecha caso de que los operandos sean de
distinta longitud.

2.6.- VARIABLES DE ENTORNO.Los SGBD suelen disponer de unos registros especiales tambin llamados variables de
entorno que representan un valor determinado, pero ese valor puede variar de una ejecucin a
otra de la misma sentencia, lo que las diferencia de las constantes que permanecen
invariables.
Las variables de entorno se referencian por una palabra predefinida y algunas son:
Variable
UID

Descripcin
Devuelve un entero que es el identificador nico del usuario
conectado.
USER
USER
Devuelve un VARCHAR2 que contiene el nombre del usuario
conectado en la base de datos local.
USERENV USERENV Devuelve informacin acerca de la sesin actual en un tipo de
(opcin)
dato VARCHAR2. El argumento opcin puede tener los
valores:
'ENTRYID': Devuelve un identificador de la sentencia
ejecutada para auditorias.
'LANGUAGE': Devuelve el lenguaje y el territorio utilizado
durante
la
sesin
en
formato:
lenguaje_territorio_juegocaracteres.
'SESSIONID': Devuelve un identificativo de la sesin del
usuario para auditorias.
'TERMINAL': Devuelve el identificativo del sistema
operativo para el terminal usado.
Dep. de Informtica

Sintaxis
UID

11

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 3.- LENGUAJE DE MANIPULACIN DE DATOS.3.1.- SELECT bsico.


3.1.1.- Seleccin de columnas.
3.1.2.- Seleccin de tablas. Clusula FROM.
3.1.3.- Seleccin de filas. Clusula WHERE.
3.1.4.- Ordenacin de los resultados. Clusula ORDER BY.
3.2.- Expresiones.
3.2.1.- Operadores.
3.2.1.1.- Aritmticos.
3.2.1.2.- Alfanumricos.
3.2.1.3.- De fecha.
3.2.1.4.- De comparacin general.
3.2.1.5.- De comparacin de cadenas.
3.2.1.6.- De comparacin lgica.
3.2.1.7.- Lgicos.
3.3.- Ejercicios propuestos.

3.1.- SELECT BSICO.Las sentencias SQL estn formadas por distintas clusulas, cada una de las cuales empieza
con una palabra predefinida determinada.
La sentencia SELECT permite recuperar datos de una o varias tablas, vistas o rplicas. Para
seleccionar filas de una tabla se deber ser el propietario del esquema con el que se cre la
tabla, o, en caso contrario, tener permiso de acceso o tener un privilegio del sistema llamado
SELECT ANY TABLE, que permite acceder a cualquier tabla o vista.
A continuacin veremos como usar la sentencia SELECT para realizar consultas sencillas
sobre una nica tabla, usando una sintaxis simplificada de la sentencia:
SELECT
[DISTINCT] { col1 [, col2].. / * }
FROM
tabla
[ WHERE
predicado ]
[ ORDER BY col1 [, col2].. ]

3.1.1.- Seleccin de columnas.Dnde col-1 y col-2 son nombres de columnas de la tabla cuyo nombre figura en la clusula
FROM. Si se especifica el carcter comodn (*) se mostrarn todas las columnas de la tabla,
pero en el orden que ocupan. Si a pesar de querer mostrar todas las columnas, las deseamos en
un orden concreto habr que especificar todos los nombres de columnas en el orden deseado.
SELECT
FROM

Dep. de Informtica

nomem, salar, fecna


temple ;

12

I.E.S. TRASSIERRA - Crdoba

SELECT
FROM

SQL

*
temple ;

La clusula DISTINCT elimina, del resultado a mostrar, las filas repetidas.


Ejemplo: Mostrar los nmeros de empleado de los empleados que son directores.
SELECT
FROM

DISTINCT direc
tdepto ;

Obsrvese como la informacin devuelta es mucho ms significativa (justa y necesaria) si


usamos DISTINCT que si no lo hacemos.

3.1.2.- Seleccin de tablas. Clusula FROM.La clusula FROM indica el nombre de la tabla o tablas sobre las que se realizar la consulta.
En la clusula FROM deben aparecer los nombres de las tablas a las que se refieren las
columnas especificadas tras la palabra SELECT. Si se especifican varias tablas, sus nombres
deben separarse por comas.
Recordemos que cuando la tabla no es de nuestra propiedad el nombre del propietario y un
punto deben especificarse delante del nombre de la tabla.
SELECT
FROM

numem
scott.temple ;

3.1.3.- Seleccin de filas. Clusula WHERE.WHERE permite filtrar las filas de forma que sean devueltas solo las que cumplan cierta
condicin. El predicado de la clusula WHERE es una condicin que puede ser verdadera o
no. De momento vamos a suponer que se trata de una comparacin entre dos valores. Ms
adelante veremos otras posibilidades.
Ejemplos:
1).- Listar los nombres de los empleados que trabajan en el departamento 110.
SELECT
FROM
WHERE

nomem
temple
numde = 110;

Resultado: (puede obtenerse en otro orden):


NOMEM
PEREZ, MARCOS
MORAL, CARMEN
CAMPOS, ROMULO

Dep. de Informtica

13

I.E.S. TRASSIERRA - Crdoba

SQL

2).- Extraer todos los datos del departamento 110.


SELECT
FROM
WHERE

*
tdepto
numde = 110 ;

Resultado:
NUMDE
110

NUMCE
20

DIREC TIDIR
180
P

PRESU
90000

DEPDE NOMDE
100
DIRECCIN COMERCIAL

3.1.4.- Ordenacin de los resultados. Clusula ORDER BY.


La clusula ORDER BY permite mostrar los resultados en un orden determinado, admitiendo
la ordenacin por ms de una columna y en orden ascendente y descendente.
La(s) columna(s) especificada(s) en la clusula ORDER BY no tienen por que ser una(s) de
las especificadas en la clusula SELECT.
Ejemplos:
1).- Obtener los nombres de todos los departamentos ordenados alfabticamente.
SELECT
dname
FROM
dept
ORDER BY 1 ;
Resultado:
DNAME
ACCOUNTING
OPERATIONS
RESEARCH
SALES

2).- Obtener, en orden de nmero de empleado, el nombre y salario de los empleados cuyo
jefe es el empleado nmero 7902.
SELECT
FROM
WHERE
ORDER BY

ename, sal
emp
mgr= 7902
empno ;

Resultado:
ENAME
SMITH

SAL
800

3).- Listar el nmero de departamento, nombre y fecha de ingreso en la empresa y el salario,


de los empleados cuyo salario es inferior a 1300 euros, clasificndolos por departamento en
orden creciente y, dentro de cada departamento, por antigedad en la empresa.
SELECT
FROM
WHERE
ORDER BY
Dep. de Informtica

deptno, ename, hiredate, sal


emp
sal < 1300
1, 2 DESC;
14

I.E.S. TRASSIERRA - Crdoba

SQL

Resultado:
DEPTNO
20
20
30
30
30

ENAME
SMITH
ADAMS
WARD
MARTIN
JAMES

HIREDATE
17/12/80
23/05/87
22/02/81
28/09/81
03/12/81

SAL
800
1100
1250
1250
950

Si no se especifica ORDER BY, las filas de la tabla resultado sern devueltas en cualquier
orden. Incluso en distinto orden de una ejecucin a otra.
Cuando el SGBD ordena las filas ascendentemente (opcin por defecto), los valores nulos
se muestran detrs de todos los dems. Para obtener un orden descendente se especifica la
palabra DESC detrs del nombre o nmero de la columna; en este caso los nulos se
muestran al principio.
Adems, en vez de especificar el nombre de la columna por la que se quieren ordenar los
resultados, puede indicarse el nmero relativo de la columna en la clusula SELECT. As
por ejemplo, ORDER BY 3 equivale a especificara el nombre de la tercera columna de la
clusula SELECT.
Tambin puede ordenarse el resultado por ms de una columna. Para ello, basta dar sus
nombres o nmeros, separados por comas.
La sentencia SELECT siempre devuelve como resultado otra tabla. ste resultado, puede
construirse siguiendo los siguientes pasos, aunque el SGBD puede seguir otros:
1. De entre las tablas accesibles para el esquema por defecto se selecciona la nombrada
en la clusula FROM. Es como si se creara una copia temporal de ella, que pasar a
ser por ahora la tabla resultante.
2. Se filtran las filas de la tabla resultante, segn el predicado (condicin) de la clusula
WHERE, suprimiendo a todas las que no satisfagan la condicin.
3. Despus se eliminan las columnas que no se mencionen en la clusula SELECT. Las
restantes se retienen y se ponen en la misma posicin relativa en que se hayan escrito
en la clusula SELECT. Incluso puede repetirse alguna si su nombre aparece repetido
en esta clusula.
4. La tabla as formada es el resultado final de la sentencia SELECT.
5. La tabla anterior se presenta al usuario con sus filas clasificadas por los valores de la
columna mencionada en la clusula ORDER BY.

3.2.- EXPRESIONES.Una expresin es una combinacin de operadores, operandos y parntesis. Cuando el


SGBD ejecuta las operaciones indicadas en ella, produce como resultado un nico valor, de
forma que en la sentencia, la funcin es sustituida por su valor de retorno.
En el formato de SELECT simplificado, las expresiones pueden emplearse en la clusula
SELECT en vez de los nombres de columnas, y en la clusula WHERE en la formulacin del
predicado o condicin, dnde uno o ambos de los valores a comparar pueden ser el resultado
de evaluar una expresin.
Dep. de Informtica

15

I.E.S. TRASSIERRA - Crdoba

SQL

Los operandos pueden ser nombres de columnas, constantes, funciones, registros especiales
(USER, por ejemplo) u otras expresiones.

3.2.1.- Operadores.Los operadores actan sobre datos homogneos. Los hay unarios, que actan sobre un nico
operando (por ejemplo 2), pero la mayora son binarios actuando sobre dos operandos.
Segn el tipo de datos con los que operan, los operadores se clasifican en:

3.2.1.1.- Aritmticos.
Se usan para sumar, restar, multiplicar y dividir valores numricos o para hacerlos
negativos. El resultado de la operacin es siempre un nmero.
Operador Funcin
+,-

Suma y resta

+,-

Positivo y negativo

*, /

Multiplicacin y divisin

Ejemplo
SELECT
FROM
WHERE
SELECT
FROM
WHERE
SELECT
FROM

salar+comis
temple
sysdate fecin > 365;
*
temple
comis > -1;
salar*12 "Salario anual"
temple;

3.2.1.2.- Alfanumricos.
Operan sobre cadenas de caracteres. Solo existe el operador de concatenacin
alfanumrica que se escribe con dos rayas verticales (||) que permite unir dos cadenas.
Por ejemplo: SELECT 'Departamento de ' || nomde
FROM tdepto;
3.2.1.3.- De fecha.Con operandos de tipo fecha pueden operar los operadores + y -, segn las siguientes
tres operaciones:
Operacin

Valor devuelto

fecha + <num>

La fecha incrementada en <num> das.

fecha - <num>

La fecha disminuida en <num> das.

fecha1 fecha2

El nmero de das transcurridos entre dos fechas.


Si fecha1 es mayor que fecha2, el nmero devuelto ser
positivo, y en caso contrario negativo.

Dep. de Informtica

16

I.E.S. TRASSIERRA - Crdoba

Ejemplos:

SQL

SELECT
FROM

sysdate + 7 "Dentro de 7 das"


dual ;

SELECT
FROM

fecin fecna "Edad de ingreso en das"


temple ;

Si necesitamos usar una constante de tipo fecha, la nica forma es escribiendo la fecha
como una cadena y convirtindola a fecha con la funcin TO_DATE:
SELECT
FROM

sysdate TO_DATE('17/10/2010')
dual ;

En estos ejemplos se usa la tabla DUAL. sta se crea automticamente en Oracle y


est accesible para todos los usuarios. Contiene una sola columna llamada DUMMY
definida como VARCHAR2(1) y contiene una fila con el carcter "X".
Se usa para acceder a una variable de entorno sin necesidad de acceder a datos reales
de las tablas. A nosotros nos ser de mucha utilidad para experimentar con operandos
y funciones de tipo fecha a partir de la fecha actual (SYSDATE). Mas adelante
estudiaremos las funciones para manipular valores de tipo fecha (DATE).

3.2.1.4.- De comparacin general.Se utilizan en los predicados condicionales para comparar una expresin con otra. El
resultado puede ser verdadero TRUE, falso FALSE o desconocido UNKNOW
Operador Descripcin
=
Igualdad

<>, !=

No igual

>

Mayor

<

Menor

>=

Mayor o igual

<=

Menor o igual

Ejemplo
SELECT *
FROM tdepto
WHERE numde = 110;
SELECT *
FROM tdepto
WHERE numde <> 110;
SELECT *
FROM tdepto
WHERE numde > 110;
SELECT *
FROM tdepto
WHERE numde < 110;
SELECT *
FROM tdepto
WHERE numde >= 110;
SELECT *
FROM tdepto
WHERE numde <= 110;

Si alguno de los comparandos, o ambos, son nulos, el predicado toma el valor desconocido.

Dep. de Informtica

17

I.E.S. TRASSIERRA - Crdoba

SQL

El segundo comparando puede ser otra select, pero se especificar entre parntesis y
producir como resultado un nico valor (1 fila y 1 columna). Si devuelve una tabla vaca, el
predicado en que participa toma el valor desconocido.
Ejemplo: Obtener el nombre de los empleados cuyo sueldo cuadruplica al menos al del
empleado 550.
SELECT
FROM
WHERE

nomem
temple
salar > (

SELECT
FROM
WHERE

salar *4
temple
numem = 550) ;

Que tambin podra haberse formulado as:


SELECT
FROM
WHERE

nomem
temple
salar/4 > (

SELECT
FROM
WHERE

salar
temple
numem = 550) ;

Pero sera menos eficiente al tener que dividir por 4 todas las tuplas de la tabla TEMPLE.
Ojo.- Si en vez del empleado 550 se tratase del 560, al no existir ese empleado, la SELECT
devolvera una tabla vaca y el resultado final tambin sera una tabla vaca.
Resulvanse los ejercicios propuestos nmeros 1 al 9.
3.2.1.5.- De comparacin de cadenas.
EI operador LlKE se utiliza en comparaciones de cadenas de caracteres con un patrn de
bsqueda. Su sintaxis es:
<expresin> [NOT] LIKE <cadena>
Mientras el operador = buscara cadenas de caracteres idnticas, el operador LIKE
busca cadenas de caracteres que contengan la porcin de la cadena indicada.
Para realizar las bsquedas con LIKE se utilizan los caracteres comodines '%' y '_':
% (porcentaje) sustituye a cualquier cadena de 0 o ms caracteres.
_ (subrayado) sustituye a cualquier carcter, pero solo a uno.
Ejemplos:
LIKE 'Director'
LIKE 'M%'
LIKE '%Z%'
LIKE '_T%'

la cadena Director
cualquier cadena que empiece por M.
cualquier cadena que contenga una Z
cualquier cadena cuyo segundo carcter sea una T

Ejemplo: Listar el nombre y salario de los empleados cuyo nombre acabe en 'a'.
SELECT nomem, salar
Dep. de Informtica

FROM temple

WHERE nomem LIKE '%A';


18

I.E.S. TRASSIERRA - Crdoba

SQL

3.2.1.6.- De comparacin lgica. El operador BETWEEN permite hallar si un valor est o no comprendido entre otros dos,
ambos inclusive.
Su formato es:
<Exp_1> [NOT] BETWEEN <Exp_2> AND <Exp_3>
Si se omite NOT, el predicado es verdadero si el valor de la <Exp_1> est comprendido
entre el de la <Exp_2> y el de la <Exp_3>, ambos inclusive. Si se especifica NOT, el
predicado es verdadero cuando no est comprendido en ese intervalo.
Vamos a verlo un poco ms en detalle:
Si escribimos:
V1 BETWEEN V2 AND V3
Si ninguno de los valores, V1 , V2 o V3, es nulo, el predicado es verdadero si Vl es
mayor o igual que V2 y menor o igual que V3, En otro caso es falso.
Normalmente, V2 ser menor o igual que V3, Si as no fuera, el predicado ser falso
para todos los valores de Vl.
Si alguno de los valores, V1, V2 o V3, es nulo, el predicado toma el valor
desconocido.
Supongamos ahora:
V1 NOT BETWEEN V2 AND V3
Si ninguno de los valores, V1 , V2 o V3, es nulo, el predicado es verdadero si V1 es, o
bien menor que V2, o bien mayor que V3, En otro caso es falso.
Por tanto si V2 es igual o mayor que V3, el predicado se satisface para cualquier valor
de V1 (siempre es verdadero).
Si V1 es nulo, el predicado es desconocido.
Si Vl no es nulo:
- Si V2 y V3 son nulos, el predicado es desconocido,
- Si V2 es nulo y V3 no, el predicado es verdadero si V1 es mayor que V3, En otro
caso es desconocido.
- Si V3 es nulo y V2 no, el predicado es verdadero si V1 es menor que V2, Si no, es
desconocido.
Estos predicados son equivalentes a otros compuestos con los operadores lgicos AND y
OR que se vern ms adelante, as el predicado:
V1 BETWEEN V2 AND V3
y

es equivalente a:

V1 NOT BETWEEN V2 AND V3 equivale a:

Dep. de Informtica

(V1 > = V2) AND (V1 < =


V3)
(V1 < V2) OR (V1 > V3)

19

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplos:
1).- Obtener por orden alfabtico los nombres de los empleados cuyo salario est entre
250000 y 300000 pts.
SELECT
FROM
WHERE
ORDER BY

nomem
temple
salar BETWEEN 250000/166.386 AND 300000/166.386
nomem ;

Resultado:
NOMEM
DIEZ, AMELIA
:
:
VEIGA, JULIANA

(7 registros)

2).- Obtener por orden alfabtico los nombres y salarios de los empleados cuyo salario
dividido por su nmero de hijos cumpla una, o ambas, de las dos condiciones siguientes:
- Que sea inferior a 720 euros.
- Que sea superior al doble de su comisin.
SELECT
FROM
WHERE
ORDER BY

nomem, salar
temple
salar / numhi NOT BETWEEN 720 AND 2 * comis
nomem ;

En la ejecucin de esta sentencia se presentarn errores al dividir por numhi, pues ste vale
cero en algunas filas. Por ello, ser necesario reformular la consulta:
SELECT
nomem, salar
FROM
temple
WHERE
salar NOT BETWEEN numhi * 720 AND numhi * 2 * comis
ORDER BY nomem ;
Obsrvese que si en alguna fila el valor de la expresin ( 720 * numhi) no es menor que el de (2
* numhi * comis), la fila cumple las condiciones expresadas y debe aparecer en el resultado.
Este es el caso de MARCOS PREZ, y es conveniente asegurarnos que es eso lo que se busca.
Los operadores ANY y ALL permiten cuantificar un predicado de comparacin. Su
formato es:
<exp> <operador_relacional> ANY /
<lista_expres.> /
ALL
(subselect)
A pesar de que se ha dicho que una SELECT subordinada debe devolver un nico valor,
puede devolver varios si va precedida por ANY o ALL. En este caso, el resultado de la
subselect debe ser una tabla con una sola columna con una o ms filas.
Con ALL, el predicado cuantificado es verdadero si la comparacin es verdadera para
todos y cada uno de los valores de la lista, o resultantes de la sentencia subordinada.

Dep. de Informtica

20

I.E.S. TRASSIERRA - Crdoba

SQL

Con ANY, el predicado cuantificado es verdadero si la comparacin es verdadera para


uno cualquiera de los valores.
Veamos con ms detalle el comportamiento de estos operadores al usar subselect:
Si se especifica ALL:

Si la sentencia subordinada devuelve una tabla vaca, se conviene en que el


predicado cuantificado toma el valor verdadero.

Si devuelve uno o ms valores, y alguno de ellos es nulo, e1 predicado


cuantificado puede ser:
- Falso, si para alguno de los valores no nulos la comparacin es falsa.
- Desconocido, si la comparacin es verdadera para todos los valores no nulos.

Si devuelve uno o ms valores y ninguno de ellos es nulo, el predicado


cuantificado es verdadero si la comparacin lo es para todos los valores. En caso
contrario es falso.

Si se especifica ANY.

Si la sentencia subordinada devuelve una tabla con cero filas (vaca), se conviene
en que el predicado cuantificado toma el valor falso.

Si devuelve una o ms filas, y alguno de los valores es nulo, el predicado


cuantificado puede ser:
- Verdadero, si para alguno de los valores no nulos la comparacin es Verdadera
- Desconocido, si para todos los valores no nulos, la comparacin es falsa.

Si devuelve una o ms filas, y ninguna de ellas contiene nulo, el predicado es


Verdadero si la comparacin es Verdadera para alguno de los valores. En caso
contrario es falso.

Ejemplos:
1).- Obtener por orden alfabtico los nombres de los empleados cuyo salario supera al
mximo salario de los empleados del departamento 122.
SELECT
FROM
WHERE

nomem
temple
salar > ALL ( SELECT
FROM
WHERE
ORDER BY nomem ;

salar
temple
numde = 122 )

Resultado:
NOMEM
LOPEZ, ANTONIO
PEREZ, MARCOS

Esta consulta podra formularse con la funcin MAX que se ver en el tema siguiente.

Dep. de Informtica

21

I.E.S. TRASSIERRA - Crdoba

SQL

Supongamos que formulamos la misma consulta para el departamento 150:


SELECT
FROM
WHERE

nomem
temple
salar > ALL ( SELECT
salar
FROM
temple
WHERE
numde = 150)
ORDER BY nomem ;

Como el departamento 150 no existe, la SELECT subordinada devuelve como resultado una
tabla vaca. Por tanto, todas las filas satisfacen el predicado cuantificado y el resultado final
es una relacin de todos los empleados por orden alfabtico.
2).- Obtener por orden alfabtico los nombres de los empleados cuyo salario supera en tres
veces y media o ms al mnimo salario de los empleados del departamento 122.
SELECT
FROM
WHERE

nomem
temple
salar > = ANY (

SELECT
FROM
WHERE

salar * 3.5
temple
numde = 122)

ORDER BY nomem ;
Se podra formular de otra forma con la funcin MIN que se ver ms adelante.
Resultado:
NOMEM
LOPEZ, ANTONIO

Repitamos esta consulta para un departamento inexistente:


SELECT
FROM
WHERE

nomem
temple
salar > = ANY (

SELECT
FROM
WHERE

salar * 3.5
temple
numde = 150 ) ;

Como el resultado de la subselect es una tabla vaca, el predicado cuantificado es falso. El


resultado final, por tanto, es tambin una tabla vaca.
3).- Obtener por orden alfabtico los nombres y salarios de los empleados cuyo salario es
inferior a la comisin ms alta existente.
SELECT
FROM
WHERE

nomem, salar
temple
salar < ANY (SELECT
FROM
ORDER BY nomem ;

comis
temple)

Resultado:
NOMEM
SANTOS, SANCHO

Dep. de Informtica

SALAR
601

22

I.E.S. TRASSIERRA - Crdoba

SQL

El operador IN sirve para saber si un valor se encuentra entre una lista de valores dada. Su
sintaxis es:
<Exp> [NOT] IN <lista de constantes>
Si el valor de la <Exp> no es nulo y es igual a alguno de los valores de la lista, el
predicado es verdadero, y si no, es falso. Si la <Exp> es nula, el predicado toma el
valor desconocido.
En vez de la <lista de constantes> puede especificarse, entre parntesis, una sentencia
SELECT simplificada, la cual deber devolver una tabla con una sola columna y no
incluir la clusula ORDER BY.
El alumno debera comprobar las siguientes equivalencias:
IN
NOT IN

es equivalente a
es equivalente a

= ANY
!= ALL

Ejemplos:
1).- Obtener por orden alfabtico los nombres de los empleados cuya extensin telefnica es
250 750.
SELECT
FROM
WHERE
ORDER BY

nomem
temple
extel IN (250, 750)
1;

Resultado:
NOMEM
ALBA, ADRIANA
LARA, DORINDA
VAZOUEZ, HONORIA

2).- Obtener por orden alfabtico los nombres de los empleados que trabajan en el mismo
departamento que Pilar Glvez o Dorotea Flor.
SELECT
FROM
WHERE

nomem
temple
numde IN (

SELECT
FROM
WHERE

numde
temple
nomem IN ('GALVEZ, PILAR', 'FLOR,
DOROTEA') )

ORDER BY nomem ;
Resultado:
NOMEM
ALBA, ADRIANA
:
LOPEZ, ANTONIO

Dep. de Informtica

(6 registros)

23

I.E.S. TRASSIERRA - Crdoba

SQL

El operador NULL permite saber si un atributo de una tupla determinada es o no nulo. En


caso afirmativo el operador NULL devuelve verdadero y falso en caso contrario. No
devuelve desconocido, pues o es Nulo o no lo es. Caso de aadir la palabra NOT, el valor
devuelto ser el contrario. Su sintaxis es:
<col> IS [NOT] NULL
Ejemplo: Listar los nombres y sueldos totales (salario
empleados que cobran comisin:
SELECT
FROM
WHERE

ms comisin) de los

nomem, salar+comis "Salario mensual"


temple
comis IS NOT NULL;

El operador EXISTS permite detectar si el resultado de una subselect es o no una tabla


vaca. Devuelve verdadero si la sentencia subordinada no es una tabla vaca. Su sintaxis
es:
EXISTS (subselect)
Ejemplo: Listar los nombres y salarios de los empleados del departamento 112, pero
solo si hay alguno de ellos con un salario superior a 2000 euros.
SELECT
nomem, salar
FROM
temple
WHERE
numde=112 AND
EXISTS(
SELECT
*
FROM
WHERE

temple
numde=112 AND salar>2000 ) ;

3.2.1.7.- Operadores lgicos.Los predicados vistos hasta ahora son simples. Los operadores lgicos AND, OR y NOT
permiten expresar predicados compuestos combinando predicados simples o compuestos.
AND es el operador lgico de conjuncin, OR el de disyuncin y NOT el de negacin.
Los dos primeros se aplican a dos operandos (son binarios) y el ltimo a uno solo
(unario), y en todos los casos los operandos son otros predicados.
Un predicado compuesto, lo mismo que uno simple, puede tomar los valores Verdadero,
Falso o Desconocido.
Cuando se especifica AND, el resultado es verdadero si sus dos operandos lo son.
Cuando se especifica OR, es verdadero si lo es uno cualquiera de sus dos operandos al
menos. El resultado de NOT es verdadero si el operando al que se aplica es "Falso".
Obsrvese que las palabras AND y NOT pueden usarse en otros predicados sin
desempear el papel de operadores lgicos. En los predicados BETWEEN se usa la
palabra AND, y la palabra NOT puede aparecer en los predicados BETWEEN, NULL,
IN y LlKE, todos ellos simples. As, por ejemplo, (NOT <col> IS NULL) es un predicado
compuesto y (<col> IS NOT NULL) es simple y ambos son adems equivalentes.
Dep. de Informtica

24

I.E.S. TRASSIERRA - Crdoba

SQL

El valor devuelto por estos operandos lgicos, teniendo en cuenta la posibilidad de


valores nulos ya se vio cuando se estudiaron los valores nulos en el modelo relacional y
no se repiten para no ser reiterativos, pero el alumno debera repasarlos para entender los
resultados de las consultas sobre valores nulos.
Ejemplos:
1).- Obtener por orden alfabtico los nombres y comisiones de los empleados del
departamento 110 si hay en l algn empleado que tenga comisin.
SELECT
FROM
WHERE

nomem, comis
temple
numde = 110 AND
EXISTS (
SELECT
FROM
WHERE

*
temple
numde = 110 AND
comis IS NOT NULL)

ORDER BY nomem ;
Resultado:
NOMEM
CAMPOS, ROMULO
MORAN, CARMEN
PEREZ, MARCOS

COMIS

301

2).- Obtener los nombres, salarios y fechas de ingreso de los empleados que o bien ingresaron
antes del 1980 o bien tienen un salario inferior a 1100 euros. Clasificarlos por fecha y
nombre.
SELECT
FROM
WHERE
ORDER BY

nomem, salar, fecin


temple
fecin < '01-01-1980' OR salar <1100
fecin, nomem ;

Resultado:
NOMEM
PONS, CESAR
PEREZ, JULIO
:
:
SANTOS, SANCHO
MUOZ, AZUCENA

SALAR
1863
2644

FECIN
17/02/65
16/01/69

601
1052

22/01/01
15/10/01

(11 registros)

3).- Obtener por orden alfabtico los nombres de los departamentos que no sean de Direccin
ni de Sectores.
SELECT
FROM
WHERE
ORDER BY

Dep. de Informtica

nomde
tdepto
NOT (nomde LIKE '%DIREC%' OR nomde LIKE '%SECTO%')
nomde ;

25

I.E.S. TRASSIERRA - Crdoba

SQL

Esta sentencia podr formularse tambin as:


SELECT
FROM
WHERE
ORDER BY

nomde
tdepto
nomde NOT LIKE '%DIREC%' AND nomde NOT LIKE '%SECTO%'
nomde ;

Resultado:
NOMDE
.
FINANZAS
ORGANIZACION PERSONAL
PROCESO DE DA TOS

4) Obtener por orden alfabtico los nombres y salarios de los empleados que o bien no tienen
hijos y ganan ms de 1200 euros, o bien tienen hijos y ganan menos de 1800 euros.
SELECT
FROM
WHERE
ORDER BY
Resultado:

nomem, salar
temple
(numhi = 0 AND salar > 1200 ) OR (numhi < > 0 AND salar < 1800 )
nomem ;

19 filas seleccionadas.

3.3.- EJERCICIOS PROPUESTOS.Notas.- 1.- Antes de resolver los ejercicios propuestos es conveniente que el/la alumno/a se familiarice con
las tablas ejemplo a las que se refieren los mismos, realizando el esquema Entidad/Relacin.
2.- En los enunciados, por salario nos referimos a la columna salar y por sueldo a la suma de salario
y comisin).

1.- Hallar, por orden alfabtico, los nombres de los departamentos cuyo director lo es en
funciones y no en propiedad.
2.- Obtener un listn telefnico de los empleados del departamento 121 incluyendo nombre de
empleado, nmero de empleado y extensin telefnica. Por orden alfabtico.
3.- Hallar la comisin, nombre y salario de los empleados con ms de tres hijos, clasificados
por comisin, y dentro de comisin por orden alfabtico.
4.- Obtener salario y nombre de los empleados sin hijos por orden decreciente de salario y por
orden alfabtico dentro de salario
5.- Obtener la relacin alfabtica de los departamentos con presupuesto inferior a 30000
euros. El nombre de los departamentos se preceder de la cadena "Departamento de ";
6.- Suponiendo que en los prximos tres aos el coste de vida va a aumentar un 6 % anual y
que se suben los salarios en la misma proporcin, hallar para los empleados con ms de 4
hijos su nombre y su salario anual actual sin comisin, y para cada uno de los prximos tres
aos, clasificados por orden alfabtico.
Dep. de Informtica

26

I.E.S. TRASSIERRA - Crdoba

SQL

7.- Hallar por orden alfabtico los nombres de los empleados tales que si se les da una
gratificacin de 60 euros por hijo, el total de esta gratificacin no supera a la dcima parte del
salario.
8.- Para los empleados del departamento 112 con comisin, hallar el nombre y el sueldo total
de cada uno (salario ms comisin), por orden de sueldo total decreciente, y por orden
alfabtico como criterio secundario de ordenacin.
9.- Obtener los nmeros de los departamentos en los que haya algn empleado cuya comisin
supere al 20 % de su salario.
10.- Hallar por orden de nmero de empleado el nombre y sueldo (salario ms comisin) de
los empleados cuyo sueldo supere al salario mnimo en 600 euros mensuales.
11.- Para los empleados que no tienen comisin obtener por orden alfabtico el nombre y el
cociente entre su salario y el nmero de hijos.
12.- Se desea hacer un regalo de un 1 % del salario a los empleados en el da de su
onomstica. Hallar por orden alfabtico los nombres y cuanta de los regalos para los que
celebren su santo el da de San Honorio.
13.- Obtener por orden alfabtico los nombres y salarios de los empleados del departamento
111 que tienen comisin, pero solo si la comisin de alguno de ellos supera al 15 % de su
salarlo.

Dep. de Informtica

27

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 4.- FUNCIONES.4.1.- Introduccin.


4.2.- Funciones de fila.
4.2.1.- Funciones numricas.
4.2.2.- Funciones de caracteres.
4.2.3.- Funciones de fechas.
4.2.4.- Funciones de conversin.
4.2.5.- Otras funciones
4.3.- Funciones de columna.
4.4.- Agrupamiento de filas. Clusulas GROUP BY y HAVING.
4.5.- Ejercicios propuestos.

4.1.- INTRODUCCIN.Una funcin realiza ciertas operaciones sobre uno o varios valores y devuelve un valor nico.
Los valores sobre los que opera se llaman argumentos.
Las funciones se especifican mediante una palabra reservada seguida de los argumentos entre
parntesis y separados por comas. La funcin SYSDATE, como excepcin, no lleva
argumentos (ni parntesis), el resto utilizan uno, dos, o mas argumentos algunos de los cuales
pueden ser opcionales, los que, si se omiten, toman valores por defecto.
Las funciones permiten realizar con los datos funciones adicionales a las vistas hasta ahora,
pudiendo aparecer como operandos en las expresiones en:

Clusula SELECT
Clusula WHERE
Clusula ORDER BY

Si se invoca a una funcin con un tipo de dato distinto al que espera como argumento, se
convierte automticamente y de forma implcita en el que la funcin espera.
Las funciones pueden anidarse a cualquier nivel, lo que permite la construccin de
expresiones muy complejas.
Las funciones suelen dividirse en:
Funciones de fila, simples o escalares.
Funciones de columna, grupo o agregado.
Mientras las primeras operan con valores nicos (la columna x de la tupla y), las segundas lo
hacen sobre varios valores (la columna x en varias o todas las tuplas).

Dep. de Informtica

28

I.E.S. TRASSIERRA - Crdoba

SQL

4.2.- FUNCIONES DE FILA.A continuacin veremos las funciones de fila simple que operan sobre un nico valor y las
agruparemos en funcin del tipo de dato de sus argumentos:

4.2.1.- Funciones numricas.Son aquellas que aceptan como entrada argumentos numricos y devuelven valores
numricos.
Funcin

Sintaxis

Devuelve/Descripcin

ABS
ACOS
ASIN
ATAN
CEIL
COS
COSH
EXP
FLOOR
LN
LOG

ABS(n)
ACOS(n)
ASIN(n)
ATAN(n,[m])
CEIL(n)
COS(n)
COSH(n)
EXP(n)
FLOOR(n)
LN(n)
LOG(m, n)

MOD
POWER

MOD(m, n)
POWER(m, n)

ROUND

ROUND(n[,m])

SIGN

SIGN(n)

SIN
SINH
SQRT
TAN
TANH
TRUNC

SIN(n)
SINH(n)
SQRT(n)
TAN (n)
TANH(n)
TRUNC(n[,m])

Valor absoluto de n
Arco coseno de n.
Arco seno de n.
Tangente del arco de n, o del arco entre n y m.
Entero inmediatamente superior o igual a n
Coseno de n en radianes
Coseno hiperblico de n
Nmero e elevado a la potencia de n
Entero inmediatamente inferior o igual a n
Logaritmo natural de n. Siendo n > 0.
Logaritmo en base m de n. La base m debe ser un numero
positivo distinto de 0 1.n tambin debe ser positivo.
Resto de m dividido por n.
Potencia: m elevado a la potencia de n. La base m y el
exponente n puede ser cualquier tipo de nmero, pero si m
es negativo, n debe ser un entero
Redondeo: n redondeado a m decimales. Si se omite, m =
0.
Signo: Si n<0 devuelve -1.
Si n=0 devuelve 0.
Si n>0 devuelve 1.
Seno de n expresado en radianes
Seno hiperblico de n
Raz cuadrada de n. El valor de n no puede ser negativo
Tangente de n.
Tangente hiperblica de n.
Truncado: n truncado a m decimales. Por defecto m = 0.

Ejemplos:
1).- Listar los nombres y nmeros de departamento de los empleados que pertenecen a
departamentos pares.
SELECT
nomem, numde
FROM
temple
WHERE
MOD(numde, 2) = 0 ;
2).- Para los empleados que cobran comisin, listar su nombre y su comisin diaria
redondeada con 2 decimales.
SELECT
nomem, ROUND(comis*12/365, 2)
FROM
temple
WHERE
comis IS NOT NULL ;
Dep. de Informtica

29

I.E.S. TRASSIERRA - Crdoba

SQL

4.2.2.- Funciones de caracteres.Estas funciones suelen manejar parmetros de tipo carcter y pueden devolver tanto un valor
de tipo carcter como un nmero.
Funcin

Sintaxis

Devuelve/ Descripcin

ASCII

ASCII(char)

CHR

CHR(n)

CONCAT

CONCAT(char1,
char2)
INITCAP(char)

Nmero: representacin numrica de la cadena char.


en el juego de caracteres usado en la B.D.,
Carcter cuyo numero correspondiente en binario
es n.
Cadena char1 concatenada con char2. Es
equivalente al operador || .
Cadena char con la primera letra de cada palabra en
mayscula el resto en minsculas. Las palabras van
delimitadas por espacios en blanco v no son
alfanumricas.
Nmero que indica la posicin en char1 de la
m_sima ocurrencia de char2 en char1, empezando
la bsqueda en la posicin n. Si se omiten n o m se
les asigna por defecto el valor 1.
Nmero idntico a INSTR excepto que n y el valor
devuelto se expresa en bytes en vez de en caracteres.
Para una B.D. con juego de caracteres de byte
simple INSTR e INSTRB son equivalentes.
Nmero que expresa la longitud de char en
caracteres, incluyendo los blancos.
Nmero que expresa la longitud de char en bytes. Si
char es nulo, esta funcin devuelve un nulo. Para
una B.D. con juego de caracteres de byte simple
LENGTH y LENGTHB son equivalentes.
Cadena char con todas las letras en minsculas.
Cadena char1 rellenado a la izquierda hasta la
longitud indicada por n, con la cadena indicada en
char2. Si char2 se omite, se rellena con blancos.
Cadena char en la que se han eliminado los
caracteres a la izquierda hasta encontrar el primer
carcter que no est en muestra.
Cadena char, despus de reemplazar car_bus por
car_repl.
Cadena char1 rellenado a la derecha hasta la
longitud indicada en n, con el carcter indicado en
char2. Si char2 se omite rellena con blancos.
Cadena char previa eliminacin de los caracteres a
la derecha de char hasta encontrar el primer carcter
que no este en muestra.
Cadena de caracteres conteniendo la representacin
fontica de char. Las comparaciones se basan en
sonidos en Ingls.
Subcadena de char, empezando en la posicin
indicada en m, y tomando el nmero de caracteres
indicado en n. O hasta el final si se omite n.
Cadena char con todas las ocurrencias "de"
reemplazadas por lo indicado en "a".
Cadena char con todas las letras en maysculas.

INITCAP

INSTR

INSTR(char1,
[,n[,m]])

char2,

INSTRB

INSTRB(charl,
[,n[,m]])

char2,

LENGTH

LENGTH (char)

LENGTHB

LENGTHB (char)

LOWER
LPAD

LOWER(char)
LPAD(char1,n [,char2])

LTRIM

LTRIM(char[,muestra])

REPLACE

REPLACE
(char,
car_bus[,car repl])
RPAD(char1,n [,char2])

RPAD

RTRIM

RTRIM(char
[,muestra])

SOUNDEX

SOUNDEX (char)

SUBSTR

SUBSTR(char,m[,n])

TRANSLATE TRANSLATE(char, de,


a)
UPPER(char)
UPPER

Dep. de Informtica

30

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplos:
1).- SELECT REPLACE ('El modelo Entidad/Relacin', 'modelo', 'metodo') FROM DUAL;
Rdo. El metodo Entidad/Relacin
2).- SELECT TRANSLATE ('El modelo Entidad/Relacin', 'aeiou', 'eioua') FROM DUAL;
Rdo. El mudilu Entoded/Rilecon
3).- Mostrar los nombres de los departamentos con la primera letra en maysculas y el resto
en minsculas.
SELECT
INITCAP(nomde)
FROM
tdepto ;
4).- Listar los nombres propios de todos los empleados, en orden alfabtico.
SELECT
SUBSTR( nomem, INSTR(nomem, ',') + 1 )
FROM
temple
ORDER BY 1 ;
5).- Listar los nombres de los departamentos ordenados de mayor a menor longitud del
nombre.
SELECT
nomde
FROM
tdepto
ORDER BY LENGTH(nomde) DESC ;

4.2.3.- Funciones de fechas.Estas funciones operan con argumentos de tipo fecha y devuelven valores de tipo fecha, salvo
la funcin MONTHS_BETWEEN que devuelve un nmero.
Funcin

Sintaxis

Devuelve/Descripcin

ADD_MONTHS

ADD_ MONTHS(f, n)

LAST_DAY

LAST_DAY(f)

Fecha f ms n meses, n puede ser >, = o


< que cero.
Fecha del ultimo da del mes de la fecha
f.
Nmero de meses transcurridos entre f1
y f2.
Fecha del primer da de la semana
indicado en n (1 lunes, 2 martes,..), a
partir de la fecha f.
Fecha f en formato fmt. Si se omite fmt
el valor por defecto es el da 'DD'.
Fecha actual y la hora. Sin parmetros.
No se puede utilizar esta pseudocolumna
/funcin en una restriccin CHECK.
Fecha f con la parte de tiempo del da
truncado a la unidad especificada en fmt.
Si se omite fmt el valor por defecto es el
da 'DD'

MONTHS_BETWEEN MONTHS_BETWEEN
(f1,f2)
NEXT_DAY(f, n)
NEXT_DAY

ROUND

ROUND (f [, fmt))

SYSDATE

SYSDATE

TRUNC

TRUNC (f [, fmt])

Dep. de Informtica

31

I.E.S. TRASSIERRA - Crdoba

SQL

Mscaras para ROUND y TRUNC con datos de tipo fecha.Las funciones ROUND y TRUNC son especialmente importantes en el manejo de
fechas. El redondeo o truncado se realiza a una unidad u otra (ao, da, ..) en funcin del
modelo de mscara especificado en fmt (ver sintaxis). A continuacin exponemos los
principales formatos, que deben expresarse entre comillas, y la unidades de redondeo o
truncado que les corresponden. El modelo por defecto es 'DD', y muestra la fecha
redondeada o truncada en formato da. La hora se establece a medianoche.
Modelo de formato
CC
SCC
YYYY
SYYY
Y
IYYY
IY
I
Q
MONTH
MM
WW
IW
DD
DAY
O
HH
MI

Unidad de redondeo o truncado


Siglo.
Ao. (redondeado sobre el 1 de Julio).

Ao ISO

Trimestre (redondeado al da 16 del segundo mes del trimestre).


Mes.
El da de la semana del primer da del ao.
El da de la semana del primer da del ao en formato ISO.
Da.
Da de comienzo de la semana.
Hora.
Minuto.

Ejemplos:
1).- Calcular la edad, en aos cumplidos, de los empleados del departamento 130.
SELECT
FROM
WHERE
O mejor:

TRUNC(( sysdate-fecna)/365) "Edad en aos"


temple
numde = 130 ;

TRUNC (MONTHS_BETWEEN( sysdate, fecna)/12) "Edad en aos"

2).- Calcular la fecha del prximo domingo.


SELECT
FROM

NEXT_DAY(sysdate, 7)
DUAL ;

3).- Calcular los das que quedan hasta fin de mes.


SELECT
FROM

LAST_DAY(sysdate) - sysdate
DUAL ;

4).- Devolver el primer da del mes actual.


SELECT TRUNC(sysdate, 'MM')
FROM DUAL;

Dep. de Informtica

32

I.E.S. TRASSIERRA - Crdoba

SQL

4.2.4.- Funciones de conversin.Permiten convertir un tipo de dato en otro.


Funcin
CHARTOROWID

Sintaxis
CHARTOROWID(char)

CONVERT

CONVERT(char, car_dest
[,car_fuen])

HEXTORAW

HEXTORAW (char)

RAWTOHEX

RAWTOHEX (raw)

ROWIDTOCHAR

ROWIDTOCHAR (rowid)

TO_CHAR

TO_CHAR(f
[,formato[,
'parametros nls'] ])

TO_CHAR

TO_CHAR(n
[,formato[,
'parametros_nls']])

TO_DATE

TO_DATE(char [,formato
[,'parametros_nls'] ])

TO_MULTI_BYTE

TO_MULTI_BYTE (char)

TO_SINGLE_BYTE TO_SINGLE_BYTE (char)

TO_NUMBER

TO_NUMBER( char [,fmt


[,'parametros_nls'] ] )

Conversin
Convertir un tipo de dato VARCHAR2 a tipo
ROWID
Convierte una cadena un juego de caracteres a
otro. Si se omite el juego de caracteres fuente,
toma por defecto el de la B.D.
Convierte un cadena conteniendo dgitos en
hexadecimal a un valor RAW
Convierte un RAW a un valor tipo carcter que
contiene el equivalente en hexadecimal
Convertir un tipo de dato ROWID a
VARCHAR2. De la conversin resulta siempre
una cadena de 18 caracteres de longitud.
Convierte una fecha f tipo DATE en un
VARCHAR2 con la mscara indicada en formato.
Si se omite formato, la fecha se convierte a en un
valor VARCHAR2 en el formato de fecha por
defecto. Ms adelante veremos los "modelos de
formato de fecha". Parametros_nls especfica el
lenguaje en el cual se visualizan los nombres y
abreviaturas de los meses y das. El parmetro se
indica con: 'NLS_DATE_LANGUAGE = idioma'.
Si se omite toma el idioma por defecto. (1)
Convierte un nmero de tipo NUMBER en un tipo
de datos VARCHAR2 con la mscara indicada en
formato. Ms adelante veremos los "modelos de
formato numricos". 'Parmetros_nls' especifica
los caracteres y elementos de formatos de nmeros
que se visualiza (separador de decima-les, de
grupo, smbolo de la moneda local e ISO).
Convierte una cadena tipo VARACHAR2 en un
valor tipo DATE. El formato es la mscara de la
fecha. Si se omite toma el formato por defecto. Si
el formato es J para juliano char debe ser un
entero. 'Parmetros_nls' tiene la misma funcin
que para TO_CHAR en conversin a fechas. No
utilizar con TO_DATE un valor tipo DATE como
argumento. La fecha que devuelve puede tener un
valor diferente que el char original, dependiendo
del formato indicado o el activo por defecto.
Devuelve char con todos sus caracteres de byte
simple convertidos en sus correspondientes
caracteres multibyte. Solo se utiliza en 8.D. que
utilicen ambos tipos de juegos de caracteres.
Devuelve char con todos sus caracteres multibyte
convertidos en sus correspondientes caracteres de
byte simple. Solo se utiliza en B.D. que utilicen
ambos tipos de juegos de caracteres.
Convierte char de un valor CHAR o VARCHAR2
a un tipo de dato NUMBER con el
formato especificado

(1) Ejemplo: SELECT TO_CHAR(sysdate, 'dd " de " month " de " yyyy', 'NLS_DATE_LANGUAGE= ENGLISH');
Otros lenguajes para las funciones fecha son: ITALIAN, SPANISH, FRENCH, GERMAN, ..

Dep. de Informtica

33

I.E.S. TRASSIERRA - Crdoba

SQL

Mscaras de conversin.Deben proporcionarse las mscaras de conversin en formato numrico adecuadas


cuando:
D
En una funcin TO_CHAR se cambie un tipo de dato NUMBER a un tipo de
dato VARCHAR2. Ejemplo:
SELECT

TO_CHAR(1.25, '$999D999') FROM dual ;

D
En una funcin TO_NUMBER se cambie un tipo de dato VARCHAR2 a
NUMBER. Como ejemplo vase la diferencia entre las siguientes mscaras:
SELECT
SELECT

TO_NUMBER('1.25', '9999') FROM dual ;


TO_NUMBER('1,25', '99D99') FROM dual ;

Los formatos numricos estn compuestos de uno o varios elementos de formatos:


Mscara

Ejemplo

9999

0
$
B
MI
S
PR
D (*)
G (*)
C (*)
L (*)
,
.
EEEE
RN

Descripcin

El numero de "9" especifica la cantidad de dgitos que se visualizan. Se


visualizan blancos para los ceros a la izquierda.
0999
Visualiza los ceros a la izquierda en esa posicin como ceros en vez de
9990
como blancos, o les da valor de 0 en lugar de blanco.
$9999
Antepone como prefijo el signo de dlar.
B9999
Devuelve los ceros como blancos, a menos que se indique "O" en la
mscara de formato.
9999MI
Muestra un "-" despus de los valores negativos. Para los valores
positivos muestra un espacio en blanco.
S9999
Muestra un "+" para los valores positivos y"." para los negativos en la
posicin indicada.
9999PR
Muestra los valores negativos entre los signos de menor mayor <>.
99D99
Muestra el carcter decimal en la posicin indicada. Separa la parte
entera fraccionara de un numero.
9G999
Muestra el separador de grupo en la posicin indicada.
C9999
Muestra el smbolo ISO de la moneda, en la posicin indicada.
L999
Muestra el smbolo de la moneda local en la posicin indicada.
9,999
Muestra una coma la posicin indicada.
9.999
Muestra un punto en la posicin indicada y separa la parte entera y la
decimal de un numero.
9.999EEEE Muestra el valor en notacin cientfica.
RN
Devuelve en maysculas o minsculas (m) el valor del nmero en
romano. El nmero tiene que ser un entero entre 1 y 3999.

MI y PR solo pueden estar en la ltima posicin de un formato numrico.


El formato S slo puede estar en la primera o la ltima posicin.
(*) Los caracteres que devuelven los formatos indicados con un asterisco son
especificados por los siguientes parmetros de inicializacin de la Base de Datos:
D
G
C
L

Carcter Decimal NLS_NUMERIC_CHARACTERS


Separador Grupo NLS_NUMERIC_CHARACTERS
Smbolo moneda NLS_ISO_CURRENCY
Smbolo moneda NLS_ISO_CURRENCY

Dep. de Informtica

34

I.E.S. TRASSIERRA - Crdoba

SQL

Los formatos tipo fecha se utilizan en las siguientes situaciones:


En la funcin TO_CHAR para convertir un valor tipo DATE a un formato diferente al
formato por defecto.
En la funcin TO_DA TE para convertir un valor tipo carcter en un formato diferente
del formato por defecto.
La fecha por defecto se especifica explcitamente con el parmetro NLS_DATE_FORMAT o
implcitamente con el parmetro de inicializacin NLS_TERRITORY. Se puede sobreescribir
el valor de estos parmetros para la sesin actual con el comando ALTER SESSION.

Mscara

Descripcin

SCC CC

Indica el siglo. Si se especifica S, aparece el prefijo en las fechas de antes de


Cristo.
4 Dgitos del ao. S antepone un si es antes de Cristo.
4 Dgitos del ao en formato ISO estndar.
Los ltimos 3, 2 o 1 dgitos del ao
Los ltimos 3, 2 o 1 dgitos del ao en formato ISO estndar
El ao, con una coma en la posicin indicada.
El nmero de ao nombrado. El prefijo S se antepone si es antes de Cristo.
Los ltimos dos dgitos del ao. Se usa para aos de otros siglos.
Indicador antes/despus de Cristo.
Indicador antes/despus de Cristo separado por puntos.
Trimestre del ao.
Nmero de Mes.
Nmero de Mes en romano.
Nombre del mes alineado con blancos de hasta 9 caracteres de longitud.
Nombre del da abreviado a tres letras.
Nmero de la semana del ao.
Nmero de la semana del ao en ISO estndar.
Nmero de da del ao. (1-366).
Nmero del da del mes (1-31).
Nmero de da de la semana. (1-7).
Nombre del da de la semana hasta 9 caracteres.
Nombre del da de la semana abreviado.
Fecha en Juliano. Los nmeros especificados deben ser enteros.
Indicador de Meridiano.
Indicador de Meridiano separado por puntos.
Hora del da (1-12).
Hora del da (0-23).
Minutos (0-59).
Segundos (0-59).
Segundos transcurridos desde medianoche. (0-86399).

YYYY SYYYY
IYYY
YYY YY Y
IYY IY I
Y,YYY
SYEAR YEAR
RR
BC AD
B.C. A.D.
Q
MM
RM
MONTH
MON
WW
IW
DDD
DD
D
DAY
DY
J
AM PM
A.M. P.M
HH HH12
HH24
MI
SS
SSSSS

Las especificaciones de algunos formatos, (MONTH, MON, DAY, DY, BC/AD, B.C./A.D.,
AM/PM) dependen de los siguientes parmetros de inicializacin:
NLS_DATE_LENGUAGE
NLS_TERRITORY
NLS_LANGUAGE

Dep. de Informtica

35

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplos:
1).- Mostrar los das transcurridos desde el 1 de enero del 2000 hasta el da de hoy.
SELECT

sysdate - TO_DATE('01012000', 'ddmmyyyy') FROM dual;

2).- Listar en una sola columna un cdigo formado por el da de nacimiento y el nmero de
empleado de todos los empleados.
SELECT
FROM

nomem || TO_CHAR(fecna)|| TO_CHAR(numem)


temple ;

3).- Listar los nombres de los empleados del departamento 130 junto a su fecha de ingreso
con el siguiente formato: 12 de Octubre de 1987.
SELECT
FROM
WHERE

nomem, TO_CHAR(fecin, 'DD "de " Month "de " YYYY')


temple
numde = 130 ;

4.2.5.- Otras funciones.Funcin


DUMP

GREATEST

LEAST

NVL

VSIZE
DECODE

Sintaxis
Descripcin
DUMP(expr
[,fornato Devuelve un VARCHAR2 conteniendo el
[,posc_comienzo [,long]]] ) cdigo del tipo de dato, la longitud en bytes y la
representacin interna del dato. El argumento
formato indica la notacin en la que se visualiza el
resultado. Formato puede tener los siguientes
valores:
8 Devuelve el resultado en notacin octal.
10 Devuelve el resultado en notacin decimal.
16 Devuelve el resultado en notacin
hexadecimal.
17 Devuelve el resultado en formato carcter
simple.
GREATEST(exp [,exp2]...) Devuelve el mayor valor de una lista de
expresiones. Compara carcter a carcter. El tipo
de dato es siempre VARCHAR2..
LEAST(expr [,expr2]...)
Devuelve el menor valor de una lista de
expresiones. Compara carcter a carcter. El tipo
de dato es siempre VARCHAR2..
NVL(expr1,expr2)
Indica el valor que ha de tener expr1 cuando en su
contenido aparezcan nulos. El tipo de dato que
retorna expr2 es siempre el mismo de expr1.
VSIZE (expr)
Devuelve el numero de bytes que ocupa la
representacin interna del dato.
DECODE (expr, val1, Dentro de una expresin evala los valores de la
cod1,.. valn, codn, codf)
lista y los cambia por el cdigo correspondiente.

Ejemplos:
1).- Mostrar el tipo de dato, la longitud en bytes y la representacin interna (en hexadecimal)
de la columna numem de la tabla temple de los empleados con nmero de empleado superior
a 450;
SELECT
DUMP (numem, 16)
FROM
temple
WHERE
numem > 450 ;
Dep. de Informtica

36

I.E.S. TRASSIERRA - Crdoba

SQL

2).- Para cada empleado, listar el mayor valor (en orden alfabtico) de entre el apellido y el
nombre propio.
SELECT
GREATEST( SUBSTR( nomem, 1, INSTR( nomem, ',' ) - 1 ),
SUBSTR( nomem, INSTR( nomem, ',' ) + 2 ) )
FROM
temple ;
3).- Mostrar el nombre y nmero de hijos de todos los empleados. Pero si no tiene hijos, en
lugar de cero se mostrar "Sin hijos", y si tiene 3 se mostrar "Familia numerosa".
SELECT
FROM

nomem, DECODE(numhi, 0, 'Sin hijos', 3, 'Familia numerosa', numhi)


temple ;

4).- Visualizar el sueldo total anual (salario ms comisin) de los empleados del departamento
110.
SELECT
( salar + NVL(comis, 0) ) * 12
FROM
temple
WHERE
numde = 110 ;

4.3.- FUNCIONES DE COLUMNA.Estas funciones tratan como argumento a una coleccin de valores y, a partir de ellos,
producen un nico resultado. Son las siguientes:
Funcin
AVG
COUNT
MAX
MIN
STDEV

Sintaxis
AVG(n)
COUNT(*/<Exp>)
MAX(<Exp>)
MIN(<Exp>)
STDEV(<Exp>)

SUM
VARIANCE

SUM(<Exp>)
VARIANCE(<Exp>)

Valor devuelto
Media de n (ignorando los nulos)
Nmero de filas de la consulta.
Mximo valor de la expresin.
Mnimo valor de la expresin.
Desviacin tpica de la expresin sin tener
en cuenta los valores nulos.
Suma de los valores de la expresin.
Varianza de la expresin (ignorando nulos)

Si la coleccin de valores es vaca, la funcin COUNT devuelve un cero y las dems


funciones un valor Nulo. Esto puede ocurrir, por ejemplo, si el predicado de WHERE no es
satisfecho por ninguna fila.
Las funciones MAX y MIN admiten cualquier tipo de argumento, en COUNT no tiene
importancia el tipo de argumento, y en el resto de funciones los argumentos son numricos.
Las funciones de columna aceptan opcionalmente las clusulas DISTINCT y ALL:
DISTINCT: Hace que la funcin solo considere los distintos valores de la expresin.
ALL:

Dep. de Informtica

Hace que la funcin considere todos los valores recuperados,


incluyendo duplicados. Es la opcin por defecto

37

I.E.S. TRASSIERRA - Crdoba

SQL

Comprubese el distinto resultado de las siguientes sentencias:


SELECT
FROM

COUNT(*) "Nmero de extensiones telefnicas"


temple ;

SELECT
FROM

COUNT(DISTINCT extel) "N de extensiones telefnicas distintas"


temple ;

En ORACLE, los valores nulos no intervienen en el clculo de las funciones de columna, por
lo que las siguientes sentencias no siempre devuelven el mismo resultado:
SELECT
SELECT

AVG(comis)
SUM(comis) / COUNT(*)

Ejemplos:
1).- Hallar en nmero de empleados del departamento 112, as como cuantas comisiones
distintas hay, y la suma y media de sus comisiones.
SELECT
FROM
WHERE

COUNT(*), COUNT(DISTINCT comis),


SUM(comis), AVG(comis)
temple
numde = 112 ;

Resultado:
COUNT(*)
7

COUNT(DISTINCT COMIS)
4

SUM(COMIS)
3546

AVG(COMIS)
591

El valor calculado por AVG es la media de las comisiones sin incluir a los empleados cuya
comisin es nula, es decir (3546 / 6 = 591), pues hay un empleado con comisin nula.
Para hallar la media teniendo en cuenta a todos los empleados, incluyendo los que tienen
comisin nula, podra escribirse:
SELECT
FROM
WHERE

SUM(comis) / COUNT(*)
temple
numde = 112 ;

Resultado:
SUM(COMIS)/COUNT(*)
506,57143

2).- Hallar cuntas comisiones diferentes hay, y su valor medio.


SELECT
FROM

COUNT(DISTINCT comis), AVG(comis)


temple;

Resultado:
COUNT(DISTINCTCOMIS)
6

Dep. de Informtica

AVG(COMIS)
588,14286

38

I.E.S. TRASSIERRA - Crdoba

SQL

3).- Hallar la media del nmero de hijos de los empleados del departamento 123.
SELECT
FROM
WHERE

AVG (numhi)
temple
numde = 123 ;

Como este departamento no existe, el resultado es un valor nulo.


4).- Hallar la edad media, en aos de los empleados del departamento 110.
SELECT
FROM
WHERE

AVG( TRUNC ( MONTHS_BETWEEN(SYSDATE, fecna)/12 ) )


temple
numde = 110 ;

Resultado:
AVG(TRUNC( MONTHS_BETWEEN(SYSDATE, fecna)/12 ) )
32,666667

La sentencia SELECT realiza los siguientes pasos:


1. Formar un grupo con todas las filas de temple que satisfagan la condicin
numde=100.
2. Formar una coleccin de valores con todos los que haya en la columna fecna de
esas filas, sin incluir los nulos si los hubiera. Supongamos que hay N no nulos.
3. Resolver la funcin MONTHS_BETWEEN.
4. Calcular para todos la funcin TRUNC de la SELECT.
5. Aplicar la funcin AVG a la coleccin de valores anteriores, es decir, sumarlos y
dividir la suma por N.

4.4.- AGRUPAMIENTO DE FILAS.Las funciones de columna tal y como las hemos visto anteriormente operan sobre todos (o los
distintos) valores de una columna. A continuacin veremos cmo formar grupos de filas, para
que las funciones colectivas operen no sobre la totalidad sino sobre los distintos grupos,
devolviendo no un valor nico, sino una lista de valores (tantos como grupos se hayan
formado).
GROUP BY.- Esta clusula permite formar grupos de filas segn un criterio determinado.
Su formato es:
GROUP BY col1 [, col2 [, ..] ]
Siendo col1, col2, .. las columnas de agrupamiento. De forma que las filas de la tabla se
agrupan en funcin de los valores idnticos de las columnas de agrupamiento. A estos efectos,
los valores nulos se consideran todos iguales, por lo que se incluyen en el mismo grupo.
Una vez formados los grupos, para cada uno de ellos se evalan las expresiones de la clusula
SELECT, por lo que cada uno produce una fila en la tabla resultante de la consulta.

Dep. de Informtica

39

I.E.S. TRASSIERRA - Crdoba

SQL

Si se utiliza GROUP BY, en la clusula SELECT solo pueden aparecer:


Constantes.
Funciones de columna
Columnas o expresiones incluidas en la clusula GROUP BY.
En la clusula GROUP BY puede contener cualquier columna de la tabla especificada en
FROM, sin importar que estn o no en la lista de la SELECT.
Ejemplos:
1).- Para cada departamento hallar el salario medio (con 2 decimales), el mnimo, el mximo
y la media aritmtica de estos dos ltimos.
SELECT

numde, TRUNC(AVG(salar), 2), MIN(salar),


MAX(salar), ( MIN(salar) + MAX(salar) ) / 2
FROM
temple
GROUP BY numde
ORDER BY numde ;
Resultado:
NUMDE TRUNC(AVG(SALAR),2) MIN(SALAR) MAX(SALAR) (MIN(SALAR)+MAX(SALAR))/2
100
3105,33
2284
4327
3305,5
110
1793
1202
2885
2043,5
111
1311
601
1863
1232
112
1605,71
1082
2284
1683
120
1623
1623
1623
1623
121
1863
1142
2644
1893
122
1947,4
1052
2705
1878,5
130
2223,66
1743
2524
2133,5

2).- Hallar la edad en aos cumplidos del empleado mas viejo de cada departamento,
ordenado por nmero de departamento.
SELECT
FROM
GROUP BY
ORDER BY
Resultado:
NUMDE
100
110
111
112
120
121
122
130

numde, MAX( TRUNC(MONTHS_BETWEEN(sysdate, fecna)/12 ))


temple
numde
1;
MAX( TRUNC(MONTHS_BETWEEN(sysdate, fecna)/12 ))
41
47
42
46
33
51
32
34

No tendra sentido incluir la columna salar en la lista de la SELECT, de hecho dara el error:
ORA-00979: no es una expresin GROUP BY

Dep. de Informtica

40

I.E.S. TRASSIERRA - Crdoba

SQL

HAVING.- Esta clusula es opcional y sirve para descartar grupos de filas. Su formato es:
HAVING <condicin>
Una vez formados los grupos con GROUP BY, se descartan aquellos grupos que no satisfacen
la condicin especificada.
La condicin es un predicado en el que las columnas que participen y no sean de
agrupamiento, debern figurar como argumentos de funciones colectivas.
Ejemplo:
Para los departamentos en los que el mayor salario de sus empleados supere los 2500 Euros,
listar su nmero y el mayor salario.
SELECT
FROM
GROUP BY
HAVING

numde, MAX(salar)
temple
numde
MAX(salar) > 2500 ;

Resultado:
NUMDE MAX(SALAR)
100
4327
110
2885
121
2644
122
2705
130
2524

En resumen, si tenemos una sentencia SELECT formada por clusulas SELECT, FROM,
WHERE, GROUP BY, HAVING y ORDER BY, los pasos que sigue el motor SQL podran
ser:
1) Ejecutar la clusula FROM .
Es decir, seleccionar la tabla nombrada en esta clusula, que de momento pasa a ser
la tabla resultante de la sentencia.
2) Ejecutar la clusula WHERE.
Esto quiere decir eliminar de la tabla resultante las filas que no satisfagan la
condicin expresada en el WHERE.
3) Ejecutar la clusula GROUP BY.
Es decir, formar grupos con las filas de la tabla resultante en el paso anterior que
tengan iguales valores en las columnas de agrupamiento.
4) Ejecutar la clusula HA VING.
Descartar los grupos que no satisfagan la condicin especificada detrs de la
palabra HAVING.
5) Ejecutar la clusula SELECT.
Esto implica evaluar sus expresiones para cada grupo, produciendo por cada uno de
ellos una fila de la tabla resultante final, con tantos valores como expresiones. Si la
clusula empieza con las palabras SELECT DISTINCT se eliminan de este
resultado las filas repetidas.
6) Ejecutar la clusula ORDER BY.
Es decir, presentar la tabla resultante final clasificada por las columnas indicadas.

Dep. de Informtica

41

I.E.S. TRASSIERRA - Crdoba

SQL

4.5.- EJERCICIOS PROPUESTOS.1.- Listar los nombres de los empleados y el resultado de dividir el cuadrado de sus salarios
entre la comisin.
2.- Listar los nombres de los departamentos rellenados con puntos hasta un total de 25
caracteres, y el presupuesto anual, en euros y en pesetas de cada uno de los departamentos.
3.- Para los departamentos con nombres de ms de 12 caracteres, listar los nmeros de
departamento y los caracteres nmeros 11 al 17 del nombre de departamento, ordenados por
nmero de departamento.
4.- Listar los nombres de los empleados que no tienen comisin, clasificados de manera que
aparezcan primero aquellos cuyos nombres son ms cortos.
5.- Obtener en una nica columna los nombres propios y el apellido de todos los empleados
visualizando la primera letra del nombre y apellido en maysculas y el resto en minsculas.
----------Fechas -------------------------6.- Obtener las fechas de ingreso, nombres y salarios de los empleados que hayan empezado a
trabajar en la empresa el ao 98 despus, por orden alfabtico.
7.- Obtener por orden alfabtico los nombres de los empleados que empezaron a trabajar en la
empresa en el ao 1999.
8.- Obtener por orden alfabtico los nombres de los empleados que han ingresado el 2-03-99
en el da de hoy.
9.- De los empleados mayores de 50 aos y con hijos, seleccionar los nombres y fechas de
nacimiento con el siguiente formato: Domingo, 12 de Enero de 1947.
10.- Segn el convenio colectivo, para los empleados con ms de un ao de servicio el
nmero de das de vacaciones anuales expresado en das laborables es de 20 incrementados en
uno ms por cada tres aos de servicio cumplidos en el ao anterior. Para los empleados que
este ao cumplen 45 o ms aos de edad y tienen ms de un ao de servicio. Hallar por orden
alfabtico el nombre y el nmero de das de vacaciones anuales que corresponde a cada uno.
11.- Se desea analizar un plan de jubilacin anticipada para los empleados con 55 aos
cumplidos, en el que se ofrece una paga adicional extra de jubilacin equivalente al salario
actual de un mes por cada ao de servicio cumplido. Listar el nombre y cuanta de esa paga
extra de los empleados que este ao cumplen 55 ms aos.
12.- Para los empleados de los departamentos 111 y 112 hallar por orden alfabtico: nombre,
edad en aos cumplidos en el da de hoy, y edad que tenan al ingresar en la empresa.
13.- Para los empleados de los departamentos 110 y 111 hallar por orden alfabtico: nombre y
tiempo que llevan en la empresa en el da de hoy expresado en aos, meses y das.
14.- Para los empleados de los departamentos 110 y 112, listar su nombre, el nombre del mes
y da de su cumpleaos, por orden cronolgico.

Dep. de Informtica

42

I.E.S. TRASSIERRA - Crdoba

SQL

15.- Livia Durn recibi un prstamo para vivienda el da en que ingres en la empresa con
vencimientos anuales a 180 das del da y mes de su ingreso. Hallar la fecha en que vence la
anualidad del prstamo correspondiente al ao actual.
16.- Todos los empleados tienen un perodo de 6 meses despus de su ingreso antes de firmar
su contrato de empleo definitivo. Hallar para los empleados que este ao cumplen menos de
40 aos de edad, por orden alfabtico: nombre y fecha de firma de su contrato definitivo.
17.- Amelia Dez y Octavio Garca, han decidido casarse. La boda se celebrar dentro de 2
das, y tomarn 20 das de vacaciones. La empresa har a cada uno un regalo de boda del 1%
de su salario mensual actual por cada ao de servicio. Ha1lar: la fecha de la boda, la fecha en
que se incorporarn al trabajo y el regalo correspondiente a cada uno de ellos.
---------- Funciones colectivas ---------------18.- Hallar cuntos departamentos hay sin director en propiedad y el presupuesto anual medio
de todos ellos.
19.- Para los departamentos 111 y 112 hallar la media de los aos de servicio de sus
empleados en el da de hoy.
20.- Para los empleados que han ingresado en la empresa en los ltimos 5 aos, hallar la edad
media en aos cumplidos de la edad a la que han ingresado.
21.- Hallar la masa salarial anual (salario ms comisin) de la empresa, suponiendo 14 pagas.
22.- Hallar cuntos empleados han ingresado en el ao actual.
23.- Hallar la diferencia entre el salario ms alto y el ms bajo.
24.- Hallar la edad media en aos cumplidos de los empleados que tienen ms de 2 hijos.
25.- Hallar el presupuesto medio de los departamentos cuyo presupuesto supera al
presupuesto medio de los departamentos.
26.- Hallar el nmero medio de hijos por empleado, con 2 decimales, para todos los
empleados que no tienen ms de dos hijos.
------------ Agrupamiento de filas --------------------27.- Agrupando por departamento y n de hijos, hallar cuantos empleados hay en cada grupo.
28.- Hallar el salario medio por departamentos, para aquellos departamentos cuyo salario
mximo es inferior al salario medio de todos los empleados.
29.- Hallar el salario medio (con 2 decimales) y la edad media de los aos cumplidos (sin
decimales) para cada grupo de empleados con igual comisin y para los que no la tengan.
30.- Para los departamentos en los que hay algn empleado con salario superior a 2400 euros,
hallar el nmero de empleados y la suma de sus salarios, comisiones y nmero de hijos.
31.- Para los departamentos en los que la antigedad media de Sus empleados supera a la de
la empresa, hallar el salario mnimo, el medio y el mximo.
32.- Para cada departamento, hallar la media de la comisin con respecto a los empleados que
la reciben y con respecto al total de empleados.
Dep. de Informtica

43

I.E.S. TRASSIERRA - Crdoba

SQL

33.- Para cada extensin telefnica, hallar cuntos empleados la usan y el salario medio de stos.
34.- Para cada departamento, hallar el nmero (cantidad) de extensiones telefnicas que
utiliza.
35.- Para cada centro de trabajo, mostrar su nmero de centro y el presupuesto medio de los
departamentos dirigidos en propiedad y en funciones.

Dep. de Informtica

44

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 5.- CONSULTAS SOBRE VARIAS TABLAS.5.1.- Consultas sobre varias tablas.
5.2.- Combinacin.
5.2.1.- Equireunin.
5.2.2.- Combinacin externa.
5.3.- Subconsultas.
5.4.- Correlacin.
5.5.- Operadores de conjunto.
5.5.1.- Unin.
5.5.2.- Interseccin.
5.5.3.- Resta.
5.6.- Ejercicios propuestos.

5.1.- CONSULTAS SOBRE VARIAS TABLAS.Las sentencias SELECT vistas hasta ahora devolvan datos de una nica tabla. An en el caso
de sentencias subordinadas, stas trataban la misma tabla que la sentencia principal.
En este tema veremos la posibilidad de tratar varias tablas en una sola consulta, para lo cual
basta con poner sus nombres detrs de FROM en la sentencia principal o en la subordinada.
En el primer caso el resultado se obtiene combinando datos de las tablas especificadas entre
s, mediante lo que se conoce como yuncin o producto cartesiano. En el segundo caso, si en
una sentencia subordinada se hace referencia a datos que devuelve la anterior, se dice que la
consulta es correlacionada.
Al trabajar con una nica tabla, no ha sido necesario calificar las columnas, pues sus nombres
las identificaban sin ambigedad. Al trabajar con varias tablas podemos encontrarnos con
columnas con el mismo nombre, en cuyo caso ser necesaria la calificacin de las columnas.
Por otro lado, los nombres de las tablas no suelen ser cmodos para calificar las columnas,
por lo que es aconsejable la calificacin de las tablas para acortar las calificaciones de
columnas. Ser necesario calificar las tablas cuando una misma tabla interviene dos veces en
una yuncin.

5.2.- COMBINACIN.En teora relacional se define la reunin, combinacin o yuncin (join) como una operacin
en la que se combinan datos de distintas tablas. En SQL esta operacin se realiza con la
sentencia SELECT y sus clusulas FROM, y WHERE, donde los nombres de las tablas que
intervienen en la yuncin se especifican detrs de FROM.
Cuando se especifican dos o ms tablas, se forma una tabla fruto del producto cartesiano de
todas las especificadas. Es decir, que el nmero de columnas en esta tabla es igual a la suma
del nmero de columnas de las tablas de la lista, y el nmero de filas es el producto del
nmero de filas que stas tienen. Como este ltimo nmero puede ser muy grande,
Dep. de Informtica

45

I.E.S. TRASSIERRA - Crdoba

SQL

normalmente el SGBD no construir fsicamente esta tabla, pero a efectos de comprender


cmo se forma el resultado de la sentencia SELECT es como si as fuera.
La tabla resultante ser de poca utilidad si no se filtran las filas correctamente con la
clusula WHERE que establecer la condicin de la yuncin.

5.2.1.- Equireunin.El tipo de combinacin ms frecuente es la llamada equireunin (equi join), que devuelve
filas de dos o mas tablas basndose en una condicin de igualdad que permite 'conectar' las
tuplas de las tablas con un mismo valor en uno de sus campos, de esta forma la cardinalidad
de la tabla devuelta coincidir con la mayor cardinalidad de las tablas que intervienen en la
yuncin.
Ejemplos:
1).- Listar los nombres de los departamentos con presupuesto superior a 60.000 euros, as
como el nombre de su centro de trabajo, clasificados por nombre de departamento.
SELECT
FROM
WHERE
ORDER BY

D.nomde, C.nomce
tcentr C, tdepto D
C.nunce = D.nunce AND D.presu > 60000
1;

2).- Para cada departamento con presupuesto inferior a 36.000 euros, listar su nombre, el del
centro de trabajo y el mximo salario de sus empleados, si ste excede de 1.200 euros.
SELECT
FROM
WHERE

D.nomde, C.nomce, MAX(salar)


tcentr C, tdepto D, temple E
C.numce = D.numce AND D.numde = E.numde
D.presu < 36000
GROUP BY D.nomde, C.nomce
HAVING
MAX(E.salar) > 1200 ;

AND

3).- Hallar por orden alfabtico los nombres de los departamentos que dependen de los que
tienen un presupuesto inferior a 30000 euros.
SELECT
FROM
WHERE
ORDER BY

D1.nomde, D2.nomde
tdepto D1, tdepto D2
D1.depde = D2.numde AND D2.presu < 30000
1;

5.2.2.- Combinacin externa.Un caso especial de la yuncin es la combinacin externa (outer join) que amplifica el
resultado de una combinacin simple. Una combinacin externa recupera TODAS las filas de
la de la combinacin simple y tambin aquellas que no encuentren su correspondiente fila
pareja de una tabla a otra.

Dep. de Informtica

46

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplo:
1).- Seleccionar el nmero de departamento, el nombre de departamento y suma de los
salarios de sus empleados:
SELECT
FROM
WHERE
GROUP BY
ORDER BY

D.numde, D.nomde, SUM(salar) "Salario Mensual"


temple E, tdepto D
E.numde = D.numde
D.numde, D.nomde
D.numde ;

Ntese que el segundo criterio de agrupamiento (D.nomde) se especifica por razones de


operatividad, para poder mostrar esa columna. Recordemos que si se usa GROUP BY, en la
clusula SELECT solo pueden aparecer los criterios de agrupamiento y funciones colectivas.
Para seleccionar la suma de salarios para todos los departamentos independientemente de que
tengan empleados o no, tendremos que utilizar un OUTER JOIN:
SELECT
FROM
WHERE
GROUP BY
ORDER BY

D.numde, D.nomde, SUM(salar) "Salario Mensual"


temple E, tdepto D
E.numde (+) = D.numde
D.numde, D.nomde
D.numde ;

El smbolo (+) debe situarse en el predicado de combinacin aliado de la columna o columnas


pertenecientes a la tabla en la que hay ausencia de valor. Con su uso en un operador u otro de
la expresin podremos lograr la combinacin externa izquierda o derecha (left outer join o
right outer join), respectivamente, de forma que el siguiente predicado hara que se trataran
los empleados que no tienen asignado departamento:
E.numde = D.numde(+)

5.3.- SUBCONSULTAS.Una subconsulta o consulta subordinada es una SELECT que aparece dentro de otra sentencia
SQL. Recordemos que las subconsultas se pueden especificar en las clusulas WHERE y
HAVING, y como parte de los predicados de comparacin, ANY, ALL, IN y EXISTS.
Una sentencia subordinada de otra puede a su vez tener otras subordinadas a ella. Se llama
sentencia externa a la primera sentencia SELECT de todas, es decir la que no es subordinada
de ninguna. Tambin se suele decir que estas sentencias estn anidadas en niveles: la externa
es la de primer nivel, sus inmediatas subordinadas las de segundo nivel, etc. El nmero de
niveles de anidamiento depende del SGBD, pero suelen ser superiores a 10. La sentencia
externa puede ser, en vez de una SELECT, una de las sentencias DELETE, INSERT o
UPDATE, que se describirn ms adelante.
Cuando hay sentencias anidadas, diremos que una sentencia es antecedente de otra cuando
sta es su subordinada directa, o subordinada de sus subordinadas a cualquier nivel.

Dep. de Informtica

47

I.E.S. TRASSIERRA - Crdoba

SQL

Todos los ejercicios vistos hasta ahora con sentencias subordinadas, se referan a la misma
tabla que la sentencia externa. Esto no tiene que ser as y en general cada clusula FROM, en
cualquier nivel de anidamiento, puede referirse a las tablas que se desee. Una subconsulta se
ejecuta una sola vez, independientemente de las filas que devuelve su antecedente directa.
Ejemplos:
1).- Si el departamento 122 est ubicado en la calle de Alcal, obtener por orden alfabtico los
nombres de sus empleados cuyo salario supere al salario medio de su departamento.
SELECT
FROM
WHERE

nomem
temple
numde = 122
AND
salar >
(SELECT AVG(salar)
FROM temple
WHERE numde = 122)
AND
EXISTS
(SELECT *
FROM tdepto
WHERE numde = 122 AND
numce IN ( SELECT numce
FROM TCENTR
WHERE seas LIKE '%ALCALA%') )
ORDER BY 1 ;
Resultado:
NOMEM
CAMPS, AURELIO
POLO, OTlLIA
SANZ, CORNELIO

En esta sentencia hay tres niveles de anidamiento y se manejan tres tablas, a las que hay
cuatro referencias. A la tabla temple hay dos referencias, pero no es necesario calificar sus
columnas porque stas se refieren a la tabla de su propia FROM en cada caso. Para evitar
dudas puede escribirse la sentencia con nombres locales y calificaciones.

La consulta puede tambin formularse con dos niveles de anidamiento:


SELECT
FROM
WHERE

nomem
temple
numde = 122
salar > (
SELECT
FROM
WHERE
EXISTS (
SELECT
FROM
WHERE

AND
AVG(salar)
temple
numde = 122 ) AND
*
tdepto D, tcentr C
D.numce = C.numce
AND
seas LIKE '%ALCALA%' AND
numde = 122)

ORDER BY 1 ;

Dep. de Informtica

48

I.E.S. TRASSIERRA - Crdoba

SQL

2).- Obtener por orden alfabtico los nombres y salarios medios de los departamentos cuyo
salario medio supera al salario medio de la empresa.
SELECT
FROM
WHERE
GROUP BY
HAVING

nomde, AVG(salar)
temple E, tdepto D
E.numde = D.numde
nomde
AVG (salar) > (SELECT
FROM
ORDER BY nomde ;

AVG(salar)
temple

En esta sentencia se usa una subordinada en la clusula HAVING.


Resultado:
NOMDE
DIRECCION GENERAL
FINANZAS
PERSONAL
PROCESO DE DATOS

AVG(salar)
3105,3333
2223,6667
1863
1947,4

5.4.- CORRELACIN.En los ejemplos vistos hasta ahora, las sentencias subordinadas no hacan referencia a
columnas de tablas que no estn en su propia clusula FROM. Esto significa que el resultado
de la sentencia subordinada puede evaluarse independientemente de sus sentencias
antecedentes en todos los niveles, inclusive la de nivel 1 sentencia externa. Por tanto el
SGBD la evala una sola vez y reemplaza los valores resultantes en el predicado donde se
encuentre.
No ocurre lo mismo con las sentencias subordinadas correlacionadas. Se llama as a las
sentencias subordinadas en las que se especifica alguna columna de una tabla mencionada en
la clusula FROM de alguna de sus sentencias antecedentes.
Una sentencia subordinada correlacionada no puede evaluarse independientemente de
las antecedentes, pues su resultado puede cambiar segn qu filas se consideren en la
evaluacin de stas en cada momento, por lo que el SGBD la evaluar mltiples veces.
Cuando en una sentencia subordinada se especifica un nombre de columna sin calificar, se
interpreta que se refiere a la primera tabla que, conteniendo una columna con este nombre, se
encuentre al buscar en el orden siguiente: primero, en las tablas de su propia sentencia
FROM; luego, en las de su sentencia antecedente inmediata; luego, en la antecedente de
siguiente nivel, etc., hasta llegar a la sentencia de nivel 1, inclusive.
Ejemplos:
1).- Obtener por orden alfabtico los nombres de los departamentos ubicados en la calle de
Atocha.

Dep. de Informtica

49

I.E.S. TRASSIERRA - Crdoba

No correlacionada:
SELECT
nomde
FROM
tdepto
WHERE
numce IN (

SQL

SELECT numce
FROM tcentr
WHERE seas LIKE '%ATOCHA%' )

ORDER BY nomde;
Resultado:
NOMDE
DIRECC. COMERCIAL
SECTOR INDUSTRIAL
SECTOR SERVICIOS

En este ejemplo, la sentencia subordinada no es correlacionada pues slo se refiere a las


columnas NUMCE y SEAS de la tabla TCENTR, que es la de su clusula FROM. Por tanto,
el SGBD la evala slo una vez y su resultado pasa a ser parte del predicado IN.
** Como ejercicio, el alumn@ deber realizar la misma consulta pero con yuncin y correlacin.
2).- Obtener por orden alfabtico los nombres de los departamentos cuyo presupuesto es
inferior a la mitad de la suma de los salarios anuales de sus empleados.
Consulta correlacionada:
SELECT
nomde
FROM
tdepto
WHERE
presu < (

SELECT
FROM
WHERE

0.5 * SUM (salar * 14)


temple
numde = tdepto.numde

ORDER BY nomde ;
En este ejemplo, la sentencia subordinada hace referencia a la columna numde de la tabla
tdepto, que est en la FROM de su sentencia antecedente. Por tanto es una sentencia
subordinada correlacionada. Hay que evaluarla para cada fila de tdepto, pues su resultado
puede ser diferente para distintas filas.
Resultado:
NOMDE
FINANZAS
PERSONAL
PROCESO DE DATOS
SECTOR INDUSTRIAL
SECTOR SERVICIOS

Tambin se puede formular esta consulta como una yuncin con agrupamiento:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

Dep. de Informtica

nomde
temple, tdepto
temple.numde = tdepto.numde
nomde, presu
presu < 0.5 * SUM (salar * 14 )
nomde ;

50

I.E.S. TRASSIERRA - Crdoba

SQL

3).- Obtener por orden alfabtico los nombres de los empleados cuyo salario supera al salario
medio de su departamento.
Consulta correlacionada sobre la misma tabla:
SELECT
FROM
WHERE

nomem
temple E
salar > (SELECT
AVG(salar)
FROM temple
WHERE numde = E.numde)
ORDER BY nomem ;
Que tambin se puede formular mediante yuncin y agrupamiento:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

E1.nomem
temple E1, temple E2
E1.numde = E2.numde
E1.numem, E1.nomem, E1.salar
E1.salar > AVG(E2.salar)
1;

5.5.- OPERADORES DE CONJUNTO.Estos operadores operan sobre consultas, de forma que combinan dos o ms tablas, vistas o
consultas en una nica tabla resultado. Su sintaxis general es:
SELECT

<operador de conjunto>

SELECT

Las sentencias SELECT deben tener el mismo nmero de columnas, y adems las
columnas que estn en la misma posicin relativa deben ser del mismo tipo aunque sus
longitudes pueden variar. Al unirlas se obtiene como resultado otra tabla con las mismas
columnas y tipos de datos que las que se unen, y con un nmero de filas que depender
del operador utilizado.
En estos operadores de conjunto va implcita la clusula DISTINCT. Los desarrollados por
Oracle son unin interseccin y resta:
Son de especial utilidad cuando se trata de manipular tablas completas, componer vistas de
usuario, etc. Aunque tambin pueden usarse para realizar consultas.

5.5.1.- Operador UNION.El operador UNION devuelve todas las filas que han sido seleccionadas por las dos sentencias
SELECT que hacen de operandos.
Si ambos operandos se refieren a la misma tabla, el resultado es equivalente a realizar una
sola consulta con el operador OR.
Dep. de Informtica

51

I.E.S. TRASSIERRA - Crdoba

SQL

El resultado de la unin puede a su vez unirse con el de otra sentencia SELECT o con el de
otra unin. Pueden usarse parntesis para indicar el orden de evaluacin de las uniones. Si no
se usan parntesis, el orden de evaluacin es el de escritura. Para que el resultado se presente
en un orden determinado hay que usar la clusula ORDER BY en la ultima SELECT.
Si se aade la opcin ALL, la unin devolver todas las filas aunque estn duplicadas.
Ejercicio: ejecutar la siguiente sentencia, primero con UNION y despus con UNION ALL.
SELECT * FROM tdepto
UNION [ALL]
SELECT * FROM tdepto ;
Ejemplos:
1).- Listar alfabticamente los nombres de los empleados del departamento 112, sus sueldos
mensuales (salario + comisin) y el literal "Con comisin" o "Sin comisin", segn el caso.
SELECT
FROM
WHERE

nomem, salar, 'Sin comisin'


temple
comis IS NULL AND numde = 112

UNION
SELECT
FROM
WHERE
ORDER BY

nomem, salar+comis, 'Con comisin'


temple
comis IS NOT NULL AND numde = 112
1;

Resultado:
NOMEM
DIEZ, AMELIA
GARCIA, OCTAVIO
LASA, MARIO
MARTIN, MICAELA
PEREZ, SABINA
TEROL, LUCIANO
TORRES, HORACIO

SALAR
'SINCOMISIN
2224
Con comisin
2765
Con comisin
2765
Con comisin
1082
Sin comisin
863
Con comisin
2404
Con comisin
1683
Con comisin

2).- Listar los nombres de los empleados del departamento 112 y los nombres de los
departamentos.
SELECT nomem FROM temple WHERE numde = 112
UNION
SELECT nomde FROM tdepto ;

5.5.2.- Operador INTERSECT.Este operador devuelve las filas comunes que han sido seleccionadas por los comandos
SELECT sobre los que opera, esto es las filas que se encuentran en ambas tablas resultado de
las SELECT.

Dep. de Informtica

52

I.E.S. TRASSIERRA - Crdoba

SQL

Si ambas sentencias SELECT se refieren a la misma tabla, el resultado es equivalente a


realizar una sola consulta con el operador AND.
Ejemplo: Listar el nombre y salario de todos los empleados del departamento 112 que tengan
un salario mensual superior a 2000 euros.
SELECT
FROM
WHERE

nomem, salar
temple
numde = 112

INTERSECT
SELECT
FROM
WHERE

nomem, salar
temple
salar > 2000 ;

Resultado:
NOMEM
GARCIA, OCTAVIO
LASA, MARIO

SALAR
2284
2104

5.5.3.- Operador MINUS.El operador MINUS devuelve las filas que habiendo sido devueltas por el primer SELECT,
no se encuentran en las devueltas por el segundo.
Ejemplo: Listar el nombre y salario de todos los empleados del departamento 112 salvo los
que no tengan hijos.
SELECT
FROM
WHERE
MINUS
SELECT
FROM
WHERE

nomem, salar
temple
numde = 112
nomem, salar
temple
numhi =0 ;

Resultado:
NOMEM
GARCIA, OCTAVIO
LASA, MARIO
TEROL, LUCIANO

SALAR
2284
2104
1743

5.6.- EJERCICIOS PROPUESTOS .1.- Para los departamentos cuyo director lo sea en funciones, hallar el nmero de empleados y
la suma de sus salarios, comisiones y nmero de hijos.
2.- Listar, por orden alfabtico, los nombres de los empleados que son directores en
funciones.
Dep. de Informtica

53

I.E.S. TRASSIERRA - Crdoba

SQL

3.- Para todos los departamentos que no sean de direccin ni de sectores, listar el nmero de
departamento y el de sus distintas extensiones telefnicas, por orden creciente de
departamento y, dentro de ste, por nmero de extensin creciente.
4.- A los empleados que son directores en funciones se les asignar una gratificacin del 5%
de su salario. Hallar por orden alfabtico los nombres de estos empleados y la gratificacin
correspondiente a cada uno de ellos.
5.- Listar todos los datos de los departamentos cuyo centro de trabajo no exista en la tabla
TCENTR.
6.- Hallar si hay algn departamento que an no tenga empleados asignados ni director en
propiedad.
7.- Listar alfabticamente, los nombres de los empleados que son directores de primer nivel,
es decir, que dirigen departamentos de los que no dependen otros departamentos.
8.- Listado alfabtico de los empleados que pertenecen a departamentos cuyo Director en
propiedad lo sea tambin en funciones de algn otro, excluyendo del resultado a los
directores.
9.- Comprobar (listando todos sus datos) si hay empleados con un departamento inexistente.
10.- Hallar (listando todos sus datos) si hay algn departamento que solo tenga como
empleado a su director en propiedad.
11.- Comprobar que todos los empleados que son directores de departamento existen en la
tabla de empleados.
12.- Comprobar que los directores en propiedad son empleados de su departamento.
13.- Obtener, por orden alfabtico, todos los datos de los centros de trabajo en los que hay
algn departamento cuyo director lo sea en funciones.
14.- Para cada director, hallar por orden alfabtico su nombre y la suma de los salarios de los
empleados que estn directamente a su cargo (es decir, en los departamentos que l dirige), en
dos grupos separados segn sea en funciones o en propiedad.
15.- Hallar, por orden alfabtico, los nombres de los departamentos cuyo presupuesto medio
por empleado supera a la media de sus salarios.
16.- Para los empleados que trabajan en la calle de Atocha y comparten su extensin
telefnica con otro empleado con menor salario que ellos, hallar la suma de sus salarios por
departamento y el nombre de ste, por orden alfabtico.
17.- Hallar cuntos empleados hay que compartan su extensin telefnica con otro de otro
departamento.
18.- Hallar, por orden alfabtico, los nombres de los departamentos en los que hay algn
empleado que cumpla este ao ms de 50 aos de edad.
Dep. de Informtica

54

I.E.S. TRASSIERRA - Crdoba

SQL

19.- Hallar el nmero de departamento y el salario mximo para los departamentos cuyo
salario mximo es menor que el salario medio de los empleados de todos los dems
departamentos.
20.- Listar los nombres y salarios totales de aquellos empleados que ganan igual o ms que
sus jefes de departamento.
21.- Listar el nombre y nmero de departamento de los empleados no directores, pero solo de
aquellos departamentos de los que no dependen otros departamentos, ordenados por nmero
de departamento.
22.- Para los departamentos ubicados en la calle de Alcal en los que haya algn empleado
con ms de 10 aos de antigedad y tales que la media de hijos por cada uno de estos
departamentos sea superior a 1, hallar el salario medio de estos empleados.
----------- Operadores de conjunto--------23.- Hallar el salario medio y la edad media en aos de los empleados que tienen comisin y
los que no.
24.- Para los empleados que no tienen comisin, obtener por orden alfabtico el nombre y el
cociente entre su salario y el nmero de hijos, pero si un empleado no tiene hijos, se obtendr
el salario sin ms, indicando este caso con un literal.
25.- Para los empleados que trabajan en la calle de Atocha cuyo salario supera al salario
medio de su departamento, obtener por orden alfabtico su nombre y su salario total.
26.- Hallar, por departamento, la masa salarial total (suma de todos los salarios y comisiones
del departamento) y el nombre, por orden alfabtico.
27.- Supongamos que algunos departamentos se van a trasladar a otro local. Disponemos de
una tabla llamada TTRASL con una sola columna llamada NUMDEP donde hay una fila por
cada departamento que se traslada al local nuevo. Se desea producir una lista por orden
alfabtico de todos los departamentos, indicando cules se trasladan y cules no.
28.- Efectuar una explosin de la organizacin de departamentos. Es decir, para cada
departamento, obtener su nombre, el de los que dependen de l y el nivel al que dependen. Si
un departamento depende directamente de otro, este nivel ser 1, si depende de uno que
depende directamente de ste ser 2, y as sucesivamente. Se considerar que un
departamento depende de s mismo a nivel 0. La primera columna del resultado ser el
nombre de un departamento, la segunda el de un departamento que depende de l, y la tercera
el nivel al que depende. Considerar un mximo de 3 niveles de dependencia. Presentar el
resultado por orden alfabtico. Si de un departamento no depende ningn otro, aparecer al
menos dependiendo de s mismo a nivel 0.

Dep. de Informtica

55

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 6.- ARCHIVOS DE COMANDOS E INFORMES CON


SQL *Plus.6.1.- Archivos de comandos con SQL*Plus.
6.1.1.- Variables de sustitucin.
6.1.2.- Captura de datos desde el terminal.
6.2.-Informes con SQL*Plus.
6.2.1.- Comandos de parmetros.
- de entorno.
- de feedback.
- de salida.
6.2.2.- Comandos de formato.
- de ttulo: TITLE y BTITLE.
- de columna: COLUMN.
- de ruptura: BREAK.
- de clculo: COMPUTE.
- de limpieza: CLEAR.
6.3.- Ejercicios propuestos.

6.1.- ARCHIVOS DE COMANDOS CON SQL*Plus.Hasta ahora hemos usado archivos de texto para almacenar un comando. Ahora veremos
como almacenar varios comandos. SQL tiene sus comandos o sentencias, y SQL*Plus, que es
un producto de Oracle, tiene otros comandos y parmetros adicionales que se vern mas
adelante en este mismo tema.
Un archivo de comandos no es ms que un archivo de texto con la extensin .SQL en el que
se almacenan un conjunto de comandos SQL, que se ejecutan secuencialmente, uno tras otro,
al lanzar la ejecucin del archivo.
Adems de lneas de comandos de SQL, un archivo de comandos puede contener:
Lneas de comentario, que comienzan con REM

Lneas de ejecucin, que constan solo de la barra inclinada ( / ) y que se insertan a


continuacin de cada sentencia SQL indicando su ejecucin.
REM Ejemplo de archivo de comandos
SELECT
REPLACE(nomem, 'A', '~')
FROM
temple
/
SELECT
RPAD('HOLA', 20, '*')
FROM
dual
/

Dep. de Informtica

56

I.E.S. TRASSIERRA - Crdoba

SQL

Un archivo de comandos se arranca con el comando START ya visto:


START <nombre_archivo>
Desde un archivo de comandos puede arrancarse otro, en cuyo caso se habla de "archivos de
comandos anidados".

6.1.1.- Variables de sustitucin.Aparte de las variables globales que pertenecen al entorno de trabajo de SQL*Plus, en un
archivo de comandos pueden aparecer variables locales a dicho archivo, tambin llamadas
variables de sustitucin que permiten agilizar la codificacin evitando repetir valores en
distintas sentencias. Estas se inicializan con DEFINE y se usan precedidas del smbolo &.
Inicializacin:

DEF[INE] <variable> = valor

Uso:

&<variable>

Ejemplo:
DEF dep=110
SELECT
REPLACE(nomem, 'A', '~')
FROM
temple
WHERE
numde = &dep
/
SELECT
nomem, salar
FROM
temple
WHERE
numde = &dep
/
DEF <variable> muestra el contenido de la variable ya inicializada.
DEF

sin argumentos muestra los valores de todas las variables de usuario.

Hay que tener en cuenta que todas las variables definidas con DEFINE toman siempre valores
de tipo char.
Si una variable de sustitucin tiene valor, ste permanece en el mbito del archivo hasta que:
Se vuelva a inicializar.
Se desactive la variable (con UNDEF[INE] <variable>).

6.1.2.- Captura de datos desde el terminal.Si utilizamos archivos de comandos, nos ser necesario en ocasiones capturar datos desde el
terminal, que sern usados por los comandos del archivo. Eso ocurrir, por ejemplo si
queremos disear una consulta interactiva del salario medio de un departamento, de forma
que el usuario teclee el nmero del departamento y la consulta se refiera a l.

Dep. de Informtica

57

I.E.S. TRASSIERRA - Crdoba

SQL

Para capturar datos desde el terminal pueden usarse dos mtodos:

Captura mediante variables de sustitucin.-

Si una variable de sustitucin es referenciada en el archivo de comandos sin que se haya


inicializado, se muestra en pantalla un mensaje solicitando un valor para esa variable.
Ejemplo:
SELECT
FROM
WHERE

AVG(salar)
temple
numde = &dep ;

Introduzca un valor para dep: 120


Despus de introducido, muestra la lnea de sustitucin:
antiguo 3: WHERE numde= &dep
nuevo 3: WHERE numde= 120
Y por ltimo muestra el resultado:
AVG(SALAR)
----------------1623

Si la misma variable de sustitucin aparece varias veces en una sentencia o en varias del
archivo de comandos, y no queremos que el sistema nos pregunte por su valor nada ms que
una vez, deberemos usar &&<variable> la primera vez que se referencia a la variable de
sustitucin.
Ejemplo:
SELECT
FROM
WHERE
/
SELECT
FROM
WHERE
/

nomem "Empleado", salar "Salario"


temple
numde = &&dep
nomde
tdepto
numde = &dep

) El comando ACCEPT permite asignar a una variable de usuario un valor introducido


por teclado. Su sintaxis es:
NUM[BER] /
PROMPT <texto> /
ACC[EPT] <variable>
CHAR
NOPR[OMPT] [HIDE]
Si <variable> no existe, SQL*Plus la crea. Puede especificarse un tipo NUMBER o
CHAR (por defecto). Los valores tecleados que no coinciden con el tipo de variable son
rechazados.
PROMPT <texto> hace que se muestre el texto en pantalla al solicitar el valor.
HIDE hace que se oculten los caracteres tecleados.
Dep. de Informtica

58

I.E.S. TRASSIERRA - Crdoba

SQL

) El comando PROMPT permite visualizar un texto, incluso que contenga variables de


sustitucin. As por ejemplo:
SQL> ACCEPT mes PROMPT ' Introduce el mes: '
Introduce el mes: Junio
SQL> PROMPT El mes tecleado es &mes
El mes tecleado es Junio
) El comando PAUSE muestra un mensaje en pantalla y se suspende la ejecucin hasta
que se pulse Return:
SQL> PAUSE coloca papel en la impresora y pulsa Return para continuar.

Captura mediante parmetros en la lnea de comandos.-

Al arrancar un archivo de comandos pueden indicarse hasta nueve parmetros:


START nombre_archivo par1 par2 ..... par9
En el archivo de comandos nos referiremos a los parmetros por las variables:
&1, &2, ...., &9
que se corresponden posicionalmente con ellos.
No se admiten ms de nueve parmetros. Si se indican menos parmetros que variables, las
variables sobrantes quedan sin valor asignado. Desde el archivo de comandos se pueden
referir las variables cuantas veces se desee y el cualquier orden.
Ejemplo. Supongamos el fichero prueba.sql:
SELECT
FROM
WHERE
/
La invocacin:

numde, nomem, salar


temple
numde = &1 AND salar > &2

START prueba 110 1000

Ejecuta la consulta para los empleados del departamento 110 que cobran mas de 1000 euros.
NOTA: En cualquiera de los casos de captura de variables desde el terminal, la sustitucin se
realiza segn el contenido tecleado, por lo que si se espera un valor alfanumrico habr que
incluir comillas en la referencia a la variable: '& variable'.

Dep. de Informtica

59

I.E.S. TRASSIERRA - Crdoba

SQL

6.2.- INFORMES CON SQL*Plus.A continuacin veremos algunos comandos sobre parmetros que personalizan el entorno de
trabajo y facilitan la obtencin de informes mejorando la presentacin de los mismos. Estos
comandos:
No se guardan en el buffer de SQL.
Su ejecucin no cambia el comando SQL actual.
Tienen efecto hasta que se desactiven o hasta que se cancele, se cambie o se
abandone la sesin de trabajo con SQL*Plus.
Estos comandos pueden ajustarse ejecutando el correspondiente comando desde la lnea de
comandos de SQL o desde un archivo de comandos.
Si deseamos configurar el entorno, podemos incluir sus definiciones en un fichero de texto y
guardarlo como LOGIN.SQL en el directorio por defecto de Oracle (consltese la variable
path de MSDOS). De esta forma ser ejecutado al arrancar SQL*Plus. Si el fichero no existe
los parmetros se inicializarn por defecto.
Tambin podemos personalizar un entorno a travs del acceso directo de SQL Plus en el
escritorio. En el cuadro Iniciar en de sus propiedades, especificaremos el directorio por
defecto. El fichero LOGIN.SQL colocado ah, ser el que se ejecute desde ese acceso directo.
6.2.1.- Comandos de parmetros.Los parmetros representan valores de ciertas propiedades que controlan la ejecucin de SQL.
Esos valores se recogen en variables y pueden ser modificados por el usuario.
Cada parmetro de entorno tiene un valor por defecto y se almacena como una variable
global.
El comando SET define los valores de variables de sistema. Su sintaxis genrica es:
SET <variable> ON/OFF/<valor>
El comando SHOW muestra el valor de una o todas las variables de sistema. Su sintaxis es:
SHOW <variable>/ALL

Parmetros de feedback.SET ECHO [ON/OFF]

Permite visualizar o no los comandos conforme se ejecutan


desde un archivo de comandos. Por defecto OFF.

SET
FEEDBACK Define el nmero mnimo de filas recuperadas por una consulta
para que genere el mensaje N Of rows returned (Nmero de
[nn/ON/OFF]
filas devueltas). Por defecto ON y 6.
SET VERIFY [ON/OFF]

Dep. de Informtica

Muestra o no los valores antiguo y nuevo de las variables


parametrizadas (de sustitucin). Por defecto ON.

60

I.E.S. TRASSIERRA - Crdoba

SQL

Parmetros de salida.SET LINESIZE nn

Nmero mximo de caracteres por lnea (mx. 999, 80 por


defecto). Una columna nunca se extender sobre dos lneas.

SET PAGESIZE nn

Nmero de lneas de la pgina, incluyendo ttulo y lneas de


pausa. Por defecto 25.

SET HEAD[ING] ON/OFF

Activa y desactiva las cabeceras de columnas. Por defecto ON.

SET HEADSEP car

Especifica el carcter para separar los ttulos en varias lneas.


(por defecto |).

SET NULL texto

Indica la cadena de caracteres para valores nulos (NULL). Por


defecto "".

SET NEWPAGE nn

Nmero de lneas de separacin entre pginas.

SET NUMWIDTH nn

Anchura de los campos numricos.

SET TIME ON/OFF

Permite visualizar o no la hora junto al prompth de SQL

SET WRAP ON/OFF

Permite visualizar en otra lnea(por defecto ON), o truncar las


columnas que excedan del tamao especificado en COLUMN.

SET NUMF[ORMAT] <fmt> Indica el formato que tendrn por defecto las columnas
numricas que no tengan un formato especificado. Los formatos
son los mismos que para el comando COLUMN.
Indica el n de espacios entre columnas (1 por defecto, mx. 10)

SET SPA[CE] nn
SET PAU[SE]
[texto]

ON/OFF/ Permite hacer una pausa entre pginas y mostrar el texto


especificado. Por defecto OFF.

SET TERM[OUT] ON/OFF Permite mostrar u ocultar los resultados de las sentencias
cuando se ejecutan en un archivo de comandos(x filas
borradas). Por defecto en ON.

6.2.2.- Comandos de formato.Las especificaciones de formato se almacenan como variables locales, pueden activarse o
desactivarse en cualquier momento y se pueden almacenar en el archivo LOGIN.SQL. Hay
cinco comandos bsicos: de ttulo, de columna, de ruptura, de clculo y de limpieza.

Comandos de ttulo: TTITLE y BTITLE.-

Los ttulos no necesitan comillas si no contienen espacios blancos y se centran en la anchura


de la lnea especificada con SET LINESIZE. Si dentro de la cadena de ttulo incluimos los
caracteres ||, provocaremos un salto de lnea en el ttulo.
TTITLE/BTITLE [LEFT/CENT/RIGHT] <texto> [ <&variable>] / {ON/OFF} [SKIP n]
TTITLE establece el ttulo superior o encabezado de pgina y BTITLE el pie de pgina.
Los valores por defecto son CENT y ON. Si especificamos CENT, se ocultan la fecha y n de
pgina del encabezado, SKIP n indica el nmero de lneas entre pginas.
Dep. de Informtica

61

I.E.S. TRASSIERRA - Crdoba

SQL

Comandos de columna: COLUMN.-

Permiten especificar formatos de salida para cada columna individualmente.


COLUMN <nombre_columna> <lista_de_formatos>
<nombre_columna>

es el nombre especificado en cualquiera de las expresiones de


columna de la SELECT.

<lista_de_formatos> es uno o varios formatos de entre los siguientes:


HEADING <texto>

Permite visualizar un encabezado de columna distinto al nombre


de la columna.

WRAPPED /
WORD WRAPPED /
TRUNCATED.

Indica qu hacer con la salida si el valor de la columna es mayor


que la anchura especificada para ella en el formato FORMAT
que se ver a continuacin. WRAPPED (por defecto) hace que se
muestre en la siguiente lnea y TRUNCATED que se trunque.

NEWLINE/OFF

Fuerza que el valor de la columna se visualice en una nueva lnea.


No afecta a la primera columna.

NULL <texto>

Indica el texto que reemplazar a un valor nulo en la columna.

LIKE <columna1>

Copia todos los comandos de formato de <columna1> a la


columna especificada.

PRINT / NOPRINT

Establece la visualizacin o no de la columna.

ON / OFF

Activa o desactiva los formatos especificados para la columna.

FORMAT <mscara> Una mscara de formato se construye con las siguientes unidades:
Alfanumrica
An
Numrica
9
0
$
.
,
V
B
MI
PR

Dep. de Informtica

n caracteres de anchura.

Especifica una posicin de un dgito suprimiendo los ceros no


significativos.
Especifica una posicin de un dgito rellenando con ceros las
posiciones no significativas.
Posicin del signo $
Posicin del punto (.)
Posicin de la coma (,)
Alinea los decimales de los nmeros reales sin mostrar el punto
decimal.
Convierte a blancos los ceros al principio de la columna.
Coloca un signo menos(-) a la derecha de las cifras negativas.
Encierra entre signos de menor y mayor (<>) las cifras negativas.

62

I.E.S. TRASSIERRA - Crdoba

SQL

Comando de ruptura: BREAK.

Una ruptura de control (break) es un evento que permite interrumpir la salida normal y hacer
algo. Se suele usar en conjuncin con una SELECT con la clusula ORDER BY.
Puede definirse en los siguientes casos:
<expr>
ROW
PAGE
REPORT

Cuando cambia el valor de <expr>


En cada cambio de fila
En cada cambio de pgina
Al final de un informe o consulta.

Y siempre se debe de realizar alguna de las siguientes acciones:


SKIP n
PAGE

Saltar n lneas.
Saltar a la cabecera de la siguiente pgina.

Y opcionalmente:
DUP / NODUP Permite visualizar o no los valores duplicados en las columnas
especificadas como de ruptura de control. NODUP por defecto.
En un momento determinado solo puede haber un comando BREAK activo (al escribir un
BREAK, ste sustituye al anterior), por lo que se deben especificar varias columnas en un
mismo BREAK si se quieren activar a la vez
Sintaxis:

BREAK ON

<exp_colum> /
ROW
/
PAGE
/
REPORT

SKIP <numero> /
PAGE

DUP /
NODUP

donde <exp colum> debe ser un nombre de columna sin calificar o un alias de columna.
Ejemplos:
1.- Mostrar el nmero de departamento, el nombre de empleado y el salario de todos los
empleados ordenado por nmero de departamento, de forma que en una misma pgina no se
muestren datos de mas de un departamento y evitando valores consecutivos duplicados.
SQL> BREAK ON numde PAGE
SQL> SELECT
numde, nomem, salar
FROM
temple
ORDER BY numde ;
2.- Mostrar el nombre y el presupuesto de todos los departamentos, el informe se har a 2
espacios.
SQL> BREAK ON ROW SKIP 1
SQL> SELECT
nomde, presu
Dep. de Informtica

63

I.E.S. TRASSIERRA - Crdoba

SQL

FROM
tdepto
ORDER BY numde ;
3.- Mostrar el nmero de hijos y el nombre de todos los empleados. El informe se har de
forma que en cada pgina aparezcan ordenados alfabticamente los nombres de los empleados
con igual nmero de hijos.
SQL> BREAK ON numhi PAGE
SQL> SELECT
numhi, nomem
FROM
temple
ORDER BY 1, 2 ;

Comando de clculo: COMPUTE.-

Permite realizar operaciones estadsticas con grupos de tuplas seleccionados. Las operaciones
que permite calcular son:
AVG
COUNT
MAXIMUN
MINIMUN
NUMBER
STD
SUM
VARIANCE

Media
Recuento de valores no nulos
Valor mximo.
Valor mnimo.
Recuento de filas.
Desviacin estndar
Suma (total)
Varianza.

COMPUTE puede ejecutarse en un punto de ruptura determinado, o sincronizarse con


definiciones existentes de BREAK. Su sintaxis es:

COMPUTE

[SUM] [COUNT] [AVG]


[MIN] [MAX] [VAR]
OF <exp_colum> ON
[STD] [NUMBER]

<exp_colum> /
ROW / PAGE /
REPORT

Solo puede haber un comando COMPUTE activo por columna, por lo que si queremos aadir
un clculo a una columna que ya tiene uno, debemos reescribir el comando con los dos
clculos.
Ejemplo:
BREAK ON
COMPUTE
SELECT
FROM
ORDER BY

Dep. de Informtica

numde SKIP 1
SUM AVG OF salar ON numde
numde, nomem, salar
temple
numde ;

64

I.E.S. TRASSIERRA - Crdoba

SQL

Comando de limpieza: CLEAR.-

El comando CLEAR permite realizar la limpieza de ciertos elementos: Su sintaxis es:


CLEAR <opcin>
<opcin> puede ser alguna de las siguientes:
BREAKS
BUFFER
COLUMNS
COMPUTES
SCREEN
SQL

Limpia los BREAKS marcados mediante el comando BREAK.


Limpia el texto del buffer activo.
Limpia las opciones del comando COLUMN.
Limpia las opciones del comando COMPUTE.
Limpia la pantalla.
Limpia el buffer de SQL.

6.3.- EJERCICIOS PROPUESTOS.1.- Codificar un archivo de comandos de nombre TEM6_1.SQL que contenga una consulta
que muestre el nombre del departamento y su salario medio, de un departamento cuyo nmero
se teclear una sola vez. (con variables de sustitucin).
2.- Modificar el anterior archivo de comandos para que se ejecucin sea posible pasndole los
parmetros desde la lnea de comandos. Guardarlo como TEM6_2.SQL.
3.- Realizar el siguiente informe, en el que se muestran los empleados por departamento y sus
salarios, y las sumas de los salarios por departamento. Guardando todos los comandos
necesarios en el archivo TEM6_3.SQL.
Mar Dic 11

pgina

LISTADO DE SALARIOS POR DEPARTAMENTO


Nombre
Departamento
-------------------------------------------------DIRECC. COMERCIAL

Empleado
-------------------------------------------------PEREZ, MARCOS
MORAN, CARMEN
CAMPOS, ROMULO

********************
sum
DIRECCION GENERAL

GALVEZ, PILAR
ALBA, ADRIANA
LOPEZ, ANTONIO

2,284
2,705
4,327
-------9,316

********************
sum
FINANZAS

FLOR, DOROTEA
GARCIA, AUGUSTO
FIERRO, CLAUDIA

********************
sum
ORGANIZACIN
********************
sum

GIL, GLORIA

Salario
Mensual
---------------2,885
1,292
1,202
-------5,379

1,743
2,524
2,404
-------6,671
1,623
-------1,623

Informe confidencial

Dep. de Informtica

65

I.E.S. TRASSIERRA - Crdoba

SQL

4.- Se quiere realizar un informe en el que se analicen los salarios en funcin del numero de
hijos que tiene el personal de la empresa. El informe deber estar agrupado por numero de
hijos en cada pgina y ordenado alfabticamente por el nombre de los empleados. Tras cada
pgina deber esperar la confirmacin del usuario. Se guardar en el fichero TEM6_4.SQL Y
Presentar el siguiente formato:
Jue Nov 07

pgina 1
LISTADO ALFABETICO DE EMPLEADOS
POR NUMERO DE HIJOS

N de hijos
--------------0

Empleado
---------------------------------ALBA, ADRIANA
DIEZ, AMELIA
DURAN, LIVIA
....................................
....................................
VAZQUEZ, HONORIA

***********
avg
count
minimum
maximum
number
sum

Sueldo Mensual
Salario Comisin TOTAL
--------- ----------- ----------2,870
0
2,870
1,751
541
2,292
1,313
601
1,914

1,251
601
1,852
------- ------------- ----------1,699
1,961
6
1,116
2,870
14
23,788
27,454

Pulse una tecla para continuar .....................>

5.- Realizar el siguiente informe:

Dep. de Informtica

66

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 7.- SENTENCIAS DE ACTUALIZACIN DE DATOS Y


TRANSACCIONALES.7.1.- Actualizacin de datos.
7.1.1.- Insercin de tuplas. Sentencia INSERT.
7.1.2.- Borrado de tuplas. Sentencia DELETE.
7.1.3.- Modificacin de tuplas. Sentencia UPDATE.
7.2.- Sentencias transaccionales.
7.2.1.- Sentencia COMMIT.
7.2.2.- Sentencia ROLLBACK.
7.2.3.- Sentencia SAVEPOINT.
7.3.- Ejercicios propuestos

7.1.- ACTUALIZACIN DE DATOS.Adems de la sentencia SELECT vista, que permite consultar datos, el L.M.D. de SQL
dispone de consultas para actualizar los datos de las tablas, permitiendo aadir nuevas tuplas,
borrar tuplas existentes y modificar sus datos.
Dado que a partir de ahora vamos a actualizar las tablas usadas como ejemplo, y como las
sentencias que veremos pueden actualizar (aadir, borrar o modificar) muchas filas de una
vez, conviene que para practicar, el alumno o alumna:
Trabaje con copias de las tablas originales.
Antes de ejecutar la sentencia de actualizacin, se cercione, con ayuda de SELECT, de
las tuplas que se vern afectadas

7.1.1.- Insercin de tuplas. Sentencia INSERT.La sentencia INSERT permite aadir uno o mas filas completas a una tabla o vista, para lo
cual la tabla debe ser propiedad del usuario que intenta la insercin o tener privilegio de
INSERT sobre ella, en cuyo caso deber calificar el nombre de la tabla, anteponindole el
nombre del propietario y un punto. Esta sentencia tiene la siguiente sintaxis:
INSERT INTO <tabla> [(col1, col2, ..)]

VALUES (valor1, valor2, ..) /


Subselect

donde:
<tabla>

es el nombre de la tabla en la que se desea insertar (realmente aadir al


final, pues el orden es irrelevante).

(col1, col2,..) es una lista de las columnas de esa tabla, no tienen por que especificarse
todas ni en el mismo orden de definicin. Si se omite, se interpreta
como si se hubieran especificado todas y en dicho orden.

Dep. de Informtica

67

I.E.S. TRASSIERRA - Crdoba

SQL

Si se especifica la palabra reservada VALUES solo se insertar una fila completa por cada
sentencia. En este caso:
(valor1, valor2, ..) representan los valores que adoptarn las columnas. Cada uno de los
valores debe ser una constante, o la palabra NULL (o un registro especial), y debe haber
tantos como en la lista de columnas.
El primer valor se asigna a la primera columna de la lista, el segundo a la segunda, etc. Si
alguna columna de la tabla no ha sido especificada se le asigna el valor nulo por defecto,
si dicha columna lo admite, sino dar error.

Si se especifica una subconsulta, se insertarn en la tabla todas las tuplas resultantes de la


consulta subordinada, por lo que con este formato, con una nica sentencia se pueden
insertar mltiples filas, una o ninguna, segn que la subselect devuelva varias, una o
ninguna tupla (tabla vaca). Pero hay que tener en cuanta que ni la sentencia subordinada,
ni sus subordinadas si las tuviera, pueden referirse a la tabla en la que se est insertando.
El nmero de columnas devueltas por la subordinada debe ser el igual que las
especificadas en la lista de columnas y sus datos homogneos para que permita asignar los
datos devueltos en la primera columna a la primera columna de las especificadas en la
lista de columnas, los de la segunda a la segunda, etc. Evidentemente, los datos de las
columnas devueltas deben ser homogneos con las receptoras.

Ejemplos:
1).- Dar de alta el departamento de Planificacin con el nmero 123 que depender del 120.
Estar ubicado en el centro 10, siendo su presupuesto de 24.000 y su director el empleado
350.
INSERT INTO
tdepto
VALUES
(123, 10, 350, 'F', 24000, 120, 'PLANIFICACION') ;
2).- Supongamos que el usuario USU4 es propietario de la tabla mayores, vaca y con la
misma estructura que temple y queremos (y podemos) insertar en ella los empleados mayores
de 50 aos:
INSERT INTO
USU4.mayores
SELECT
nomem, fecna
FROM
temple
WHERE
TRUNC(MONTHS_BETWEEN(sysdate, fecna)/12) >=50 ;

7.1.2.- Borrado de tuplas. Sentencia DELETE.


La sentencia DELETE permite borrar filas de una tabla o vista. Lgicamente la tabla debe ser
propiedad del usuario que intenta realizar el borrado o bien tener privilegio de DELETE sobre
ella, en cuyo caso deber calificar el nombre de la tabla, anteponindole el nombre del
propietario y un punto. Su sintaxis es:
DELETE [FROM] <tabla> [<alias>] [WHERE <predicado>]
donde:

Dep. de Informtica

68

I.E.S. TRASSIERRA - Crdoba

SQL

<tabla>

es el nombre de la tabla de la que se van a eliminar las filas. Se le


puede asignar un nombre local o alias, indicndolo despus.

<predicado>

puede contener sentencias subordinadas, incluso con sentencias


correlacionadas a la tabla del DELETE.

Esta sentencia borra todas las filas que cumplan el predicado de WHERE, como no pueden
borrarse parcialmente desaparecen completas. Si se omite WHERE, se borran todas las filas
de la tabla, por lo que hay que tener mucho cuidado con su uso.
Ejemplo: Borrar el departamento de Planificacin dado de alta en ltimo lugar:
DELETE
FROM
WHERE

tdepto
numde=123 ;

7.1.2.- Modificacin de tuplas. Sentencia UPDATE.


La sentencia UPDATE sirve para modificar una o varias tuplas de una tabla, permitiendo que
se actualice una, varias o todas las columnas de la fila o filas seleccionadas, al contrario que
el borrado y la insercin que trataban filas completas. Para actualizar filas de una tabla, sta
debe ser propiedad del usuario que intenta realizar la actualizacin o bien tener privilegio de
UPDATE sobre ella, en cuyo caso deber calificar el nombre de la tabla anteponindole el del
usuario y un punto. Su sintaxis es:
UPDATE <tabla> [<alias>]
SET

<col1> =

<subconsulta> /
<exp> /
NULL

, <col2> =

<subconsulta> /
<exp> /
NULL

....

[WHERE <predicado>]
donde:
<tabla>

es el nombre de la tabla a actualizar, a la que se le puede asignar un


nombre local o alias, especificndolo detrs.

<subconsulta> especifica que la sentencia SELECT devolver el valor que se asignar


a la columna correspondiente.
<exp>

es la expresin que deber devolver un valor acorde con la columna


correspondiente.

NULL

indica que la columna especificada tomar el valor nulo.

<predicado>

puede contener sentencias subordinadas, incluso con sentencias


correlacionadas a la tabla del UPDATE.

La sentencia UPDATE actualiza todas las filas que cumplan el predicado de WHERE, o todas
si se omite esta clusula, modificando las columnas especificadas en la clusula SET.

Dep. de Informtica

69

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplos:
1).- Actualizar todos los salarios redondendolos a euros (sin decimales) con un incremento
del 3%. (antes debe comprobarse el resultado con una SELECT).
UPDATE
SET

temple
salar = ROUND(salar *1.03) ;

Resultado: 35 filas actualizadas.


2).- Honoria Vzquez (empleada n 500) ha ascendido en el mismo departamento y le han
aumentado el sueldo hasta igualrselo al menor salario de la tabla mayores, dejando de
percibir comisiones. Actualizar la tabla de empleados para que recoja estos cambios.
UPDATE
SET

WHERE

temple
salar = (SELECT
FROM
comis = NULL
numem= 500 ;

MIN(salar)
mayores),

Resultado: 1 fila actualizada


Ejercicio: Aumentar un 10% los salarios de los empleados con salario inferior al salario
medio de su departamento.

7.2.- SENTENCIAS TRANSACCIONALES.


Como sabemos una transaccin o Unidad Lgica de Trabajo (ULT) es una secuencia de
operaciones de actualizacin que forman un todo, de forma que o se ejecutan todas o no se
ejecuta ninguna, debiendo dejar la base de datos en estado coherente.
Una transaccin comienza en la primera sentencia SQL tras: una sentencia COMMIT, una
sentencia ROLLBACK o una conexin a la base de datos.
Una transaccin termina con: una sentencia COMMIT, una sentencia ROLLBACK o una
desconexin, intencionada o no, a la base de datos. El SGBD realiza un COMMIT implcito
antes de ejecutar cualquier sentencia de LDD (create, alter, ..) o al realizar una desconexin
que no haya sido precedida de un error.
Las sentencias SQL que permiten gestionar explcitamente las transacciones son:

COMMIT

ROLLBACK

SAVEPOINT

Dep. de Informtica

70

I.E.S. TRASSIERRA - Crdoba

SQL

7.2.1.- COMMIT .Seala el final de una transaccin y el principio de otra indicndole al sistema que se deben
validar los cambios que se produjeron desde el principio de la transaccin que se da por
concluida, hacindolos visibles para los dems usuarios. Su sintaxis es:
COMMIT [WORK];
WORK es opcional, y no tiene ninguna trascendencia. Al hacer un COMMIT, se liberan todos
los puntos de salvaguarda (SAVEPOINT) indicados hasta el momento.

7.2.2.- ROLLBACK.Seala el final de una transaccin y el principio de otra indicndole al sistema que se deben
restaurar el estado de la base de datos tal y como estaba al comenzar la transaccin, es decir,
deshace todos los cambios pendientes de validacin de la transaccin actual. Su sintaxis es:
ROLLBACK [WORK] [TO [SAVEPOINT] <punto_salvaguarda>];
donde:
WORK es opcional y no tiene ninguna trascendencia.
TO [SAVEPOINT] <punto_salvaguarda> deshace slo los cambios efectuados desde el
punto de salvaguarda indicado. La palabra reservada SAVEPOINT es opcional.

7.2.3.- SAVEPOINT.los puntos de salvaguarda son marcas que va poniendo el usuario durante la transaccin. Estas
marcas permiten deshacer los cambios por partes en vez de deshacer toda la transaccin. Su
sintaxis es:
SAVEPOINT <punto de salvaguarda>;
Los nombres de los puntos de salvaguarda pueden reutilizarse durante la transaccin. Al
reutilizarlo el anterior punto se pierde.
Al ejecutar ROLLBACK sin parmetros o COMMIT, se eliminan todos los puntos de
salvaguarda.
Al ejecutar ROLLBACK TO solo se borran los puntos posteriores al indicado. As, si
escribimos:
INSERT INTO ...
SAVEPOINT A;
DELETE ...
ROLLBACK TO SAVEPOINT A;
Se deshace solo el borrado, permaneciendo pendiente la insercin realizada con INSERT .

Dep. de Informtica

71

I.E.S. TRASSIERRA - Crdoba

SQL

SQL*Plus dispone de un comando para controlar las validaciones de forma automtica. Su


sintaxis es:
SET AUTOCOMMIT ON/OFF
Si se especifica ON los cambios se validarn automticamente despus de cada operacin de
actualizacin de datos.
La opcin por defecto es OFF y permite que sea el usuario el que controle la validacin de los
cambios con los comandos anteriores.
Las sentencias del LMD y la desconexin de Oracle llevan implcita una validacin (commit).
Si se produce la cada del sistema o la terminacin anormal de una aplicacin, se llevar a
cabo una restauracin automtica, mediante la consulta al fichero diario o log.
Oracle almacena temporalmente, en los llamados segmentos de rollback, la informacin
necesaria para deshacer los cambios si se ejecuta un ROLLBACK y dejar la informacin en
estado consistente.
Puede comprobarse que el propietario de la tabla modificada, tiene constancia al instante de
las modificaciones que se produzcan. Bastar hacer una consulta y observar el nuevo valor.
El navegador es una herramienta del Administrador de la Base de Datos, por lo que al abrir
una tabla nos da la visin que de la misma tiene aqul. Si abrimos una tabla con el
Navegador, no apreciaremos los cambios hasta que se cierre la sesin del usuario (nos
conectemos como otro usuario o salgamos de SQL, por ejemplo), o se ejecute el comando
COMMIT.

7.3.- EJERCICIOS PROPUESTOS.1.- En aplicacin del convenio colectivo, aumentar todos los salarios en un 3,24 % y las
comisiones en un 4,16 %.
2.- Debido a un nuevo sistema telefnico, modificar todas las extensiones telefnicas que
comiencen por 8 de forma que se reemplace el 8 por un 9.
3.- Modificar las seas de los centros de trabajo, eliminando los tres primeros caracteres.

Para los siguientes ejercicios vamos a crear la tabla TEMPLE2 vaca, con la siguiente
sentencia que estudiaremos en el prximo tema. Baste decir que como el departamento
444 no existe, la subselect devuelve una tabla vaca, provocando que temple2 se cree
con la misma estructura que temple, pero sin ninguna fila.
CREATE TABLE temple2
AS ( SELECT *
FROM temple WHERE numde=444 ) ;

4.- Insertar en temple2 una fila por cada empleado de temple cuyo salario total (salario ms
comisin) supere al salario total medio de su departamento.
Dep. de Informtica

72

I.E.S. TRASSIERRA - Crdoba

SQL

5.- En temple2, modificar el salario de los empleados con comisin aumentndolo en sta,
poniendo nula su comisin.
6.- En temple2, disminuir el salario en un 3% de los empleados cuyos salarios (en temple)
superen en un 50% al salario mximo de su departamento.
7.- Borrar en temple2 a los empleados cuyo salario (sin incluir comisin) supere al salario
medio de los empleados de su departamento.
8.- Borrar en temple2 a los empleados cuyo salario (sin incluir comisin) supere al salario
medio de los empleados de su departamento, excluyndole a l mismo.
9.- Disminuir la fecha de ingreso de los directores de departamento en tantos meses como
aos de antigedad cumplidos lleven en la empresa.
10.- Borrar todas las filas de temple2.

Para los siguientes ejercicios necesitars la tabla TBORRA con una nica columna (numem), y sin
ningn registro. Puedes crearla con la siguiente sentencia:
SELECT numem FROM temple where numem=999;

11.- Insertar en TBORRA los datos de los empleados que se jubilarn este ao, que son los
que cumplan durante el presente ao 55 o ms aos de edad.
12.- Borrar de TEMPLE las filas de los empleados incluidos en TBORRA y almacenarlos en
TEMPLE2.
13.- Modificar los salarios de los directores en propiedad de forma que ganen el doble del
empleado mejor pagado de su departamento, excluido l mismo.
14.- Crear un archivo de comandos que al ejecutarlo permita insertar un nuevo centro de
trabajo. La introduccin de datos se har con variables de sustitucin, validando en la medida
de lo posible los datos de entrada (maysculas en campos carcter).

Dep. de Informtica

73

I.E.S. TRASSIERRA - Crdoba

SQL

TEMA 8.- EL LENGUAJE DE DEFINICIN DE DATOS.8.1.- Introduccin.


8.2.- Creacin de tablas: CREATE TABLE.
8.2.1.- Restricciones.
8.3.- Creacin de otros objetos.
8.3.1.- CREATE INDEX
8.3.2.- CREATE SYNONYM.
8.3.3.- CREATE WIEW.
8.3.4.- CREATE SEQUENCE.
8.4.- Modificacin de tablas: ALTER TABLE.
8.4.1.- Aadir y borrar restricciones.
8.4.2.- Activar y desactivar restricciones.
8.5.- Modificacin de secuencias: ALTER SEQUENCE.
8.6.- Eliminacin de objetos.
8.6.1.- DROP TABLE.
8.6.2.- DROP INDEX.
8.6.3.- DROP SYNONYM.
8.6.4.- DROP WIEW.
8.6.5.- DROP SEQUENCE.
8.7.- Renombrado de objetos: RENAME.
8.8.- Vaciado de una tabla. TRUNCATE.
8.9.- Ejercicios propuestos.

8.1.- INTRODUCCIN.Como ya sabemos el LDD es el conjunto de sentencias SQL que permiten la descripcin de la
parte esttica del modelo relacional de datos, esto es: crear, modificar, renombrar y borrar
objetos de la base de datos.
Hasta ahora solo hemos manipulado objetos ya creados, ya es hora de que el alumno aprenda
a crearlos, pues aunque suele ser responsabilidad del administrador, en ocasiones se autoriza a
los usuarios a definir tablas privadas con datos solo interesantes para l, esto lleva a que el
usuario debe ser capaz de crearlas, destruirlas cuando ya no las necesite y, si lo estima
conveniente, autorizar a otros usuarios a usarlas, y todo ello solo si previamente el ABD lo ha
autorizado para ello. Las sentencias que veremos son:
CREATE
ALTER
DROP
RENAME
TRUNCATE

Para crear objetos.


Para modificar objetos ya creados.
Eliminar objetos.
Renombrar objetos.
Eliminar los datos de una tabla. Solo queda la estructura.

Estas sentencias afectan a la esttica por lo que no se ven afectadas por el comando Rollback.
Dep. de Informtica

74

I.E.S. TRASSIERRA - Crdoba

SQL

8.2.- CREACIN DE TABLAS: CREATE TABLE.La sentencia CREATE TABLE permite la creacin de una tabla. Antes de crearla conviene
tener claro el nombre de la tabla, y por cada una de las columnas sus nombres, tipos de datos
que almacenarn, tamao, y cierta informacin adicional (columnas obligatorias, si admiten o
no valores nulos, clave primaria, etc..).
Sintaxis:
CREATE TABLE

<tabla>
( col1 tipo[(tamao)] [NOT NULL] [restriccin] ,
col2 tipo[(tamao)] [NOT NULL] [restriccin] , ....
[restriccines sobre varias columnas]
)

[AS subconsulta] ;
Los nombres de tabla deben ser nicos, con un mximo de 30 caracteres y comenzar con un
carcter alfabtico.
Por cada columna de la tabla hay que especificar un nombre y un tipo (el tamao solo es
necesario para los tipos varchar2, char, number y raw). Los tipos de datos se vieron en un
tema anterior y conviene que el alumno los repase.
Si se especifica NOT NULL, el sistema impedir valores nulos en esa columna. La opcin por
defecto es NULL.
Al definir una columna puede especificarse una restriccin sobre ella. Despus de definir
todas las columnas se especificarn las restricciones que afecten a varias de ellas (una clave
primaria compuesta, por ejemplo) aunque tambin aqu pueden indicarse restricciones de una
sola columna.
La opcin AS subconsulta permite crear la tabla a partir de la consulta sobre una o varias
tablas. En este caso no es necesario especificar las columnas, pues se toman de la subselect.
Ejemplos:
1).-

CREATE TABLE enfermo


(
numero
NUMBER(5) NOT NULL,
apellidos
VARCHAR2(25),
nombre
VARCHAR2(15),
direccion
VARCHAR2(35),
dpostal
CHAR(5),
telefono
CHAR(9),
fecha_nac
DATE,
sexo
CHAR(1),
numhijos
NUMBER(2)
);

Esta sentencia crea la tabla llamada ENFERMO, con 9 columnas, la primera de las cuales no
admite valores nulos, esto es, debe tener siempre algn valor al insertar una nueva fila.

Dep. de Informtica

75

I.E.S. TRASSIERRA - Crdoba

SQL

2).- Crear la tabla COMERCIALES con las columnas numem, nomem y comis que contendr
a los empleados de temple que cobran comisin.
CREATE TABLE comerciales
AS( SELECT
numem, nomem, comis
FROM
temple
WHERE
comis IS NOT NULL ) ;
3).- Crear la tabla SALAR_DEP con las siguientes columnas: numde, salar_min, salar_med y
salar_max, con los nmeros de departamentos, y los salarios mnimo, medio y mximo.
CREATE TABLE salardep
( numde, salar_min, salar_med, salar_max)
AS ( SELECT numde, min(salar), avg(salar), max(salar)
FROM temple
GROUP BY numde ) ;

La informacin acerca de las tablas y columnas en el diccionario de datos, se encuentra en las


siguientes vistas del diccionario accesibles para cualquier usuario:
USER_TABLES
ALL_TABLES
USER_TAB_COLUMNS
ALL_ TAB_COLUMNS

8.2.1.- Restricciones.Una restriccin es una limitacin asociada a una o varias columnas. Oracle soporta
sintcticamente restricciones sobre las tablas y sobre las columnas. Estas restricciones son
almacenadas en el diccionario de datos y son:

Obligatoriedad de columnas: NOT NULL.

Unicidad sobre una o un conjunto de columnas: UNIQUE.

Clave primaria: PRIMARY KEY.

Clave ajena: FOREIGN KEY.... REFERENCES.

Verificacin de condiciones: CHECK.

Para poderlas identificar, las restricciones pueden tener un nombre, y despus de definidas
pueden ser activadas, desactivadas y eliminadas.
Antes de proceder a la creacin de la tabla es necesario tenerla perfectamente diseada y
descrito su comportamiento, para aplicarle correctamente las restricciones.
El nombre de una restriccin debe ser nico, definido bien por el propietario del objeto o por
el sistema. Si lo define el propietario del objeto en el momento de definir la restriccin debe ir
precedido de la palabra CONSTRAINT nombre_restriccin tipo_restriccin.

Dep. de Informtica

76

I.E.S. TRASSIERRA - Crdoba

SQL

Si no se le asigna nombre en el momento de la creacin, el sistema generar uno por defecto:


SYS_COOn.

Es una buena costumbre nombrar las restricciones segn el siguiente mnemotcnico:


Cdigorestriccin_nombretabla_nombrecolumna
Donde el Cdigo de restriccin es:
CP = CLAVE PRIMARIA
UQ = UNICIDAD
CA = CLAVE AJENA
CK = CHECK
NN = OBLIGATORIO
El nombre de la restriccin aparecer en los mensajes de error, en la documentacin, al
activarla y desactivarla temporalmente o al borrarla.
La informacin acerca de las restricciones definidas por el usuario, y sobre qu columnas han
definido se encuentra en las siguientes tablas del diccionario de datos
USER_CONSTRAINTS
USER_CONS_COLUMNS

Hay dos formas de definir restricciones: en lnea o fuera de lnea.


Se dice que una restriccin es en lnea cuando se define en el momento de describir una
columna, a continuacin de su nombre, el tipo de dato y la precisin, de forma que solo afecta
a esa columna. En este caso, no es obligatorio darles un nombre con la palabra clave
CONSTRAINT, pero se generar uno por defecto. Su sintaxis es:

[CONSTRAINT <nombre>]

PRIMARY KEY
/
UNIQUE
/
NOT NULL
/
CHECK <condicin>
/
REFERENCES <tabla_externa>[(campo1[, campo2]...)]
[ON DELETE CASCADE]

<tabla_externa> es el nombre de la tabla referenciada por la clave ajena.


<campo1, campo2, ..> son las claves de la tabla externa por las que se establece la relacin.
Puede omitirse si la relacin se establece por la clave primaria (suele ser lo habitual).
ON DELETE CASCADE, hace que se borren todas las tuplas cuya clave ajena referencie
(apunte) a una tupla borrada en la tabla referenciada.

Dep. de Informtica

77

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplo:
CREATE TABLE editoriales
(
codigo
CHAR(4) PRIMARY KEY,
nombre
VARCHAR2(50) NOT NULL
);
CREATE TABLE libros
(
signa
NUMBER(6) CONSTRAINT cp_libros_signa PRIMARY KEY,
materia
NUMBER(3) CONSTRAINT nn_libros_materia NOT NULL,
titulo
VARCHAR2(50) NOT NULL ,
autor
VARCHAR2(30) ,
codedit
CHAR (4) REFERENCES editoriales
);
El usuario decide si quiere definirlas en lnea, o fuera de lnea (normalmente despus de la
definicin de columnas). En este caso es obligatorio preceder la restriccin con la palabra
clave CONSTRAINT para que el gestor distinga entre lo que es la definicin de la columna o
la declaracin de la restriccin. En este caso la sintaxis varia, y se define de este modo:

[CONSTRAINT <nombre>]

PRIMARY KEY (col_cp1[,col_cp2[,..] ] )


/
UNIQUE (col_un1[,col_un2[,..] ] )
/
NOT NULL (col_nn1[,col_nn2[,..] ] )
/
CHECK (col_ck1[,col_ck2[,..] ] <condicin>)
/
FOREIGN KEY (col_ca1[,col_ca2[,..] ] )
REFERENCES <tabla_externa>[(campo1[,campo2]...)]
[ON DELETE CASCADE]

dnde: col_cp1, col_un1, col_nn1, col_ck1, col_ca1 representan los nombres de las columnas
que en cada caso se estn definiendo como clave primaria (cp), nico (uq), no nulo
(nn), chequeo (ck) o clave ajena (ca). Genricamente puede expresarse as:
CONSTRAINT nombre restriccin tipo_restriccin (campo1 [,campo2]...)
Al definir una restriccin fuera de lnea hay que indicar a qu columnas de la tabla se aplica la
restriccin, puesto que no est a continuacin de la definicin. En ciertos casos, como cuando
una clave primaria esta compuesta de varias columnas, o cuando una restriccin se aade a
posteriori, es obligatorio definirlas como "no en lnea". A continuacin se muestra un
ejemplo:
CREATE TABLE libros
(
sign
NUMBER(6) ,
materia
NUMBER(3) ,
titulo
VARCHAR2(50) CONSTRAINT nn_libros_titulo NOT NULL ,
autor
VARCHAR2(30) ,
codedit
CHAR (4) ,
CONSTRAINT cp_libros_sign_materia PRIMARY KEY (sign, materia),
CONSTRAINT ck_libros_materia CHECK (materia BETWEEN 1 AND 300) ,
CONSTRAINT ca_libros_codedit FOREIGN KEY(codedit)
REFERENCES editoriales ON DELETE CASCADE
);

Dep. de Informtica

78

I.E.S. TRASSIERRA - Crdoba

SQL

Esta sentencia crea la tabla libros a la vez que define una clave primaria compuesta por los
campos sign y materia, la materia no es necesario declararla no nula al ser parte de la clave
primaria. Declara el campo titulo como obligatorio (no nulo), establece el dominio de la
materia como un entero entre 1 y 300 ambos inclusive, y declara a codedit como clave ajena
que referencia a la tabla editoriales, mediante la clave primaria de sta. Si la relacin se
establece con otro atributo de editoriales (clave alternativa) debe indicarse entre parntesis
despus del nombre de la tabla referenciada. Por ltimo se ha definido el borrado en cascada
para las tuplas de esta tabla cuya tupla relacionada de la tabla editoriales sea borrada.
Oracle dispone de la especificacin DEFAULT, que aunque no es una restriccin
propiamente dicha, ofrece la posibilidad de indicar un valor por defecto a campos (columnas)
que no se especifiquen en una sentencia INSERT.
Otro ejemplo: En una gestin bancaria crear la tabla prestamos con todas sus restricciones y
reglas.
CREATE TABLE prestamos
(
nocuenta
NUMBER(6) CONSTRAINT nn_prest_nocuenta NOT NULL,
noprestamo NUMBER (6) CONSTRAINT nn_prest_noprestamo NOT NULL
CONSTRAINT uq_prest_noprestamo UNIOUE,
tipopres
VARCHAR2 (8) CONSTRAINT ck_prest_tipopres
CHECK (ti po pres IN ('PERS', 'CASA', 'COCHE')),
cantidad
NUMBER(8,O) CONSTRAINT nn_prest_cantidad NOT NULL,
fechapres
DATE DEFAULT sysdate,
aprobadopor VARCHAR2(15) CONSTRAINT ca_prest_aprobadopor
REFERENCES jefes(nombre_dir) ,
CONSTRAINT cp_prest PRIMARY KEY (nocuenta, noprestamo),
CONSTRAINT ca_prest_cuenta FOREIGN KEY (nocuenta)
REFERENCES clientes(no_cuenta)
) ;

8.3. CREACIN DE OTROS OBJETOS.Un objeto de base de datos es algo definido y almacenado en una base de datos. Los objetos
de base de datos son: tablas, vistas, ndices, sinnimos, enlaces de base de datos, roles,
secuencias, rplicas, usuarios, disparadores, paquetes, procedimientos y funciones.

8.3.1.- CREATE INDEX.Un ndice se utiliza para recuperar con rapidez informacin de un proyecto de base de datos.
Al igual que los ndices de los libros ayudan a recuperar informacin especfica con ms
rapidez, un ndice de base de datos proporciona acceso rpido a los datos de las tablas. El
indexado crea una lista de registros en un orden lgico, as como su correspondiente posicin
fsica en la tabla. Los ndices se crean para encontrar y visualizar registros con rapidez, sobre
todo en tablas de gran tamao o en bases de datos que constan de muchas tablas.
Los ndices se crean en una o ms columnas de una tabla. Una vez creados, la base de datos
de Oracle los mantiene y los utiliza de forma automtica. Los cambios que se realicen a los
Dep. de Informtica

79

I.E.S. TRASSIERRA - Crdoba

SQL

datos de la tabla (como aadir o eliminar filas) se incorporan de forma automtica en todos
los ndices relevantes.
El usuario puede crear los ndices que estime conveniente, pero antes de indexar por una
columna es conveniente que cumpla ciertos requisitos:

Ser consultada con frecuencia.


No sufrir alteraciones de operadores o funciones cuando se consulta (1).
Contener un volumen importante de informacin (muchas tuplas con valores).
Tener muchos valores diferentes.

En general, cuanto mas corto es el ndice mas eficaz resulta. Los ndices pueden ser simples o
compuestos de varias columnas. En este caso las columnas no tienen que ser consecutivas ni
del mismo tipo de datos. Un ndice compuesto lo puede estar hasta por 16 columnas o de 240
caracteres.
Los ndices pueden ser nicos o no. Si un ndice se define como nico, significa que no puede
tener valores repetidos.
Las restricciones UNIQUE y PRIMARY KEY llevan implcita la creacin del ndice si no se
crean desactivadas y en ambos casos es nico.
La sentencia CREATE INDEX tiene la siguiente sintaxis:
CREATE [UNIQUE] INDEX
ON
nombre_indice
tabla
campo1, campo2, ..

nombre_indice
tabla (campo1 [,campo2[,..]]) ;

Es el nombre que le asignamos al ndice. Conviene seguir la notacin


usada en las restricciones.
Es el nombre de la tabla sobre la que vamos a crear el ndice.
Son los nombre de los campos sobre los que se va a indexar.

Ejemplo: Indexar la tabla temple por salario.


CREATE INDEX
ON

temple_salar
temple(salar) ;

(1) El ndice creado ser usado por la siguiente sentencia, aumentando la velocidad de
ejecucin.
SELECT
nomem, salar
FROM
temple
WHERE
salar BETWEEN 1200 AND 2200 ;
Sin embargo no ser usado en la siguiente:
SELECT
nomem, salar
FROM
temple
WHERE
salar/2 BETWEEN 600 AND 1100 ;
Puede comprobarse que el resultado es el mismo, aunque en el primer caso, la ordenacin por
salario denota el uso del ndice. Los tiempos de ejecucin seran visibles si dispusiramos de
decenas de miles de tuplas, que es lo habitual en bases de datos gestionados con Oracle.
Dep. de Informtica

80

I.E.S. TRASSIERRA - Crdoba

SQL

Si se trata de un ndice compuesto de varios campos, para que el ndice sea utilizado, la
primera columna del ndice debe aparecer en el predicado de la condicin donde se use.
Las tablas del diccionario de datos con informacin acerca de ndices accesibles para el
usuario son:
USER_INDEXES
ALL_INDEX
USER_IND_COLUMNS
ALL_IND_COLUMNS
Consultndolas podremos saber los ndices activos para poder referirnos a ellos (para su
borrado, por ejemplo).
Ejemplos:
SELECT * FROM user_indexes ;
SELECT index_name, index_type, table_name FROM user_indexes ;
SELECT * FROM USER_IND_COLUMNS ;

8.3.2.- CREATE SYNONYM.Un sinnimo es un alias de una tabla, una vista, una secuencia o una unidad de programa. Un
sinnimo no es un objeto en s mismo, pero es una referencia directa a un objeto. Los
sinnimos se utilizan para:

Enmascarar el nombre real y el propietario de un objeto.


Proporcionar acceso pblico a un objeto
Proporcionar un nombre sencillo para un objeto de base de datos.
Enmascarar la ubicacin real de un objeto de base de datos (por ejemplo, una tabla se
encuentra en una base de datos de Madrid y otra tabla se encuentra en una base de
datos de Barcelona. Si utiliza sinnimos, al usuario le parecer que ambas tablas se
encuentran en el mismo sitio).

Los sinnimos pueden ser privados o pblicos. Un sinnimo privado slo es utilizable por la
persona que crea el sinnimo (es su propietaria) y se necesita el privilegio CREATE
SYNONYM. Un sinnimo pblico es aqul que puede utilizar cualquier usuario para tener
acceso a una base de datos, y para crearlos se necesita el privilegio CREATE PUBLIC
SYNONYM.
Independientemente de la creacin del sinnimo es necesario tener acceso al objeto sobre el
que se desea crear dicho sinnimo, o bien ser su propietario. A diferencia del alias, el
sinnimo no es temporal y permanece hasta que es borrado.
Cuando los usuarios que no son propietarios de un objeto de base de datos, como una tabla,
desean hacer referencia a esa tabla, pueden utilizar un sinnimo para hacer referencia a dicha
tabla. Generalmente, los Administradores de Base de Datos crean sinnimos pblicos para
Dep. de Informtica

81

I.E.S. TRASSIERRA - Crdoba

SQL

que los objetos de base de datos estn disponibles en todo el sistema y puedan utilizarlos los
usuarios de la base de datos.
La sentencia CREATE SYNONYM tiene la siguiente sintaxis:
CREATE [PUBLIC] SYNONYM sinnimo
FOR
objeto ;
Sinnimo
objeto

Es el nombre asignado al sinnimo.


Es el nombre del objeto sobre el que creamos el sinnimo. Si pertenece a otro
propietario deberemos preceder su nombre con el de aqul y un punto.

Ejemplos:
1).- Crear un sinnimo privado sobre la tabla temple, son el nombre de emp.
CREATE SYNONYM
FOR

emp
temple ;

2).- Crear el sinnimo salario para el ndice creado en el ejemplo de la pregunta anterior.
CREATE SYNONYM
FOR

salario
temple_salar ;

3).- Crear el sinnimo pblico dep para la tabla tdepto.


CREATE PUBLIC SYNONYM
FOR

dep
tdepto

Producir el error de privilegios insuficientes si no estamos conectados como administrador o


no tenemos los privilegios necesarios.
Las tablas del diccionario de datos con informacin acerca de los sinnimos accesibles para el
usuario son:
USER_SYNONYMS
ALL_SYNONYMS

8.3.3.- CREATE VIEW.Una vista es un presentacin personalizada de los datos de una o ms tablas. Las vistas
extraen los datos de las tablas en las que se basan, denominadas tablas base. Todas las
operaciones que se realizan en una vista afectan de hecho a las tablas base de la vista. Utilice
las vistas para:

Proporcionar un nivel adicional de seguridad de tabla limitando el acceso a un conjunto


predeterminado de columnas y filas de tabla. Por ejemplo, cree una vista que no incluya
datos sensibles, como la informacin sobre sueldos.
Ocultar la complejidad de los datos. Normalmente, las bases de datos de Oracle8 incluyen
muchas tablas y, si crea una vista que combine informacin de dos o ms tablas, facilita a
otros usuarios el acceso a la informacin de su base de datos. Por ejemplo, podra tener

Dep. de Informtica

82

I.E.S. TRASSIERRA - Crdoba

SQL

una vista que sea una combinacin de su tabla Empleado y su tabla Departamento. Un
usuario que consulte esta vista, que ha denominado emp_dept, slo tiene que ir a un sitio
para obtener la informacin, en lugar de tener que acceder a las dos tablas que componen
esta vista.
Presentar los datos con una perspectiva distinta de la que tiene la tabla base. Las vistas
permiten cambiar el nombre a las columnas sin que afecte a la tabla base.
Almacenar consultas complejas. Por ejemplo, puede que una consulta realice clculos
extensos con la informacin de las tablas. Si se guarda esta consulta como una vista, los
clculos slo se realizarn cuando se consulte la vista.

Una vista es una tabla lgica. La tabla no se crea fsicamente sino que lo que se almacena es
la SELECT de creacin de la vista.
Cuando se recuperan filas de una vista, ocurre que se accede a la sentencia SELECT que la
compone y que se encuentra almacenada, y se ejecuta.
La sintaxis de la sentencia CREATE WIEW es:
FORCE /
CREATE [OR REPLACE] NOFORCE VIEW nombre_vista [(coI1, col2, ...)]
AS
subconsulta
WITH
CHECK OPTION ;

OR REPLACE

Recrea la vista si ya existe Esto permite cambiar la definicin de


la vista sin tener que borrarla y volver a crearla.

FORCE

Crea la vista incluso si hay problemas de acceso por insuficientes


privilegios a los objetos de la subconsulta en que se basa la
creacin de la vista.

NOFORCE

Es la opcin por defecto y no crea la vista si se producen errores


en la definicin

WI'TH CHECK OPTION

Si la vista permite inserciones, comprobar la condicin WHERE


impuesta, no solo en el momento de componer la vista, sino
tambin a la hora de realizar inserciones sobre ella.

Ejemplos:
1).- Crear la vista de nombre COMISIONISTAS sobre la tabla temple que contendr las
columnas numem , nomem y comis de los empleados con comisin.
CREATE VIEW
AS
SELECT
FROM
WHERE

Dep. de Informtica

comisionistas
numem, nomem, comis
temple
comis IS NOT NULL ;

83

I.E.S. TRASSIERRA - Crdoba

SQL

2).- Crear la vista DIRDEPART que contendr las siguientes columnas: numero y nombre de
empleado y el nmero y nombre de departamento de todos lo directores.
CREATE OR REPLACE VIEW
AS
SELECT
FROM
WHERE

dirdepart
numem, nomem, E.numde, nomde
temple E, tdepto D
E.numem=D.direc ;

Sobre una vista no existen restricciones en consulta, pero si en actualizacin insercin y


borrado. Si se cumplen las condiciones impuestas, la actualizacin, insercin o borrado se
lleva a cabo sobre la tabla base sobre la que se defini la vista.

Para que una vista sea actualizable (permitir UPDATE), ninguna de las columnas que
forman la vista puede estar modificada por una expresin.
Para que la vista permita inserciones (INSERT INTO vista), la vista en su definicin
debe contener todas las columnas obligatorias de la tabla que la forma.
Para que la vista permita borrado de filas (DELETE FROM vista), la vista debe estar
creada sobre una sola tabla (no admite join). No puede incorporar clusulas
DISTINCT ni GROUP BY. No puede ser definida con funciones de grupo ni
pseudocolumnas (SUM(sal) o rowid).

Las tablas del diccionario de datos con informacin acerca de vistas accesibles para el usuario
son:
USER_VIEWS
ALL_VIEWS

8.3.4.- CREATE SEQUENCE.Una secuencia es un objeto que permite generar nmeros secuenciales enteros y nicos. Esto
puede ser muy til, por ejemplo, para conseguir claves primarias de forma automtica.
Supongamos, por ejemplo, que dos usuarios insertan al mismo tiempo filas nuevas en la tabla
de empleados. Al utilizar una secuencia para generar nmeros de empleados nicos para la
columna NUMEMP, ningn usuario tiene que esperar a que el otro introduzca el siguiente
nmero de empleado disponible. La secuencia genera automticamente los valores correctos
para cada usuario. Adems y dado que es un objeto como otro cualquiera de la Base de Datos,
puede ser utilizado por mltiples usuarios.
Para crear una secuencia, se debe poseer un privilegio denominado CREATE SEQUENCE.
Su sintaxis es:
CREATE SEQUENCE esquema.nombre_de_secuencia
[INCREMENT BY entero ]
[START WITH
entero ]
[MAXVALUE
entero ]
[NOMAXVALUE
]
[MINVALUE
entero ]
[NOMINVALUE
]
[CYCLE
]
[NOCYCLE
]
[CACHE/NOCACHE
];
Dep. de Informtica

84

I.E.S. TRASSIERRA - Crdoba

SQL

INCREMENT BY

Determina el salto entre los nmeros secuenciales. Puede ser un entero


negativo o positivo. De ese modo, hacemos secuencias ascendentes o
descendentes. No puede ser cero y el valor por defecto es 1.

START WITH

Determina el primer nmero secuencial que ser generado. Los valores


por defecto son: MINVALUE si la secuencia es creciente, MAXVALUE
si es decreciente o 1 si es creciente y no se especifica MINVALUE.

MINVALUE

Determina el valor mnimo de la secuencia.

NOMINVALUE

Valor 1 para las secuencias ascendentes y -1026 para las descendentes.

MAXVALUE

Valor mximo que genera la secuencia.

NOMAXVALUE

Valor de 1027 para las ascendentes y -1 para las descendentes.

CYCLE/ NOCYCLE La secuencia entra en un ciclo cuando alcanza su valor mximo o


mnimo, o por el contrario, si se alcanza el valor mximo o mnimo, no
se pueden generar ms nmeros. NOCYCLE por defecto.
CACHE/NOCACHE Almacena o no un nmero determinado de valores en memoria cache.
Una vez que se ha creado la secuencia puede ser accedida utilizando dos pseudocolumnas:
CURRVAL devuelve el valor actual de la secuencia.
NEXTVAL incrementa el valor de la secuencia y lo devuelve (la primera vez solo lo
devuelve).
Ejemplos:
1).- Crear la secuencia sequ1 que comience por 100 y vaya generando nmeros de tres en tres
CREATE SEQUENCE
START WITH
INCREMENT BY

sequ1
100
3;

2).- Conseguir un nmero de la secuencia anterior:


SELECT
FROM

sequ1.nextval
dual ;

3).- Insertar una tupla extrayendo su valor de la secuencia anterior:


INSERT INTO ALUMNOS
VALUES
(sequ1.nextval, 'Francisco Valiente');
Las tablas del diccionario de datos con informacin acerca de las secuencias, y accesibles
para el usuario son:
USER_SEQUENCES
ALL_SEQUENCES

Dep. de Informtica

85

I.E.S. TRASSIERRA - Crdoba

SQL

8.4.- MODIFICACIN DE TABLAS: ALTER TABLE.El comando ALTER TABLE permite modificar la estructura de una tabla para:
-

Aadir columnas a una tabla ya creada.


Modificar el tipo de dato o la precisin de una columna.
Aadir, activar o desactivar temporalmente y borrar restricciones de integridad
referencial sobre la tabla.

Este comando no permite eliminar una columna de una tabla. Su sintaxis es:

ALTER TABLE tabla

ADD ( col1 tipo[(tamao)] [NOT NULL] [restriccin],


col2 tipo[(tamao)] [NOT NULL] [restriccin], ...
[ restricciones fuera de lnea ]
)/
MODIFY ( col1 tipo[(tamao)] [NOT NULL] ,
col2 tipo[(tamao)] [NOT NULL] ) /
;
DROP col1[,col2][, ..]
/
DROP CONSTRAINT restriccin
/
DISABLE CONSTRAINT restriccin
/
ENABLE CONSTRAINT restriccin
/

Ejemplos:
1).- Aadir una columna a la tabla de departamentos que contenga el numero de empleados
que trabaja en cada departamento
ALTER TABLE tdepto
ADD (no_empl number(4)) ;
2).- Modificar la longitud de la columna seas en la tabla de centros, aumentndola a 55
posiciones. Aadir la caracterstica de obligatoriedad a esa columna.
ALTER TABLE
MODIFY

tcentr
( seas varchar2(55) NOT NULL ) ;

8.4.1.- Aadir y borrar restricciones .Se pueden aadir restricciones de integridad referencial a posteriori. En el momento que se
aade, se bloquea toda la tabla y se produce la comprobacin de la restriccin que se desea
incorporar. Si alguna fila no la cumple, la restriccin no se aade.
Ejemplos:
1).- Aadir una restriccin a la tabla tcentro. La situacin de los centros de trabajo (seas)
debe ser nica.
ALTER TABLE tcentr
ADD CONSTRAINT uq_cent_seas UNIQUE (seas) ;

Dep. de Informtica

86

I.E.S. TRASSIERRA - Crdoba

SQL

La sintaxis para aadir restricciones una vez creada la tabla es similar a la de las restricciones
"no en lnea". Esto significa que se debe de indicar tras el comando ALTER TABLE la
palabra clave CONSTRAINT seguida de un nombre (obligatorio) luego el tipo de restriccin
a aplicar, y por ltimo sobre qu columna de la tabla se desea aplicar dicha restriccin.
2).- Aadir una restriccin en la tabla lnea de facturas. Cada vez que se borre una cabecera
de factura se borran las lneas asociadas en cascada. Ntese que la restriccin no se aplica en
la tabla maestra (la de cabeceras de facturas) sino en la DETALLE (en este caso la de lneas).
ALTER TABLE
linea_factura
ADD CONSTRAINT ca_linea_facturas_idfactura
FOREIGN KEY (idfactura) REFERENCES facturas ON DELETE CASCADE ;
Cuando se borre una factura, (DELETE FROM facturas WHERE idfactura=2344) se visualiza
el mensaje "N filas borradas" que se refiere a las cabeceras, aunque se hayan borrado una
cabecera y sus siete lneas.
Cuando se define una clave ajena se puede hacer referencia explcita a la tabla referenciada
REFERENCES tabla(col), o implcita REFERENCES tabla.
En el caso del borrado en cascada la sintaxis slo permite referencia implcita, es decir, solo
admite la relacin de la clave ajena con la clave primaria de la tabla referenciada.
Para borrar restricciones se utiliza la sintaxis:
ALTER TABLE
tabla DROP
[UNIQUE
(col1 [,col2])]
[PRIMARY KEY]
[CONSTRAINT
restriccin ]
[CASCADE ];
CASCADE

Hace que al borrar una restriccin UNIQUE o PRIMARY KEY, se borre dicha
restriccin y adems se eliminen todas las claves ajenas que apunten a la clave.

Ejemplo:
Eliminar una restriccin de unicidad llamada uq_nomde sobre la columna nomde de la tabla
tdepto mediante dos variaciones del comando ALTER TABLE.
ALTER TABLE tdepto
DROP CONSTRAINT uq_nomde ;
o bien
ALTER TABLE tdepto
DROP CONSTRAINT UNIQUE(nomde) ;

Dep. de Informtica

87

I.E.S. TRASSIERRA - Crdoba

SQL

8.4.2.- Activar y desactivar restricciones. Desactivar una restriccin permite que dicha restriccin no se compruebe
temporalmente. NO ES IGUAL que borrar la restriccin. Se usa para incrementar la
velocidad en cargas de datos masivas, aunque Loader la herramienta de Oracle deshabilita
automticamente todas las restricciones.
Cuando se intenta desactivar una clave primaria o nica que est referenciada, primero
habr que desactivar las claves ajenas que la referencian o utilizar DISABLE CASCADE.
Al desactivar una clave primaria o nica tambin se destruyen los ndices asociados.
Sintaxis:
ALTER TABLE
tabla DISABLE
[UNIQUE
(col1 [,col2])]
[PRIMARY KEY]
[CONSTRAINT
restriccin ]
[CASCADE] ;
CASCADE

Desactiva todas las dependencias asociadas

Oracle tambin permite activar la comprobacin de restricciones no activadas. En el


momento que se crea una restriccin se activa a no ser que se indique la clusula
DISABLE.
Cuando se activa posteriormente:
-

Bloquea la tabla completa hasta que se termine la comprobacin.


Comprueba una a una las filas.
Si alguna de las filas no cumple la restriccin, no podr llegar a activarse.

Al habilitar una clave primaria o nica se vuelven a construir los ndices asociados.
Sintaxis:
ALTER TABLE
tabla
ENABLE
[UNIQUE
(col1 [,col2))]
[PRIMARY KEY]
[CONSTRAINT
restriccin ]
[EXCEPTIONS INTO tabla_excepciones ];

Excepciones activando restricciones.- Cuando se intenta activar una restriccin con la


opcin EXCEPTIONS INTO, y no se puede, por cada fila que no cumpla la restriccin se
puede guardar en una tabla creada previamente la siguiente informacin:
-

Rowid.

Usuario propietario de la tabla.

Nombre de la tabla en la que se encuentra la restriccin.

Nombre de restriccin que no se cumple.

La tabla de excepciones deber haberse creado previamente en SQL *Plus con la estructura:
Dep. de Informtica

88

I.E.S. TRASSIERRA - Crdoba

CREATE TABLE tabla_excepciones (

SQL

identificador_fila
propietario
nombre_tabla
restriccin

rowid ,
varchar2(30) ,
varchar2(30) ,
varchar2(30) ) ;

Oracle ofrece el script de ejemplo: C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\utlexcpt.sql

La tabla sobre la cual se han definido las restricciones que no han podido activarse
(tabla_base), podr ser actualizada a partir de los resultados almacenados en
tabla_excepciones. Para saber las tuplas de tabla_base que no cumplen la restriccin haremos:
SELECT
FROM
WHERE

*
tabla_base, tabla_excepciones
tabla_base.rowid = tabla_excepciones.identificador_fila ;

8.5.- MODIFICACIN DE SECUENCIAS: ALTER SEQUENCE .El comando ALTER SEQUENCE permite modificar las caractersticas y el comportamiento
de una secuencia. Algunas caractersticas pueden modificarse, como cycle/nocycle e
increment by. Otras, como start with, no pueden alterarse. Por ltimo, la modificacin de
otras caractersticas depender del estado actual de la secuencia, por ejemplo no puede fijarse
un valor para MAXVALUE inferior a CURVAL.
La secuencia debe pertenecer al usuario o poseer el privilegio ALTER sobre ella. Su sintaxis es
muy parecida a la de creacin:
ALTER SEQUENCE esquema.nombre_de_secuencia
[INCREMENT BY entero ]
[START WITH
entero ]
[MAXVALUE
entero ]
[NOMAXVALUE
]
[MINVALUE
entero ]
[NOMINVALUE
]
[CYCLE
]
[NOCYCLE
];
El significado de los diferentes valores coincide con los del comando CREATE SEQUENCE.

8.6.- ELIMINACIN DE OBJETOS.8.6.1.- DROP TABLE.Permite eliminar una tabla. Sintaxis:


DROP TABLE
nombre_de_tabla
[CASCADE CONSTRAINTS] ;
Dep. de Informtica

89

I.E.S. TRASSIERRA - Crdoba

SQL

Ejemplo: Eliminar la tabla PRODUCTOS con todas sus filas y las claves ajenas que apunten
a cualquier columna de PRODUCTOS.
DROP TABLE
productos
CASCADE CONSTRAINTS;

8.6.2.- DROP INDEX.Permite eliminar un ndice de una tabla. Sintaxis:


DROP INDEX

nombre_ndice ;

A partir de este momento la columna en cuestin ya no esta indexada. En el comando DROP


INDEX es indiferente que el ndice sea nico o no.
La informacin acerca de los ndices est almacenada en el diccionario en las tablas:
USER_INDEXES
USER_IND_COLUMNS
Para borrar un ndice se debe ser el propietario de la tabla en la que estn los ndices o tener
un privilegio llamado DROP ANY INDEX.

8.6.3.- DROP SYNONYM.Se puede borrar un sinnimo sobre una tabla, procedimiento, vista, etc utilizando el siguiente
comando. Sintaxis:
DROP [PUBLIC] SYNONYM nombre_sinnimo ;
Con el uso de este comando no se borra el objeto, sino el alias permanente del objeto.
La informacin referente a sinnimos se encuentra en las siguientes tablas:
USER_SYNONYMS
ALL_SYNONYMS
Para borrar un sinnimo basta con ser el propietario (haberlo creado). En el caso de que el
sinnimo que se desea borrar sea pblico, es necesario tener el privilegio DROP PUBLIC
SYNONYM.

8.6.4.-DROP VIEW.Se puede eliminar una vista de una tabla utilizando este comando que tiene la siguiente
sintaxis:
DROP VIEW nombre_vista ;

Dep. de Informtica

90

I.E.S. TRASSIERRA - Crdoba

SQL

8.6.5.- DROP SEQUENCE.Sirve para eliminar una secuencia de la BD. Sintaxis


DROP SECUENCE nombre_secuencia ;
Suele ser el mtodo utilizado para resetear una secuencia. Se borra y luego se vuelve a crear
con los valores deseados. Ejemplo:
DROP SECUENCE sequ1 ;

8.7.- RENOMBRADO DE OBJETOS: RENAME.Cambia el nombre de un objeto (tabla, procedimiento, vista, etc...) por otro de forma
permanente. Los ndices no pueden renombrarse, por lo que deberan ser borrados y vueltos a
crear con otro nombre. Sintaxis:
RENAME nombre_antiguo TO nombre_nuevo;
La informacin sobre los objetos de un usuario se encuentran en el diccionario en la vista:
USER_OBJECTS
Para renombrar un objeto se debe ser propietario del mismo.

8.8.- VACIADO DE UNA TABLA: TRUNCATE .Borra filas de una tabla o ndice sin eliminar la estructura del objeto. Es similar a DELETE,
pero no hay posibilidad de deshacer la transaccin (ROLLBACK), ni de hacer un borrado
restrictivo (clusula WHERE).
Sintaxis:
TRUNCATE TABLE nombre_tabla [DROP STORAGE]/[REUSE STORAGE]
Para truncar un objeto, se debe ser propietario del mismo o tener el privilegio DELETE ANY
TABLE.
La opcin DROP STORAGE libera el espacio que el objeto ha tomado a la base de datos.
La opcin REUSE STORAGE (por defecto) mantiene reservado el espacio previamente
adquirido para dicho objeto.
Al truncar una tabla se truncan de forma implcita los ndices de dicha tabla.

Dep. de Informtica

91

I.E.S. TRASSIERRA - Crdoba

SQL

8.9.- EJERCICIOS PROPUESTOS.1.- Crear las tablas: EMPLEADOS, DEPARTAMENTOS y CENTROS, con estructuras
similares a las tablas TEMPLE, TDEPTO y TCENTR y con sus mismas tuplas, restricciones
y relaciones.
A.- Con subconsulta. Guardando las sentencias en CREATAB_A.SQL. Despus de
creadas se borrarn.
B.- Sin subconsulta (suponiendo que no disponemos de tablas similares). El alumno
deber crear todas las restricciones que crea oportuno, y guardar las sentencias
necesarias en el archivo de comandos CREATAB_B.SQL.
C.- Insertar en las tablas todas las tuplas de sus tablas homogneas tcentr, tdepto y
temple.
2.- Sobre la tabla EMPLEADOS:
2.1.- Aadir el campo Sexo.
2.2.- Con dos instrucciones, poner a M el campo sexo de tod@s l@s emplead@s
cuyo nombre propio termine por la letra A. Y en H para el resto.
2.3.- Disminuir el salario de tod@s l@s emplead@s en un 8 %.
2.4.- Eliminar el campo Sexo.
2.5.- Eliminar la clave ajena.
2.6.- Crear de nuevo la clave ajena antes eliminada.
3.- Sobre la tabla CENTROS:
3.1.- Borrar todos sus registros manteniendo su estructura.
3.2.- Borrar la tabla.
4.- Crear (o recrear) la vista DIRDEPART que contendr los datos de los directores de
departamentos y con las siguientes columnas: numero de empleado, 20 primeros caracteres
del nombre de empleado, el nmero de departamento y los 20 primeros caracteres del nombre
de departamento. Siendo los nombres de sus columnas: num_empl, nom_empl, num_dept y
nom_dept, respectivamente.
5.- Crear los sinnimos emp, dep y cen sobre las tablas empleados, departamentos y centros,
respectivamente.
6.- Borrar los anteriores sinnimos.
7.- Disminuir a 30 caracteres la longitud de la columna nomce de la tabla centros. Las
sentencias necesarias se guardarn en el archivo EJER8_7.SQL.
8.- Crear la secuencia S1 que comenzar por el nmero 3000 y disminuir de 3 en 3 hasta
llegar a 2000. Despus de creada, se consultar la secuencia creada. Posteriormente se
obtendrn tres valores de la secuencia y se volver a consultar para ver lo cambios.
9.- Modificar la anterior secuencia para que sea cclica.

Dep. de Informtica

92

I.E.S. TRASSIERRA - Crdoba

SQL

10.- Modificar la anterior secuencia para que vare entre el 3000 y el -2000, pero que
comience por el 1996. Posteriormente se extraern cuatro valores.
11.- Borrar la anterior secuencia. Comprobando su inexistencia mediante una consulta a la
tabla de secuencias del usuario.
12.- Debido a un supuesto gran nmero de empleados y al aumento de consultas por salario,
se os encarga crear el ndice ind_salar.
13.- Crear el ndice ind_numde_numem sobre las columnas numde y numem de la tabla
empleados. Posteriormente se disearn dos consultas de forma que la primera le permita a
SQL usar el ndice creado, y la segunda no.
14.- Renombrar el anterior ndice con el nombre de ind_dep_emp.
15.- Borrar los anteriores ndices.
16.- Crear, la vista dep111, con los datos de los empleados del departamento 111 que no son
directores. Despus de creada, consultar todos sus datos. Por ltimo eliminar todas sus tuplas
manteniendo la estructura.
17.- Desactivar la restriccin de clave primaria de la tabla centros. Despus, y para comprobar
que se encuentra desactivada, insertar el centro de SEGURIDAD con el nmero 10 y sito en
la calle Julio Romero, 10 de Crdoba. Por ltimo intentar activar la restriccin.
18.- Disear las tablas para la gestin bsica de un videoclub: SOCIOS, VIDEOS,
PRESTAMOS e HISPRES (histrico de prstamos donde adems de los datos de prstamos
figurar la fecha de devolucin). Se sabe que:
-

Cada ejemplar de vdeo lleva un cdigo identificador.


El tipo de socio puede ser uno de los siguientes (E, 1, 2, A).
Los vdeos son todos de la misma categora.
En la tabla de prestamos solo se almacenarn los pendientes de devolucin.

Crear el ndice ind_fecha sobre la tabla histrica.


Las sentencias LDD necesarias se guardarn en el fichero CREAVIDEO.SQL

Dep. de Informtica

93

I.E.S. TRASSIERRA - Crdoba

SQL

BIBLIOGRAFA:
- SQL para usuarios y programadores. J. Benavides. Paraninfo. 1991
- ORACLE 10G: SQL, PL-SQL, SQL PLUS (RECURSOS INFORMATICOS). Jerome
Gabillaud. Eni. 2005.
- SQL. Philip J. Pratt, Mary Z. Last. Anaya Multimedia. 2009.
- Oracle Database 10g Manual del administrador. Kevin Money, Bob Bryla. McGraw-Hill
/ Interamericana de Espaa, S.A.

Dep. de Informtica

94