TRASSIERRA
Crdoba
http://www.iestrassierra.com
Departamento de Informtica
APUNTES DE SQL
Etapa:
Ciclo:
Nivel:
Superior.
Mdulo:
Bases de Datos.
Profesor:
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
SQL
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
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:
-
Dep. de Informtica
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
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.
____
Dep. de Informtica
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.-
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.-
Dep. de Informtica
SQL
Comando SAVE.
Comando START.
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.
Comando HOST.
Dep. de Informtica
SQL
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
Agrupaciones.
Procedimientos
Funciones
almacenados (*).
SQL
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
SQL
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.
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.
Dep. de Informtica
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
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.
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
SQL
Descripcin
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
SQL
Numricas:
Nmeros. Ejemplo:
Alfanumricas:
Francisco
'BAR PACO''S'
BAR PACOS
Fechas:
4
-586.21
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
SQL
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
12
SELECT
FROM
SQL
*
temple ;
DISTINCT direc
tdepto ;
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;
Dep. de Informtica
13
SQL
*
tdepto
numde = 110 ;
Resultado:
NUMDE
110
NUMCE
20
DIREC TIDIR
180
P
PRESU
90000
DEPDE NOMDE
100
DIRECCIN COMERCIAL
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
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.
15
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>
fecha - <num>
fecha1 fecha2
Dep. de Informtica
16
Ejemplos:
SQL
SELECT
FROM
SELECT
FROM
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 ;
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
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) ;
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
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:
Dep. de Informtica
19
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
SQL
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.
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
SQL
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
nomem
temple
salar > = ANY (
SELECT
FROM
WHERE
salar * 3.5
temple
numde = 150 ) ;
nomem, salar
temple
salar < ANY (SELECT
FROM
ORDER BY nomem ;
comis
temple)
Resultado:
NOMEM
SANTOS, SANCHO
Dep. de Informtica
SALAR
601
22
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
SQL
ms comisin) de los
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
SQL
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
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
SQL
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
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
SQL
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
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
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)
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])
Dep. de Informtica
30
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)
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
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
Ao ISO
Ejemplos:
1).- Calcular la edad, en aos cumplidos, de los empleados del departamento 130.
SELECT
FROM
WHERE
O mejor:
NEXT_DAY(sysdate, 7)
DUAL ;
LAST_DAY(sysdate) - sysdate
DUAL ;
Dep. de Informtica
32
SQL
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_NUMBER
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
SQL
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
Ejemplo
9999
0
$
B
MI
S
PR
D (*)
G (*)
C (*)
L (*)
,
.
EEEE
RN
Descripcin
Dep. de Informtica
34
SQL
Mscara
Descripcin
SCC CC
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
SQL
Ejemplos:
1).- Mostrar los das transcurridos desde el 1 de enero del 2000 hasta el da de hoy.
SELECT
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
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
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
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
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)
Dep. de Informtica
37
SQL
SELECT
FROM
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
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
Resultado:
COUNT(DISTINCTCOMIS)
6
Dep. de Informtica
AVG(COMIS)
588,14286
38
SQL
3).- Hallar la media del nmero de hijos de los empleados del departamento 123.
SELECT
FROM
WHERE
AVG (numhi)
temple
numde = 123 ;
Resultado:
AVG(TRUNC( MONTHS_BETWEEN(SYSDATE, fecna)/12 ) )
32,666667
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
SQL
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
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
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
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
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
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
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
SQL
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
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
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
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
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.
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
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
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
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
SELECT
FROM
WHERE
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
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
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
UNION
SELECT
FROM
WHERE
ORDER BY
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
SQL
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
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
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
SQL
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
Dep. de Informtica
56
SQL
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:
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
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
SQL
AVG(salar)
temple
numde = &dep ;
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
/
58
SQL
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
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
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
60
SQL
SET PAGESIZE nn
SET NEWPAGE nn
SET NUMWIDTH nn
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]
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.
61
SQL
WRAPPED /
WORD WRAPPED /
TRUNCATED.
NEWLINE/OFF
NULL <texto>
LIKE <columna1>
PRINT / NOPRINT
ON / OFF
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.
62
SQL
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
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
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 ;
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
<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
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
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
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
Dep. de Informtica
66
SQL
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, ..)]
donde:
<tabla>
(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
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.
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 ;
Dep. de Informtica
68
SQL
<tabla>
<predicado>
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 ;
<col1> =
<subconsulta> /
<exp> /
NULL
, <col2> =
<subconsulta> /
<exp> /
NULL
....
[WHERE <predicado>]
donde:
<tabla>
NULL
<predicado>
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
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) ;
WHERE
temple
salar = (SELECT
FROM
comis = NULL
numem= 500 ;
MIN(salar)
mayores),
COMMIT
ROLLBACK
SAVEPOINT
Dep. de Informtica
70
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
SQL
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
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
SQL
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
Estas sentencias afectan a la esttica por lo que no se ven afectadas por el comando Rollback.
Dep. de Informtica
74
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).-
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
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 ) ;
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:
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
SQL
[CONSTRAINT <nombre>]
PRIMARY KEY
/
UNIQUE
/
NOT NULL
/
CHECK <condicin>
/
REFERENCES <tabla_externa>[(campo1[, campo2]...)]
[ON DELETE CASCADE]
Dep. de Informtica
77
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>]
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
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
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:
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[,..]]) ;
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
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:
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
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
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 ;
dep
tdepto
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:
Dep. de Informtica
82
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
FORCE
NOFORCE
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
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 ;
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
SQL
INCREMENT BY
START WITH
MINVALUE
NOMINVALUE
MAXVALUE
NOMAXVALUE
sequ1
100
3;
sequ1.nextval
dual ;
Dep. de Informtica
85
SQL
8.4.- MODIFICACIN DE TABLAS: ALTER TABLE.El comando ALTER TABLE permite modificar la estructura de una tabla para:
-
Este comando no permite eliminar una columna de una tabla. Su sintaxis es:
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
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
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
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 ];
Rowid.
La tabla de excepciones deber haberse creado previamente en SQL *Plus con la estructura:
Dep. de Informtica
88
SQL
identificador_fila
propietario
nombre_tabla
restriccin
rowid ,
varchar2(30) ,
varchar2(30) ,
varchar2(30) ) ;
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.
89
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;
nombre_ndice ;
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
SQL
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
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
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:
-
Dep. de Informtica
93
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