0% encontró este documento útil (0 votos)
24 vistas95 páginas

2 SQL

Programación, bases sql

Cargado por

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

2 SQL

Programación, bases sql

Cargado por

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

I.E.S.

TRASSIERRA - Córdoba
[Link]

Departamento de Informática

BLOQUE 2: SQL
Etapa: Formación Profesional Específica.
Ciclo: Desarrollo de Aplicaciones Web.
Nivel: Superior.
Módulo: Bases de Datos.
Profesor: Salvador Pérez Jorge

INDICE:

Creación de Bases de Datos Relacionales............................................1


1. El Lenguaje SQL
2. Sentencias SQL
Tratamiento de datos.......................................................................13
3. Lenguaje de definición de datos LDD

Realización de Consultas...................................................................32
4. El lenguaje de manipulación de datos LMD
5. Funciones
6. Consultas sobre varias tablas
7. Archivos de comandos e informes
8. Sentencias de actualización de datos y transaccionales

Bibliografía.......................................................................................95
I.E.S. TRASSIERRA - Córdoba SQL

CREACIÓN DE BASES DE DATOS RELACIONALES


1. EL LENGUAJE SQL.-
1.1.- Qué es SQL.
1.2.- Uso de SQL.
1.3.- Principales características.
1.4.- Sublenguajes SQL.
1.5.- El editor de SQL *Plus.

1.1.- QUÉ ES SQL.-

El SQL es un lenguaje que permite comunicarnos con un SGBDR. A pesar de que su nombre proviene
de las iniciales Structured Query Languaje (Lenguaje Estructurado de Consultas), actualmente el SQL
es un lenguaje capaz de ser usado para consultas, para actualización y definición 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 años 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 estándar cumpliendo
las normas ANSI/ISO/FIPS. No obstante, y como en cualquier otro lenguaje los estándares 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 según las
normas sintácticas y semánticas de este lenguaje.

SQL puede ser usado como sentencias de un programa escrito en otro lenguaje (SQL embebido). Esta
forma de trabajo está más orientada a los programadores que además de conocer la sintaxis SQL
deberán conocer el lenguaje de programación correspondiente (COBOL, FORTRAN, PL71, C, etc.).
Pero además de embebido en un programa, SQL puede usarse de forma interactiva, esto es,
ejecutando la sentencia de consulta y recibiendo instantáneamente 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 técnicas para utilizar el SQL embebido en programas. En una de ellas, llamada SQL estático,
las sentencias incluidas en el programa no pueden cambiar durante su ejecución. En la otra, llamada
SQL dinámico, una sentencia puede ser modificada total o parcialmente por el propio programa
durante su ejecución. La mayoría de los programas pueden codificarse empleando SQL estático, más
sencillo y eficiente que el dinámico. Éste, en cambio, proporciona una mayor flexibilidad, que puede
ser útil en algunos casos especiales, y suele requerir técnicas de programación más avanzadas en el
manejo dinámico de memoria.

Dpto. de Informática 1
I.E.S. TRASSIERRA - Córdoba SQL

Oracle tiene una extensión procedural llamada PL/SQL que mezcla el SQL estándar 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 harán del lenguaje los programadores y usuarios consistirá en la realización de
consultas y actualizaciones sobré datos almacenados en tablas relacionales. Pero también hay otras
tareas que se pueden realizar mediante sentencias SQL, aunque pertenecen más a las
responsabilidades del Administrador de Bases de Datos o ABD (en inglés DBA). Son las siguientes:

1) Definición y destrucción de objetos.


Antes de poder usar una tabla para almacenar o consultar datos en ella, hay que describirla
al SGBD, dándole su nombre y características. Esto se hace definiéndola. Hay otros muchos
objetos que maneja un SGBD, tales como espacios para ficheros físicos, índices, etc. Todos
ellos se definen con sentencias SQL. Normalmente, la definición 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) Gestión 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
ejecución 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
programación) porque:
- Su potencia estriba en que procesa varias filas a la vez.
- La navegación para buscar los datos es automática, utilizando el “optimizador”.

SQL es un lenguaje relacionalmente completo, pues permite realizar cualquier consulta de datos: la
consulta puede devolver una tabla completa, una fila (tupla), una columna (atributo), una celda
(valor de un atributo para una tupla concreta) o un subconjunto de la tabla.

SQL es un lenguaje muy sencillo y parecido al idioma inglés y los comandos básicos pueden
aprenderse en poco tiempo.

Además, dispone de las mismas sentencias para cualquier tipo de usuario: administrador,
programadores y usuarios finales.

Dpto. de Informática 2
I.E.S. TRASSIERRA - Córdoba 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.:

L.M.D. Lenguaje de Manipulación de datos. (Consultas).


SQL L.D.D. Lenguaje de Descripción de datos. (Creación de tablas).
L.C.D. Lenguaje de Control de datos. (Confidencialidad).

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

Comando Acción
SELECT Consultar datos (sin modificarlos) de una o varias tablas
UPDATE Actualizar uno o varios valores de una o mas filas de una tabla.
INSERT Añadir una o varias tuplas a una tabla.
DELETE 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 Acción ____


CREATE Definir nuevos objetos. Por ejemplo, una tabla.
ALTER Modificar las características de un objeto ya existente. Por ejemplo, añadir
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 sinónimo.
TRUNCATE Borra las filas de una tabla o índice sin borrar su estructura. La tabla
permanece, pero vacía.

1.4.3.- LCD.-
Comandos utilizados por el administrador o por el dueño de un objeto para conceder o suprimir
privilegios de acceso a la Base de Datos o a un objeto,

Comando Acción ____


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

*
Solo válido para ciertos objetos

Dpto. de Informática 3
I.E.S. TRASSIERRA - Córdoba 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 línea de comandos y tras el prompt
SQL> escribimos el comando de conexión seguido del usuario y contraseña que hayamos indicado en
la instalación:
SQL> conn[ect] [usuario/password]

Si no especificamos el usuario/password, nos será solicitado por la propia herramienta.

Para trabajar en entorno gráfico deberemos ejecutar el programa Ir a la Página Inicial de Bases de
Datos que nos solicitará el usuario y clave. A continuación, deberemos picar sobre el icono SQL y
después sobre Comandos SQL.

El editor de líneas proporcionado por SQL*Plus es bastante rudimentario y similar al edlin del MS-
DOS. No obstante, el usuario puede elegir el editor de texto que desee. Desde el prompt de SQL*Plus
pueden ejecutarse comandos, algunos de los cuales pueden realizarse mediante las opciones de la
ventana de SQL*Plus.

• Comando EXIT.-
Sale de SQL *Plus. Sintaxis:
SQL> exit

• Comando HELP.-
Proporciona ayuda sobre los comandos de SQl *Plus. Para obtener ayuda genérica:
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 "[Link]". Si se


especifica un nombre, se genera un fichero con ese nombre y una extensión sql.

• Comando SPOOL.-
El comando SPOOL se utiliza para almacenar el RESULTADO de la ejecución de una SELECT en un
fichero.

Dpto. de Informática 4
I.E.S. TRASSIERRA - Córdoba SQL

Para activarlo se escribe:


SQL> SPOOL <nombre_fichero>

Y para desactivarlo:
SQL> SPOOL OFF

Genera un fichero, con extensión por defecto .lst, con el resultado de la SELECT ejecutada.

Si en vez de a un fichero queremos mandar el resultado a la impresora, para activarlo:


SQL> SPOOL ON

Y para desactivarlo:
SQL> SPOOL OUT

• Comando SAVE.
El comando SAVE guarda en un fichero el contenido de la sentencia SQL que está actualmente en el
buffer. Su sintaxis es:

SQL> SAVE <nombre_fichero> [REPLACE]

Esto crea un fichero de sistema operativo con extensión sql con la SELECT escrita anteriormente.

• Comando START.
El comando START permite ejecutar un fichero de comandos creado previamente y que contenga
más de una sentencia SQL. Su sintaxis es:
SQL> START <nombre_fichero>

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

• Comando DESCRIBE.
El comando DESCRIBE o DESC muestra la estructura de una tabla. Su sintaxis es:
SQL> DESC <nombre_tabla>

• Comando HOST.
Permite ejecutar un comando de sistema operativo sin salir de la sesión de SQL*Plus. Su sintaxis es:
SQL> HOST [comando]

Si se omite el comando se sale temporalmente al S.O. Para regresar a SQL*Plus deberemos usar el
comando EXIT que nos devolverá a la sesión de la base de datos.

Dpto. de Informática 5
I.E.S. TRASSIERRA - Córdoba SQL

CREACIÓN DE BASES DE DATOS RELACIONALES


2.- SENTENCIAS SQL.-
2.1.- Elementos de SQL.-
2.1.1.- Objetos de un esquema.
2.1.2.- Reglas para nombrar objetos.
2.1.3.- Reglas para referenciar objetos.
2.2.- Elementos de una sentencia SQL.
2.3.- Tipos de datos.
2.4.- Valores nulos.
2.5.- Constantes.
2.6.- Variables de entorno.

2.1.- ELEMENTOS SQL.-

Antes de estudiar las sentencias SQL *Plus debemos familiarizarnos con ciertos conceptos:

2.1.1.- Objetos de un Esquema.

Un esquema es un conjunto de objetos y estructuras de datos propiedad de un usuario. Cada usuario


tiene su propio esquema que coincide con el nombre del usuario que crea el objeto.

Los objetos se crean y modifican su estructura con el lenguaje LDD e incluyen los siguientes tipos de
objetos:

Tablas. Unidad básica de almacenamiento en un sistema de gestión de bases


de datos relacionales. Una tabla consta de una o más unidades de
información (filas), cada una de las cuales contiene el mismo tipo de
valores (columnas).
Índices Objeto de base de datos creado para aumentar el rendimiento de
recuperación de datos. Proporciona una ruta de acceso rápida a los
datos de una base de datos. Los índices apuntan directamente a la
ubicación de las filas que contienen los datos especificados.
Secuencias. Una secuencia genera una lista en serie de números únicos para las
columnas numéricas de una tabla de base de datos. Por ejemplo, si dos
usuarios desean insertar nuevos números de empleado en una tabla, la
secuencia genera automáticamente el valor correcto para cada
usuario.
Vistas. Presentación personalizada de los datos de una o más tablas.
Sinónimos. Alias de una tabla, vista, secuencia o unidad de programa. Sinónimo
privado: Sinónimo de un objeto de base de datos definido por un
usuario de Oracle para que otros usuarios seleccionados de la base de
datos puedan acceder a dicho objeto.
Sinónimo público: Sinónimo de un objeto de base de datos definido
por un administrador de base de datos para que todos los usuarios de
la base tengan acceso a dicho objeto.

Dpto. de Informática 6
I.E.S. TRASSIERRA - Córdoba SQL

Agrupaciones. Estructura de base de datos que contiene una o más tablas con una o
más columnas en común. Las filas de una o más tablas que comparten
el mismo valor en estas columnas comunes se almacenan físicamente
juntas en la base de datos.
Procedimientos y Procedimiento:
Funciones Juego de sentencias SQL y PL/SQL agrupadas para solucionar un
almacenados (*). problema específico o realizar un conjunto de tareas relacionadas.

Función 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
función 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 implícitamente)
almacenados en Base al emitir una sentencia INSERT, UPDATE o DELETE para la tabla
de Datos (*). asociada.
Réplicas y Réplicas Copia local de una tabla maestra remota. Las réplicas pueden utilizarse
Lógicas (*) (+). para replicar (copiar) toda la tabla o parte de ella, o para replicar el
resultado de una consulta en varias tablas. Las réplicas pueden ser
tanto actualizables como de sólo lectura. Ambas son copias de la tabla
maestra. Una réplica de sólo lectura se puede refrescar
periódicamente para reflejar los cambios realizados en la tabla
maestra. Los cambios realizados en una réplica 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 opción distribuida.

Existen otros objetos que se crean y manipulan a través 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
partición es parte de una tabla o un índice. Una restricción 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 están formados por un
cierto número de piezas llamadas particiones que tienen los mismos atributos lógicos. 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.

Dpto. de Informática 7
I.E.S. TRASSIERRA - Córdoba SQL

2.1.2. Reglas para Nombrar Objetos

Los nombres de objeto tienen que seguir las siguientes reglas:

• Deben tener una longitud entre 1 y 30 caracteres, excepto el nombre de una base de datos
que está limitado a 8 caracteres y el de un enlace de base de datos a 128.
• No puede estar entre paréntesis, ni entrecomillado.
• Pueden escribirse en mayúsculas o minúsculas. Oracle no es sensible a esto.
• Debe comenzar con un carácter reconocible por el conjunto de caracteres de la base de
datos, a menos que vaya acotado por dobles comillas.
• Solo debe contener caracteres alfanuméricos y el guión bajo. También, se admiten los
caracteres $ y # aunque no es aconsejable utilizarlos.
• No puede coincidir con una palabra reservada.

Se puede nombrar un objeto con un nombre alternativo o sinónimo, y a una columna con un nombre
alternativo temporal denominado alias que se detallarán más adelante.

2.1.3.- Reglas para Referenciar Objetos

Para referenciar un objeto se utiliza la siguiente sintaxis general:

[ esquema.]nombre-objeto [.parte-objeto ]

En el caso de que el objeto sea una tabla, deberá anteponerse el nombre del usuario y un punto al
nombre de la tabla. Solo si la tabla pertenece (la creó) al usuario que realiza la consulta se admite la
omisión de la referencia (nombre de usuario propietario).

Así por ejemplo el usuario PACO se referirá a la tabla de su propiedad de nombre emple,
simplemente por su nombre:

SELECT * FROM temple ;

Si la usuaria MARIA quiere acceder a la misma tabla (suponiendo que el propietario la haya
autorizado a ello) tendrá que referirse a ella como [Link].

SELECT * FROM [Link] ;

En las consultas sobre una sola tabla no es necesario referenciar las columnas, basta con indicar el
nombre de la misma, pero si la consulta se refiere a varias tablas con columnas sinónimas, el
referenciado de columnas se torna en necesidad. La forma de referenciar una columna es
anteponiéndole el nombre de la tabla a la que pertenece y un punto.

[Link] indica que se trata de la columna codenf de la tabla hospital.

En la sentencia SELECT es frecuente asignar alias a las tablas (para acortar las sentencias) y a las
columnas (para que se visualicen títulos de columna distintos a los nombres de campo). Estos alias
no son permanentes y solo se activan en esa sentencia

Dpto. de Informática 8
I.E.S. TRASSIERRA - Córdoba SQL

• Alias de nombre de tabla.-


La forma de asignar un alias al nombre de una tabla es escribiendo el nombre del alias a
continuación del de la tabla (separados con un espacio). Por ejemplo:

SELECT [Link], [Link], [Link]


FROM temple E, tdepto D
WHERE [Link]=[Link];

No debe confundirse un alias de tabla, que solo tiene vigencia en la sentencia en que se define,
con un sinónimo 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 presentación del
resultado, es escribiendo el alias tras el nombre de columna y un espacio. Por ejemplo:

SELECT [Link] “Nº DE EMPLEADO”,


[Link] EMPLEADO,
[Link] DEPARTAMENTO
FROM temple E, tdepto D
WHERE [Link] = [Link];

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 numéricos 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 más usado es el espacio,
pero también lo son la coma y los operadores aritméticos, alfanuméricos y de comparación.

2.3.- TIPOS DE DATOS.-


Cada valor de columna que se manipula es un tipo de dato. Cada tipo de dato tiene una serie de
características asociadas.

Al crear una tabla se especifica el tipo de datos acogerá cada columna. Luego, en función del tipo de
dato, podremos insertar ciertos valores o establecer ciertas comparaciones.

Dpto. de Informática 9
I.E.S. TRASSIERRA - Córdoba SQL

Los tipos de datos son:

Código Dato Descripción


1 VARCHAR2(tam) Cadena de caracteres de longitud variable. Tamaño máximo
es 4000 bytes y el mínimo uno. Es obligatorio especificar
precisión.
NVARCHAR2(tam) Cadena de caracteres de longitud variable teniendo un
máximo de longitud expresado en caracteres o bytes,
depende del juego de caracteres nacional indicado. El
tamaño máximo viene determinado por el número de bytes
requerido para almacenar cada carácter. El límite superior
es 4000 bytes. Hay que especificar precisión.
2 NUMBER(n[,d]) Numero de tamaño 'n' (hasta 38) y, opcionalmente, 'd'
decimales (de -84 a 127).
8 LONG Cadena de caracteres de longitud variable de hasta 2 Gb.
12 DATE Fecha en formato DD:MM:AA:HH:MM:SS. Depende de las
variables "NLS". Siete bytes numéricos. Rangos válidos son
desde 1 de enero de 4712 adC al 31 de diciembre de 4712
ddC.
23 RAW(tam) Dato binario de longitud variable. Tamaño máximo 2000
bytes. Se debe indicar precisión.
24 LONGRAW Cadena binaria de longitud variable de hasta 2 Gb.
69 ROWID Cadena hexadecimal que representa la dirección única de
una fila en una tabla. Este tipo se usa para almacenar los
valores devueltos por la pseudocolumna ROWID.
96 CHAR(tam) Cadena alfanumérica de longitud fija. Tamaño máximo 2000
bytes. Si no se indica precisión el valor mínimo y valor por
defecto es 1 byte.

Los códigos de los tipos de datos son para utilización interna. El código interno de un dato se muestra
cuando se utiliza la función 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 función de que se omitiera o incluyera la cláusula NOT
NULL en la creación 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 préstamo de biblioteca, podría 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.

Dpto. de Informática 10
I.E.S. TRASSIERRA - Córdoba SQL

2.5.- CONSTANTES.-

Las constantes o literales son secuencias de caracteres que representan un valor determinado de
tipo numérico, alfanumérico o fecha:

• Numéricas: Números. Ejemplo: 4


-586.21

• Alfanuméricas: Serie entrecomillada de hasta 254 caracteres. Ejemplo:


'Francisco' → Francisco
'BAR PACO''S' → BAR PACO’S

• Fechas: Números y caracteres especiales de fecha representados entre


comillas. Ejemplo: '04-10-2011'

La comparación de valores es frecuente en las consultas SQL, tanto en las condiciones de filtro
(cláusula Where) como en el orden de presentación de resultados (cláusula Order by).

La comparación de dos valores requiere que ambos sean del mismo tipo. Dos valores nulos son
considerados como iguales. Dos valores alfanuméricos vacíos se consideran iguales.

Las normas que se siguen son las típicas. En los valores alfanuméricos no nulos se toman en orden
creciente del código ASCII. La comparación se hace carácter a carácter, comenzando por la izquierda
y completando con blancos por la derecha caso de que los operandos sean de distinta longitud.

2.6.- VARIABLES DE ENTORNO.-

Los SGBD suelen disponer de unos registros especiales también llamados variables de entorno que
representan un valor determinado. Pero ese valor puede variar de una ejecución 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 Sintaxis Descripción


UID UID 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 información acerca de la sesión actual en un tipo de dato
(opción) VARCHAR2. El argumento opción puede tener los valores:
'ENTRYID': Devuelve un identificador de la sentencia ejecutada
para auditorias.
'LANGUAGE': Devuelve el lenguaje y el territorio utilizado
durante la sesión en formato:
lenguaje_territorio_juegocaracteres.
'SESSIONID': Devuelve un identificativo de la sesión del usuario
para auditorias.
'TERMINAL': Devuelve el identificativo del sistema operativo
para el terminal usado.

Dpto. de Informática 11
I.E.S. TRASSIERRA - Córdoba SQL

TRATAMIENTOS DE DATOS
3.- EL LENGUAJE DE DEFINICIÓN DE DATOS.-
3.1.- Introducción.
3.2.- Creación de tablas: CREATE TABLE.
3.2.1.- Restricciones.
3.3.- Creación de otros objetos.
3.3.1.- CREATE INDEX
3.3.2.- CREATE SYNONYM.
3.3.3.- CREATE WIEW.
3.3.4.- CREATE SEQUENCE.
3.4.- Modificación de tablas: ALTER TABLE.
3.4.1.- Añadir y borrar restricciones.
3.4.2.- Activar y desactivar restricciones.
3.5.- Modificación de secuencias: ALTER SEQUENCE.
3.6.- Eliminación de objetos.
3.6.1.- DROP TABLE.
3.6.2.- DROP INDEX.
3.6.3.- DROP SYNONYM.
3.6.4.- DROP WIEW.
3.6.5.- DROP SEQUENCE.
3.7.- Renombrado de objetos: RENAME.
3.8.- Vaciado de una tabla. TRUNCATE.
3.9.- Ejercicios propuestos.

3.1.- INTRODUCCIÓN.-

Como ya sabemos el LDD es el conjunto de sentencias SQL que permiten la descripción de la parte
estática del modelo relacional de datos, esto es: crear, modificar, renombrar y borrar objetos de la
base de datos.

Aunque la creación de los objetos 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 Para crear objetos.


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

Estas sentencias afectan a la estática por lo que no se ven afectadas por el comando Rollback.

Dpto. de Informática 12
I.E.S. TRASSIERRA - Córdoba SQL

3.2.- CREACIÓN DE TABLAS: CREATE TABLE.-

La sentencia CREATE TABLE permite la creación 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 almacenarán,
tamaño, y cierta información adicional (columnas obligatorias, si admiten o no valores nulos, clave
primaria, etc..).

Sintaxis:

CREATE TABLE <tabla>


( col1 tipo[(tamaño)] [NOT NULL] [restricción] ,
col2 tipo[(tamaño)] [NOT NULL] [restricción] , ....
[restricciónes sobre varias columnas] )
[AS subconsulta] ;

Los nombres de tabla deben ser únicos, con un máximo de 30 caracteres y comenzar con un carácter
alfabético.

Por cada columna de la tabla hay que especificar un nombre y un tipo (el tamaño 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 opción por defecto
es NULL.

Al definir una columna puede especificarse una restricción sobre ella. Después de definir todas las
columnas se especificarán las restricciones que afecten a varias de ellas (una clave primaria
compuesta, por ejemplo) aunque también aquí pueden indicarse restricciones de una sola columna.

La opción AS subconsulta permite crear la tabla a partir de la consulta sobre una o varias tablas. En
este caso no es necesario especificar las columnas, pues se toman de la subselect.

Ejemplos:

1).- CREATE TABLE enfermo


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

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

Dpto. de Informática 13
I.E.S. TRASSIERRA - Córdoba SQL

2).- Crear la tabla COMERCIALES con las columnas numem, nomem y comis que contendrá a los
empleados de temple que cobran comisión.

CREATE TABLE comerciales


AS( SELECT numem, nomem, comis
FROM temple
WHERE comis IS NOT NULL ) ;

La información acerca de las tablas y columnas en el diccionario de datos, se encuentra en las


siguientes vistas del diccionario accesibles para cualquier usuario:

USER_TABLES
ALL_TABLES
USER_TAB_COLUMNS
ALL_ TAB_COLUMNS

3.2.1.- RESTRICCIONES.-

Una restricción es una limitación asociada a una o varias columnas. Oracle soporta sintácticamente
restricciones sobre las tablas y sobre las columnas. Estas restricciones son almacenadas en el
diccionario de datos y son:

• Obligatoriedad de columnas: NOT NULL.


• Unicidad sobre una o un conjunto de columnas: UNIQUE.
• Clave primaria: PRIMARY KEY.
• Clave ajena: FOREIGN KEY.... REFERENCES.
• Verificación de condiciones: CHECK.

Para poderlas identificar, las restricciones pueden tener un nombre, y después de definidas pueden
ser activadas, desactivadas y eliminadas.

Antes de proceder a la creación de la tabla es necesario tenerla perfectamente diseñada y descrito su


comportamiento, para aplicarle correctamente las restricciones.

El nombre de una restricción 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 restricción debe ir
precedido de la palabra CONSTRAINT nombre_restricción tipo_restricción. Si no se le asigna nombre
en el momento de la creación, el sistema generará uno por defecto: SYS_COOn.

Es una buena costumbre nombrar las restricciones según el siguiente mnemotécnico:

Códigorestricción_nombretabla_nombrecolumna

Donde el Código de restricción es:

CP = CLAVE PRIMARIA
UQ = UNICIDAD
CA = CLAVE AJENA
CK = CHECK
NN = OBLIGATORIO

Dpto. de Informática 14
I.E.S. TRASSIERRA - Córdoba SQL

El nombre de la restricción aparecerá en los mensajes de error, en la documentación, al activarla y


desactivarla temporalmente o al borrarla.

La información acerca de las restricciones definidas por el usuario, y sobre qué columnas han
definido se encuentra en las siguientes tablas del diccionario de datos

USER_CONSTRAINTS
USER_CONS_COLUMNS

Hay dos formas de definir restricciones: en línea o fuera de línea.


Se dice que una restricción es en línea cuando se define en el momento de describir una columna, a
continuación de su nombre, el tipo de dato y la precisión, de forma que solo afecta a esa columna. En
este caso, no es obligatorio darles un nombre con la palabra clave CONSTRAINT, pero se generará
uno por defecto. Su sintaxis es:

PRIMARY KEY /
UNIQUE /
[CONSTRAINT <nombre>] NOT NULL /
CHECK <condición> /
REFERENCES <tabla_externa>[(campo1[, campo2]...)]
[ON DELETE CASCADE]

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

<campo1, campo2, ..> son las claves de la tabla externa por las que se establece la relación. Puede
omitirse si la relación se establece por la clave primaria (suele ser lo habitual).

ON DELETE CASCADE, hace que se borren todas las tuplas cuya clave ajena referencie (apunte) a una
tupla borrada en la tabla referenciada.

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
);

Dpto. de Informática 15
I.E.S. TRASSIERRA - Córdoba SQL

El usuario decide si quiere definirlas en línea, o fuera de línea (normalmente después de la definición
de columnas). En este caso es obligatorio preceder la restricción con la palabra clave CONSTRAINT
para que el gestor distinga entre lo que es la definición de la columna o la declaración de la
restricción. En este caso la sintaxis varia, y se define de este modo:

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


UNIQUE (col_un1[,col_un2[,..] ] ) /
[CONSTRAINT <nombre>] CHECK (col_ck1[,col_ck2[,..] ] <condición>) /
FOREIGN KEY (col_ca1[,col_ca2[,..] ] )
REFERENCES <tabla_externa>[(campo1[,campo2]...)]
[ON DELETE CASCADE]

Dónde: col_cp1, col_un1, col_nn1, col_ck1, col_ca1 representan los nombres de las columnas que en
cada caso se están definiendo como clave primaria (cp), único (uq), no nulo (nn), chequeo
(ck) o clave ajena (ca). Genéricamente puede expresarse así:

CONSTRAINT nombre restricción tipo_restricción (campo1 [,campo2]...)

Al definir una restricción fuera de línea hay que indicar a qué columnas de la tabla se aplica la
restricción, puesto que no está a continuación de la definición. En ciertos casos, como cuando una
clave primaria esta compuesta de varias columnas, o cuando una restricción se añade a posteriori, es
obligatorio definirlas como "no en línea". A continuación, se muestra un ejemplo:

CREATE TABLE libros


( signa 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 (signa, materia),
CONSTRAINT ck_libros_materia CHECK (materia BETWEEN 1 AND 300) ,
CONSTRAINT ca_libros_codedit FOREIGN KEY(codedit)
REFERENCES editoriales ON DELETE CASCADE
);

Esta sentencia crea la tabla libros a la vez que define una clave primaria compuesta por los campos
signa y materia. El atributo materia no es necesario declararlo no nula al ser parte de la clave
primaria. Se declara el campo titulo como obligatorio (no nulo). Se establece el dominio de materia
como un entero entre 1 y 300 ambos inclusive, y se declara a codedit como clave ajena que
referencia a la tabla editoriales, mediante la clave primaria de ésta. Si la relación se establece con
otro atributo de editoriales (clave alternativa) debe indicarse entre paréntesis después 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 especificación DEFAULT que, aunque no es una restricción propiamente dicha,
ofrece la posibilidad de indicar un valor por defecto a campos (columnas) que no se especifiquen en
una sentencia INSERT.

Dpto. de Informática 16
I.E.S. TRASSIERRA - Córdoba SQL

Otro ejemplo: En una gestión 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)
) ;

3.3. – CREACIÓN 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, sinónimos, enlaces de base de datos, roles, secuencias,
réplicas, usuarios, disparadores, paquetes, procedimientos y funciones.

3.3.1.- CREATE INDEX.-

Un índice se utiliza para recuperar con rapidez información de un proyecto de base de datos. Al igual
que los índices de los libros ayudan a recuperar información específica con más rapidez, un índice de
base de datos proporciona acceso rápido a los datos de las tablas. El indexado crea una lista de
registros en un orden lógico, así como su correspondiente posición física en la tabla. Los índices se
crean para encontrar y visualizar registros con rapidez, sobre todo en tablas de gran tamaño o en
bases de datos que constan de muchas tablas.

Los índices se crean en una o más columnas de una tabla. Una vez creados, la base de datos de
Oracle los mantiene y los utiliza de forma automática. Los cambios que se realicen a los datos de la
tabla (como añadir o eliminar filas) se incorporan de forma automática en todos los índices
relevantes.

El usuario puede crear los índices que estime conveniente, pero antes de indexar por una columna es
conveniente que cumpla ciertos requisitos:

• Ser consultada con frecuencia.


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

En general, cuanto mas corto es el índice mas eficaz resulta. Los índices pueden ser simples o
compuestos de varias columnas. En este caso las columnas no tienen que ser consecutivas ni del
mismo tipo de datos. Un índice compuesto lo puede estar hasta por 16 columnas o de 240
caracteres.

Dpto. de Informática 17
I.E.S. TRASSIERRA - Córdoba SQL

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 implícita la creación del índice si no se crean
desactivadas y en ambos casos es único.

La sentencia CREATE INDEX tiene la siguiente sintaxis:

CREATE [UNIQUE] INDEX nombre_indice


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

nombre_indice Es el nombre que le asignamos al índice. Conviene seguir la notación usada


en las restricciones.
tabla Es el nombre de la tabla sobre la que vamos a crear el índice.
campo1, campo2, .. Son los nombres de los campos sobre los que se va a indexar.

Ejemplo: Indexar la tabla temple por salario.

CREATE INDEX temple_salar


ON temple(salar) ;

(1) El índice creado será usado por la siguiente sentencia, aumentando la velocidad de ejecución.

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 ordenación por
salario denota el uso del índice. Los tiempos de ejecución serían visibles si dispusiéramos de decenas
de miles de tuplas, que es lo habitual en bases de datos gestionados con Oracle.

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 condición donde se use.

Las tablas del diccionario de datos con información acerca de índices accesibles para el usuario son:

USER_INDEXES
ALL_INDEX
USER_IND_COLUMNS
ALL_IND_COLUMNS

Consultándolas podremos saber los índices activos para poder referirnos a ellos (para su borrado, por
ejemplo).

Dpto. de Informática 18
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplos:
SELECT * FROM user_indexes ;

SELECT index_name, index_type, table_name FROM user_indexes ;

SELECT * FROM USER_IND_COLUMNS ;

3.3.2.- CREATE SYNONYM.-

Un sinónimo es un alias de una tabla, una vista, una secuencia o una unidad de programa. Un
sinónimo no es un objeto en sí mismo, pero es una referencia directa a un objeto. Los sinónimos se
utilizan para:

• Enmascarar el nombre real y el propietario de un objeto.


• Proporcionar acceso público a un objeto
• Proporcionar un nombre sencillo para un objeto de base de datos.
• Enmascarar la ubicación real de un objeto de base de datos (por ejemplo, una tabla se
encuentra en una base de datos de Madrid y otra tabla se encuentra en una base de datos de
Barcelona. Si utiliza sinónimos, al usuario le parecerá que ambas tablas se encuentran en el
mismo sitio).

Los sinónimos pueden ser privados o públicos. Un sinónimo privado sólo es utilizable por la persona
que crea el sinónimo (es su propietaria) y se necesita el privilegio CREATE SYNONYM. Un sinónimo
público es aquél 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 creación del sinónimo es necesario tener acceso al objeto sobre el que se
desea crear dicho sinónimo, o bien ser su propietario. A diferencia del alias, el sinónimo 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 sinónimo para hacer referencia a dicha tabla.
Generalmente, los Administradores de Base de Datos crean sinónimos públicos para que los objetos
de base de datos estén 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 sinónimo


FOR objeto;

Sinónimo Es el nombre asignado al sinónimo.


objeto Es el nombre del objeto sobre el que creamos el sinónimo. Si pertenece a otro
propietario deberemos preceder su nombre con el de aquél y un punto.

Dpto. de Informática 19
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplos:

1).- Crear un sinónimo privado sobre la tabla temple, son el nombre de emp.

CREATE SYNONYM emp


FOR temple;

2).- Crear el sinónimo salario para el índice creado en el ejemplo de la pregunta anterior.

CREATE SYNONYM salario


FOR temple_salar;

3).- Crear el sinónimo público dep para la tabla tdepto.

CREATE PUBLIC SYNONYM dep


FOR tdepto

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


tenemos los privilegios necesarios.

Las tablas del diccionario de datos con información acerca de los sinónimos accesibles para el usuario
son:
USER_SYNONYMS
ALL_SYNONYMS

3.3.3.- CREATE VIEW.-

Una vista es un presentación personalizada de los datos de una o más tablas. Las vistas extraen los
datos de las tablas en las que se basan, denominadas tablas base. Todas las operaciones que se
realizan en una vista afectan de hecho a las tablas base de la vista. Utilice las vistas para:

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


predeterminado de columnas y filas de tabla. Por ejemplo, cree una vista que no incluya datos
sensibles, como la información sobre sueldos.
• Ocultar la complejidad de los datos. Normalmente, las bases de datos de Oracle8 incluyen
muchas tablas y, si crea una vista que combine información de dos o más tablas, facilita a otros
usuarios el acceso a la información de su base de datos. Por ejemplo, podría tener una vista que
sea una combinación de su tabla Empleado y su tabla Departamento. Un usuario que consulte
esta vista, que ha denominado emp_dept, sólo tiene que ir a un sitio para obtener la
información, 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 cálculos extensos
con la información de las tablas. Si se guarda esta consulta como una vista, los cálculos sólo se
realizarán cuando se consulte la vista.

Una vista es una tabla lógica. La tabla no se crea físicamente sino que lo que se almacena es la
SELECT de creación 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.

Dpto. de Informática 20
I.E.S. TRASSIERRA - Córdoba SQL

La sintaxis de la sentencia CREATE WIEW es:

FORCE /
CREATE [OR REPLACE] NOFORCE VIEW nombre_vista [(coI1, col2, ...)]
AS subconsulta
WITH CHECK OPTION ;

OR REPLACE Recrea la vista si ya existe Esto permite cambiar la definición de la vista


sin tener que borrarla y volver a crearla.
FORCE Crea la vista incluso si hay problemas de acceso por insuficientes
privilegios a los objetos de la subconsulta en que se basa la creación de
la vista.
NOFORCE Es la opción por defecto y no crea la vista si se producen errores en la
definición
WI'TH CHECK OPTION Si la vista permite inserciones, comprobará la condición WHERE
impuesta, no solo en el momento de componer la vista, sino también a
la hora de realizar inserciones sobre ella.

Ejemplos:

1).- Crear la vista de nombre COMISIONISTAS sobre la tabla temple que contendrá las columnas
numem, nomem y comis de los empleados con comisión.

CREATE VIEW comisionistas


AS SELECT numem, nomem, comis
FROM temple
WHERE comis IS NOT NULL;

2).- Crear la vista DIRDEPART que contendrá las siguientes columnas: número y nombre de empleado
y el número y nombre de departamento de todos lo directores.

CREATE OR REPLACE VIEW dirdepart


AS SELECT numem, nomem, [Link], nomde
FROM temple E, tdepto D
WHERE [Link]=[Link];

Sobre una vista no existen restricciones en consulta, pero si en actualización inserción y borrado. Si
se cumplen las condiciones impuestas, la actualización, inserción o borrado se lleva a cabo sobre la
tabla base sobre la que se definió la vista.
• Para que una vista sea actualizable (permitir UPDATE), ninguna de las columnas que forman
la vista puede estar modificada por una expresión.
• Para que la vista permita inserciones (INSERT INTO vista), la vista en su definición 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 cláusulas 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 información acerca de vistas accesibles para el usuario son:
USER_VIEWS
ALL_VIEWS

Dpto. de Informática 21
I.E.S. TRASSIERRA - Córdoba SQL

3.3.4.- CREATE SEQUENCE.-

Una secuencia es un objeto que permite generar números secuenciales enteros y únicos. Esto puede
ser muy útil, por ejemplo, para conseguir claves primarias de forma automática.

Supongamos, por ejemplo, que dos usuarios insertan al mismo tiempo filas nuevas en la tabla de
empleados. Al utilizar una secuencia para generar números de empleados únicos para la columna
NUMEMP, ningún usuario tiene que esperar a que el otro introduzca el siguiente número de
empleado disponible. La secuencia genera automáticamente los valores correctos para cada usuario.

Además y dado que es un objeto como otro cualquiera de la Base de Datos, puede ser utilizado por
múltiples 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 ];

INCREMENT BY Determina el salto entre los números secuenciales. Puede ser un entero
negativo o positivo. De ese modo, hacemos secuencias ascendentes o
descendentes. No puede ser cero y el valor por defecto es 1.
START WITH Determina el primer número secuencial que será generado. Los valores por
defecto son: MINVALUE si la secuencia es creciente, MAXVALUE si es
decreciente o 1 si es creciente y no se especifica MINVALUE.
MINVALUE Determina el valor mínimo de la secuencia.
NOMINVALUE Valor 1 para las secuencias ascendentes y -1026 para las descendentes.
MAXVALUE Valor máximo que genera la secuencia.
NOMAXVALUE Valor de 1027 para las ascendentes y -1 para las descendentes.
CYCLE/ NOCYCLE La secuencia entra en un ciclo cuando alcanza su valor máximo o mínimo, o
por el contrario, si se alcanza el valor máximo o mínimo, no se pueden
generar más números. NOCYCLE por defecto.
CACHE/NOCACHE Almacena o no un número determinado de valores en memoria cache.

Una vez que se ha creado la secuencia puede ser accedida utilizando dos pseudocolumnas:

CURRVAL devuelve el valor actual de la secuencia.


NEXTVAL incrementa el valor de la secuencia y lo devuelve (la primera vez solo lo devuelve).

Dpto. de Informática 22
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplos:

1).- Crear la secuencia sequ1 que comience por 100 y vaya generando números de tres en tres

CREATE SEQUENCE sequ1


START WITH 100
INCREMENT BY 3;

2).- Conseguir un número de la secuencia anterior:

SELECT [Link]
FROM dual;

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

INSERT INTO ALUMNOS


VALUES ([Link], 'Francisco Valiente');

Las tablas del diccionario de datos con información acerca de las secuencias, y accesibles para el
usuario son:

USER_SEQUENCES
ALL_SEQUENCES

3.4.- MODIFICACIÓN DE TABLAS: ALTER TABLE.-

El comando ALTER TABLE permite modificar la estructura de una tabla para:

- Añadir columnas a una tabla ya creada.


- Modificar el tipo de dato o la precisión de una columna.
- Añadir, activar o desactivar temporalmente y borrar restricciones de integridad
referencial sobre la tabla.

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

ADD ( col1 tipo[(tamaño)] [NOT NULL] [restricción],


col2 tipo[(tamaño)] [NOT NULL] [restricción], ...
[ restricciones fuera de línea ] )/
MODIFY ( col1 tipo[(tamaño)] [NOT NULL] ,
ALTER TABLE tabla col2 tipo[(tamaño)] [NOT NULL] ) /;
DROP col1[,col2][, ..] /
DROP CONSTRAINT restricción /
DISABLE CONSTRAINT restricción /
ENABLE CONSTRAINT restricción /

Dpto. de Informática 23
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplos:

1).- Añadir 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 dirce en la tabla de centros, aumentándola a 55 posiciones.


Añadir la característica de obligatoriedad a esa columna.

ALTER TABLE tcentr


MODIFY (dirce varchar2(55) NOT NULL);

3.4.1.- Añadir y borrar restricciones .-

Se pueden añadir restricciones de integridad referencial a posteriori. En el momento que se añade,


se bloquea toda la tabla y se produce la comprobación de la restricción que se desea incorporar. Si
alguna fila no la cumple, la restricción no se añade.

Ejemplos:

1).- Añadir una restricción a la tabla tcentro. La situación de los centros de trabajo (dirce) debe ser
única.

ALTER TABLE tcentr


ADD CONSTRAINT uq_cent_dirce UNIQUE (dirce);

La sintaxis para añadir restricciones una vez creada la tabla es similar a la de las restricciones "no en
línea". 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 restricción a aplicar, y por último
sobre qué columna de la tabla se desea aplicar dicha restricción.

2).- Añadir una restricción en la tabla línea de facturas. Cada vez que se borre una cabecera de
factura se borran las líneas asociadas en cascada. Nótese que la restricción no se aplica en la tabla
maestra (la de cabeceras de facturas) sino en la DETALLE (en este caso la de líneas).

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
líneas.

Cuando se define una clave ajena se puede hacer referencia explícita a la tabla referenciada
REFERENCES tabla(col), o implícita REFERENCES tabla.

En el caso del borrado en cascada la sintaxis sólo permite referencia implícita, es decir, solo admite la
relación de la clave ajena con la clave primaria de la tabla referenciada.

Dpto. de Informática 24
I.E.S. TRASSIERRA - Córdoba SQL

Para borrar restricciones se utiliza la sintaxis:

ALTER TABLE tabla DROP


[UNIQUE (col1 [,col2])]
[PRIMARY KEY]
[CONSTRAINT restricción ]
[CASCADE ];

CASCADE Hace que al borrar una restricción UNIQUE o PRIMARY KEY, se borre dicha restricción
y además se eliminen todas las claves ajenas que apunten a la clave.

Ejemplo:

Eliminar una restricción 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);

3.4.2.- Activar y desactivar restricciones.-

 Desactivar una restricción permite que dicha restricción no se compruebe temporalmente. NO


ES IGUAL que borrar la restricción. Se usa para incrementar la velocidad en cargas de datos
masivas, aunque Loader la herramienta de Oracle deshabilita automáticamente 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 también se destruyen los índices asociados.

Sintaxis:
ALTER TABLE tabla DISABLE
[UNIQUE (col1 [,col2])]
[PRIMARY KEY]
[CONSTRAINT restricción ]
[CASCADE] ;

CASCADE Desactiva todas las dependencias asociadas

 Oracle también permite activar la comprobación de restricciones no activadas. En el momento


que se crea una restricción se activa a no ser que se indique la cláusula DISABLE.

Cuando se activa posteriormente:


- Bloquea la tabla completa hasta que se termine la comprobación.
- Comprueba una a una las filas.
- Si alguna de las filas no cumple la restricción, no podrá llegar a activarse.

Dpto. de Informática 25
I.E.S. TRASSIERRA - Córdoba SQL

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 restricción ]
[EXCEPTIONS INTO tabla_excepciones ];

• Excepciones activando restricciones.- Cuando se intenta activar una restricción con la opción
EXCEPTIONS INTO, y no se puede, por cada fila que no cumpla la restricción se puede guardar en
una tabla creada previamente la siguiente información:
- Rowid.
- Usuario propietario de la tabla.
- Nombre de la tabla en la que se encuentra la restricción.
- Nombre de restricción que no se cumple.
La tabla de excepciones deberá haberse creado previamente en SQL *Plus con la estructura:

CREATE TABLE tabla_excepciones ( identificador_fila rowid ,


propietario varchar2(30) ,
nombre_tabla varchar2(30) ,
restricción varchar2(30) ) ;

Oracle ofrece el script de ejemplo:

C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\[Link]

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 restricción haremos:

SELECT *
FROM tabla_base, tabla_excepciones
WHERE tabla_base.rowid = tabla_excepciones.identificador_fila ;

3.5.- MODIFICACIÓN DE SECUENCIAS: ALTER SEQUENCE .-

El comando ALTER SEQUENCE permite modificar las características y el comportamiento de una


secuencia. Algunas características pueden modificarse, como cycle/nocycle e increment by. Otras,
como start with, no pueden alterarse. Por último, la modificación de otras características 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 creación:

Dpto. de Informática 26
I.E.S. TRASSIERRA - Córdoba SQL

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.

3.6.- ELIMINACIÓN DE OBJETOS.-

3.6.1.- DROP TABLE.-

Permite eliminar una tabla. Sintaxis:

DROP TABLE nombre_de_tabla


[CASCADE CONSTRAINTS] ;

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;

3.6.2.- DROP INDEX.-

Permite eliminar un índice de una tabla. Sintaxis:

DROP INDEX nombre_índice ;

A partir de este momento la columna en cuestión ya no esta indexada. En el comando DROP INDEX
es indiferente que el índice sea único o no.

La información acerca de los índices está almacenada en el diccionario en las tablas:

USER_INDEXES
USER_IND_COLUMNS

Para borrar un índice se debe ser el propietario de la tabla en la que están los índices o tener un
privilegio llamado DROP ANY INDEX.

Dpto. de Informática 27
I.E.S. TRASSIERRA - Córdoba SQL

3.6.3.- DROP SYNONYM.-

Se puede borrar un sinónimo sobre una tabla, procedimiento, vista, etc utilizando el siguiente
comando. Sintaxis:

DROP [PUBLIC] SYNONYM nombre_sinónimo ;

Con el uso de este comando no se borra el objeto, sino el alias permanente del objeto.

La información referente a sinónimos se encuentra en las siguientes tablas:

USER_SYNONYMS
ALL_SYNONYMS

Para borrar un sinónimo basta con ser el propietario (haberlo creado). En el caso de que el sinónimo
que se desea borrar sea público, es necesario tener el privilegio DROP PUBLIC SYNONYM.

3.6.4.-DROP VIEW.-

Se puede eliminar una vista de una tabla utilizando este comando que tiene la siguiente sintaxis:

DROP VIEW nombre_vista ;

3.6.5.- DROP SEQUENCE.-

Sirve para eliminar una secuencia de la BD. Sintaxis

DROP SECUENCE nombre_secuencia ;

Suele ser el método utilizado para resetear una secuencia. Se borra y luego se vuelve a crear con los
valores deseados. Ejemplo:

DROP SECUENCE sequ1 ;

3.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 deberían ser borrados y vueltos a crear con otro
nombre. Sintaxis:

RENAME nombre_antiguo TO nombre_nuevo;

La información 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.

Dpto. de Informática 28
I.E.S. TRASSIERRA - Córdoba SQL

3.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 transacción (ROLLBACK), ni de hacer un borrado restrictivo (cláusula
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 opción DROP STORAGE libera el espacio que el objeto ha tomado a la base de datos.

La opción REUSE STORAGE (por defecto) mantiene reservado el espacio previamente adquirido para
dicho objeto.

Al truncar una tabla se truncan de forma implícita los índices de dicha tabla.

3.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. Después de creadas se
borrarán.
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 homogéneas tcentr, tdepto y temple.

2.- Sobre la tabla EMPLEADOS:


2.1.- Añadir 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.

Dpto. de Informática 29
I.E.S. TRASSIERRA - Córdoba SQL

4.- Crear 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
número 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 sinónimos emp, dep y cen sobre las tablas empleados, departamentos y centros.

6.- Borrar los anteriores sinónimos.

7.- Disminuir a 30 caracteres la longitud de la columna nomce de la tabla centros. Las sentencias
necesarias se guardarán en el archivo EJER8_7.SQL.

8.- Crear la secuencia S1 que comenzará por el número 3000 y disminuirá de 3 en 3 hasta llegar a –
2000. Después de creada, se consultará la secuencia creada. Posteriormente se obtendrán tres
valores de la secuencia y se volverá a consultar para ver lo cambios.

9.- Modificar la anterior secuencia para que sea cíclica.

10.- Modificar la anterior secuencia para que varíe entre el 3000 y el -2000, pero que comience por el
–1996. Posteriormente se extraerán cuatro valores.

11.- Borrar la anterior secuencia. Comprueba su inexistencia mediante una consulta a la tabla de
secuencias del usuario.

12.- Debido a un supuesto gran número 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.
Diseña dos consultas tal 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. Después de creada, consultar todos sus datos. Por último eliminar todas sus tuplas
manteniendo la estructura.

17.- Desactivar la restricción de clave primaria de la tabla centros. Después, y para comprobar que se
encuentra desactivada, insertar el centro de SEGURIDAD con el número 10 y sito en la calle Julio
Romero, 10 de Córdoba. Por último intentar activar la restricción.

18.- Diseñar las tablas para la gestión básica de un videoclub: SOCIOS, VIDEOS, PRESTAMOS e
HISPRES (histórico de préstamos donde además de los datos de préstamos figurará la fecha de
devolución). Se sabe que:
- Cada ejemplar de vídeo lleva un código identificador.
- El tipo de socio puede ser uno de los siguientes (E, 1, 2, A).
- Los vídeos son todos de la misma categoría.
- En la tabla de préstamos solo se almacenarán los pendientes de devolución.

Crear el índice ind_fecha sobre la tabla histórica.


Las sentencias LDD necesarias se guardarán en el fichero [Link]

Dpto. de Informática 30
I.E.S. TRASSIERRA - Córdoba SQL

REALIZACIÓN DE CONSULTAS
4.- LENGUAJE DE MANIPULACIÓN DE DATOS.-
4.1.- SELECT básico.
4.1.1.- Selección de columnas.
4.1.2.- Selección de tablas. Cláusula FROM.
4.1.3.- Selección de filas. Cláusula WHERE.
4.1.4.- Ordenación de los resultados. Cláusula ORDER BY.
4.2.- Expresiones.
4.2.1.- Operadores.
[Link].- Aritméticos.
[Link].- Alfanuméricos.
[Link].- De fecha.
[Link].- De comparación general.
[Link].- De comparación de cadenas.
[Link].- De comparación lógica.
[Link].- Lógicos.
4.3.- Ejercicios propuestos.

4.1.- SELECT BÁSICO.-


Las sentencias SQL están formadas por distintas cláusulas, cada una de las cuales empieza con una
palabra predefinida determinada.

La sentencia SELECT permite recuperar datos de una o varias tablas, vistas o réplicas. 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 continuación, 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].. ] [DESC]

4.1.1.- Selección de columnas.-

Dónde col-1 y col-2 son nombres de columnas de la tabla cuyo nombre figura en la cláusula FROM. Si
se especifica el carácter comodín (*) se mostrarán 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.

Dpto. de Informática 31
I.E.S. TRASSIERRA - Córdoba SQL

SELECT nomem, salar, fecna


FROM temple ;

SELECT *
FROM temple ;

La cláusula DISTINCT elimina, del resultado a mostrar, las filas repetidas.

Ejemplo: Mostrar los números de empleado de los empleados que son directores.

SELECT DISTINCT direc


FROM tdepto ;

Obsérvese como la información devuelta es mucho más significativa (justa y necesaria) si usamos
DISTINCT que si no lo hacemos.

4.1.2.- Selección de tablas. Cláusula FROM.-

La cláusula FROM indica el nombre de la tabla o tablas sobre las que se realizará la consulta. En la
cláusula 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 numem
FROM [Link] ;

4.1.3.- Selección de filas. Cláusula WHERE.-

WHERE permite filtrar las filas de forma que sean devueltas solo las que cumplan cierta condición. El
predicado de la cláusula WHERE es una condición que puede ser verdadera o no. De momento vamos
a suponer que se trata de una comparación entre dos valores. Más adelante veremos otras
posibilidades.

Ejemplos:

1).- Listar los nombres de los empleados que trabajan en el departamento 110.

SELECT nomem
FROM temple
WHERE numde = 110;

Resultado: (puede obtenerse en otro orden):

NOMEM
PEREZ, MARCOS
MORAL, CARMEN
CAMPOS, ROMULO

Dpto. de Informática 32
I.E.S. TRASSIERRA - Córdoba SQL

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

SELECT *
FROM tdepto
WHERE numde = 110 ;

Resultado:

NUMDE NUMCE DIREC TIDIR PRESU DEPDE NOMDE


110 20 180 P 90000 100 DIRECCIÓN COMERCIAL

4.1.4.- Ordenación de los resultados. Cláusula ORDER BY.

La cláusula ORDER BY permite mostrar los resultados en un orden determinado, admitiendo la


ordenación por más de una columna y en orden ascendente y descendente.

La(s) columna(s) especificada(s) en la cláusula ORDER BY no tienen por que ser una(s) de las
especificadas en la cláusula SELECT.

Ejemplos:

1).- Obtener los nombres de todos los departamentos ordenados alfabéticamente.

SELECT nomde
FROM tdept
ORDER BY 1 ;

Resultado:

NOMDE .
ACCOUNTING
OPERATIONS
RESEARCH
SALES

2).- Obtener, en orden de número de empleado, el nombre y salario de los empleados con más de
tres hijos. ( Nota: Se puede ordenar el resultado por un atributo que no aparezca en la SELECT)

SELECT nomem, salar


FROM temple
WHERE numhi > 3
ORDER BY numem ;

Resultado:

NOMEM SALAR
VEIGA, JULIANA 2163,6
LOPEZ, ANTONIO 4770,52
FLOR, DOROTEA 1917,3

Dpto. de Informática 33
I.E.S. TRASSIERRA - Córdoba SQL

3).- Listar el número de departamento, nombre y fecha de ingreso en la empresa y el salario, de los
empleados cuyo salario es inferior a 1300 euros, clasificándolos por departamento en orden
creciente y, dentro de cada departamento, por antigüedad en la empresa.

SELECT numde, nomem, fecin, salar


FROM temple
WHERE salar < 1200
ORDER BY 1, 2 DESC;

Resultado:

NUMDE NOMEM FECIN SALAR


111 SANTOS, SANCHO 22/01/01 631,05
111 LARA, LUCRECIA 02/11/00 1167,6
112 TORRES, HORACIO 02/01/01 1136,1
112 MARTIN, MICAELA 02/01/01 1136,1
122 MUÑOZ, AZUCENA 15/10/01 1104,6

• Si no se especifica ORDER BY, las filas de la tabla resultado serán devueltas en cualquier orden.
Incluso en distinto orden de una ejecución a otra.
• Cuando el SGBD ordena las filas ascendentemente (opción por defecto), los valores nulos se
muestran detrás de todos los demás. Para obtener un orden descendente se especifica la palabra
DESC detrás del nombre o número de la columna; en este caso los nulos se muestran al principio.
• Además, en vez de especificar el nombre de la columna por la que se quieren ordenar los
resultados, puede indicarse el número relativo de la columna en la cláusula SELECT. Así por
ejemplo, ORDER BY 3 equivale a especificara el nombre de la tercera columna de la cláusula
SELECT.
• También puede ordenarse el resultado por más de una columna. Para ello, basta dar sus nombres
o números, 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
cláusula 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, según el predicado (condición) de la cláusula WHERE,
suprimiendo a todas las que no satisfagan la condición.
3. Después se eliminan las columnas que no se mencionen en la cláusula SELECT. Las restantes
se retienen y se ponen en la misma posición relativa en que se hayan escrito en la cláusula
SELECT. Incluso puede repetirse alguna si su nombre aparece repetido en esta cláusula.
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 cláusula ORDER BY.

Dpto. de Informática 34
I.E.S. TRASSIERRA - Córdoba SQL

4.2.- EXPRESIONES.-

Una expresión es una combinación de operadores, operandos y paréntesis. Cuando el SGBD ejecuta
las operaciones indicadas en ella, produce como resultado un único valor, de forma que en la
sentencia, la función es sustituida por su valor de retorno.

En el formato de SELECT simplificado, las expresiones pueden emplearse en la cláusula SELECT en vez
de los nombres de columnas, y en la cláusula WHERE en la formulación del predicado o condición,
dónde uno o ambos de los valores a comparar pueden ser el resultado de evaluar una expresión. Los
operandos pueden ser nombres de columnas, constantes, funciones, registros especiales (USER, por
ejemplo) u otras expresiones.

4.2.1.- Operadores.-

Los operadores actúan sobre datos homogéneos. Los hay unarios, que actúan sobre un único
operando (por ejemplo –2), pero la mayoría son binarios actuando sobre dos operandos. Según el
tipo de datos con los que operan, los operadores se clasifican en:

[Link].- Aritméticos.
Se usan para sumar, restar, multiplicar y dividir valores numéricos o para hacerlos negativos.
El resultado de la operación es siempre un número.

Operador Función Ejemplo


SELECT salar+comis
+, - Suma y resta FROM temple
WHERE sysdate - fecin > 365;
SELECT *
+, - Positivo y negativo FROM temple
WHERE comis > -1;
SELECT salar*12 "Salario anual"
*, / Multiplicación y división
FROM temple;

[Link].- Alfanuméricos.
Operan sobre cadenas de caracteres. Solo existe el operador de concatenación alfanumérica
que se escribe con dos rayas verticales (||) que permite unir dos cadenas.

Por ejemplo: SELECT 'Departamento de ' || nomde


FROM tdepto;

[Link].- De fecha.-
Con operandos de tipo fecha pueden operar los operadores + y -, según las siguientes tres
operaciones:

Operación Valor devuelto .


fecha + <num> La fecha incrementada en <num> días.
fecha - <num> La fecha disminuida en <num> días.
fecha1 - fecha2 El número de días transcurridos entre dos fechas.
Si fecha1 es mayor que fecha2, el número devuelto será
positivo, y en caso contrario negativo.

Dpto. de Informática 35
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplos:
SELECT sysdate + 7 "Dentro de 7 días"
FROM dual ;

SELECT fecin - fecna "Edad de ingreso en días"


FROM temple ;

Si necesitamos usar una constante de tipo fecha, la única forma es escribiendo la fecha como
una cadena y convirtiéndola a fecha con la función TO_DATE:

SELECT sysdate – TO_DATE('17/10/2010')


FROM dual ;

En estos ejemplos se usa la tabla DUAL. Ésta se crea automáticamente en Oracle y está
accesible para todos los usuarios. Contiene una sola columna llamada DUMMY definida como
VARCHAR2(1) y contiene una fila con el carácter "X".

Se usa para acceder a una variable de entorno sin necesidad de acceder a datos reales de las
tablas. A nosotros nos será de mucha utilidad para experimentar con operandos y funciones
de tipo fecha a partir de la fecha actual (SYSDATE). Mas adelante estudiaremos las funciones
para manipular valores de tipo fecha (DATE).

[Link].- De comparación general.-


Se utilizan en los predicados condicionales para comparar una expresión con otra. El
resultado puede ser verdadero TRUE, falso FALSE o desconocido UNKNOW

Operador Descripción Ejemplo


= Igualdad SELECT *
FROM tdepto
WHERE numde = 110;
<>, != No igual SELECT *
FROM tdepto
WHERE numde <> 110;
> Mayor SELECT *
FROM tdepto
WHERE numde > 110;
< Menor SELECT *
FROM tdepto
WHERE numde < 110;
>= Mayor o igual SELECT *
FROM tdepto
WHERE numde >= 110;
<= Menor o igual SELECT *
FROM tdepto
WHERE numde <= 110;

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

El segundo comparando puede ser otra select, pero se especificará entre paréntesis y producirá
como resultado un único valor (1 fila y 1 columna). Si devuelve una tabla vacía, el predicado en que
participa toma el valor desconocido.

Dpto. de Informática 36
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplo: Obtener el nombre de los empleados cuyo sueldo cuadruplica, al menos, al del empleado
550.

SELECT nomem
FROM temple
WHERE salar > (SELECT salar *4
FROM temple
WHERE numem = 550) ;
Que también podría haberse formulado así:
SELECT nomem
FROM temple
WHERE salar/4 > (SELECT salar
FROM temple
WHERE numem = 550) ;

Pero sería 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 devolvería
una tabla vacía y el resultado final también sería una tabla vacía.

Resuélvanse los ejercicios propuestos números 1 al 9.

[Link].- De comparación de cadenas.

➢ EI operador LlKE se utiliza en comparaciones de cadenas de caracteres con un patrón de


búsqueda. Su sintaxis es:
<expresión> [NOT] LIKE <cadena>

Mientras el operador = buscaría cadenas de caracteres idénticas, el operador LIKE busca


cadenas de caracteres que contengan la porción de la cadena indicada.

Para realizar las búsquedas con LIKE se utilizan los caracteres comodines '%' y '_':

‘%’ (porcentaje) sustituye a cualquier cadena de 0 o más caracteres.


‘_’ (subrayado) sustituye a cualquier carácter, pero solo a uno.

Ejemplos:

LIKE 'Director' la cadena ‘Director’


LIKE 'M%' cualquier cadena que empiece por M.
LIKE '%Z%' cualquier cadena que contenga una Z
LIKE '_T%' cualquier cadena cuyo segundo carácter sea una T

Ejemplo: Listar el nombre y salario de los empleados cuyo nombre acabe en 'a'.

SELECT nomem, salar


FROM temple
WHERE nomem LIKE '%A';

Dpto. de Informática 37
I.E.S. TRASSIERRA - Córdoba SQL

[Link].- De comparación lógica.-

➢ 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 más 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 lógicos AND y OR que
se verán más adelante, así el predicado:

V1 BETWEEN V2 AND V3 es equivalente a: (V1 > = V2) AND (V1 < = V3)
V1 NOT BETWEEN V2 AND V3 equivale a: (V1 < V2) OR (V1 > V3)

Dpto. de Informática 38
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplos:

1).- Obtener en orden alfabético los nombres de empleados cuyo salario está entre 1200 y 3000 €.

SELECT nomem
FROM temple
WHERE salar BETWEEN 1200 AND 3000
ORDER BY nomem ;

2).- Obtener por orden alfabético los nombres y salarios de los empleados cuyo salario dividido por
su número de hijos cumpla una, o ambas, de las dos condiciones siguientes:
- Que sea inferior a 720 euros.
- Que sea superior al doble de su comisión.

SELECT nomem, salar


FROM temple
WHERE salar / numhi NOT BETWEEN 720 AND 2 * comis
ORDER BY nomem ;

En la ejecución de esta sentencia se presentarán 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 ;

Obsérvese que si en alguna fila el valor de la expresión (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 PÉREZ, y es conveniente asegurarnos que es eso lo que se busca.

➢ Los operadores ANY y ALL permiten cuantificar un predicado de comparación. 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 más filas.

Con ALL, el predicado cuantificado es verdadero si la comparación es verdadera para todos y


cada uno de los valores de la lista, o resultantes de la sentencia subordinada.

Con ANY, el predicado cuantificado es verdadero si la comparación es verdadera para uno


cualquiera de los valores.
Veamos con más detalle el comportamiento de estos operadores al usar subselect:

Dpto. de Informática 39
I.E.S. TRASSIERRA - Córdoba SQL

 Si se especifica ALL:
• Si la sentencia subordinada devuelve una tabla vacía, se conviene en que el predicado
cuantificado toma el valor verdadero.
• Si devuelve uno o más valores, y alguno de ellos es nulo, e1 predicado cuantificado
puede ser:
- Falso, si para alguno de los valores no nulos la comparación es falsa.
- Desconocido, si la comparación es verdadera para todos los valores no nulos.
• Si devuelve uno o más valores y ninguno de ellos es nulo, el predicado cuantificado es
verdadero si la comparación lo es para todos los valores. En caso contrario es falso.

 Si se especifica ANY.
• Si la sentencia subordinada devuelve una tabla con cero filas (vacía), se conviene en que
el predicado cuantificado toma el valor falso.
• Si devuelve una o más filas, y alguno de los valores es nulo, el predicado cuantificado
puede ser:
- Verdadero, si para alguno de los valores no nulos la comparación es Verdadera
- Desconocido, si para todos los valores no nulos, la comparación es falsa.
• Si devuelve una o más filas, y ninguna de ellas contiene nulo, el predicado es Verdadero si
la comparación es Verdadera para alguno de los valores. En caso contrario es falso.

Ejemplos:

1).- Obtener por orden alfabético los nombres de los empleados cuyo salario supera al máximo
salario de los empleados del departamento 122.

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

Resultado:

NOMEM .
LOPEZ, ANTONIO
PEREZ, MARCOS

Esta consulta podría formularse con la función MAX que se verá en el tema siguiente.

Supongamos que formulamos la misma consulta para el departamento 150:

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

Dpto. de Informática 40
I.E.S. TRASSIERRA - Córdoba SQL

Como el departamento 150 no existe, la SELECT subordinada devuelve como resultado una tabla
vacía. Por tanto, todas las filas satisfacen el predicado cuantificado y el resultado final es una relación
de todos los empleados por orden alfabético.

2).- Obtener por orden alfabético los nombres de los empleados cuyo salario supera en tres veces y
media o más al mínimo salario de los empleados del departamento 122.

SELECT nomem
FROM temple
WHERE salar > = ANY ( SELECT salar * 3.5
FROM temple
WHERE numde = 122)
ORDER BY nomem ;

Se podría formular de otra forma con la función MIN que se verá más adelante.

Resultado:
NOMEM .
LOPEZ, ANTONIO

Repitamos esta consulta para un departamento inexistente:

SELECT nomem
FROM temple
WHERE salar > = ANY (SELECT salar * 3.5
FROM temple
WHERE numde = 150) ;

Como el resultado de la subselect es una tabla vacía, el predicado cuantificado es falso. El resultado
final, por tanto, es también una tabla vacía.

3).- Obtener por orden alfabético los nombres y salarios de los empleados cuyo salario es inferior a la
comisión más alta existente.

SELECT nomem, salar


FROM temple
WHERE salar < ANY (SELECT comis
FROM temple)
ORDER BY nomem ;

Resultado:

NOMEM SALAR
SANTOS, SANCHO 601

➢ 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.

Dpto. de Informática 41
I.E.S. TRASSIERRA - Córdoba SQL

En vez de la <lista de constantes> puede especificarse, entre paréntesis, una sentencia SELECT
simplificada, la cual deberá devolver una tabla con una sola columna y no incluir la cláusula
ORDER BY.

El alumno debería comprobar las siguientes equivalencias:

IN es equivalente a = ANY NOT IN es equivalente a != ALL

Ejemplos:
1).- Obtener por orden alfabético los nombres de los empleados cuya extensión telefónica es 250 ó
750.
SELECT nomem
FROM temple
WHERE extel IN (250, 750)
ORDER BY 1 ;

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

2).- Obtener por orden alfabético los nombres de los empleados que trabajan en el mismo
departamento que Pilar Gálvez o Dorotea Flor.

SELECT nomem
FROM temple
WHERE numde IN (SELECT numde
FROM temple
WHERE nomem IN ('GALVEZ, PILAR', 'FLOR, DOROTEA') )
ORDER BY nomem ;

Resultado:
NOMEM .
ALBA, ADRIANA
:
LOPEZ, ANTONIO (6 registros)

➢ El operador NULL permite saber si un atributo de una tupla determinada es o no nulo. En caso
afirmativo el operador NULL devuelve verdadero y falso en caso contrario. No devuelve
desconocido, pues o es Nulo o no lo es. Caso de añadir la palabra NOT, el valor devuelto será el
contrario. Su sintaxis es:

<col> IS [NOT] NULL

Ejemplo: Listar los nombres y sueldos totales (salario más comisión) de los empleados que
cobran comisión:

SELECT nomem, salar+comis "Salario mensual"


FROM temple
WHERE comis IS NOT NULL;

Dpto. de Informática 42
I.E.S. TRASSIERRA - Córdoba SQL

➢ El operador EXISTS permite detectar si el resultado de una subselect es o no una tabla vacía.
Devuelve verdadero si la sentencia subordinada no es una tabla vacía. Su sintaxis es:

EXISTS (subselect)

Ejemplo: Listar los nombres y salarios de los empleados del departamento 112, pero solo si
hay alguno de ellos con un salario superior a 2000 euros.

SELECT nomem, salar


FROM temple
WHERE numde=112 AND EXISTS (SELECT *
FROM temple
WHERE numde=112 AND salar>2000 ) ;

[Link].- Operadores lógicos.-

Los predicados vistos hasta ahora son simples. Los operadores lógicos AND, OR y NOT permiten
expresar predicados compuestos combinando predicados simples o compuestos.

AND es el operador lógico de conjunción, OR el de disyunción y NOT el de negación. 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".

Obsérvese que las palabras AND y NOT pueden usarse en otros predicados sin desempeñar el
papel de operadores lógicos. 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 además equivalentes.

El valor devuelto por estos operandos lógicos, teniendo en cuenta la posibilidad de valores nulos
ya se vio cuando se estudiaron los valores nulos en el modelo relacional y no se repiten para no
ser reiterativos, pero el alumno debería repasarlos para entender los resultados de las consultas
sobre valores nulos.

Ejemplos:

1).- Obtener por orden alfabético los nombres y comisiones de los empleados del departamento 110
si hay en él algún empleado que tenga comisión.

SELECT nomem, comis


FROM temple
WHERE numde = 110 AND EXISTS (SELECT *
FROM temple
WHERE numde = 110 AND comis IS NOT NULL)
ORDER BY nomem ;

Dpto. de Informática 43
I.E.S. TRASSIERRA - Córdoba SQL

Resultado:
NOMEM COMIS
CAMPOS, ROMULO
MORAN, CARMEN
PEREZ, MARCOS 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 nomem, salar, fecin


FROM temple
WHERE fecin < '01-01-1980' OR salar <1100
ORDER BY fecin, nomem ;

Resultado:
NOMEM SALAR FECIN
PONS, CESAR 1863 17/02/65
PEREZ, JULIO 2644 16/01/69
:
:
SANTOS, SANCHO 601 22/01/01
MUÑOZ, AZUCENA 1052 15/10/01 (11 registros)

3).- Obtener por orden alfabético los nombres de los departamentos que no sean de Dirección ni de
Sectores.

SELECT nomde
FROM tdepto
WHERE NOT (nomde LIKE '%DIREC%' OR nomde LIKE '%SECTO%')
ORDER BY nomde ;

Esta sentencia podrá formularse también así:

SELECT nomde
FROM tdepto
WHERE nomde NOT LIKE '%DIREC%' AND nomde NOT LIKE '%SECTO%'
ORDER BY nomde ;

Resultado:
NOMDE .
FINANZAS
ORGANIZACION PERSONAL
PROCESO DE DATOS

4) Obtener por orden alfabético los nombres y salarios de los empleados que o bien no tienen hijos y
ganan más de 1200 euros, o bien tienen hijos y ganan menos de 1800 euros.

SELECT nomem, salar


FROM temple
WHERE (numhi = 0 AND salar > 1200 ) OR (numhi < > 0 AND salar < 1800 )
ORDER BY nomem ;

Resultado: 19 filas seleccionadas.

Dpto. de Informática 44
I.E.S. TRASSIERRA - Córdoba SQL

4.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/Relación.
2ª.- En los enunciados, por salario nos referimos a la columna salar y por sueldo a la suma de
salario y comisión).

1.- Hallar, por orden alfabético, los nombres de los departamentos cuyo director lo es en funciones y
no en propiedad.

2.- Obtener un listín telefónico de los empleados del departamento 121 incluyendo nombre de
empleado, número de empleado y extensión telefónica. Por orden alfabético.

3.- Hallar la comisión, nombre y salario de los empleados con más de tres hijos, clasificados por
comisión, y dentro de comisión por orden alfabético.

4.- Obtener salario y nombre de los empleados sin hijos por orden decreciente de salario y por orden
alfabético dentro de salario

5.- Obtener la relación alfabética 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 próximos tres años el coste de vida va a aumentar un 6 % anual y que se
suben los salarios en la misma proporción, hallar para los empleados con más de 4 hijos su nombre y
su salario anual actual sin comisión, y para cada uno de los próximos tres años, clasificados por orden
alfabético.

7.- Hallar por orden alfabético los nombres de los empleados tales que si se les da una gratificación
de 60 euros por hijo, el total de esta gratificación no supera a la décima parte del salario.

8.- Para los empleados del departamento 112 con comisión, hallar el nombre y el sueldo total de
cada uno (salario más comisión), por orden de sueldo total decreciente, y por orden alfabético como
criterio secundario de ordenación.

9.- Obtener los números de los departamentos en los que haya algún empleado cuya comisión
supere al 20 % de su salario.

10.- Hallar por orden de número de empleado el nombre y sueldo (salario más comisión) de los
empleados cuyo sueldo supere al salario mínimo en 600 euros mensuales.

11.- Para los empleados que no tienen comisión obtener por orden alfabético el nombre y el cociente
entre su salario y el número de hijos.

12.- Se desea hacer un regalo de un 1 % del salario a los empleados en el día de su onomástica. Hallar
por orden alfabético los nombres y cuantía de los regalos para los que celebren su santo el día de San
Honorio.

13.- Obtener por orden alfabético los nombres y salarios de los empleados del departamento 111
que tienen comisión, pero solo si la comisión de alguno de ellos supera al 15 % de su salarlo.

Dpto. de Informática 45
I.E.S. TRASSIERRA - Córdoba SQL

REALIZACIÓN DE CONSULTAS
5.- FUNCIONES.-
5.1.- Introducción.
5.2.- Funciones de fila.
5.2.1.- Funciones numéricas.
5.2.2.- Funciones de caracteres.
5.2.3.- Funciones de fechas.
5.2.4.- Funciones de conversión.
5.2.5.- Otras funciones
5.3.- Funciones de columna.
5.4.- Agrupamiento de filas. Cláusulas GROUP BY y HAVING.
5.5.- Ejercicios propuestos.

5.1.- INTRODUCCIÓN.-

Una función 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
paréntesis y separados por comas. La función SYSDATE, como excepción, no lleva argumentos (ni
paréntesis), 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:

• Cláusula SELECT
• Cláusula WHERE
• Cláusula ORDER BY

Si se invoca a una función con un tipo de dato distinto al que espera como argumento, se convierte
automáticamente y de forma implícita en el que la función espera.

Las funciones pueden anidarse a cualquier nivel, lo que permite la construcción 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).

Dpto. de Informática 46
I.E.S. TRASSIERRA - Córdoba SQL

5.2.- FUNCIONES DE FILA.-

A continuación, veremos las funciones de fila simple que operan sobre un único valor y las
agruparemos en función del tipo de dato de sus argumentos:

5.2.1.- Funciones numéricas.-

Son aquellas que aceptan como entrada argumentos numéricos y devuelven valores numéricos.

Función Sintaxis Devuelve/Descripción


ABS ABS(n) Valor absoluto de n
ACOS ACOS(n) Arco coseno de n.
ASIN ASIN(n) Arco seno de n.
ATAN ATAN(n,[m]) Tangente del arco de n, o del arco entre n y m.
CEIL CEIL(n) Entero inmediatamente superior o igual a n
COS COS(n) Coseno de n en radianes
COSH COSH(n) Coseno hiperbólico de n
EXP EXP(n) Número e elevado a la potencia de n
FLOOR FLOOR(n) Entero inmediatamente inferior o igual a n
LN LN(n) Logaritmo natural de n. Siendo n > 0.
LOG LOG(m, n) Logaritmo en base m de n. La base m debe ser un numero
positivo distinto de 0 ó 1.n también debe ser positivo.
MOD MOD(m, n) Resto de m dividido por n.
POWER POWER(m, n) Potencia: m elevado a la potencia de n. La base m y el
exponente n puede ser cualquier tipo de número, pero si
m es negativo, n debe ser un entero
ROUND ROUND(n[,m]) Redondeo: n redondeado a m decimales. Si se omite, m =
0.
SIGN SIGN(n) Signo: Si n<0 devuelve -1.
Si n=0 devuelve 0.
Si n>0 devuelve 1.
SIN SIN(n) Seno de n expresado en radianes
SINH SINH(n) Seno hiperbólico de n
SQRT SQRT(n) Raíz cuadrada de n. El valor de n no puede ser negativo
TAN TAN (n) Tangente de n.
TANH TANH(n) Tangente hiperbólica de n.
TRUNC TRUNC(n[,m]) Truncado: n truncado a m decimales. Por defecto m = 0.

Ejemplos:
1).- Listar los nombres y números 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 comisión, listar su nombre y su comisión diaria redondeada con 2
decimales.
SELECT nomem, ROUND(comis*12/365, 2)
FROM temple
WHERE comis IS NOT NULL ;

Dpto. de Informática 47
I.E.S. TRASSIERRA - Córdoba SQL

5.2.2.- Funciones de caracteres.-


Estas funciones suelen manejar parámetros de tipo carácter y pueden devolver tanto un valor de tipo
carácter como un número.

Función Sintaxis Devuelve/ Descripción


ASCII ASCII(char) Número: representación numérica de la cadena char. en
el juego de caracteres usado en la B.D.,
CHR CHR(n) Carácter cuyo numero correspondiente en binario es n.
CONCAT CONCAT(char1, char2) Cadena char1 concatenada con char2. Es equivalente al
operador || .
INITCAP INITCAP(char) Cadena char con la primera letra de cada palabra en
mayúscula el resto en minúsculas. Las palabras van
delimitadas por espacios en blanco v no son
alfanuméricas.
INSTR INSTR(char1, char2, Número que indica la posición en char1 de la m_ésima
[,n[,m]]) ocurrencia de char2 en char1, empezando la búsqueda en
la posición n. Si se omiten n o m se les asigna por defecto
el valor 1.
INSTRB INSTRB(charl, char2, Número idéntico a INSTR excepto que n y el valor
[,n[,m]]) devuelto se expresa en bytes en vez de en caracteres.
Para una B.D. con juego de caracteres de byte simple
INSTR e INSTRB son equivalentes.
LENGTH LENGTH (char) Número que expresa la longitud de char en caracteres,
incluyendo los blancos.
LENGTHB LENGTHB (char) Número que expresa la longitud de char en bytes. Si char
es nulo, esta función devuelve un nulo. Para una B.D. con
juego de caracteres de byte simple LENGTH y LENGTHB
son equivalentes.
LOWER LOWER(char) Cadena char con todas las letras en minúsculas.
LPAD LPAD(char1,n [,char2]) Cadena char1 rellenado a la izquierda hasta la longitud
indicada por n, con la cadena indicada en char2. Si char2
se omite, se rellena con blancos.
LTRIM LTRIM(char[,muestra]) Cadena char en la que se han eliminado los caracteres a la
izquierda hasta encontrar el primer carácter que no esté
en muestra.
REPLACE REPLACE (char, Cadena char, después de reemplazar car_bus por
car_bus[,car repl]) car_repl.
RPAD RPAD(char1,n [,char2]) Cadena char1 rellenado a la derecha hasta la longitud
indicada en n, con el carácter indicado en char2. Si char2
se omite rellena con blancos.
RTRIM RTRIM(char [,muestra]) Cadena char previa eliminación de los caracteres a la
derecha de char hasta encontrar el primer carácter que no
este en muestra.
SOUNDEX SOUNDEX (char) Cadena de caracteres conteniendo la representación
fonética de char. Las comparaciones se basan en sonidos
en Inglés.
SUBSTR SUBSTR(char,m[,n]) Subcadena de char, empezando en la posición indicada en
m, y tomando el número de caracteres indicado en n. O
hasta el final si se omite n.
TRANSLATE TRANSLATE(char, de, a) Cadena char con todas las ocurrencias "de" reemplazadas
por lo indicado en "a".
UPPER UPPER(char) Cadena char con todas las letras en mayúsculas.

Dpto. de Informática 48
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplos:

1).- SELECT REPLACE ('El modelo Entidad/Relación', 'modelo', 'metodo') FROM DUAL;

Rdo. → El metodo Entidad/Relación

2).- SELECT TRANSLATE ('El modelo Entidad/Relación', 'aeiou', 'eioua') FROM DUAL;

Rdo. → El mudilu Entoded/Rilecoón

3).- Mostrar los nombres de los departamentos con la primera letra en mayúsculas y el resto en
minúsculas.
SELECT INITCAP(nomde)
FROM tdepto ;

4).- Listar los nombres propios de todos los empleados, en orden alfabético.
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 ;

5.2.3.- Funciones de fechas.-

Estas funciones operan con argumentos de tipo fecha y devuelven valores de tipo fecha, salvo la
función MONTHS_BETWEEN y EXTRACT que devuelve un número.

Función Sintaxis Devuelve/Descripción


ADD_MONTHS ADD_ MONTHS(f, n) Fecha f más n meses, n puede ser >, = o <
que cero.
LAST_DAY LAST_DAY(f) Fecha del ultimo día del mes de la fecha f.
MONTHS_BETWEEN MONTHS_BETWEEN (f1,f2) Número de meses transcurridos entre f1 y
f2.
NEXT_DAY NEXT_DAY(f, n) Fecha del primer día de la semana indicado
en n (1 lunes, 2 martes,..), a partir de la
fecha f.
ROUND ROUND (f [, fmt)) Fecha f en formato fmt. Si se omite fmt el
valor por defecto es el día 'DD'.
SYSDATE SYSDATE Fecha actual y la hora. Sin parámetros. No
se puede utilizar esta pseudocolumna
/función en una restricción CHECK.
TRUNC TRUNC (f [, fmt]) Fecha f con la parte de tiempo del día
truncado a la unidad especificada en fmt. Si
se omite fmt el valor por defecto es el día
'DD'
EXTRACT EXTRACT(unid FROM f) Número del valor especificado en unid.
Unid puede ser YEAR, MONTH o DAY.

Dpto. de Informática 49
I.E.S. TRASSIERRA - Córdoba SQL

• Máscaras 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 (año, día, ..) en función del modelo de
máscara especificado en fmt (ver sintaxis). A continuación, exponemos los principales
formatos, que deben expresarse entre comillas, y las unidades de redondeo o truncado que les
corresponden. El modelo por defecto es 'DD', y muestra la fecha redondeada o truncada en
formato día. La hora se establece a medianoche.

Modelo de formato Unidad de redondeo o truncado


CC Siglo.
SCC
YYYY Año. (redondeado sobre el 1 de Julio).
SYYY
Y
IYYY Año ISO
IY
I
Q Trimestre (redondeado al día 16 del segundo mes del trimestre).
MONTH Mes.
MM
WW El día de la semana del primer día del año.
IW El día de la semana del primer día del año en formato ISO.
DD Día.
DAY Día de comienzo de la semana.
O
HH Hora.
MI Minuto.

Ejemplos:

1).- Calcular la edad, en años cumplidos, de los empleados del departamento 130.
SELECT TRUNC(( sysdate-fecna)/365) "Edad en años"
FROM temple
WHERE numde = 130 ;
Mejor para años bisiestos: TRUNC (MONTHS_BETWEEN( sysdate, fecna)/12) "Edad en años"

2).- Calcular la fecha del próximo domingo.


SELECT NEXT_DAY(sysdate, 7)
FROM DUAL ;

3).- Calcular los días que quedan hasta fin de mes.


SELECT LAST_DAY(sysdate) - sysdate
FROM DUAL ;

4).- Devolver el primer día del mes actual.


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

5).- Listar el año actual.


SELECT EXTRACT(YEAR FROM sysdate) FROM dual:

Dpto. de Informática 50
I.E.S. TRASSIERRA - Córdoba SQL

5.2.4.- Funciones de conversión.-

Permiten convertir un tipo de dato en otro.

Función Sintaxis Conversión


TO_CHAR TO_CHAR(f [,formato[, Convierte una fecha f tipo DATE en un
'parametros nls'] ]) VARCHAR2 con la máscara indicada en formato.
Si se omite formato, la fecha se convierte a en
un valor VARCHAR2 en el formato de fecha por
defecto. Más adelante veremos los "modelos de
formato de fecha". Parametros_nls específica el
lenguaje en el cual se visualizan los nombres y
abreviaturas de los meses y días. El parámetro se
indica con: 'NLS_DATE_LANGUAGE = idioma'. Si
se omite toma el idioma por defecto. (1)
TO_CHAR TO_CHAR(n [,formato[, Convierte un número de tipo NUMBER en un
'parametros_nls']]) tipo de datos VARCHAR2 con la máscara
indicada en formato. Más adelante veremos los
"modelos de formato numéricos".
'Parámetros_nls' especifica los caracteres y
elementos de formatos de números que se
visualiza (separador de decima-les, de grupo,
símbolo de la moneda local e ISO).
TO_DATE TO_DATE(char [,formato Convierte una cadena tipo VARACHAR2 en un
[,'parametros_nls'] ]) valor tipo DATE. El formato es la máscara de la
fecha. Si se omite toma el formato por defecto.
Si el formato es J para juliano char debe ser un
entero. 'Parámetros_nls' tiene la misma función
que para TO_CHAR en conversión 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.
TO_NUMBER TO_NUMBER( char [,fmt Convierte char de un valor CHAR o VARCHAR2 a
[,'parametros_nls'] ] ) 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, ..

• Máscaras de formato.-
En las funciones anteriores los formatos de conversión pueden indicarse para forzar la
conversión.

 Los formatos numéricos están compuestos de uno o varios elementos y deben


proporcionarse cuando:

En una función TO_CHAR se cambie un tipo de dato NUMBER a un tipo de dato VARCHAR2.
Ejemplo: SELECT TO_CHAR(1.25, '$999D999') FROM dual ;

Dpto. de Informática 51
I.E.S. TRASSIERRA - Córdoba SQL

En una función TO_NUMBER se cambie un tipo de dato VARCHAR2 a NUMBER. Como


ejemplo véase la diferencia entre las siguientes máscaras:

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


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

Máscara Ejemplo Descripción


9 9999 El numero de "9" especifica la cantidad de dígitos que se visualizan. Se
visualizan blancos para los ceros a la izquierda.
0 0999 Visualiza los ceros a la izquierda en esa posición como ceros en vez de
9990 como blancos, o les da valor de 0 en lugar de blanco.
$ $9999 Antepone como prefijo el signo de dólar.
B B9999 Devuelve los ceros como blancos, a menos que se indique "O" en la
máscara de formato.
MI 9999MI Muestra un "-" después de los valores negativos. Para los valores
positivos muestra un espacio en blanco.
S S9999 Muestra un "+" para los valores positivos y"." para los negativos en la
posición indicada.
PR 9999PR Muestra los valores negativos entre los signos de menor mayor <>.
D (*) 99D99 Muestra el carácter decimal en la posición indicada. Separa la parte
entera fraccionaría de un numero.
G (*) 9G999 Muestra el separador de grupo en la posición indicada.
C (*) C9999 Muestra el símbolo ISO de la moneda, en la posición indicada.
L (*) L999 Muestra el símbolo de la moneda local en la posición indicada.
, 9,999 Muestra una coma la posición indicada.
. 9.999 Muestra un punto en la posición indicada y separa la parte entera y la
decimal de un numero.
EEEE 9.999EEEE Muestra el valor en notación científica.
RN RN Devuelve en mayúsculas o minúsculas (m) el valor del número en
romano. El número tiene que ser un entero entre 1 y 3999.
MI y PR solo pueden estar en la última posición de un formato numérico.
El formato S sólo puede estar en la primera o la última posición.
(*) Los caracteres que devuelven los formatos indicados con un asterisco son especificados
por los siguientes parámetros de inicialización de la Base de Datos:

D Carácter Decimal NLS_NUMERIC_CHARACTERS


G Separador Grupo NLS_NUMERIC_CHARACTERS
C Símbolo moneda NLS_ISO_CURRENCY
L Símbolo moneda NLS_ISO_CURRENCY

➢ Los formatos tipo fecha se utilizan en las siguientes situaciones:

En la función TO_CHAR para convertir un valor tipo DATE a un formato diferente al formato por
defecto.

En la función TO_DATE para convertir un valor tipo carácter en un formato diferente del formato
por defecto.

La fecha por defecto se especifica explícitamente con el parámetro NLS_DATE_FORMAT o


implícitamente con el parámetro de inicialización NLS_TERRITORY. Se puede sobreescribir el
valor de estos parámetros para la sesión actual con el comando ALTER SESSION.

Dpto. de Informática 52
I.E.S. TRASSIERRA - Córdoba SQL

Máscara Descripción
SCC ó CC Indica el siglo. Si se especifica S, aparece el prefijo en las fechas de antes de
Cristo.
YYYY ó SYYYY 4 Dígitos del año. S antepone un – si es antes de Cristo.
IYYY 4 Dígitos del año en formato ISO estándar.
YYY ó YY ó Y Los últimos 3, 2 o 1 dígitos del año
IYY ó IY ó I Los últimos 3, 2 o 1 dígitos del año en formato ISO estándar
Y,YYY El año, con una coma en la posición indicada.
SYEAR ó YEAR El número de año nombrado. El prefijo S se antepone si es antes de Cristo.
RR Los últimos dos dígitos del año. Se usa para años de otros siglos.
BC ó AD Indicador antes/después de Cristo.
B.C. ó A.D. Indicador antes/después de Cristo separado por puntos.
Q Trimestre del año.
MM Número de Mes.
RM Número de Mes en romano.
MONTH Nombre del mes alineado con blancos de hasta 9 caracteres de longitud.
MON Nombre del día abreviado a tres letras.
WW Número de la semana del año.
IW Número de la semana del año en ISO estándar.
DDD Número de día del año. (1-366).
DD Número del día del mes (1-31).
D Número de día de la semana. (1-7).
DAY Nombre del día de la semana hasta 9 caracteres.
DY Nombre del día de la semana abreviado.
J Fecha en Juliano. Los números especificados deben ser enteros.
AM ó PM Indicador de Meridiano.
A.M. ó P.M Indicador de Meridiano separado por puntos.
HH ó HH12 Hora del día (1-12).
HH24 Hora del día (0-23).
MI Minutos (0-59).
SS Segundos (0-59).
SSSSS Segundos transcurridos desde medianoche. (0-86399).

Las especificaciones de algunos formatos, (MONTH, MON, DAY, DY, BC/AD, B.C./A.D., AM/PM)
dependen de los siguientes parámetros de inicialización:

NLS_DATE_LENGUAGE
NLS_TERRITORY
NLS_LANGUAGE

Ejemplos:
1).- Mostrar los días transcurridos desde el 1 de enero del 2000 hasta el día de hoy.

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

2).- Listar en una sola columna un código formado por el día de nacimiento y el número de empleado
de todos los empleados.

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


FROM temple ;

Dpto. de Informática 53
I.E.S. TRASSIERRA - Córdoba SQL

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 nomem, TO_CHAR(fecin, 'DD "de " Month "de " YYYY')
FROM temple
WHERE numde = 130 ;

5.2.5.- Otras funciones.-

Función Sintaxis Descripción


DUMP DUMP(expr [,fornato Devuelve un VARCHAR2 conteniendo el código del tipo
[,posíc_comienzo [,long]]] ) de dato, la longitud en bytes y la representación
interna del dato. El argumento formato indica la
notación en la que se visualiza el resultado. Formato
puede tener los siguientes valores:
8 Devuelve el resultado en notación octal.
10 Devuelve el resultado en notación decimal.
16 Devuelve el resultado en notación hexadecimal.
17 Devuelve el resultado en formato carácter simple.
GREATEST GREATEST(exp [,exp2]...) Devuelve el mayor valor de una lista de expresiones.
Compara carácter a carácter. El tipo de dato es siempre
VARCHAR2.
LEAST LEAST(expr [,expr2]...) Devuelve el menor valor de una lista de expresiones.
Compara carácter a carácter. El tipo de dato es siempre
VARCHAR2.
NVL 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 VSIZE (expr) Devuelve el número de bytes que ocupa la
representación interna del dato.
DECODE DECODE (expr, val1, cod1,.. Dentro de una expresión evalúa los valores de la lista y
valn, codn, codf) los cambia por el código correspondiente.

Ejemplos:
1).- Mostrar el tipo de dato, la longitud en bytes y la representación interna (en hexadecimal) de la
columna numem de la tabla temple de los empleados con número de empleado superior a 450;

SELECT DUMP (numem, 16)


FROM temple
WHERE numem > 450 ;

2).- Para cada empleado, listar el mayor valor (en orden alfabético) 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 número 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 nomem, DECODE(numhi, 0, 'Sin hijos', 3, 'Familia numerosa', numhi)


FROM temple ;

Dpto. de Informática 54
I.E.S. TRASSIERRA - Córdoba SQL

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

5.3.- FUNCIONES DE COLUMNA.-


Estas funciones tratan como argumento a una colección de valores y, a partir de ellos, producen un
único resultado. Son las siguientes:

Función Sintaxis Valor devuelto


AVG AVG(n) Media de n (ignorando los nulos)
COUNT COUNT(*/<Exp>) Número de filas de la consulta.
MAX MAX(<Exp>) Máximo valor de la expresión.
MIN MIN(<Exp>) Mínimo valor de la expresión.
STDEV STDEV(<Exp>) Desviación típica de la expresión sin tener en cuenta los valores nulos.
SUM SUM(<Exp>) Suma de los valores de la expresión.
VARIANCE VARIANCE(<Exp>) Varianza de la expresión (ignorando nulos)

Si la colección de valores es vacía, la función COUNT devuelve un cero y las demás funciones un valor
Nulo. Esto puede ocurrir, por ejemplo, si el predicado de WHERE no es satisfecho por ninguna fila.

Las funciones MAX y MIN admiten cualquier tipo de argumento, en COUNT no tiene importancia el
tipo de argumento, y en el resto de funciones los argumentos son numéricos.
Las funciones de columna aceptan opcionalmente las cláusulas DISTINCT y ALL:
• DISTINCT: Hace que la función solo considere los distintos valores de la expresión.
• ALL: Hace que la función considere todos los valores recuperados, incluyendo
duplicados. Es la opción por defecto

Compruébese el distinto resultado de las siguientes sentencias:

SELECT COUNT(*) "Número de extensiones telefónicas"


FROM temple ;

SELECT COUNT(DISTINCT extel) "Nº de extensiones telefónicas distintas"


FROM temple ;

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

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

Ejemplos:
1).- Hallar en número de empleados del departamento 112, así como cuantas comisiones distintas
hay, y la suma y media de sus comisiones.

SELECT COUNT(*), COUNT(DISTINCT comis), SUM(comis), AVG(comis)


FROM temple
WHERE numde = 112 ;

Resultado:
COUNT(*) COUNT(DISTINCT COMIS) SUM(COMIS) AVG(COMIS)
7 4 3546 591

Dpto. de Informática 55
I.E.S. TRASSIERRA - Córdoba SQL

El valor calculado por AVG es la media de las comisiones sin incluir a los empleados cuya comisión es
nula, es decir (3546 / 6 = 591), pues hay un empleado con comisión nula.

Para hallar la media teniendo en cuenta a todos los empleados, incluyendo los que tienen comisión
nula, podría escribirse:

SELECT SUM(comis) / COUNT(*)


FROM temple
WHERE numde = 112 ;

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

2).- Hallar cuántas comisiones diferentes hay, y su valor medio.

SELECT COUNT(DISTINCT comis), AVG(comis)


FROM temple;

Resultado:
COUNT(DISTINCTCOMIS) AVG(COMIS)
6 588,14286

3).- Hallar la media del número de hijos de los empleados del departamento 123.

SELECT AVG (numhi)


FROM temple
WHERE numde = 123 ;

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

4).- Hallar la edad media, en años de los empleados del departamento 110.

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


FROM temple
WHERE numde = 110 ;

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

La sentencia SELECT realiza los siguientes pasos:


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

Dpto. de Informática 56
I.E.S. TRASSIERRA - Córdoba SQL

5.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 continuación, veremos cómo 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 cláusula permite formar grupos de filas según 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
función de los valores idénticos 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 evalúan las expresiones de la cláusula
SELECT, por lo que cada uno produce una fila en la tabla resultante de la consulta.

Si se utiliza GROUP BY, en la cláusula SELECT solo pueden aparecer:


• Constantes.
• Funciones de columna
• Columnas o expresiones incluidas en la cláusula GROUP BY.

En la cláusula GROUP BY puede contener cualquier columna de la tabla especificada en FROM, sin
importar que estén o no en la lista de la SELECT.

Ejemplos:

1).- Para cada departamento hallar el salario medio (con 2 decimales), el mínimo, el máximo y la
media aritmética de estos dos últimos.

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


MAX(salar), ( MIN(salar) + MAX(salar) ) / 2
FROM temple
GROUP BY numde
ORDER BY numde ;

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

2).- Hallar la edad en años cumplidos del empleado mas viejo de cada departamento, ordenado por
número de departamento.

Dpto. de Informática 57
I.E.S. TRASSIERRA - Córdoba SQL

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


FROM temple
GROUP BY numde
ORDER BY 1 ;

Resultado:

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


100 41
110 47
111 42
112 46
120 33
121 51
122 32
130 34

No tendría sentido incluir la columna salar en la lista de la SELECT, de hecho daría el error:
ORA-00979: no es una expresión GROUP BY

➢ HAVING.- Esta cláusula es opcional y sirve para descartar grupos de filas. Su formato es:

HAVING <condición>

Una vez formados los grupos con GROUP BY, se descartan aquellos grupos que no satisfacen la
condición especificada.

La condición es un predicado en el que las columnas que participen y no sean de agrupamiento,


deberán 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
número y el mayor salario.

SELECT numde, MAX(salar)


FROM temple
GROUP BY numde
HAVING 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 cláusulas SELECT, FROM, WHERE, GROUP
BY, HAVING y ORDER BY, los pasos que sigue el motor SQL podrían ser:

Dpto. de Informática 58
I.E.S. TRASSIERRA - Córdoba SQL

1) Ejecutar la cláusula FROM .


Es decir, seleccionar la tabla nombrada en esta cláusula, que de momento pasa a ser la
tabla resultante de la sentencia.
2) Ejecutar la cláusula WHERE.
Esto quiere decir eliminar de la tabla resultante las filas que no satisfagan la condición
expresada en el WHERE.
3) Ejecutar la cláusula 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 cláusula HAVING.
Descartar los grupos que no satisfagan la condición especificada detrás de la palabra
HAVING.
5) Ejecutar la cláusula 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 cláusula
empieza con las palabras SELECT DISTINCT se eliminan de este resultado las filas
repetidas.
6) Ejecutar la cláusula ORDER BY.
Es decir, presentar la tabla resultante final clasificada por las columnas indicadas.

5.5.- USO DE ROWNUM.-


Rownum es una pseucolumna que puede ser muy útil para limitar las tuplas de una consulta, de
forma similar a lo que hace la opción LIMIT de otras versiones de SQL.

Rownum, que literalmente significa número de fila (o tupla), es asignado después del filtro aplicado
por la clúsula WHERE y antes de que le sea aplicado un ordenamiento (ORDER BY) o agregación
(GROUKP BY), por lo que la consulta:

SELECT nomem, salar


FROM temple
WHERE ROWNUM <= 3
ORDER BY salar DESC;

Devolverá el nombre y salario de las 3 primeras tuplas en el orden de creación y no en orden


descendente de salario. Para obtener los nombres y salarios de los 3 mayores salarios deberíamos
hacer:

SELECT *
FROM (SELECT nomem, salar
FROM temple
ORDER BY salar DESC)
WHERE ROWNUM <= 3 ;

Ahora si que la tabla (en realidad una subcontulta) sobre la que operará ROWNUM está ordenada
como nos interesa.

Otro aspecto importante es que la condición de ROWNUM se ejecuta fila a fila, por lo que en el
momento que una fila tratada no cumple la condición, no son ttratadas más filas.

Dpto. de Informática 59
I.E.S. TRASSIERRA - Córdoba SQL

Así, para obtener el nombre y salario del empleado con el quinto mayor salario, si hacemos:

SELECT *
FROM (SELECT nomem, salar
FROM temple
ORDER BY salar DESC)
WHERE ROWNUM = 5 ;

No devolverá ninguna fila ya que la primera fila tratada no cumple la condición, y tendríamos que
buscar otra solución más compleja:

SELECT *
FROM ( SELECT *
FROM (SELECT *
FROM (SELECT nomem, salar
FROM temple
ORDER BY salar DESC)
WHERE ROWNUM <= 5)
ORDER BY salar DESC)
WHERE ROWNUM=1 ;

Más información en el siguiente enlace.

5.6.- EJERCICIOS PROPUESTOS.-


1.- Listar los nombres de los empleados y el resultado de dividir el cuadrado de sus salarios entre la
comisión.

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 más de 12 caracteres, listar los números de
departamento y los caracteres números 11 al 17 del nombre de departamento, ordenados por
número de departamento.

4.- Listar los nombres de los empleados que no tienen comisión, clasificados de manera que
aparezcan primero aquellos cuyos nombres son más 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 mayúsculas y el resto en minúsculas.

----------Fechas --------------------------
6.- Obtener las fechas de ingreso, nombres y salarios de los empleados que hayan empezado a
trabajar en la empresa el año 98 ó después, por orden alfabético.

7.- Obtener por orden alfabético los nombres de los empleados que empezaron a trabajar en la
empresa en el año 1999.

8.- Obtener por orden alfabético los nombres de los empleados que han ingresado el 2-03-99 ó en el
día de hoy.

Dpto. de Informática 60
I.E.S. TRASSIERRA - Córdoba SQL

9.- De los empleados mayores de 50 años y con hijos, seleccionar los nombres y fechas de nacimiento
con el siguiente formato: Domingo, 12 de Enero de 1947.

10.- Según el convenio colectivo, para los empleados con más de un año de servicio el número de
días de vacaciones anuales expresado en días laborables es de 20 incrementados en uno más por
cada tres años de servicio cumplidos en el año anterior. Para los empleados que este año cumplen 45
o más años de edad y tienen más de un año de servicio. Hallar por orden alfabético el nombre y el
número de días de vacaciones anuales que corresponde a cada uno.

11.- Se desea analizar un plan de jubilación anticipada para los empleados con 55 años cumplidos, en
el que se ofrece una paga adicional extra de jubilación equivalente al salario actual de un mes por
cada año de servicio cumplido. Listar el nombre y cuantía de esa paga extra de los empleados que
este año cumplen 55 ó más años.

12.- Para los empleados de los departamentos 111 y 112 hallar por orden alfabético: nombre, edad
en años cumplidos en el día de hoy, y edad que tenían al ingresar en la empresa.

13.- Para los empleados de los departamentos 110 y 111 hallar por orden alfabético: nombre y
tiempo que llevan en la empresa en el día de hoy expresado en años, meses y días.

14.- Para los empleados de los departamentos 110 y 112, listar su nombre, el nombre del mes y día
de su cumpleaños, por orden cronológico.

15.- Livia Durán recibió un préstamo para vivienda el día en que ingresó en la empresa con
vencimientos anuales a 180 días del día y mes de su ingreso. Hallar la fecha en que vence la
anualidad del préstamo correspondiente al año actual.

16.- Todos los empleados tienen un período de 6 meses después de su ingreso antes de firmar su
contrato de empleo definitivo. Hallar para los empleados que este año cumplen menos de 40 años de
edad, por orden alfabético: nombre y fecha de firma de su contrato definitivo.

17.- Amelia Díez y Octavio García, han decidido casarse. La boda se celebrará dentro de 2 días, y
tomarán 20 días de vacaciones. La empresa hará a cada uno un regalo de boda del 1% de su salario
mensual actual por cada año de servicio. Ha1lar: la fecha de la boda, la fecha en que se incorporarán
al trabajo y el regalo correspondiente a cada uno de ellos.

---------- Funciones colectivas ----------------


18.- Hallar cuántos 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 años de servicio de sus empleados en el
día de hoy.

20.- Para los empleados que han ingresado en la empresa en los últimos 5 años, hallar la edad media
en años cumplidos de la edad a la que han ingresado.

21.- Hallar la masa salarial anual (salario más comisión) de la empresa, suponiendo 14 pagas.

22.- Hallar cuántos empleados han ingresado en el año actual.

23.- Hallar la diferencia entre el salario más alto y el más bajo.

24.- Hallar la edad media en años cumplidos de los empleados que tienen más de 2 hijos.

Dpto. de Informática 61
I.E.S. TRASSIERRA - Córdoba SQL

25.- Hallar el presupuesto medio de los departamentos cuyo presupuesto supera al presupuesto
medio de los departamentos.

26.- Hallar el número medio de hijos por empleado, con 2 decimales, para todos los empleados que
no tienen más 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 máximo es
inferior al salario medio de todos los empleados.

29.- Hallar el salario medio (con 2 decimales) y la edad media de los años cumplidos (sin decimales)
para cada grupo de empleados con igual comisión y para los que no la tengan.

30.- Para los departamentos en los que hay algún empleado con salario superior a 2400 euros, hallar
el número de empleados y la suma de sus salarios, comisiones y número de hijos.

31.- Para los departamentos en los que la antigüedad media de Sus empleados supera a la de la
empresa, hallar el salario mínimo, el medio y el máximo.

32.- Para cada departamento, hallar la media de la comisión con respecto a los empleados que la
reciben y con respecto al total de empleados.

33.- Para cada extensión telefónica, hallar cuántos empleados la usan y el salario medio de éstos.

34.- Para cada departamento, hallar el número (cantidad) de extensiones telefónicas que utiliza.

35.- Para cada centro de trabajo, mostrar su número de centro y el presupuesto medio de los
departamentos dirigidos en propiedad y en funciones.

Dpto. de Informática 62
I.E.S. TRASSIERRA - Córdoba SQL

REALIZACIÓN DE CONSULTAS
6.- CONSULTAS SOBRE VARIAS TABLAS.-
6.1.- Consultas sobre varias tablas.
6.2.- Combinación.
6.2.1.- Equireunión.
6.2.2.- Combinación externa.
6.3.- Subconsultas.
6.4.- Correlación.
6.5.- Operadores de conjunto.
6.5.1.- Unión.
6.5.2.- Intersección.
6.5.3.- Resta.
6.6.- Ejercicios propuestos.

6.1.- CONSULTAS SOBRE VARIAS TABLAS.-

Las sentencias SELECT vistas hasta ahora devolvían datos de una única tabla. Aún en el caso de
sentencias subordinadas, éstas trataban la misma tabla que la sentencia principal. A continuación,
veremos la posibilidad de tratar varias tablas en una sola consulta, para lo cual basta con poner sus
nombres detrás 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
yunción 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 ambigüedad. Al trabajar con varias tablas podemos encontrarnos con columnas con
el mismo nombre, en cuyo caso será necesaria la calificación de las columnas. Por otro lado, los
nombres de las tablas no suelen ser cómodos para calificar las columnas, por lo que es aconsejable la
calificación de las tablas para acortar las calificaciones de columnas. Será necesario calificar las tablas
cuando una misma tabla interviene dos veces en una yunción.

6.2.- COMBINACIÓN.-

En teoría relacional se define la reunión, combinación o yunción (join) como una operación en la que
se combinan datos de distintas tablas. En SQL esta operación se realiza con la sentencia SELECT y sus
cláusulas FROM, y WHERE, donde los nombres de las tablas que intervienen en la yunción se
especifican detrás de FROM. Cuando se especifican dos o más tablas, se forma una tabla fruto del
producto cartesiano de todas las especificadas. Es decir, que el número de columnas en esta tabla es
igual a la suma del número de columnas de las tablas de la lista, y el número de filas es el producto
del número de filas que éstas tienen. Como este último número puede ser muy grande,
normalmente el SGBD no construirá físicamente esta tabla, pero a efectos de comprender cómo se
forma el resultado de la sentencia SELECT es como si así fuera.

La tabla resultante será de poca utilidad si no se filtran las filas correctamente con la cláusula
WHERE que establecerá la condición de la yunción.

Dpto. de Informática 63
I.E.S. TRASSIERRA - Córdoba SQL

6.2.1.- Equireunión.-

El tipo de combinación más frecuente es la llamada equireunión (equi join), que devuelve filas de dos
o mas tablas basándose en una condición 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 yunción.

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 [Link], [Link]


FROM tcentr C, tdepto D
WHERE [Link] = [Link] AND [Link] > 60000
ORDER BY 1 ;

2).- Para cada departamento con presupuesto inferior a 36.000 euros, listar su nombre, el del centro
de trabajo y el máximo salario de sus empleados, si éste excede de 1.200 euros.

SELECT [Link], [Link], MAX(salar)


FROM tcentr C, tdepto D, temple E
WHERE [Link] = [Link] AND [Link] = [Link] AND [Link] < 36000
GROUP BY [Link], [Link]
HAVING MAX([Link]) > 1200 ;

3).- Hallar por orden alfabético los nombres de los departamentos que dependen de los que tienen
un presupuesto inferior a 30000 euros.

SELECT [Link], [Link]


FROM tdepto D1, tdepto D2
WHERE [Link] = [Link] AND [Link] < 30000
ORDER BY 1 ;

6.2.2.- Combinación externa.-

Un caso especial de la yunción es la combinación externa (outer join) que amplifica el resultado de
una combinación simple. Una combinación externa recupera TODAS las filas de la de la combinación
simple y también aquellas que no encuentren su correspondiente fila pareja de una tabla a otra.

Ejemplo:

1).- Seleccionar el número de departamento, el nombre de departamento y suma de los salarios de


sus empleados:

SELECT [Link], [Link], SUM(salar) "Salario Mensual"


FROM temple E, tdepto D
WHERE [Link] = [Link]
GROUP BY [Link], [Link]
ORDER BY [Link] ;

Dpto. de Informática 64
I.E.S. TRASSIERRA - Córdoba SQL

Nótese que el segundo criterio de agrupamiento ([Link]) se especifica por razones de


operatividad, para poder mostrar esa columna. Recordemos que, si se usa GROUP BY, en la cláusula
SELECT solo pueden aparecer los criterios de agrupamiento y funciones colectivas.

Para seleccionar la suma de salarios para todos los departamentos independientemente de que
tengan empleados o no, tendremos que utilizar un OUTER JOIN:

SELECT [Link], [Link], SUM(salar) "Salario Mensual"


FROM temple E, tdepto D
WHERE [Link] (+) = [Link]
GROUP BY [Link], [Link]
ORDER BY [Link] ;

El símbolo (+) debe situarse en el predicado de combinación aliado de la columna o columnas


pertenecientes a la tabla en la que hay ausencia de valor. Con su uso en un operador u otro de la
expresión podremos lograr la combinación externa izquierda o derecha (left outer join o right outer
join), respectivamente, de forma que el siguiente predicado haría que se trataran los empleados que
no tienen asignado departamento:

[Link] = [Link](+)

6.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 cláusulas WHERE y HAVING, y como
parte de los predicados de comparación, 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. También se suele decir que estas sentencias están anidadas en niveles: la externa es la de
primer nivel, sus inmediatas subordinadas las de segundo nivel, etc. El número 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 describirán más
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.

Todos los ejercicios vistos hasta ahora con sentencias subordinadas, se referían a la misma tabla que
la sentencia externa. Esto no tiene que ser así y en general cada cláusula 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 alfabético los
nombres de sus empleados cuyo salario supere al salario medio de su departamento.

Dpto. de Informática 65
I.E.S. TRASSIERRA - Córdoba SQL

SELECT nomem
FROM temple
WHERE 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 dirce LIKE '%ALCALA%') )
ORDER BY 1 ;

Resultado:
NOMEM
CAMPS, AURELIO
POLO, OTlLIA
SANZ, CORNELIO

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

La consulta puede también formularse con dos niveles de anidamiento:

SELECT nomem
FROM temple
WHERE numde = 122 AND
salar > (SELECT AVG(salar)
FROM temple
WHERE numde = 122 ) AND
EXISTS (SELECT *
FROM tdepto D, tcentr C
WHERE [Link] = [Link] AND dirce LIKE '%ALCALA%' AND numde = 122)
ORDER BY 1 ;

2).- Obtener por orden alfabético los nombres y salarios medios de los departamentos cuyo salario
medio supera al salario medio de la empresa.

SELECT nomde, AVG(salar)


FROM temple E, tdepto D
WHERE [Link] = [Link]
GROUP BY nomde
HAVING AVG (salar) > (SELECT AVG(salar)
FROM temple )
ORDER BY nomde ;

En esta sentencia se usa una subordinada en la cláusula HAVING.

Dpto. de Informática 66
I.E.S. TRASSIERRA - Córdoba SQL

Resultado:

NOMDE AVG(salar)
DIRECCION GENERAL 3105,3333
FINANZAS 2223,6667
PERSONAL 1863
PROCESO DE DATOS 1947,4

6.4.- CORRELACIÓN.-

En los ejemplos vistos hasta ahora, las sentencias subordinadas no hacían referencia a columnas de
tablas que no estén en su propia cláusula 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 evalúa 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 cláusula FROM
de alguna de sus sentencias antecedentes.

Una sentencia subordinada correlacionada no puede evaluarse independientemente de las


antecedentes, pues su resultado puede cambiar según qué filas se consideren en la evaluación de
éstas en cada momento, por lo que el SGBD la evaluará múltiples 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 alfabético los nombres de los departamentos ubicados en la calle de Atocha.

No correlacionada:

SELECT nomde
FROM tdepto
WHERE numce IN ( SELECT numce
FROM tcentr
WHERE dirce LIKE '%ATOCHA%' )
ORDER BY nomde;

Resultado:

NOMDE
DIRECC. COMERCIAL
SECTOR INDUSTRIAL
SECTOR SERVICIOS

Dpto. de Informática 67
I.E.S. TRASSIERRA - Córdoba SQL

En este ejemplo, la sentencia subordinada no es correlacionada pues sólo se refiere a las columnas
NUMCE y DIRCE de la tabla TCENTR, que es la de su cláusula FROM. Por tanto, el SGBD la evalúa sólo
una vez y su resultado pasa a ser parte del predicado IN.

** Como ejercicio, el alumn@ deberá realizar la misma consulta, pero con yunción y correlación.

2).- Obtener por orden alfabético los nombres de los departamentos cuyo presupuesto es inferior a
la mitad de la suma de los salarios anuales de sus empleados.

Consulta correlacionada:

SELECT nomde
FROM tdepto
WHERE presu < ( SELECT 0.5 * SUM (salar * 14)
FROM temple
WHERE numde = [Link] )
ORDER BY nomde ;

En este ejemplo, la sentencia subordinada hace referencia a la columna numde de la tabla tdepto,
que está en el 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

También se puede formular esta consulta como una yunción con agrupamiento:

SELECT nomde
FROM temple, tdepto
WHERE [Link] = [Link]
GROUP BY nomde, presu
HAVING presu < 0.5 * SUM (salar * 14 )
ORDER BY nomde ;

3).- Obtener por orden alfabético los nombres de los empleados cuyo salario supera al salario medio
de su departamento.

Consulta correlacionada sobre la misma tabla:

SELECT nomem
FROM temple E
WHERE salar > (SELECT AVG(salar)
FROM temple
WHERE numde = [Link])
ORDER BY nomem ;

Dpto. de Informática 68
I.E.S. TRASSIERRA - Córdoba SQL

Que también se puede formular mediante yunción y agrupamiento:

SELECT [Link]
FROM temple E1, temple E2
WHERE [Link] = [Link]
GROUP BY [Link], [Link], [Link]
HAVING [Link] > AVG([Link])
ORDER BY 1 ;

6.5.- OPERADORES DE CONJUNTO.-

Estos operadores operan sobre consultas, de forma que combinan dos o más 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 número de columnas, y además las columnas que
están en la misma posición 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 número de filas que dependerá del operador utilizado.

En estos operadores de conjunto va implícita la cláusula DISTINCT. Los desarrollados por Oracle son
unión intersección y resta:

Son de especial utilidad cuando se trata de manipular tablas completas, componer vistas de usuario,
etc. Aunque también pueden usarse para realizar consultas.

6.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.

El resultado de la unión puede a su vez unirse con el de otra sentencia SELECT o con el de otra unión.
Pueden usarse paréntesis para indicar el orden de evaluación de las uniones. Si no se usan
paréntesis, el orden de evaluación es el de escritura. Para que el resultado se presente en un orden
determinado hay que usar la cláusula ORDER BY en la ultima SELECT.

Si se añade la opción ALL, la unión devolverá todas las filas aunque estén duplicadas.

Ejercicio: ejecutar la siguiente sentencia, primero con UNION y después con UNION ALL.

SELECT * FROM tdepto


UNION [ALL]
SELECT * FROM tdepto ;

Dpto. de Informática 69
I.E.S. TRASSIERRA - Córdoba SQL

Ejemplos:

1).- Listar alfabéticamente los nombres de los empleados del departamento 112, sus sueldos
mensuales (salario + comisión) y el literal "Con comisión" o "Sin comisión", según el caso.

SELECT nomem, salar, 'Sin comisión'


FROM temple
WHERE comis IS NULL AND numde = 112
UNION
SELECT nomem, salar+comis, 'Con comisión'
FROM temple
WHERE comis IS NOT NULL AND numde = 112
ORDER BY 1 ;

Resultado:
NOMEM SALAR 'SIN COMISIÓN'
DIEZ, AMELIA 2224 Con comisión
GARCIA, OCTAVIO 2765 Con comisión
LASA, MARIO 2765 Con comisión
MARTIN, MICAELA 1082 Sin comisión
PEREZ, SABINA 863 Con comisión
TEROL, LUCIANO 2404 Con comisión
TORRES, HORACIO 1683 Con comisión

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 ;

6.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.

Si ambas sentencias SELECT se refieren a la misma tabla, el resultado es equivalente a realizar una
sola consulta con el operador AND.

Ejemplo: Listar el nombre y salario de todos los empleados del departamento 112 que tengan un
salario mensual superior a 2000 euros.

SELECT nomem, salar


FROM temple
WHERE numde = 112

INTERSECT

SELECT nomem, salar


FROM temple
WHERE salar > 2000 ;

Dpto. de Informática 70
I.E.S. TRASSIERRA - Córdoba SQL

Resultado:
NOMEM SALAR
GARCIA, OCTAVIO 2284
LASA, MARIO 2104

6.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 nomem, salar


FROM temple
WHERE numde = 112
MINUS
SELECT nomem, salar
FROM temple
WHERE numhi =0 ;

Resultado:
NOMEM SALAR
GARCIA, OCTAVIO 2284
LASA, MARIO 2104
TEROL, LUCIANO 1743

6.6.- EJERCICIOS PROPUESTOS .-

1.- Para los departamentos cuyo director lo sea en funciones, hallar el número de empleados y la
suma de sus salarios, comisiones y número de hijos.

2.- Listar, por orden alfabético, los nombres de los empleados que son directores en funciones.

3.- Para todos los departamentos que no sean de dirección ni de sectores, listar el número de
departamento y el de sus distintas extensiones telefónicas, por orden creciente de departamento y,
dentro de éste, por número de extensión creciente.

4.- A los empleados que son directores en funciones se les asignará una gratificación del 5% de su
salario. Hallar por orden alfabético los nombres de estos empleados y la gratificación
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 algún departamento que aún no tenga empleados asignados ni director en
propiedad.

7.- Listar alfabéticamente, los nombres de los empleados que son directores de primer nivel, es decir,
que dirigen departamentos de los que no dependen otros departamentos.

Dpto. de Informática 71
I.E.S. TRASSIERRA - Córdoba SQL

8.- Listado alfabético de los empleados que pertenecen a departamentos cuyo Director en propiedad
lo sea también en funciones de algún 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 algún 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 alfabético, todos los datos de los centros de trabajo en los que hay algún
departamento cuyo director lo sea en funciones.

14.- Para cada director, hallar por orden alfabético su nombre y la suma de los salarios de los
empleados que están directamente a su cargo (es decir, en los departamentos que él dirige), en dos
grupos separados según sea en funciones o en propiedad.

15.- Hallar, por orden alfabético, 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 extensión telefónica con
otro empleado con menor salario que ellos, hallar la suma de sus salarios por departamento y el
nombre de éste, por orden alfabético.

17.- Hallar cuántos empleados hay que compartan su extensión telefónica con otro de otro
departamento.

18.- Hallar, por orden alfabético, los nombres de los departamentos en los que hay algún empleado
que cumpla este año más de 50 años de edad.

19.- Hallar el número de departamento y el salario máximo para los departamentos cuyo salario
máximo es menor que el salario medio de los empleados de todos los demás departamentos.

20.- Listar los nombres y salarios totales de aquellos empleados que ganan igual o más que sus jefes
de departamento.

21.- Listar el nombre y número de departamento de los empleados no directores, pero solo de
aquellos departamentos de los que no dependen otros departamentos, ordenados por número de
departamento.

22.- Para los departamentos ubicados en la calle de Alcalá en los que haya algún empleado con más
de 10 años de antigüedad 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 años de los empleados que tienen comisión y los que
no.

Dpto. de Informática 72
I.E.S. TRASSIERRA - Córdoba SQL

24.- Para los empleados que no tienen comisión, obtener por orden alfabético el nombre y el
cociente entre su salario y el número de hijos, pero si un empleado no tiene hijos, se obtendrá el
salario sin más, 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 alfabético 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 alfabético.

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 alfabético de
todos los departamentos, indicando cuáles se trasladan y cuáles no.

28.- Efectuar una explosión de la organización 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 máximo de 3
niveles de dependencia. Presentar el resultado por orden alfabético. Si de un departamento no
depende ningún otro, aparecerá al menos dependiendo de sí mismo a nivel 0.

Dpto. de Informática 73
I.E.S. TRASSIERRA - Córdoba SQL

ANEXO I.- YUNCIÓN O COMBINACIÓN EN SQL.-


Se usan indistintamente los términos de yunción o combinación, a veces también composición, para
referirnos a la consulta SQL que devuelve datos procedentes de distintas tablas debidamente
relacionadas por valores comunes en sus atributos. Siempre que los datos a devolver procedan de
distintas tablas deberemos optar por la yunción.

Para comprender las variantes de la yunción o combinación, insertaremos dos tuplas con el objetivo
de que, entre las tablas temple y tdepto, tengamos registros no emparejados, es decir, empleados en
la tabla temple que no pertenecen a ningún departamento en la tabla tdepto y departamentos sin
empleados asignados. Así:

- Insertamos un nuevo departamento, al que aún no hay ningún empleado asignado:


INSERT INTO Tdepto VALUES (123, 10, 550, 'F', 0, 120, 'INFORMATICA') ;

- Insertamos un empleado al que no a signamos aún ningún departamento (Null):


INSERT INTO Temple VALUES (560, Null, 250, '25-06-1987', sysdate, 1200, Null, 0, 'RUS,
LIDIA') ;

• Yunción interna o simplemente Yunción. INNER JOIN o simplemente JOIN.-

No mostrará los registros no enlazados o emparejados. Las tres sentencias siguientes son
equivalentes:

SELECT numem, nomem, nomde


FROM temple E , tdepto D
WHERE [Link] = [Link] ;

SELECT numem, nomem, nomde


FROM temple E JOIN tdepto D ON [Link] = [Link] ;

SELECT numem, nomem, nomde


FROM temple E INNER JOIN tdepto D ON [Link] = [Link] ;

Si necesitásemos combinar 3 tablas, haríamos:

SELECT nomem, nomde, nomce


FROM temple E , tdepto D , tcentr C
WHERE [Link] = [Link] AND [Link] = [Link] ;

SELECT nomem, nomde, nomce


FROM temple E JOIN tdepto D ON [Link] = [Link]
JOIN tcentr C ON [Link] = [Link] ;

SELECT nomem, nomde, nomce


FROM temple E INNER JOIN tdepto D ON [Link] = [Link]
INNER JOIN tcentr C ON [Link] = [Link] ;

Dpto. de Informática 74
I.E.S. TRASSIERRA - Córdoba SQL

• Yunción externa.-

Permite mostrar los registros no enlazados o emparejados.

▪ Yunción externa izquierda.-


Fuerza a que se muestren todas las tuplas de la tabla que figura a la izquierda, estén o no
emparejadas. En nuestro ejemplo se mostrarían todos los empleados, aunque no tengan
departamentos asignados o existentes. Las siguientes dos sentencias son equivalentes:

SELECT numem, nomem, nomde


FROM temple E , tdepto D
WHERE [Link] = [Link] (+) ;

SELECT numem, nomem, nomde


FROM temple E LEFT OUTER JOIN tdepto D ON [Link] = [Link] ;

▪ Yunción externa derecha.-


Fuerza a que se muestren todas las tuplas de la tabla que figura a la derecha, estén o no
emparejadas. En nuestro ejemplo se mostrarían todos los departamentos, aunque no tuviesen
empleados asignados:

SELECT numem, nomem, nomde


FROM temple E , tdepto D
WHERE [Link] (+) = [Link] ;

SELECT numem, nomem, nomde


FROM temple E RIGHT OUTER JOIN tdepto D ON [Link] = [Link] ;

▪ Yunción externa total (izquierda y derecha).-


Fuerza a que se muestren todas las tuplas no emparejadas de cualquiera de la tablas. En nuestro
ejemplo se mostrarían todos los empleados aunque no tengan departamentos asignados o
existentes, y todos los departamentos, aunque no tuviesen empleados asignados.

SELECT Numem, Nomem, Nomde


FROM temple E , tdepto D
WHERE [Link] = [Link] (+)
UNION
SELECT numem, nomem, nomde
FROM temple E , tdepto D
WHERE [Link] (+) = [Link] ;

SELECT numem, nomem, nomde


FROM TEMPLE E FULL OUTER JOIN tdepto D ON [Link] = [Link] ;

Dpto. de Informática 75
I.E.S. TRASSIERRA - Córdoba SQL

REALIZACIÓN DE CONSULTAS
7.- ARCHIVOS DE COMANDOS E INFORMES CON SQL *Plus.-
7.1.- Archivos de comandos con SQL*Plus.
7.1.1.- Variables de sustitución.
7.1.2.- Captura de datos desde el terminal.
7.2.-Informes con SQL*Plus.
7.2.1.- Comandos de parámetros.
- de entorno.
- de feedback.
- de salida.
7.2.2.- Comandos de formato.
- de título: TITLE y BTITLE.
- de columna: COLUMN.
- de ruptura: BREAK.
- de cálculo: COMPUTE.
- de limpieza: CLEAR.
7.3.- Ejercicios propuestos.

7.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 parámetros adicionales que se verán mas adelante en este mismo
tema.

Un archivo de comandos no es más que un archivo de texto con la extensión .SQL en el que se
almacenan un conjunto de comandos SQL, que se ejecutan secuencialmente, uno tras otro, al lanzar
la ejecución del archivo.

Además de líneas de comandos de SQL, un archivo de comandos puede contener:

▪ Líneas de comentario, que comienzan con REM

▪ Líneas de ejecución, que constan solo de la barra inclinada ( / ) y que se insertan a


continuación de cada sentencia SQL indicando su ejecución.

REM Ejemplo de archivo de comandos


SELECT REPLACE(nomem, 'A', '~')
FROM temple
/
SELECT RPAD('HOLA', 20, '*')
FROM dual
/

Dpto. de Informática 76
I.E.S. TRASSIERRA - Córdoba SQL

Un archivo de comandos se arranca con el comando START y desde un archivo de comandos puede
arrancarse otro, en cuyo caso se habla de "archivos de comandos anidados".

START <nombre_archivo>

7.1.1.- Variables de sustitución.-

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, también llamadas variables de
sustitución que permiten agilizar la codificación evitando repetir valores en distintas sentencias.
Estas se inicializan con DEFINE y se usan precedidas del símbolo &.

Inicialización: DEF[INE] <variable> = valor

Uso: &<variable>

Ejemplo:
DEF dep=110
SELECT REPLACE(nomem, 'A', '~')
FROM temple
WHERE numde = &dep
/
SELECT nomem, salar
FROM temple
WHERE numde = &dep
/

DEF <variable> muestra el contenido de la variable ya inicializada.


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

Hay que tener en cuenta que todas las variables definidas con DEFINE toman siempre valores de tipo
char.

Si una variable de sustitución tiene valor, éste permanece en el ámbito del archivo hasta que:

• Se vuelva a inicializar.
• Se desactive la variable (con UNDEF[INE] <variable>).

7.1.2.- Captura de datos desde el terminal.-

Si utilizamos archivos de comandos, nos será necesario en ocasiones capturar datos desde el
terminal, que serán usados por los comandos del archivo. Eso ocurrirá, por ejemplo si queremos
diseñar una consulta interactiva del salario medio de un departamento, de forma que el usuario
teclee el número del departamento y la consulta se refiera a él.

Para capturar datos desde el terminal pueden usarse dos métodos:

• Captura mediante variables de sustitución.-


• Captura mediante parámetros en la línea de comandos.-

Dpto. de Informática 77
I.E.S. TRASSIERRA - Córdoba SQL

Captura mediante variables de sustitución.-


Si una variable de sustitución es referenciada en el archivo de comandos sin que se haya inicializado,
se muestra en pantalla un mensaje solicitando un valor para esa variable.

Ejemplo:
SELECT AVG(salar)
FROM temple
WHERE numde = &dep ;

Introduzca un valor para dep: 120


Después de introducido, muestra la línea de sustitución:

antiguo 3: WHERE numde= &dep


nuevo 3: WHERE numde= 120

Y por último muestra el resultado:


AVG(SALAR)
-----------------
1623

Si la misma variable de sustitución 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 más que una vez,
deberemos usar &&<variable> la primera vez que se referencia a la variable de sustitución.

Ejemplo:
SELECT nomem "Empleado", salar "Salario"
FROM temple
WHERE numde = &&dep
/
SELECT nomde
FROM tdepto
WHERE numde = &dep
/

 El comando ACCEPT permite asignar a una variable de usuario un valor introducido por teclado.
Su sintaxis es:

NUM[BER] / PROMPT <texto> /


ACC[EPT] <variable> CHAR NOPR[OMPT] [HIDE]

Si <variable> no existe, SQL*Plus la crea. Puede especificarse un tipo NUMBER o CHAR (por
defecto). Los valores tecleados que no coinciden con el tipo de variable son rechazados.

PROMPT <texto> hace que se muestre el texto en pantalla al solicitar el valor.


HIDE hace que se oculten los caracteres tecleados.

 El comando PROMPT permite visualizar un texto, incluso que contenga variables de sustitución.
Así por ejemplo:

SQL> ACCEPT mes PROMPT ' Introduce el mes: ' ---> Introduce el mes: Junio

SQL> PROMPT El mes tecleado es &mes ---> El mes tecleado es Junio

Dpto. de Informática 78
I.E.S. TRASSIERRA - Córdoba SQL

 El comando PAUSE muestra un mensaje en pantalla y se suspende la ejecución hasta que se


pulse Return:

SQL> PAUSE coloca papel en la impresora y pulsa Return para continuar.

Captura mediante parámetros en la línea de comandos.-


Al arrancar un archivo de comandos pueden indicarse hasta nueve parámetros:
START nombre_archivo par1 par2 ..... par9

En el archivo de comandos nos referiremos a los parámetros por las variables:


&1, &2, ...., &9
que se corresponden posicionalmente con ellos.

No se admiten más de nueve parámetros. Si se indican menos parámetros que variables, las variables
sobrantes quedan sin valor asignado. Desde el archivo de comandos se pueden referir las variables
cuantas veces se desee y el cualquier orden.

Ejemplo. Supongamos el fichero [Link]:

SELECT numde, nomem, salar


FROM temple
WHERE numde = &1 AND salar > &2

La invocación: START prueba 110 1000

Ejecuta la consulta para los empleados del departamento 110 que cobran mas de 1000 euros.

NOTA: En cualquiera de los casos de captura de variables desde el terminal, la sustitución se realiza
según el contenido tecleado, por lo que si se espera un valor alfanumérico habrá que incluir comillas
en la referencia a la variable: '& variable'.

7.2.- INFORMES CON SQL*Plus.-

A continuación, veremos algunos comandos sobre parámetros que personalizan el entorno de


trabajo y facilitan la obtención de informes mejorando la presentación de los mismos. Estos
comandos:
• No se guardan en el buffer de SQL.
• Su ejecución no cambia el comando SQL actual.
• Tienen efecto hasta que se desactiven o hasta que se cancele, se cambie o se abandone
la sesión de trabajo con SQL*Plus.

Estos comandos pueden ajustarse ejecutando el correspondiente comando desde la línea 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 [Link] en el directorio por defecto de Oracle (consúltese la variable path de
MSDOS). De esta forma será ejecutado al arrancar SQL*Plus. Si el fichero no existe los parámetros se
inicializarán por defecto. También podemos personalizar un entorno a través del acceso directo de
SQL Plus en el escritorio. En el cuadro Iniciar en… de sus propiedades, especificaremos el directorio
por defecto. El fichero [Link] colocado ahí, será el que se ejecute desde ese acceso directo.

Dpto. de Informática 79
I.E.S. TRASSIERRA - Córdoba SQL

7.2.1.- Comandos de parámetros.-

Los parámetros representan valores de ciertas propiedades que controlan la ejecución de SQL. Esos
valores se recogen en variables y pueden ser modificados por el usuario. Cada parámetro 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 genérica 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

• Parámetros de feedback.-

SET ECHO [ON/OFF] Permite visualizar o no los comandos conforme se ejecutan


desde un archivo de comandos. Por defecto OFF.
SET FEEDBACK [nn/ON/OFF] Define el número mínimo de filas recuperadas por una
consulta para que genere el mensaje “Nº Of rows returned”
(Número de filas devueltas). Por defecto ON y 6.
SET VERIFY [ON/OFF] Muestra o no los valores antiguo y nuevo de las variables
parametrizadas (de sustitución). Por defecto ON.

• Parámetros de salida.-

SET LINESIZE nn Número máximo de caracteres por línea (máx. 999, 80 por
defecto). Una columna nunca se extenderá sobre dos líneas.
SET PAGESIZE nn Número de líneas de la página, incluyendo título y líneas de
pausa. Por defecto 25.
SET HEAD[ING] ON/OFF Activa y desactiva las cabeceras de columnas. Por defecto ON.
SET HEADSEP car Especifica el carácter para separar los títulos en varias líneas.
(por defecto ‘|’).
SET NULL ‘texto’ Indica la cadena de caracteres para valores nulos (NULL). Por
defecto "".
SET NEWPAGE nn Número de líneas de separación entre páginas.
SET NUMWIDTH nn Anchura de los campos numéricos.
SET TIME ON/OFF Permite visualizar o no la hora junto al prompth de SQL
SET WRAP ON/OFF Permite visualizar en otra línea(por defecto ON), o truncar las
columnas que excedan del tamaño especificado en COLUMN.
SET NUMF[ORMAT] <fmt> Indica el formato que tendrán por defecto las columnas
numéricas que no tengan un formato especificado. Los
formatos son los mismos que para el comando COLUMN.
SET SPA[CE] nn Indica el nº de espacios entre columnas (1 por defecto, máx.
10)

Dpto. de Informática 80
I.E.S. TRASSIERRA - Córdoba SQL

SET PAU[SE] ON/OFF/ [texto] Permite hacer una pausa entre páginas y mostrar el texto
especificado. Por defecto OFF.
SET TERM[OUT] ON/OFF Permite mostrar u ocultar los resultados de las sentencias
cuando se ejecutan en un archivo de comandos(x filas
borradas). Por defecto en ON.

7.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 [Link]. Hay cinco
comandos básicos: de título, de columna, de ruptura, de cálculo y de limpieza.

• Comandos de título: TTITLE y BTITLE.-

Los títulos no necesitan comillas si no contienen espacios blancos y se centran en la anchura de la


línea especificada con SET LINESIZE. Si dentro de la cadena de título incluimos los caracteres ||,
provocaremos un salto de línea en el título.

TTITLE/BTITLE [LEFT/CENT/RIGHT] <texto> [ <&variable>] / {ON/OFF} [SKIP n]

TTITLE establece el título superior o encabezado de página y BTITLE el pie de página.

Los valores por defecto son CENT y ON. Si especificamos CENT, se ocultan la fecha y nº de página del
encabezado, SKIP n indica el número de líneas entre páginas.

• Comandos de columna: COLUMN.-


Permiten especificar formatos de salida para cada columna individualmente.

COLUMN <nombre_columna> <lista_de_formatos>

<nombre_columna> es el nombre especificado en cualquiera de las expresiones de columna de


la SELECT.

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

HEADING <texto> Permite visualizar un encabezado de columna distinto al nombre


de la columna.

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


WORD WRAPPED / que la anchura especificada para ella en el formato FORMAT
TRUNCATED. que se verá a continuación. WRAPPED (por defecto) hace que se
muestre en la siguiente línea y TRUNCATED que se trunque.

NEWLINE/OFF Fuerza que el valor de la columna se visualice en una nueva


línea. No afecta a la primera columna.

NULL <texto> Indica el texto que reemplazará a un valor nulo en la columna.


LIKE <columna1> Copia todos los comandos de formato de <columna1> a la
columna especificada.

PRINT / NOPRINT Establece la visualización o no de la columna.

Dpto. de Informática 81
I.E.S. TRASSIERRA - Córdoba SQL

ON / OFF Activa o desactiva los formatos especificados para la columna.

FORMAT <máscara> Una máscara de formato se construye con las siguientes


unidades:
Alfanumérica
An n caracteres de anchura.

Numérica
9 Especifica una posición de un dígito suprimiendo los ceros no
significativos.
0 Especifica una posición de un dígito rellenando con ceros las
posiciones no significativas.
$ Posición del signo $
. Posición del punto (.)
, Posición de la coma (,)
V Alinea los decimales de los números reales sin mostrar el punto
decimal.
B Convierte a blancos los ceros al principio de la columna.
MI Coloca un signo menos(-) a la derecha de las cifras negativas.
PR Encierra entre signos de menor y mayor (<>) las cifras negativas.

• Comando de ruptura: BREAK.


Una ruptura de control (break) es un evento que permite interrumpir la salida normal y hacer algo.
Se suele usar en conjunción con una SELECT con la cláusula ORDER BY.

Puede definirse en los siguientes casos:

<expr> Cuando cambia el valor de <expr>


ROW En cada cambio de fila
PAGE En cada cambio de página
REPORT Al final de un informe o consulta.

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

SKIP n Saltar n líneas.


PAGE Saltar a la cabecera de la siguiente página.

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

Dpto. de Informática 82
I.E.S. TRASSIERRA - Córdoba SQL

Sintaxis:
<exp_colum> /
ROW / SKIP <numero> / DUP /
BREAK ON PAGE / PAGE NODUP
REPORT

donde <exp colum> debe ser un nombre de columna sin calificar o un alias de columna.

Ejemplos:

1.- Mostrar el número de departamento, el nombre de empleado y el salario de todos los empleados
ordenado por número de departamento, de forma que en una misma página 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
FROM tdepto
ORDER BY numde ;

3.- Mostrar el número de hijos y el nombre de todos los empleados. El informe se hará de forma que
en cada página aparezcan ordenados alfabéticamente los nombres de los empleados con igual
número de hijos.

SQL> BREAK ON numhi PAGE

SQL> SELECT numhi, nomem


FROM temple
ORDER BY 1, 2 ;

• Comando de cálculo: COMPUTE.-

Permite realizar operaciones estadísticas con grupos de tuplas seleccionados. Las operaciones que
permite calcular son:

AVG Media
COUNT Recuento de valores no nulos
MAXIMUN Valor máximo.
MINIMUN Valor mínimo.
NUMBER Recuento de filas.
STD Desviación estándar
SUM Suma (total)
VARIANCE Varianza.

Dpto. de Informática 83
I.E.S. TRASSIERRA - Córdoba SQL

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


existentes de BREAK. Su sintaxis es:

[SUM] [COUNT] [AVG] <exp_colum> /


COMPUTE [MIN] [MAX] [VAR] OF <exp_colum> ON ROW / PAGE /
[STD] [NUMBER] REPORT

Solo puede haber un comando COMPUTE activo por columna, por lo que si queremos añadir un
cálculo a una columna que ya tiene uno, debemos reescribir el comando con los dos cálculos.

Ejemplo:

BREAK ON numde SKIP 1


COMPUTE SUM AVG OF salar ON numde
SELECT numde, nomem, salar
FROM temple
ORDER BY numde ;

• Comando de limpieza: CLEAR.-

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

CLEAR <opción>

<opción> puede ser alguna de las siguientes:

BREAKS Limpia los BREAKS marcados mediante el comando BREAK.


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

7.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 número se
tecleará una sola vez. (con variables de sustitución).

2.- Modificar el anterior archivo de comandos para que se ejecución sea posible pasándole los
parámetros desde la línea 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.

Dpto. de Informática 84
I.E.S. TRASSIERRA - Córdoba SQL

Mar Dic 11 página 1


LISTADO DE SALARIOS POR DEPARTAMENTO
Nombre Salario
Departamento Empleado Mensual
-------------------------------------------------- -------------------------------------------------- ----------------
DIRECC. COMERCIAL PEREZ, MARCOS 2,885
MORAN, CARMEN 1,292
CAMPOS, ROMULO 1,202
******************** --------
sum 5,379

DIRECCION GENERAL GALVEZ, PILAR 2,284


ALBA, ADRIANA 2,705
LOPEZ, ANTONIO 4,327
******************** --------
sum 9,316

FINANZAS FLOR, DOROTEA 1,743


GARCIA, AUGUSTO 2,524
FIERRO, CLAUDIA 2,404
******************** --------
sum 6,671

ORGANIZACIÓN GIL, GLORIA 1,623


******************** --------
sum 1,623

Informe confidencial

4.- Se quiere realizar un informe en el que se analicen los salarios en función del numero de hijos que
tiene el personal de la empresa. El informe deberá estar agrupado por numero de hijos en cada
página y ordenado alfabéticamente por el nombre de los empleados. Tras cada página deberá
esperar la confirmación del usuario. Se guardará en el fichero TEM6_4.SQL Y Presentará el siguiente
formato:

Jue Nov 07 página 1


LISTADO ALFABETICO DE EMPLEADOS

POR NUMERO DE HIJOS

Sueldo Mensual
Nº de hijos Empleado Salario Comisión TOTAL
--------------- ---------------------------------- --------- ----------- -----------
0 ALBA, ADRIANA 2,870 0 2,870
DIEZ, AMELIA 1,751 541 2,292
DURAN, LIVIA 1,313 601 1,914
....................................
....................................
VAZQUEZ, HONORIA 1,251 601 1,852
*********** ------- ------------- -----------
avg 1,699 1,961
count 6
minimum 1,116
maximum 2,870
number 14
sum 23,788 27,454

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

Dpto. de Informática 85
I.E.S. TRASSIERRA - Córdoba SQL

5.- Realizar el siguiente informe:

Dpto. de Informática 86
I.E.S. TRASSIERRA - Córdoba SQL

REALIZACIÓN DE CONSULTAS
8.- SENTENCIAS DE ACTUALIZACIÓN DE DATOS Y
TRANSACCIONALES.-
8.1.- Actualización de datos.
8.1.1.- Inserción de tuplas. Sentencia INSERT.
8.1.2.- Borrado de tuplas. Sentencia DELETE.
8.1.3.- Modificación de tuplas. Sentencia UPDATE.
8.2.- Sentencias transaccionales.
8.2.1.- Sentencia COMMIT.
8.2.2.- Sentencia ROLLBACK.
8.2.3.- Sentencia SAVEPOINT.
8.3.- Ejercicios propuestos

8.1.- ACTUALIZACIÓN DE DATOS.-

Además 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 añadir 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 (añadir, 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 actualización, se cercione, con ayuda de SELECT, de las
tuplas que se verán afectadas

8.1.1.- Inserción de tuplas. Sentencia INSERT.-

La sentencia INSERT permite añadir uno o mas filas completas a una tabla o vista, para lo cual la tabla
debe ser propiedad del usuario que intenta la inserción o tener privilegio de INSERT sobre ella, en
cuyo caso deberá calificar el nombre de la tabla, anteponiéndole el nombre del propietario y un
punto. Esta sentencia tiene la siguiente sintaxis:

VALUES (valor1, valor2, ..) /


INSERT INTO <tabla> [(col1, col2, ..)] Subselect

donde:
<tabla> es el nombre de la tabla en la que se desea insertar (realmente añadir al final,
pues el orden es irrelevante).

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

Dpto. de Informática 87
I.E.S. TRASSIERRA - Córdoba 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 adoptarán las columnas. Cada uno de los valores
debe ser una constante, o la palabra NULL (o un registro especial), y debe haber tantos como en
la lista de columnas.

El primer valor se asigna a la primera columna de la lista, el segundo a la segunda, etc. Si alguna
columna de la tabla no ha sido especificada se le asigna el valor nulo por defecto, si dicha
columna lo admite, sino dará error.

• Si se especifica una subconsulta, se insertarán en la tabla todas las tuplas resultantes de la


consulta subordinada, por lo que con este formato, con una única sentencia se pueden insertar
múltiples filas, una o ninguna, según que la subselect devuelva varias, una o ninguna tupla (tabla
vacía). Pero hay que tener en cuanta que ni la sentencia subordinada, ni sus subordinadas si las
tuviera, pueden referirse a la tabla en la que se está insertando.

El número de columnas devueltas por la subordinada debe ser el igual que las especificadas en la
lista de columnas y sus datos homogéneos para que permita asignar los datos devueltos en la
primera columna a la primera columna de las especificadas en la lista de columnas, los de la
segunda a la segunda, etc. Evidentemente, los datos de las columnas devueltas deben ser
homogéneos con las receptoras.

Ejemplos:

1).- Dar de alta el departamento de Planificación con el número 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, vacía y con la misma
estructura que temple y queremos (y podemos) insertar en ella los empleados mayores de 50 años:

INSERT INTO [Link]


SELECT nomem, fecna FROM temple
WHERE TRUNC(MONTHS_BETWEEN(sysdate, fecna)/12) >=50 ;

8.1.2.- Borrado de tuplas. Sentencia DELETE.

La sentencia DELETE permite borrar filas de una tabla o vista. Lógicamente la tabla debe ser
propiedad del usuario que intenta realizar el borrado o bien tener privilegio de DELETE sobre ella, en
cuyo caso deberá calificar el nombre de la tabla, anteponiéndole el nombre del propietario y un
punto. Su sintaxis es:

DELETE [FROM] <tabla> [<alias>] [WHERE <predicado>]


donde:
<tabla> es el nombre de la tabla de la que se van a eliminar las filas. Se le puede
asignar un nombre local o alias, indicándolo después.
<predicado> puede contener sentencias subordinadas, incluso con sentencias
correlacionadas a la tabla del DELETE.

Dpto. de Informática 88
I.E.S. TRASSIERRA - Córdoba SQL

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 Planificación dado de alta en último lugar:

DELETE
FROM tdepto
WHERE numde=123 ;

8.1.2.- Modificación de tuplas. Sentencia UPDATE.

La sentencia UPDATE sirve para modificar una o varias tuplas de una tabla, permitiendo que se
actualice una, varias o todas las columnas de la fila o filas seleccionadas, al contrario que el borrado y
la inserción que trataban filas completas. Para actualizar filas de una tabla, ésta debe ser propiedad
del usuario que intenta realizar la actualización o bien tener privilegio de UPDATE sobre ella, en cuyo
caso deberá calificar el nombre de la tabla anteponiéndole el del usuario y un punto. Su sintaxis es:

UPDATE <tabla> [<alias>]


<subconsulta> / <subconsulta> /
SET <col1> = <exp> / , <col2> = <exp> / ....
NULL NULL

[WHERE <predicado>]

donde:
<tabla> es el nombre de la tabla a actualizar, a la que se le puede asignar un
nombre local o alias, especificándolo detrás.
<subconsulta> especifica que la sentencia SELECT devolverá el valor que se asignará a la
columna correspondiente.
<exp> es la expresión que deberá devolver un valor acorde con la columna
correspondiente.
NULL indica que la columna especificada tomará el valor nulo.
<predicado> puede contener sentencias subordinadas, incluso con sentencias
correlacionadas a la tabla del UPDATE.

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

Ejemplos:

1).- Actualizar todos los salarios redondeándolos a euros (sin decimales) con un incremento del 3%.
(antes debe comprobarse el resultado con una SELECT).

UPDATE temple
SET salar = ROUND(salar *1.03) ;

Resultado: 35 filas actualizadas.

Dpto. de Informática 89
I.E.S. TRASSIERRA - Córdoba SQL

2).- Honoria Vázquez (empleada nº 500) ha ascendido en el mismo departamento y le han


aumentado el sueldo hasta igualárselo al menor salario de la tabla mayores, dejando de percibir
comisiones. Actualizar la tabla de empleados para que recoja estos cambios.

UPDATE temple
SET salar = (SELECT MIN(salar)
FROM mayores),
comis = NULL
WHERE numem= 500 ;

Resultado: 1 fila actualizada

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

8.2.- SENTENCIAS TRANSACCIONALES.

Como sabemos una transacción o Unidad Lógica de Trabajo (ULT) es una secuencia de operaciones
de actualización que forman un todo, de forma que o se ejecutan todas o no se ejecuta ninguna,
debiendo dejar la base de datos en estado coherente.

Una transacción comienza en la primera sentencia SQL tras: una sentencia COMMIT, una sentencia
ROLLBACK o una conexión a la base de datos.

Una transacción termina con: una sentencia COMMIT, una sentencia ROLLBACK o una desconexión,
intencionada o no, a la base de datos. El SGBD realiza un COMMIT implícito antes de ejecutar
cualquier sentencia de LDD (create, alter, ..) o al realizar una desconexión que no haya sido precedida
de un error.

Las sentencias SQL que permiten gestionar explícitamente las transacciones son:

• COMMIT
• ROLLBACK
• SAVEPOINT

8.2.1.- COMMIT .-

Señala el final de una transacción y el principio de otra indicándole al sistema que se deben validar
los cambios que se produjeron desde el principio de la transacción que se da por concluida,
haciéndolos visibles para los demás 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.

Dpto. de Informática 90
I.E.S. TRASSIERRA - Córdoba SQL

8.2.2.- ROLLBACK.-

Señala el final de una transacción y el principio de otra indicándole al sistema que se deben restaurar
el estado de la base de datos tal y como estaba al comenzar la transacción, es decir, deshace todos
los cambios pendientes de validación de la transacción actual. Su sintaxis es:

ROLLBACK [WORK] [TO [SAVEPOINT] <punto_salvaguarda>];


donde:
WORK es opcional y no tiene ninguna trascendencia.

TO [SAVEPOINT] <punto_salvaguarda> deshace sólo los cambios efectuados desde el punto de


salvaguarda indicado. La palabra reservada SAVEPOINT es opcional.

8.2.3.- SAVEPOINT.-

Los puntos de salvaguarda son marcas que va poniendo el usuario durante la transacción. Estas
marcas permiten deshacer los cambios por partes en vez de deshacer toda la transacción. Su sintaxis
es:

SAVEPOINT <punto de salvaguarda>;

Los nombres de los puntos de salvaguarda pueden reutilizarse durante la transacción. Al reutilizarlo
el anterior punto se pierde.

Al ejecutar ROLLBACK sin parámetros 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 inserción realizada con INSERT .

SQL*Plus dispone de un comando para controlar las validaciones de forma automática. Su sintaxis es:

SET AUTOCOMMIT ON/OFF

Si se especifica ON los cambios se validarán automáticamente después de cada operación de


actualización de datos.

La opción por defecto es OFF y permite que sea el usuario el que controle la validación de los
cambios con los comandos anteriores.

Las sentencias del LMD y la desconexión de Oracle llevan implícita una validación (commit).

Si se produce la caída del sistema o la terminación anormal de una aplicación, se llevará a cabo una
restauración automática, mediante la consulta al fichero diario o log.
Oracle almacena temporalmente, en los llamados segmentos de rollback, la información necesaria
para deshacer los cambios si se ejecuta un ROLLBACK y dejar la información en estado consistente.

Dpto. de Informática 91
I.E.S. TRASSIERRA - Córdoba SQL

Puede comprobarse que el propietario de la tabla modificada, tiene constancia al instante de las
modificaciones que se produzcan. Bastará hacer una consulta y observar el nuevo valor.

El navegador es una herramienta del Administrador de la Base de Datos, por lo que al abrir una tabla
nos da la visión que de la misma tiene aquél. Si abrimos una tabla con el Navegador, no apreciaremos
los cambios hasta que se cierre la sesión del usuario (nos conectemos como otro usuario o salgamos
de SQL, por ejemplo), o se ejecute el comando COMMIT.

8.3.- EJERCICIOS PROPUESTOS.-

1.- En aplicación del convenio colectivo, aumentar todos los salarios en un 3,24 % y las comisiones en
un 4,16 %.

2.- Debido a un nuevo sistema telefónico, modificar todas las extensiones telefónicas que comiencen
por 8 de forma que se reemplace el 8 por un 9.

3.- Modificar las dirce de los centros de trabajo, eliminando los tres primeros caracteres.

• Para los siguientes ejercicios vamos a crear la tabla TEMPLE2 vacía, con la siguiente sentencia
que estudiaremos en el próximo tema. Baste decir que como el departamento 444 no existe,
la subselect devuelve una tabla vacía, 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 más
comisión) supere al salario total medio de su departamento.

5.- En temple2, modificar el salario de los empleados con comisión aumentándolo en ésta, poniendo
nula su comisión.

6.- En temple2, disminuir el salario en un 3% de los empleados cuyos salarios (en temple) superen en
un 50% al salario máximo de su departamento.

7.- Borrar en temple2 a los empleados cuyo salario (sin incluir comisión) supere al salario medio de
los empleados de su departamento.

8.- Borrar en temple2 a los empleados cuyo salario (sin incluir comisión) supere al salario medio de
los empleados de su departamento, excluyéndole a él mismo.

9.- Disminuir la fecha de ingreso de los directores de departamento en tantos meses como años de
antigüedad cumplidos lleven en la empresa.

10.- Borrar todas las filas de temple2.

• Para los siguientes ejercicios necesitarás la tabla TBORRA con una única columna (numem), y
sin ningún registro. Puedes crearla con la siguiente sentencia:
SELECT numem FROM temple where numem=999;

Dpto. de Informática 92
I.E.S. TRASSIERRA - Córdoba SQL

11.- Insertar en TBORRA los datos de los empleados que se jubilarán este año, que son los que
cumplan durante el presente año 55 o más años 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
introducción de datos se hará con variables de sustitución, validando en la medida de lo posible los
datos de entrada (mayúsculas en campos carácter).

Dpto. de Informática 93
I.E.S. TRASSIERRA - Córdoba SQL

BIBLIOGRAFÍA:
- 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 España, S.A.

Dpto. de Informática 94

También podría gustarte