2 SQL
2 SQL
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:
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
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.
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.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
SQL se compone de tres sublenguajes especializados cada uno de ellos en un tipo de operaciones
sobre las tablas de la B.D.:
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.
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,
*
Solo válido para ciertos objetos
Dpto. de Informática 3
I.E.S. TRASSIERRA - Córdoba 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]
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
• Comando EDIT.-
Llama al editor activo del sistema operativo. Se puede elegir el editor utilizando:
SQL> define_editor = <nombre_editor>
• 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
Y para desactivarlo:
SQL> SPOOL OFF
Genera un fichero, con extensión por defecto .lst, con el resultado de la SELECT ejecutada.
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:
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
Antes de estudiar las sentencias SQL *Plus debemos familiarizarnos con ciertos conceptos:
Los objetos se crean y modifican su estructura con el lenguaje LDD e incluyen los siguientes tipos de
objetos:
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.
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
• 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.
[ 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:
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].
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.
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
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.
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 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
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:
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.
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:
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:
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
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:
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:
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.
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:
Para poderlas identificar, las restricciones pueden tener un nombre, y después de definidas pueden
ser activadas, desactivadas y eliminadas.
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.
Códigorestricción_nombretabla_nombrecolumna
CP = CLAVE PRIMARIA
UQ = UNICIDAD
CA = CLAVE AJENA
CK = CHECK
NN = OBLIGATORIO
Dpto. de Informática 14
I.E.S. TRASSIERRA - Córdoba SQL
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
PRIMARY KEY /
UNIQUE /
[CONSTRAINT <nombre>] NOT NULL /
CHECK <condición> /
REFERENCES <tabla_externa>[(campo1[, campo2]...)]
[ON DELETE CASCADE]
<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:
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:
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í:
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:
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.
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.
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:
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.
(1) El índice creado será usado por la siguiente sentencia, aumentando la velocidad de ejecución.
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 ;
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:
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.
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.
2).- Crear el sinónimo salario para el índice creado en el ejemplo de la pregunta anterior.
Las tablas del diccionario de datos con información acerca de los sinónimos accesibles para el usuario
son:
USER_SYNONYMS
ALL_SYNONYMS
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:
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
FORCE /
CREATE [OR REPLACE] NOFORCE VIEW nombre_vista [(coI1, col2, ...)]
AS subconsulta
WITH CHECK OPTION ;
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.
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.
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
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:
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
SELECT [Link]
FROM dual;
Las tablas del diccionario de datos con información acerca de las secuencias, y accesibles para el
usuario son:
USER_SEQUENCES
ALL_SEQUENCES
Este comando no permite eliminar una columna de una tabla. Su sintaxis es:
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
Ejemplos:
1).- Añadir una restricción a la tabla tcentro. La situación de los centros de trabajo (dirce) debe ser
única.
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).
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
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.
o bien
ALTER TABLE tdepto
DROP CONSTRAINT UNIQUE(nomde);
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] ;
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:
• 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:
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 ;
Dpto. de Informática 26
I.E.S. TRASSIERRA - Córdoba SQL
El significado de los diferentes valores coincide con los del comando CREATE SEQUENCE.
Ejemplo: Eliminar la tabla PRODUCTOS con todas sus filas y las claves ajenas que apunten a cualquier
columna de PRODUCTOS.
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.
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
Se puede borrar un sinónimo sobre una tabla, procedimiento, vista, etc utilizando el siguiente
comando. Sintaxis:
Con el uso de este comando no se borra el objeto, sino el alias permanente del objeto.
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:
Suele ser el método utilizado para resetear una secuencia. Se borra y luego se vuelve a crear con los
valores deseados. Ejemplo:
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:
USER_OBJECTS
Dpto. de Informática 28
I.E.S. TRASSIERRA - Córdoba SQL
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:
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.
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.
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.
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.
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.
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.
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.
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:
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 *
FROM temple ;
Ejemplo: Mostrar los números de empleado de los empleados que son directores.
Obsérvese como la información devuelta es mucho más significativa (justa y necesaria) si usamos
DISTINCT que si no lo hacemos.
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] ;
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;
NOMEM
PEREZ, MARCOS
MORAL, CARMEN
CAMPOS, ROMULO
Dpto. de Informática 32
I.E.S. TRASSIERRA - Córdoba SQL
SELECT *
FROM tdepto
WHERE numde = 110 ;
Resultado:
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:
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)
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.
Resultado:
• 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.
[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.
[Link].- De fecha.-
Con operandos de tipo fecha pueden operar los operadores + y -, según las siguientes tres
operaciones:
Dpto. de Informática 35
I.E.S. TRASSIERRA - Córdoba SQL
Ejemplos:
SELECT sysdate + 7 "Dentro de 7 días"
FROM dual ;
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:
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).
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.
Para realizar las búsquedas con LIKE se utilizan los caracteres comodines '%' y '_':
Ejemplos:
Ejemplo: Listar el nombre y salario de los empleados cuyo nombre acabe en 'a'.
Dpto. de Informática 37
I.E.S. TRASSIERRA - Córdoba SQL
➢ El operador BETWEEN permite hallar si un valor está o no comprendido entre otros dos, ambos
inclusive.
Su formato es:
Si escribimos:
V1 BETWEEN V2 AND V3
Supongamos ahora:
• 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.
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:
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:
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.
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.
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
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.
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:
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.
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:
Ejemplo: Listar los nombres y sueldos totales (salario más comisión) de los empleados que
cobran comisión:
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.
Los predicados vistos hasta ahora son simples. Los operadores lógicos AND, OR y NOT permiten
expresar predicados compuestos combinando predicados simples o compuestos.
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.
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.
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 ;
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.
Dpto. de Informática 44
I.E.S. TRASSIERRA - Córdoba SQL
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.
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
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:
Son aquellas que aceptan como entrada argumentos numéricos y devuelven valores numéricos.
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
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;
2).- SELECT TRANSLATE ('El modelo Entidad/Relación', 'aeiou', 'eioua') FROM DUAL;
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 ;
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.
Dpto. de Informática 49
I.E.S. TRASSIERRA - Córdoba SQL
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"
Dpto. de Informática 50
I.E.S. TRASSIERRA - Córdoba SQL
(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.
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 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.
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.
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.
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 ;
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;
2).- Para cada empleado, listar el mayor valor (en orden alfabético) de entre el apellido y el nombre
propio.
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".
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 ;
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
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:
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.
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:
Resultado:
SUM(COMIS)/COUNT(*)
506,57143
Resultado:
COUNT(DISTINCTCOMIS) AVG(COMIS)
6 588,14286
3).- Hallar la media del número de hijos de los empleados del departamento 123.
4).- Hallar la edad media, en años de los empleados del departamento 110.
Resultado:
AVG(TRUNC( MONTHS_BETWEEN(SYSDATE, fecna)/12 ) )
32,666667
Dpto. de Informática 56
I.E.S. TRASSIERRA - Córdoba SQL
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:
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.
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.
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
Resultado:
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.
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.
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
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 *
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 ;
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.
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.
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.
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.
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.
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.
3).- Hallar por orden alfabético los nombres de los departamentos que dependen de los que tienen
un presupuesto inferior a 30000 euros.
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:
Dpto. de Informática 64
I.E.S. TRASSIERRA - Córdoba SQL
Para seleccionar la suma de salarios para todos los departamentos independientemente de que
tengan empleados o no, tendremos que utilizar un OUTER JOIN:
[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.
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.
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.
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.
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
SELECT [Link]
FROM temple E1, temple E2
WHERE [Link] = [Link]
GROUP BY [Link], [Link], [Link]
HAVING [Link] > AVG([Link])
ORDER BY 1 ;
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:
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.
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.
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.
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.
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.
INTERSECT
Dpto. de Informática 70
I.E.S. TRASSIERRA - Córdoba SQL
Resultado:
NOMEM SALAR
GARCIA, OCTAVIO 2284
LASA, MARIO 2104
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.
Resultado:
NOMEM SALAR
GARCIA, OCTAVIO 2284
LASA, MARIO 2104
TEROL, LUCIANO 1743
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.
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.
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
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í:
No mostrará los registros no enlazados o emparejados. Las tres sentencias siguientes son
equivalentes:
Dpto. de Informática 74
I.E.S. TRASSIERRA - Córdoba SQL
• Yunción externa.-
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.
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.
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>
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 &.
Uso: &<variable>
Ejemplo:
DEF dep=110
SELECT REPLACE(nomem, 'A', '~')
FROM temple
WHERE numde = &dep
/
SELECT nomem, salar
FROM temple
WHERE numde = &dep
/
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>).
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.
Dpto. de Informática 77
I.E.S. TRASSIERRA - Córdoba SQL
Ejemplo:
SELECT AVG(salar)
FROM temple
WHERE numde = &dep ;
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:
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.
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
Dpto. de Informática 78
I.E.S. TRASSIERRA - Córdoba SQL
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.
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'.
Dpto. de Informática 79
I.E.S. TRASSIERRA - Córdoba SQL
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:
El comando SHOW muestra el valor de una o todas las variables de sistema. Su sintaxis es:
SHOW <variable>/ALL
• Parámetros de feedback.-
• 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.
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.
Dpto. de Informática 81
I.E.S. TRASSIERRA - Córdoba SQL
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.
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.
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.
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
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:
CLEAR <opción>
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
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:
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
Dpto. de Informática 85
I.E.S. TRASSIERRA - Córdoba SQL
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
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:
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:
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.
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.
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:
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:
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.
DELETE
FROM tdepto
WHERE numde=123 ;
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:
[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) ;
Dpto. de Informática 89
I.E.S. TRASSIERRA - Córdoba SQL
UPDATE temple
SET salar = (SELECT MIN(salar)
FROM mayores),
comis = NULL
WHERE numem= 500 ;
Ejercicio: Aumentar un 10% los salarios de los empleados con salario inferior al salario medio de su
departamento.
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:
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:
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:
SQL*Plus dispone de un comando para controlar las validaciones de forma automática. Su sintaxis es:
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.
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.
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.
• 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