Você está na página 1de 39

I.E.S.

TRASSIERRA
Crdoba
http://www.iestrassierra.com

Departamento de Informtica

APUNTES DE

SQL Plus/2
Etapa: Formacin Profesional Especfica.
Nivel: Superior.
Ciclo: Desarrollo de Aplicaciones Web.
Desarrollo de Aplicaciones Multiplataforma.
Mdulo: Bases de Datos.

INDICE:
Tema 4.- La sentencia SELECT ..................................................................... 1
Tema 5.- Funciones ........................................................................................ 14
Tema 6.- Consultas sobre varias tablas ....................................................... 29
I.E.S. TRASSIERRA - Crdoba SQL Plus

TEMA 4.- LA SENTENCIA SELECT.-


4.1.- SELECT bsico.
4.1.1.- Seleccin de columnas.
4.1.2.- Seleccin de tablas. Clusula FROM.
4.1.3.- Seleccin de filas. Clusula WHERE.
4.1.4.- Ordenacin de los resultados. Clusula ORDER BY.
4.2.- Expresiones.
4.2.1.- Operadores.
4.2.1.1.- Aritmticos.
4.2.1.2.- Alfanumricos.
4.2.1.3.- De fecha.
4.2.1.4.- De comparacin general.
4.2.1.5.- De comparacin de cadenas.
4.2.1.6.- De comparacin lgica.
4.2.1.7.- Lgicos.
4.3.- Ejercicios propuestos.

4.1.- SELECT BSICO.-


Las sentencias SQL estn formadas por distintas clusulas, cada una de las cuales empieza
con una palabra predefinida determinada.

La sentencia SELECT permite recuperar datos de una o varias tablas, vistas o rplicas. Para
seleccionar filas de una tabla se deber ser el propietario del esquema con el que se cre la
tabla, o, en caso contrario, tener permiso de acceso o tener un privilegio del sistema llamado
SELECT ANY TABLE, que permite acceder a cualquier tabla o vista.

A continuacin veremos como usar la sentencia SELECT para realizar consultas sencillas
sobre una nica tabla, usando una sintaxis simplificada de la sentencia:

SELECT [DISTINCT] { col1 [, col2].. / * }


FROM tabla
[ WHERE predicado ]
[ ORDER BY col1 [, col2].. ]

4.1.1.- Seleccin de columnas.-

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

Dep. de Informtica 1
I.E.S. TRASSIERRA - Crdoba SQL Plus

SELECT nomem, salar, fecna


FROM temple ;

SELECT *
FROM temple ;

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

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

SELECT DISTINCT direc


FROM tdepto ;

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


usamos DISTINCT que si no lo hacemos.

4.1.2.- Seleccin de tablas. Clusula FROM.-

La clusula FROM indica el nombre de la tabla o tablas sobre las que se realizar la consulta.
En la clusula FROM deben aparecer los nombres de las tablas a las que se refieren las
columnas especificadas tras la palabra SELECT. Si se especifican varias tablas, sus nombres
deben separarse por comas.

Recordemos que cuando la tabla no es de nuestra propiedad el nombre del propietario y un


punto deben especificarse delante del nombre de la tabla.

SELECT numem
FROM scott.temple ;

4.1.3.- Seleccin de filas. Clusula WHERE.-

WHERE permite filtrar las filas de forma que sean devueltas solo las que cumplan cierta
condicin. El predicado de la clusula WHERE es una condicin que puede ser verdadera o
no. De momento vamos a suponer que se trata de una comparacin entre dos valores. Ms
adelante veremos otras posibilidades.

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

SELECT nomem
FROM temple
WHERE numde = 110;
Resultado: (puede obtenerse en otro orden):
NOMEM
PEREZ, MARCOS
MORAL, CARMEN
CAMPOS, ROMULO

Dep. de Informtica 2
I.E.S. TRASSIERRA - Crdoba SQL Plus

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

SELECT *
FROM tdepto
WHERE numde = 110 ;

Resultado:
NUMDE NUMCE DIREC TIDIR PRESU DEPDE NOMDE
110 20 180 P 90000 100 DIRECCIN COMERCIAL

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

La clusula ORDER BY permite mostrar los resultados en un orden determinado, admitiendo


la ordenacin por ms de una columna y en orden ascendente y descendente.

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

Ejemplos:

1).- Obtener los nombres de todos los centros ordenados alfabticamente.


SELECT nomce
FROM tcentr
ORDER BY 1 ;

Resultado:
NOMCE .
RELACIN CON CLIENTES
SEDE CENTRAL

2).- Obtener, en orden de nmero de empleado, el nombre y salario de los empleados del
departamento 110.
SELECT nomem, salar
FROM temple
WHERE numde=110
ORDER BY nomem ;

Resultado:
NOMEM SALAR
CAMPOS, ROMULO 1202
MORAL, CARMEN 1292
PEREZ, MARCOS 2885

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


de los empleados cuyo salario es inferior a 1100 euros, clasificndolos por n de departamento
en orden creciente y, dentro de cada departamento, por antigedad en la empresa.
SELECT numde, nomem, fecin, salar
FROM temple
WHERE salar< 1100
ORDER BY 1, 2 DESC;
Dep. de Informtica 3
I.E.S. TRASSIERRA - Crdoba SQL Plus

Resultado:
NUMDE NOMEM FECIN SALAR
111 SANTOS, SANCHO 22/01/01 601
112 TORRES, HORACIO 02/01/01 1082
112 MARTIN, MICAELA 02/01/01 1082
122 MUOZ, AZUCENA 15/10/01 1052

Si no se especifica ORDER BY, las filas de la tabla resultado sern devueltas en cualquier
orden. Incluso en distinto orden de una ejecucin a otra.
Cuando el SGBD ordena las filas ascendentemente (opcin por defecto), los valores nulos
se muestran detrs de todos los dems. Para obtener un orden descendente se especifica la
palabra DESC detrs del nombre o nmero de la columna; en este caso los nulos se
muestran al principio.
Adems, en vez de especificar el nombre de la columna por la que se quiere ordenar, puede
indicarse el nmero relativo de la columna en la clusula SELECT. As por ejemplo,
ORDER BY 4 equivale a especificara el nombre de la cuarta columna de la clusula SELECT.
Tambin puede ordenarse el resultado por ms de una columna. Para ello, basta dar sus
nombres o nmeros, separados por comas.

La sentencia SELECT siempre devuelve como resultado otra tabla. ste resultado, puede
construirse siguiendo los siguientes pasos, aunque el SGBD puede seguir otros:
1. De entre las tablas accesibles para el esquema por defecto se selecciona la nombrada
en la clusula FROM. Es como si se creara una copia temporal de ella, que pasar a ser
por ahora la tabla resultante.
2. Se filtran las filas de la tabla resultante, segn el predicado (condicin) de la clusula
WHERE, suprimiendo a todas las que no satisfagan la condicin.
3. Despus se eliminan las columnas que no se mencionen en la clusula SELECT. Las
restantes se retienen y se ponen en la misma posicin relativa en que se hayan escrito
en la clusula SELECT. Incluso puede repetirse alguna si su nombre aparece repetido
en esta clusula.
4. La tabla as formada es el resultado final de la sentencia SELECT.
5. La tabla anterior se presenta al usuario con sus filas clasificadas por los valores de la
columna mencionada en la clusula ORDER BY.

4.2.- EXPRESIONES.-

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


SGBD ejecuta las operaciones indicadas en ella, produce como resultado un nico valor, de
forma que en la sentencia, la funcin es sustituida por su valor de retorno.

En el formato de SELECT simplificado, las expresiones pueden emplearse en la clusula


SELECT en vez de los nombres de columnas, y en la clusula WHERE en la formulacin del
predicado o condicin, dnde uno o ambos de los valores a comparar pueden ser el resultado
de evaluar una expresin.

Los operandos pueden ser nombres de columnas, constantes, funciones, registros especiales
(USER, por ejemplo) u otras expresiones.
Dep. de Informtica 4
I.E.S. TRASSIERRA - Crdoba SQL Plus

4.2.1.- Operadores.-

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

4.2.1.1.- Operadores aritmticos.


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

Operador Funcin Ejemplo


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

4.2.1.2.- Operadores alfanumricos.


Operan sobre cadenas de caracteres. Solo existe el operador de concatenacin
alfanumrica que se escribe con dos rayas verticales (||) que permite unir dos cadenas.

Por ejemplo: SELECT 'Departamento de ' || nomde


FROM tdepto;

4.2.1.3.- Operadores de fecha.-


Con operandos de tipo fecha pueden operar los operadores + y -, segn las siguientes
tres operaciones:

Operacin Valor devuelto .

fecha + <num> La fecha incrementada en <num> das.

fecha - <num> La fecha disminuida en <num> das.

fecha1 fecha2 El nmero de das transcurridos entre dos fechas.


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

Ejemplos: SELECT sysdate + 7 "Dentro de 7 das"


FROM dual ;

SELECT fecin fecna "Edad de ingreso en das"


FROM temple ;

Dep. de Informtica 5
I.E.S. TRASSIERRA - Crdoba SQL Plus

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

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


FROM dual ;

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


est accesible para todos los usuarios. Contiene una sola columna llamada DUMMY
definida como VARCHAR2(1) y contiene una fila con el carcter "X".

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

4.2.1.4.- Operadores de comparacin general.-


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

Operador Descripcin Ejemplo


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

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

El segundo comparando puede ser otra SELECT, pero se especificar entre parntesis
y producir como resultado un nico valor (1 fila y 1 columna). Si devuelve una tabla
vaca, el predicado en que participa toma el valor desconocido.

Ejemplo: Obtener el nombre de los empleados cuyo sueldo cuadruplica al menos al


del empleado 550.
SELECT nomem
FROM temple
WHERE salar > ( SELECT salar *4
FROM temple
WHERE numem = 550) ;

Dep. de Informtica 6
I.E.S. TRASSIERRA - Crdoba SQL Plus

Que tambin podra haberse formulado as:


SELECT nomem
FROM temple
WHERE salar/4 > ( SELECT salar
FROM temple
WHERE numem = 550) ;

Pero sera menos eficiente al tener que dividir por 4 todas las tuplas de la tabla TEMPLE.

Ojo.- Si en vez del empleado 550 se tratase del 560 que no existe, la subconsulta
devolvera una tabla vaca y el resultado final tambin sera una tabla vaca.

4.2.1.5.- Operadores de comparacin de cadenas.

EI operador LlKE se utiliza en comparaciones de cadenas de caracteres con un patrn


de bsqueda. Su sintaxis es:
<expresin> [NOT] LIKE <cadena>

Mientras el operador = buscara cadenas de caracteres idnticas, el operador LIKE busca


cadenas de caracteres que contengan la porcin de la cadena indicada.

Para realizar las bsquedas con LIKE se utilizan los caracteres comodines '%' y '_':

% (porcentaje) sustituye a cualquier cadena de 0 o ms caracteres.


_ (subrayado) sustituye a cualquier carcter, pero solo a uno.

Ejemplos:
LIKE 'Director' la cadena Director
LIKE 'M%' cualquier cadena que empiece por M.
LIKE '%Z%' cualquier cadena que contenga una Z
LIKE '_T%' cualquier cadena cuyo segundo carcter sea una T

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

SELECT nomem, salar FROM temple WHERE nomem LIKE '%A';

4.2.1.6.- Operadores de comparacin lgica.-

El operador BETWEEN permite hallar si un valor est o no comprendido entre otros


dos, ambos inclusive.
Su formato es:
<Exp_1> [NOT] BETWEEN <Exp_2> AND <Exp_3>

Si se omite NOT, el predicado es verdadero si el valor de la <Exp_1> est


comprendido entre el de la <Exp_2> y el de la <Exp_3>, ambos inclusive. Si se
especifica NOT, el predicado es verdadero cuando no est comprendido en ese
intervalo.

Dep. de Informtica 7
I.E.S. TRASSIERRA - Crdoba SQL Plus

Estos predicados son equivalentes a otros compuestos con los operadores lgicos AND
y OR que se vern ms adelante, as el predicado:

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

Ejemplos:

1).- Obtener por orden alfabtico los nombres de los empleados cuyo salario est entre 250000
y 300000 pts.

SELECT nomem
FROM temple
WHERE salar BETWEEN 250000/166.386 AND 300000/166.386
ORDER BY nomem ;

Resultado:
NOMEM .
DIEZ, AMELIA
:
:
VEIGA, JULIANA (7 registros)

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

SELECT nomem, salar


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

En la ejecucin de esta sentencia se presentarn errores al dividir por numhi, pues ste vale
cero en algunas filas. Por ello, ser necesario reformular la consulta:

SELECT nomem, salar


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

Obsrvese que si en alguna fila el valor de la expresin ( 720 * numhi) no es menor que el de (2
* numhi * comis), la fila cumple las condiciones expresadas y debe aparecer en el resultado.
Este es el caso de MARCOS PREZ, y es conveniente asegurarnos que es eso lo que se busca.

Los operadores ANY y ALL permiten cuantificar un predicado de comparacin. Su


formato es:
<exp> <operador_relacional> ANY / <lista_expres.> /
ALL (subselect)

Dep. de Informtica 8
I.E.S. TRASSIERRA - Crdoba SQL Plus

Aunque se ha dicho que una SELECT subordinada debe devolver un nico valor,
puede devolver varios si va precedida por ANY o ALL. En este caso, el resultado de
la subselect debe ser una tabla con una sola columna con una o ms filas.

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


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

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


uno cualquiera de los valores.

Ejemplos:
1).- Obtener por orden alfabtico los nombres de los empleados cuyo salario supera al
mximo 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 podra formularse con la funcin MAX que se ver en el tema siguiente.
Supongamos que formulamos la misma consulta para el departamento 150:
SELECT nomem
FROM temple
WHERE salar > ALL ( SELECT salar
FROM temple
WHERE numde = 150)
ORDER BY nomem ;

Como el departamento 150 no existe, la SELECT subordinada devuelve como resultado una
tabla vaca. Por tanto, todas las filas satisfacen el predicado cuantificado y el resultado final es
una relacin de todos los empleados por orden alfabtico.

2).- Obtener por orden alfabtico los nombres de los empleados cuyo salario supera en tres
veces y media o ms al mnimo salario de los empleados del departamento 122.
SELECT nomem
FROM temple
WHERE salar > = ANY ( SELECT salar * 3.5
FROM temple
WHERE numde = 122)
ORDER BY nomem ;

Que se podra formular de otra forma con la funcin MIN que se ver ms adelante.

Dep. de Informtica 9
I.E.S. TRASSIERRA - Crdoba SQL Plus

Resultado:
NOMEM .
LOPEZ, ANTONIO

Repitamos esta consulta para un departamento inexistente:


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

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


resultado final, por tanto, es tambin una tabla vaca.

3).- Obtener por orden alfabtico los nombres y salarios de los empleados cuyo salario es
inferior a la comisin ms alta existente.
SELECT nomem, salar
FROM temple
WHERE salar < ANY (SELECT comis FROM temple)
ORDER BY nomem ;
Resultado:
NOMEM SALAR
SANTOS, SANCHO 601

El operador IN sirve para saber si un valor se encuentra entre una lista de valores dada. Su
sintaxis es:
<Exp> [NOT] IN <lista de constantes>

Si el valor de la <Exp> no es nulo y es igual a alguno de los valores de la lista, el


predicado es verdadero, y si no, es falso. Si la <Exp> es nula, el predicado toma el valor
desconocido.

En vez de la <lista de constantes> puede especificarse, entre parntesis, una sentencia


SELECT simplificada, la cual deber devolver una tabla con una sola columna y no
incluir la clusula ORDER BY.

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

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

SELECT nomem
FROM temple
WHERE extel IN (250, 750)
ORDER BY 1;

Dep. de Informtica 10
I.E.S. TRASSIERRA - Crdoba SQL Plus

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

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

SELECT 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 aadir la palabra NOT, el valor
devuelto ser el contrario. Su sintaxis es:

<col> IS [NOT] NULL

Ejemplo: Listar los nombres y sueldos totales (salario ms comisin) de los


empleados que cobran comisin:

SELECT nomem, salar+comis "Salario mensual"


FROM temple
WHERE comis IS NOT NULL;

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


vaca. Devuelve verdadero si la sentencia subordinada no es una tabla vaca. Su sintaxis
es:
EXISTS (subselect)

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

SELECT nomem, salar


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

Dep. de Informtica 11
I.E.S. TRASSIERRA - Crdoba SQL Plus

4.2.1.7.- Operadores lgicos.-

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

AND es el operador lgico de conjuncin, OR el de disyuncin y NOT el de negacin.


Los dos primeros se aplican a dos operandos (son binarios) y el ltimo a uno solo
(unario), y en todos los casos los operandos son otros predicados.

Un predicado compuesto, lo mismo que uno simple, puede tomar los valores
Verdadero, Falso o Desconocido.

Cuando se especifica AND, el resultado es verdadero si sus dos operandos lo son.


Cuando se especifica OR, es verdadero si lo es uno cualquiera de sus dos operandos al
menos. El resultado de NOT es verdadero si el operando al que se aplica es "Falso".

Obsrvese que las palabras AND y NOT pueden usarse en otros predicados sin
desempear el papel de operadores lgicos. En los predicados BETWEEN se usa la
palabra AND, y la palabra NOT puede aparecer en los predicados BETWEEN, NULL,
IN y LlKE, todos ellos simples. As, por ejemplo, (NOT <col> IS NULL) es un predicado
compuesto y (<col> IS NOT NULL) es simple y ambos son adems equivalentes.

Ejemplos:

1).- Obtener por orden alfabtico los nombres y comisiones de los empleados del
departamento 110 si hay en l algn empleado que tenga comisin.

SELECT nomem, comis


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

Resultado:
NOMEM COMIS
CAMPOS, ROMULO
MORAN, CARMEN
PEREZ, MARCOS 301

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

SELECT nomem, salar, fecin


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

Dep. de Informtica 12
I.E.S. TRASSIERRA - Crdoba SQL Plus

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

4.3.- EJERCICIOS PROPUESTOS.-

Nota.- Antes de resolver los ejercicios propuestos es conveniente que el/la alumno/a se familiarice con las
tablas ejemplo a las que se refieren los mismos, realizando el esquema Entidad/Relacin.

1. Hallar, por orden alfabtico, los nombres de los departamentos cuyo director lo es en
funciones y no en propiedad.

2. Obtener un listn telefnico de los empleados del departamento 121 incluyendo


nombre de empleado, nmero de empleado y extensin telefnica. Por orden
alfabtico.

3. Obtener por orden alfabtico los nombres y salarios de los empleados que o bien no
tienen hijos y ganan ms de 1200 euros, o bien tienen hijos y ganan menos de 1800
euros.

4. Obtener salario y nombre de los empleados sin hijos por orden decreciente de salario y
por orden alfabtico dentro de salario

5. Suponiendo que en los prximos tres aos el coste de vida va a aumentar un 6 % anual
y que se suben los salarios en la misma proporcin, hallar para los empleados con ms
de 4 hijos su nombre y su salario anual actual sin comisin, y para cada uno de los
prximos tres aos, clasificados por orden alfabtico.

6. En la fiesta de Reyes Magos se desea organizar un espectculo para los hijos de los
empleados, que se representar en dos sesiones diferentes. A la primera sesin
asistirn los empleados cuyo apellido empiece por las letras desde A hasta L, ambas
inclusive, y a la segunda sesin el resto. A cada empleado se le asignarn tantas
invitaciones gratuitas como hijos tenga y dos ms. Adems, en la fiesta se entregar a
cada empleado un obsequio por hijo. Obtener una lista por orden alfabtico de los
nombres a quienes hay que invitar el primer da de la representacin, incluyendo
tambin cuntas invitaciones corresponden a cada nombre y cuntos regalos hay que
preparar para l.

7. Listado alfabtico los nombres de los departamentos que o bien tienen director en
funcio-nes, o bien en propiedad y su presupuesto anual excede a 30.000 euros, o bien
no dependen de otro.

8. Hallar por orden alfabtico los nombres y salarios de los empleados de los
departamentos 110 y 111 que, o bien no tengan hijos, o bien su salario por hijo supere
a 600 euros, pero solo si hay algn empleado sin comisin en los departamentos 111
112.

Dep. de Informtica 13
I.E.S. TRASSIERRA - Crdoba SQL Plus

TEMA 5.- FUNCIONES.-


5.1.- Introduccin.
5.2.- Funciones de fila.
5.2.1.- Funciones numricas.
5.2.2.- Funciones de caracteres.
5.2.3.- Funciones de fechas.
5.2.4.- Funciones de conversin.
5.2.5.- Otras funciones
5.3.- Funciones de columna.
5.4.- Agrupamiento de filas. Clusulas GROUP BY y HAVING.
5.5.- Ejercicios propuestos.

5.1.- INTRODUCCIN.-

Una funcin realiza ciertas operaciones sobre uno o varios valores y devuelve un valor nico.
Los valores sobre los que opera se llaman argumentos.

Las funciones se especifican mediante una palabra reservada seguida de los argumentos entre
parntesis y separados por comas. La funcin SYSDATE, como excepcin, no lleva
argumentos (ni parntesis), el resto utilizan uno, dos, o mas argumentos algunos de los cuales
pueden ser opcionales, los que, si se omiten, toman valores por defecto.

Las funciones permiten realizar con los datos funciones adicionales a las vistas hasta ahora,
pudiendo aparecer como operandos en las expresiones en:

Clusula SELECT
Clusula WHERE
Clusula ORDER BY

Si se invoca a una funcin con un tipo de dato distinto al que espera como argumento, se
convierte automticamente y de forma implcita en el que la funcin espera.

Las funciones pueden anidarse a cualquier nivel, lo que permite la construccin de


expresiones muy complejas.

Las funciones suelen dividirse en:


Funciones de fila, simples o escalares.
Funciones de columna, grupo o agregado.

Mientras las primeras operan con valores nicos (la columna x de la tupla y), las segundas lo
hacen sobre varios valores (la columna x en varias o todas las tuplas).

Dep. de Informtica 14
I.E.S. TRASSIERRA - Crdoba SQL Plus

5.2.- FUNCIONES DE FILA.-

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

5.2.1.- Funciones numricas.-

Son aquellas que aceptan como entrada argumentos numricos y devuelven valores
numricos. Las msm importantes son:

Funcin Sintaxis Devuelve/Descripcin


ABS ABS(n) Valor absoluto de n
CEIL CEIL(n) Entero inmediatamente superior o igual a n
EXP EXP(n) Nmero e elevado a la potencia de n
FLOOR FLOOR(n) Entero inmediatamente inferior o igual a n
MOD MOD(m, n) Resto de m dividido por n.
POWER POWER(m, n) Potencia: m elevado a la potencia de n. La base m y el
exponente n puede ser cualquier tipo de nmero, pero si m
es negativo, n debe ser un entero
ROUND ROUND(n[,m]) Redondeo: n redondeado a m decimales. Si se omite, m =
0.
SIGN SIGN(n) Signo: Si n<0 devuelve -1.
Si n=0 devuelve 0.
Si n>0 devuelve 1.
SQRT SQRT(n) Raz cuadrada de n. El valor de n no puede ser negativo
TRUNC TRUNC(n[,m]) Truncado: n truncado a m decimales. Por defecto m = 0.

Las siguientes funciones trigonomtricas no las veremos dado su uso especfico:

Funcin Sintaxis Devuelve/Descripcin


ACOS ACOS(n) Arco coseno de n.
ASIN ASIN(n) Arco seno de n.
ATAN ATAN(n,[m]) Tangente del arco de n, o del arco entre n y m.
COS COS(n) Coseno de n en radianes
COSH COSH(n) Coseno hiperblico de n
LN LN(n) Logaritmo natural de n. Siendo n > 0.
LOG LOG(m, n) Logaritmo en base m de n. La base m debe ser un numero
positivo distinto de 0 1.n tambin debe ser positivo.
SIN SIN(n) Seno de n expresado en radianes
SINH SINH(n) Seno hiperblico de n
SQRT SQRT(n) Raz cuadrada de n. El valor de n no puede ser negativo
TAN TAN (n) Tangente de n.
TANH TANH(n) Tangente hiperblica de n.

Ejemplos:
1).- Listar los nombres y nmeros de departamento de los empleados que pertenecen a
departamentos pares.

SELECT nomem, numde


FROM temple
WHERE MOD(numde, 2) = 0 ;

Dep. de Informtica 15
I.E.S. TRASSIERRA - Crdoba SQL Plus

2).- Para los empleados que cobran comisin, listar su nombre y su comisin diaria
redondeada con 2 decimales.
SELECT nomem, ROUND(comis*12/365, 2)
FROM temple
WHERE comis IS NOT NULL ;

5.2.2.- Funciones de caracteres.-

Estas funciones suelen manejar parmetros de tipo carcter y pueden devolver tanto un valor
de tipo carcter como un nmero.

Funcin Sintaxis Devuelve/ Descripcin


ASCII ASCII(char) Nmero: representacin numrica de la cadena
char. en el juego de caracteres usado en la B.D.,
CHR CHR(n) Carcter cuyo numero correspondiente en binario
es n.
CONCAT CONCAT(char1, Cadena char1 concatenada con char2. Es
char2) equivalente al operador || .
INITCAP INITCAP(char) Cadena char con la primera letra de cada palabra en
mayscula el resto en minsculas. Las palabras van
delimitadas por espacios en blanco v no son
alfanumricas.
INSTR INSTR(char1, char2, Nmero que indica la posicin en char1 de la
[,n[,m]]) m_sima ocurrencia de char2 en char1, empezando
la bsqueda en la posicin n. Si se omiten n o m se
les asigna por defecto el valor 1.
LENGTH LENGTH (char) Nmero que expresa la longitud de char en
caracteres, incluyendo los blancos.
LOWER LOWER(char) Cadena char con todas las letras en minsculas.
LPAD LPAD(char1,n Cadena char1 rellenado a la izquierda hasta la
[,char2]) longitud indicada por n, con la cadena indicada en
char2. Si char2 se omite, se rellena con blancos.
LTRIM LTRIM(char[,muestra]) Cadena char en la que se han eliminado los
caracteres a la izquierda hasta encontrar el primer
carcter que no est en muestra.
REPLACE REPLACE (char, Cadena char, despus de reemplazar car_bus por
car_bus[,car repl]) car_repl.
RPAD RPAD(char1,n Cadena char1 rellenado a la derecha hasta la
[,char2]) longitud indicada en n, con el carcter indicado en
char2. Si char2 se omite rellena con blancos.
RTRIM RTRIM(char [,muestra]) Cadena char previa eliminacin de los caracteres a
la derecha de char hasta encontrar el primer carcter
que no este en muestra.
SUBSTR SUBSTR(char,m[,n]) Subcadena de char, empezando en la posicin
indicada en m, y tomando el nmero de caracteres
indicado en n. O hasta el final si se omite n.
TRANSLATE TRANSLATE(char, de, Cadena char con todas las ocurrencias "de"
a) reemplazadas por lo indicado en "a".
UPPER UPPER(char) Cadena char con todas las letras en maysculas.

Dep. de Informtica 16
I.E.S. TRASSIERRA - Crdoba SQL Plus

Ejemplos:
1).- SELECT REPLACE ('El modelo Entidad/Relacin', 'modelo', 'metodo') FROM DUAL;
Rdo. El metodo Entidad/Relacin

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

Rdo. El mudilu Entoded/Rilecon

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

4).- Listar los nombres propios de todos los empleados, en orden alfabtico.
SELECT SUBSTR( nomem, INSTR(nomem, ',') + 1 )
FROM temple
ORDER BY 1 ;

5).- Listar los nombres de los departamentos ordenados de mayor a menor longitud del
nombre.
SELECT nomde
FROM tdepto
ORDER BY LENGTH(nomde) DESC ;

5.2.3.- Funciones de fechas.-

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

Funcin Sintaxis Devuelve/Descripcin


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

Dep. de Informtica 17
I.E.S. TRASSIERRA - Crdoba SQL Plus

Mscaras para ROUND y TRUNC con datos de tipo fecha.-


Las funciones ROUND y TRUNC son especialmente importantes en el manejo de
fechas. El redondeo o truncado se realiza a una unidad u otra (ao, da, ..) en funcin del
modelo de mscara especificado en fmt (ver sintaxis). A continuacin exponemos los
principales formatos, que deben expresarse entre comillas, y la unidades de redondeo o
truncado que les corresponden. El modelo por defecto es 'DD', y muestra la fecha
redondeada o truncada en formato da. La hora se establece a medianoche.

Modelo de formato Unidad de redondeo o truncado


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

Ejemplos:
1).- Calcular la edad, en aos cumplidos, de los empleados del departamento 130.
SELECT TRUNC(( sysdate-fecna)/365) "Edad en aos"
FROM temple
WHERE numde = 130 ;
Hay que resaltar que el clculo de la edad mediante resta (sysdate-fecna)/365 no es exacto al
no tener en cuenta los aos bisiestos. La nica forma de calcularla de forma excta es:
TRUNC (MONTHS_BETWEEN( sysdate, fecna)/12) "Edad en aos"
2).- Calcular la fecha del prximo domingo.
SELECT NEXT_DAY(sysdate, 7)
FROM DUAL ;
3).- Calcular los das que quedan hasta fin de mes.
SELECT LAST_DAY(sysdate) - sysdate
FROM DUAL ;
4).- Devolver el primer da del mes actual.
SELECT TRUNC(sysdate, 'MM')
FROM DUAL;

Dep. de Informtica 18
I.E.S. TRASSIERRA - Crdoba SQL Plus

5.2.4.- Funciones de conversin.-


Permiten convertir un tipo de dato en otro. Las principales son:
Funcin Sintaxis Conversin
TO_CHAR TO_CHAR(f [,formato[, Convierte una fecha f tipo DATE en un
'parametros nls'] ]) VARCHAR2 con la mscara indicada en formato.
Si se omite formato, la fecha se convierte a en un
valor VARCHAR2 en el formato de fecha por
defecto. Ms adelante veremos los "modelos de
formato de fecha". Parametros_nls especfica el
lenguaje en el cual se visualizan los nombres y
abreviaturas de los meses y das. El parmetro se
indica con: 'NLS_DATE_LANGUAGE = idioma'.
Si se omite toma el idioma por defecto. (1)
TO_CHAR TO_CHAR(n [,formato[, Convierte un nmero de tipo NUMBER en un tipo
'parametros_nls']]) de datos VARCHAR2 con la mscara indicada en
formato. Ms adelante veremos los "modelos de
formato numricos". 'Parmetros_nls' especifica
los caracteres y elementos de formatos de nmeros
que se visualiza (separador de decima-les, de
grupo, smbolo de la moneda local e ISO).
TO_DATE TO_DATE(char [,formato Convierte una cadena tipo VARACHAR2 en un
[,'parametros_nls'] ]) valor tipo DATE. El formato es la mscara de la
fecha. Si se omite toma el formato por defecto. Si
el formato es J para juliano char debe ser un
entero. 'Parmetros_nls' tiene la misma funcin que
para TO_CHAR en conversin a fechas. No
utilizar con TO_DATE un valor tipo DATE como
argumento. La fecha que devuelve puede tener un
valor diferente que el char original, dependiendo
del formato indicado o el activo por defecto.
TO_NUMBER TO_NUMBER( char [,formato Convierte char de un valor CHAR o VARCHAR2
[,'parametros_nls'] ] ) a un tipo de dato NUMBER con el
formato especificado

(1) Ej: SELECT TO_CHAR(sysdate, 'dd " de " month " de " yyyy', 'NLS_DATE_LANGUAGE= ENGLISH') FROM DUAL;

Otros lenguajes para las funciones fecha son: ITALIAN, SPANISH, FRENCH, GERMAN, ..

Mscaras de formato.-
En las funciones anteriores los formatos de conversin pueden indicarse para forzar la
conversin.

Los formatos numricos estn compuestos de uno o varios elementos y deben


proporcionarse cuando:

En una funcin TO_CHAR se cambie un tipo de dato NUMBER a un tipo de dato


VARCHAR2. Ejemplo:

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

En una funcin TO_NUMBER se cambie un tipo de dato VARCHAR2 a NUMBER. Como


ejemplo vase la diferencia entre las siguientes mscaras:

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


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

Dep. de Informtica 19
I.E.S. TRASSIERRA - Crdoba SQL Plus

Mscara Ejemplo Descripcin


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

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


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

D Carcter Decimal NLS_NUMERIC_CHARACTERS


G Separador Grupo NLS_NUMERIC_CHARACTERS
C Smbolo moneda NLS_ISO_CURRENCY
L Smbolo moneda NLS_ISO_CURRENCY

Los formatos tipo fecha se utilizan en las siguientes situaciones:

En la funcin TO_CHAR para convertir un valor tipo DATE a un formato diferente al


formato por defecto.

En la funcin TO_DA TE para convertir un valor tipo carcter en un formato diferente del
formato por defecto.

La fecha por defecto se especifica explcitamente con el parmetro


NLS_DATE_FORMAT o implcitamente con el parmetro de inicializacin
NLS_TERRITORY.

Dep. de Informtica 20
I.E.S. TRASSIERRA - Crdoba SQL Plus

Mscara Descripcin
SCC CC Indica el siglo. Si se especifica S, aparece el prefijo en las fechas de antes de Cristo.
YYYY SYYYY 4 Dgitos del ao. S antepone un si es antes de Cristo.
IYYY 4 Dgitos del ao en formato ISO estndar.
YYY YY Y Los ltimos 3, 2 o 1 dgitos del ao
IYY IY I Los ltimos 3, 2 o 1 dgitos del ao en formato ISO estndar
Y,YYY El ao, con una coma en la posicin indicada.
SYEAR YEAR El nmero de ao nombrado. El prefijo S se antepone si es antes de Cristo.
RR Los ltimos dos dgitos del ao. Se usa para aos de otros siglos.
BC AD Indicador antes/despus de Cristo.
B.C. A.D. Indicador antes/despus de Cristo separado por puntos.
Q Trimestre del ao.
MM Nmero de Mes.
RM Nmero de Mes en romano.
MONTH Nombre del mes alineado con blancos de hasta 9 caracteres de longitud.
MON Nombre del da abreviado a tres letras.
WW Nmero de la semana del ao.
IW Nmero de la semana del ao en ISO estndar.
DDD Nmero de da del ao. (1-366).
DD Nmero del da del mes (1-31).
D Nmero de da de la semana. (1-7).
DAY Nombre del da de la semana hasta 9 caracteres.
DY Nombre del da de la semana abreviado.
J Fecha en Juliano. Los nmeros especificados deben ser enteros.
AM PM Indicador de Meridiano.
A.M. P.M Indicador de Meridiano separado por puntos.
HH HH12 Hora del da (1-12).
HH24 Hora del da (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 parmetros de inicializacin:
NLS_DATE_LENGUAGE
NLS_TERRITORY
NLS_LANGUAGE

Ejemplos:
1).- Mostrar los das transcurridos desde el 1 de enero del 2000 hasta el da de hoy.
SELECT sysdate - TO_DATE('01012000', 'ddmmyyyy') FROM dual;

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

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


FROM temple ;

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

SELECT nomem, TO_CHAR(fecin, 'DD "de " Month "de " YYYY')
FROM temple
WHERE numde = 130 ;

Dep. de Informtica 21
I.E.S. TRASSIERRA - Crdoba SQL Plus

5.2.5.- Otras funciones.-

Funcin Sintaxis Descripcin


GREATEST GREATEST(exp [,exp2]...) Devuelve el mayor valor de una lista de
expresiones. Compara carcter a carcter. El tipo
de dato es siempre VARCHAR2..
LEAST LEAST(expr [,expr2]...) Devuelve el menor valor de una lista de
expresiones. Compara carcter a carcter. El tipo
de dato es siempre VARCHAR2..
NVL NVL(expr1,expr2) Indica el valor que ha de tener expr1 cuando en su
contenido aparezcan nulos. El tipo de dato que
retorna expr2 es siempre el mismo de expr1.
VSIZE VSIZE (expr) Devuelve el numero de bytes que ocupa la
representacin interna del dato.
DECODE DECODE (expr, val1, Dentro de una expresin evala los valores de la
cod1,.. valn, codn, codf) lista y los cambia por el cdigo correspondiente.

Ejemplos:

1).- Para cada empleado, listar el mayor valor (en orden alfabtico) de entre el apellido y el
nombre propio.

SELECT GREATEST( SUBSTR( nomem, 1, INSTR( nomem, ',' ) - 1 ),


SUBSTR( nomem, INSTR( nomem, ',' ) + 2 ) )
FROM temple ;

2).- Mostrar el nombre y nmero de hijos de todos los empleados. Pero si no tiene hijos, en
lugar de cero se mostrar "Sin hijos", y si tiene 3 se mostrar "Familia numerosa".

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


FROM temple ;

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

5.3.- FUNCIONES DE COLUMNA.-


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

Funcin Sintaxis Valor devuelto


AVG AVG(n) Media de n (ignorando los nulos)
COUNT COUNT(*/<Exp>) Nmero de filas de la consulta.
MAX MAX(<Exp>) Mximo valor de la expresin.
MIN MIN(<Exp>) Mnimo valor de la expresin.
STDEV STDEV(<Exp>) Desviacin tpica de la expresin ignorando los valores nulos.
SUM SUM(<Exp>) Suma de los valores de la expresin.
VARIANCE VARIANCE(<Exp>) Varianza de la expresin (ignorando nulos).

Dep. de Informtica 22
I.E.S. TRASSIERRA - Crdoba SQL Plus

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


funciones un valor Nulo. Esto puede ocurrir, por ejemplo, si el predicado de WHERE no es
satisfecho por ninguna fila.

Las funciones MAX y MIN admiten cualquier tipo de argumento, en COUNT no tiene
importancia el tipo de argumento, y en el resto de funciones los argumentos son numricos.

Las funciones de columna aceptan opcionalmente las clusulas DISTINCT y ALL:

DISTINCT: Hace que la funcin solo considere los distintos valores de la expresin.

ALL: Hace que la funcin considere todos los valores recuperados,


incluyendo duplicados. Es la opcin por defecto

Comprubese el distinto resultado de las siguientes sentencias:


SELECT COUNT(*) "Nmero de extensiones telefnicas"
FROM temple ;
SELECT COUNT(DISTINCT extel) "N de extensiones telefnicas distintas"
FROM temple ;

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

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

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

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


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

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

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

Para hallar la media teniendo en cuenta a todos los empleados, incluyendo los que tienen
comisin nula, podra escribirse:

SELECT SUM(comis) / COUNT(*)


FROM temple
WHERE numde = 112 ;

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

Dep. de Informtica 23
I.E.S. TRASSIERRA - Crdoba SQL Plus

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

SELECT COUNT(DISTINCT comis), AVG(comis)


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

3).- Hallar la media del nmero de hijos de los empleados del departamento 123.
SELECT AVG (numhi)
FROM temple
WHERE numde = 123 ;
Como este departamento no existe, el resultado es un valor nulo.

4).- Hallar la edad media, en aos de los empleados del departamento 110.
SELECT AVG( TRUNC ( MONTHS_BETWEEN(SYSDATE, fecna)/12 ) )
FROM temple
WHERE numde = 110 ;
Resultado:
AVG(TRUNC( MONTHS_BETWEEN(SYSDATE, fecna)/12 ) )
32,666667

La sentencia SELECT realiza los siguientes pasos:


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

5.4.- AGRUPAMIENTO DE FILAS.-


Las funciones de columna tal y como las hemos visto anteriormente operan sobre todos (o los
distintos) valores de una columna. A continuacin veremos cmo formar grupos de filas, para
que las funciones colectivas operen no sobre la totalidad sino sobre los distintos grupos,
devolviendo no un valor nico, sino una lista de valores (tantos como grupos se hayan formado).

GROUP BY.- Esta clusula permite formar grupos de filas segn un criterio determinado.
Su formato es:

GROUP BY col1 [, col2 [, ..] ]

Siendo col1, col2, .. las columnas de agrupamiento. De forma que las filas de la tabla se
agrupan en funcin de los valores idnticos de las columnas de agrupamiento. A estos efectos,
los valores nulos se consideran todos iguales, por lo que se incluyen en el mismo grupo.
Dep. de Informtica 24
I.E.S. TRASSIERRA - Crdoba SQL Plus

Una vez formados los grupos, para cada uno de ellos se evalan las expresiones de la clusula
SELECT, por lo que cada uno produce una fila en la tabla resultante de la consulta.
Si se utiliza GROUP BY, en la clusula SELECT solo pueden aparecer:
Constantes.
Funciones de columna
Columnas o expresiones incluidas en la clusula GROUP BY.
En la clusula GROUP BY puede contener cualquier columna de la tabla especificada en
FROM, sin importar que estn o no en la lista de la SELECT.

Ejemplos:
1).- Para cada departamento hallar el salario medio (con 2 decimales), el mnimo, el mximo y
la media aritmtica de estos dos ltimos.

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


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

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

2).- Hallar la edad en aos cumplidos del empleado mas viejo de cada departamento,
ordenado por nmero de departamento.

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


FROM temple
GROUP BY numde
ORDER BY 1;
Resultado:
NUMDE MAX( TRUNC(MONTHS_BETWEEN(sysdate, fecna)/12 ))
100 41
110 47
111 42
112 46
120 33
121 51
122 32
130 34

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

Dep. de Informtica 25
I.E.S. TRASSIERRA - Crdoba SQL Plus

HAVING.- Esta clusula es opcional y sirve para descartar grupos de filas. Su formato es:

HAVING <condicin>

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

La condicin es un predicado en el que las columnas que participen y no sean de


agrupamiento, debern figurar como argumentos de funciones colectivas.

Ejemplo:

Para los departamentos en los que el mayor salario de sus empleados supere los 2500 Euros,
listar su nmero y el mayor salario.

SELECT numde, MAX(salar)


FROM temple
GROUP BY numde
HAVING MAX(salar) > 2500 ;

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

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

5.5.- EJERCICIOS PROPUESTOS.-


1. Listar los nombres de los empleados y el resultado de dividir el cuadrado de sus salarios
entre la comisin.

2. Listar los nombres de los empleados que no tienen comisin, clasificados de manera que
aparezcan primero aquellos cuyos nombres son ms cortos.

3. Obtener en una nica columna los nombres propios y el apellido de todos los empleados
visualizando la primera letra del nombre y apellido en maysculas y el resto en
minsculas.

4. Obtener las fechas de ingreso, nombres y salarios de los empleados que hayan empezado
a trabajar en la empresa el ao 98 despus, por orden alfabtico.

5. Obtener por orden alfabtico los nombres de los empleados que han ingresado el 2-03-
99 en el da de hoy.

6. Segn el convenio colectivo, para los empleados con ms de un ao de servicio el


nmero de das de vacaciones anuales expresado en das laborables es de 20
incrementados en uno ms por cada tres aos de servicio cumplidos en el ao anterior.
Para los empleados que este ao cumplen 45 o ms aos de edad y tienen ms de un ao
de servicio. Hallar por orden alfabtico el nombre y el nmero de das de vacaciones
anuales que corresponde a cada uno.

7. Se desea analizar un plan de jubilacin anticipada para los empleados con 55 aos
cumplidos, en el que se ofrece una paga adicional extra de jubilacin equivalente al
salario actual de un mes por cada ao de servicio cumplido. Listar el nombre y cuanta
de esa paga extra de los empleados que este ao cumplen 55 ms aos.

8. Para los empleados de los departamentos 111 y 112 hallar por orden alfabtico: nombre,
edad en aos cumplidos en el da de hoy, y edad que tenan al ingresar en la empresa.

9. Para los empleados de los departamentos 110 y 112, listar su nombre, el nombre del mes
y da de su cumpleaos, por orden cronolgico.

10. Todos los empleados tienen un perodo de 6 meses despus de su ingreso antes de
firmar su contrato de empleo definitivo. Hallar para los empleados que este ao cumplen
menos de 40 aos de edad, por orden alfabtico: nombre y fecha de firma de su contrato
definitivo.

11. Amelia Dez y Octavio Garca, han decidido casarse. La boda se celebrar dentro de 2
das, y tomarn 20 das de vacaciones. La empresa har a cada uno un regalo de boda del
1% de su salario mensual actual por cada ao de servicio. Ha1lar: la fecha de la boda, la
fecha en que se incorporarn al trabajo y el regalo correspondiente a cada uno de ellos.

12. Hallar cuntos departamentos hay sin director en propiedad y el presupuesto anual
medio de todos ellos.

13. Para los departamentos 111 y 112 hallar la media de los aos de servicio de sus
empleados en el da de hoy.

Dep. de Informtica 27
I.E.S. TRASSIERRA - Crdoba SQL Plus

14. Hallar la masa salarial anual (salario ms comisin) de la empresa, suponiendo 14


pagas.

15. Hallar cuntos empleados han ingresado en el ao actual.

16. Hallar la diferencia entre el salario ms alto y el ms bajo.

17. Hallar la edad media en aos cumplidos de los empleados que tienen ms de 2 hijos.

18. Agrupando por departamento y n de hijos, hallar cuantos empleados hay en cada grupo.

19. Hallar el salario medio (con 2 decimales) y la edad media de los aos cumplidos (sin
decimales) para cada grupo de empleados con igual comisin y para los que no la
tengan.

20. Para los departamentos en los que hay algn empleado con salario superior a 2400
euros, hallar el nmero de empleados y la suma de sus salarios, comisiones y nmero
de hijos.

21. Para los departamentos en los que la antigedad media de Sus empleados supera a la de
la empresa, hallar el salario mnimo, el medio y el mximo.

22. Para cada departamento, hallar la media de la comisin con respecto a los empleados
que la reciben y con respecto al total de empleados.

23. Para cada extensin telefnica, hallar cuntos empleados la usan y el salario medio de stos.

24. Para cada departamento, hallar el nmero (cantidad) de extensiones telefnicas que
utiliza.

25. Para cada centro de trabajo, mostrar su nmero de centro y el presupuesto medio de los
departamentos dirigidos en propiedad y en funciones.

26. Para cada extensin telefnica y cada departamento, hallar cuntos empleados la usan y
el salario medio de stos.

27. Para cada departamento hallar nmero y su mayor nmero de extensin telefnica.

28. Agrupando por nmero de hijos, hallar la media por hijo del salario y la media por hijo
de comisin.

29. Para los departamentos cuyo salario medio supera al de la empresa, hallar cuntas
extensiones telefnicas tienen.

30. Para los departamentos en los que algn empleado tiene comisin, hallar cuantos
empleados con comisin hay en promedio por cada extensin telefnica.

Dep. de Informtica 28
I.E.S. TRASSIERRA - Crdoba SQL Plus

TEMA 6.- CONSULTAS SOBRE VARIAS TABLAS.-

6.1.- Consultas sobre varias tablas.


6.2.- Combinacin.
6.2.1.- Equireunin.
6.2.2.- Combinacin externa.
6.3.- Subconsultas.
6.4.- Correlacin.
6.5.- Operadores de conjunto.
6.5.1.- Unin.
6.5.2.- Interseccin.
6.5.3.- Resta.
6.6.- Ejercicios propuestos.

6.1.- CONSULTAS SOBRE VARIAS TABLAS.-

Las sentencias SELECT vistas hasta ahora devolvan datos de una nica tabla. An en el caso
de sentencias subordinadas, stas trataban la misma tabla que la sentencia principal.

En este tema veremos la posibilidad de tratar varias tablas en una sola consulta, para lo cual
basta con poner sus nombres detrs de FROM en la sentencia principal o en la subordinada.
En el primer caso el resultado se obtiene combinando datos de las tablas especificadas entre
s, mediante lo que se conoce como yuncin o producto cartesiano. En el segundo caso, si en
una sentencia subordinada se hace referencia a datos que devuelve la anterior, se dice que la
consulta es correlacionada.

Al trabajar con una nica tabla no ha sido necesario calificar las columnas, pues sus nombres
las identificaban sin ambigedad. Al trabajar con varias tablas podemos encontrar columnas
con el mismo nombre, en cuyo caso ser necesaria la calificacin de las columnas. Por otro
lado, los nombres de las tablas no suelen ser cmodos para calificar las columnas, por lo que
es aconsejable la calificacin de las tablas para acortar las calificaciones de columnas. Ser
necesario calificar las tablas cuando una misma tabla interviene dos veces en una yuncin.

6.2.- COMBINACIN.-

En teora relacional se define la reunin, combinacin o yuncin (join) como una operacin en
la que se combinan datos de distintas tablas. En SQL esta operacin se realiza con la sentencia
SELECT y sus clusulas FROM, y WHERE, donde los nombres de las tablas que intervienen
en la yuncin se especifican detrs de FROM.

Cuando se especifican dos o ms tablas, se forma una tabla fruto del producto cartesiano de
todas las especificadas. Es decir, que el nmero de columnas en esta tabla es igual a la suma
del nmero de columnas de las tablas de la lista, y el nmero de filas es el producto del

Dep. de Informtica 29
I.E.S. TRASSIERRA - Crdoba SQL Plus

nmero de filas que stas tienen. Como este ltimo nmero puede ser muy grande,
normalmente el SGBD no construir fsicamente esta tabla, pero a efectos de comprender
cmo se forma el resultado de la sentencia SELECT es como si as fuera.

La tabla resultante ser de poca utilidad si no se filtran las filas correctamente con la
clusula WHERE que establecer la condicin de la yuncin.

6.2.1.- Equireunin.-

El tipo de combinacin ms frecuente es la llamada equireunin (equi join), que devuelve filas
de dos o mas tablas basndose en una condicin de igualdad que permite 'conectar' las tuplas
de las tablas con un mismo valor en uno de sus campos, de esta forma la cardinalidad de la
tabla devuelta coincidir con la mayor cardinalidad de las tablas que intervienen.

Ejemplos:
1).- Listar los nombres de los departamentos con presupuesto superior a 60.000 euros, as
como el nombre de su centro de trabajo, clasificados por nombre de departamento.

SELECT D.nomde, C.nomce


FROM tcentr C, tdepto D
WHERE C.nunce = D.nunce AND D.presu > 60000
ORDER BY 1;

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

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


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

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

SELECT D1.nomde, D2.nomde


FROM tdepto D1, tdepto D2
WHERE D1.depde = D2.numde AND D2.presu < 30000
ORDER BY 1;

6.2.2.- Combinacin externa.-

Un caso especial de la yuncin es la combinacin externa (outer join) que amplifica el


resultado de una combinacin simple. Una combinacin externa recupera TODAS las filas de
la de la combinacin simple y tambin aquellas que no encuentren su correspondiente fila
pareja de una tabla a otra.

Dep. de Informtica 30
I.E.S. TRASSIERRA - Crdoba SQL Plus

Ejemplo:
1).- Seleccionar el nmero de departamento, el nombre de departamento y suma de los
salarios de sus empleados:

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


FROM temple E, tdepto D
WHERE E.numde = D.numde
GROUP BY D.numde, D.nomde
ORDER BY D.numde ;

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


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

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

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


FROM temple E, tdepto D
WHERE E.numde (+) = D.numde
GROUP BY D.numde, D.nomde
ORDER BY D.numde ;

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


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

E.numde = D.numde(+)

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 clusulas WHERE y
HAVING, y como parte de los predicados de comparacin, ANY, ALL, IN y EXISTS.

Una sentencia subordinada de otra puede a su vez tener otras subordinadas a ella. Se llama
sentencia externa a la primera sentencia SELECT de todas, es decir la que no es subordinada
de ninguna. Tambin se suele decir que estas sentencias estn anidadas en niveles: la externa
es la de primer nivel, sus inmediatas subordinadas las de segundo nivel, etc. El nmero de
niveles de anidamiento depende del SGBD, pero suelen ser superiores a 10. La sentencia
externa puede ser, en vez de una SELECT, una de las sentencias DELETE, INSERT o
UPDATE, que se describirn ms adelante.

Cuando hay sentencias anidadas, diremos que una sentencia es antecedente de otra cuando
sta es su subordinada directa, o subordinada de sus subordinadas a cualquier nivel.

Dep. de Informtica 31
I.E.S. TRASSIERRA - Crdoba SQL Plus

Todos los ejercicios vistos hasta ahora con sentencias subordinadas, se referan a la misma
tabla que la sentencia externa. Esto no tiene que ser as y en general cada clusula FROM, en
cualquier nivel de anidamiento, puede referirse a las tablas que se desee. Una subconsulta se
ejecuta una sola vez, independientemente de las filas que devuelve su antecedente directa.

Ejemplos:

1).- Si el departamento 122 est ubicado en la calle de Alcal, obtener por orden alfabtico los
nombres de sus empleados cuyo salario supere al salario medio de su departamento.

SELECT 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 seas LIKE '%ALCALA%') )
ORDER BY 1 ;

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

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

La consulta puede tambin formularse con dos niveles de anidamiento:

SELECT 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 D.numce = C.numce AND
seas LIKE '%ALCALA%' AND
numde = 122)
ORDER BY 1 ;

Dep. de Informtica 32
I.E.S. TRASSIERRA - Crdoba SQL Plus

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

SELECT nomde, AVG(salar)


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

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

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

6.4.- CORRELACIN.-

En los ejemplos vistos hasta ahora, las sentencias subordinadas no hacan referencia a
columnas de tablas que no estn en su propia clusula FROM. Esto significa que el resultado
de la sentencia subordinada puede evaluarse independientemente de sus sentencias
antecedentes en todos los niveles, inclusive la de nivel 1 sentencia externa. Por tanto el
SGBD la evala una sola vez y reemplaza los valores resultantes en el predicado donde se
encuentre.

No ocurre lo mismo con las sentencias subordinadas correlacionadas. Se llama as a las


sentencias subordinadas en las que se especifica alguna columna de una tabla mencionada en
la clusula FROM de alguna de sus sentencias antecedentes.

Una sentencia subordinada correlacionada no puede evaluarse independientemente de


las antecedentes, pues su resultado puede cambiar segn qu filas se consideren en la
evaluacin de stas en cada momento, por lo que el SGBD la evaluar mltiples veces.

Cuando en una sentencia subordinada se especifica un nombre de columna sin calificar, se


interpreta que se refiere a la primera tabla que, conteniendo una columna con este nombre, se
encuentre al buscar en el orden siguiente: primero, en las tablas de su propia sentencia FROM;
luego, en las de su sentencia antecedente inmediata; luego, en la antecedente de siguiente
nivel, etc., hasta llegar a la sentencia de nivel 1, inclusive.

Ejemplos:

1).- Obtener por orden alfabtico los nombres de los departamentos ubicados en la calle de
Atocha.

Dep. de Informtica 33
I.E.S. TRASSIERRA - Crdoba SQL Plus

No correlacionada:
SELECT nomde
FROM tdepto
WHERE numce IN ( SELECT numce
FROM tcentr
WHERE seas LIKE '%ATOCHA%' )
ORDER BY nomde;

Resultado:
NOMDE
DIRECC. COMERCIAL
SECTOR INDUSTRIAL
SECTOR SERVICIOS

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


columnas NUMCE y SEAS de la tabla TCENTR, que es la de su clusula FROM. Por tanto,
el SGBD la evala slo una vez y su resultado pasa a ser parte del predicado IN.

** Como ejercicio, el alumn@ deber realizar la misma consulta pero con yuncin y correlacin.

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

Consulta correlacionada:
SELECT nomde
FROM tdepto
WHERE presu < ( SELECT 0.5 * SUM (salar * 14)
FROM temple
WHERE numde = tdepto.numde )
ORDER BY nomde ;

En este ejemplo, la sentencia subordinada hace referencia a la columna numde de la tabla


tdepto, que est en la FROM de su sentencia antecedente. Por tanto es una sentencia
subordinada correlacionada. Hay que evaluarla para cada fila de tdepto, pues su resultado
puede ser diferente para distintas filas.

Resultado:
NOMDE
FINANZAS
PERSONAL
PROCESO DE DATOS
SECTOR INDUSTRIAL
SECTOR SERVICIOS

Tambin se puede formular esta consulta como una yuncin con agrupamiento:

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

Dep. de Informtica 34
I.E.S. TRASSIERRA - Crdoba SQL Plus

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

Consulta correlacionada sobre la misma tabla:

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

Que tambin se puede formular mediante yuncin y agrupamiento:

SELECT E1.nomem
FROM temple E1, temple E2
WHERE E1.numde = E2.numde
GROUP BY E1.numem, E1.nomem, E1.salar
HAVING E1.salar > AVG(E2.salar)
ORDER BY 1;

6.5.- OPERADORES DE CONJUNTO.-

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

SELECT <operador de conjunto> SELECT

Las sentencias SELECT deben tener el mismo nmero de columnas, y adems las
columnas que estn en la misma posicin relativa deben ser del mismo tipo aunque sus
longitudes pueden variar. Al unirlas se obtiene como resultado otra tabla con las mismas
columnas y tipos de datos que las que se unen, y con un nmero de filas que depender
del operador utilizado.

En estos operadores de conjunto va implcita la clusula DISTINCT. Los desarrollados por


Oracle son unin interseccin y resta:

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

6.5.1.- Operador UNION.-

El operador UNION devuelve todas las filas que han sido seleccionadas por las dos sentencias
SELECT que hacen de operandos.

Si ambos operandos se refieren a la misma tabla, el resultado es equivalente a realizar una sola
consulta con el operador OR.

Dep. de Informtica 35
I.E.S. TRASSIERRA - Crdoba SQL Plus

El resultado de la unin puede a su vez unirse con el de otra sentencia SELECT o con el de
otra unin. Pueden usarse parntesis para indicar el orden de evaluacin de las uniones. Si no
se usan parntesis, el orden de evaluacin es el de escritura. Para que el resultado se presente
en un orden determinado hay que usar la clusula ORDER BY en la ultima SELECT.

Si se aade la opcin ALL, la unin devolver todas las filas aunque estn duplicadas.

Ejercicio: ejecutar la siguiente sentencia, primero con UNION y despus con UNION ALL.
SELECT * FROM tdepto
UNION [ALL]
SELECT * FROM tdepto ;

Ejemplos:
1).- Listar alfabticamente los nombres de los empleados del departamento 112, sus sueldos
mensuales (salario + comisin) y el literal "Con comisin" o "Sin comisin", segn el caso.
SELECT nomem, salar, 'Sin comisin'
FROM temple
WHERE comis IS NULL AND numde = 112
UNION
SELECT nomem, salar+comis, 'Con comisin'
FROM temple
WHERE comis IS NOT NULL AND numde = 112
ORDER BY 1;
Resultado:
NOMEM SALAR 'SINCOMISIN
DIEZ, AMELIA 2224 Con comisin
GARCIA, OCTAVIO 2765 Con comisin
LASA, MARIO 2765 Con comisin
MARTIN, MICAELA 1082 Sin comisin
PEREZ, SABINA 863 Con comisin
TEROL, LUCIANO 2404 Con comisin
TORRES, HORACIO 1683 Con comisin

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

6.5.2.- Operador INTERSECT.-

Este operador devuelve las filas comunes que han sido seleccionadas por los comandos
SELECT sobre los que opera, esto es las filas que se encuentran en ambas tablas resultado de
las SELECT.
Si ambas sentencias SELECT se refieren a la misma tabla, el resultado es equivalente a
realizar una sola consulta con el operador AND.
Dep. de Informtica 36
I.E.S. TRASSIERRA - Crdoba SQL Plus

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

SELECT nomem, salar


FROM temple
WHERE numde = 112
INTERSECT
SELECT nomem, salar
FROM temple
WHERE salar > 2000 ;

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

6.5.3.- Operador MINUS.-

El operador MINUS devuelve las filas que habiendo sido devueltas por el primer SELECT, no
se encuentran en las devueltas por el segundo.

Ejemplo: Listar el nombre y salario de todos los empleados del departamento 112 salvo los
que no tengan hijos.

SELECT nomem, salar


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

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

6.6.- EJERCICIOS PROPUESTOS.-

1. Para los departamentos cuyo director lo sea en funciones, hallar el nmero de empleados
y la suma de sus salarios, comisiones y nmero de hijos.
2. A los empleados que son directores en funciones se les asignar una gratificacin del 5%
de su salario. Hallar por orden alfabtico los nombres de estos empleados y la
gratificacin correspondiente a cada uno de ellos.
3. Listar todos los datos de los departamentos cuyo centro de trabajo no exista en la tabla
TCENTR.
Dep. de Informtica 37
I.E.S. TRASSIERRA - Crdoba SQL Plus

4. Hallar si hay algn departamento que an no tenga empleados asignados ni director en


propiedad.
5. Listado alfabtico de los empleados que pertenecen a departamentos cuyo Director en
propiedad lo sea tambin en funciones de algn otro, excluyendo del resultado a los
directores.
6. Hallar (listando todos sus datos) si hay algn departamento que solo tenga como
empleado a su director en propiedad.
7. Comprobar que todos los empleados que son directores de departamento existen en la
tabla de empleados.
8. Para cada director, hallar por orden alfabtico su nombre y la suma de los salarios de los
empleados que estn directamente a su cargo (es decir, en los departamentos que l
dirige), en dos grupos separados segn sea en funciones o en propiedad.
9. Hallar, por orden alfabtico, los nombres de los departamentos cuyo presupuesto medio
por empleado supera a la media de sus salarios.
10. Para los empleados que trabajan en la calle de Atocha y comparten su extensin
telefnica con otro empleado con menor salario que ellos, hallar la suma de sus salarios
por departamento y el nombre de ste, por orden alfabtico.
11. Hallar el nmero de departamento y el salario mximo para los departamentos cuyo
salario mximo es menor que el salario medio de los empleados de todos los dems
departamentos.
12. Listar el nombre y nmero de departamento de los empleados no directores, pero solo de
aquellos departamentos de los que no dependen otros departamentos, ordenados por
nmero de departamento.
13. Para los departamentos ubicados en la calle de Alcal en los que haya algn empleado
con ms de 10 aos de antigedad y tales que la media de hijos por cada uno de estos
departamentos sea superior a 1, hallar el salario medio de estos empleados.
14. Hallar el salario medio y la edad media en aos de los empleados que tienen comisin y
los que no.
15. Para los empleados que no tienen comisin, obtener por orden alfabtico el nombre y el
cociente entre su salario y el nmero de hijos, pero si un empleado no tiene hijos, se
obtendr el salario sin ms, indicando este caso con un literal.
16. Hallar, por departamento, la masa salarial total (suma de todos los salarios y comisiones
del departamento) y el nombre, por orden alfabtico.
17. Nombre y masa salarial (suma de todos los salarios y comisiones) del departamento con
menor masa salarial.
18. Supongamos que algunos departamentos se van a trasladar a otro local. Disponemos de
una tabla llamada TTRASL con una sola columna llamada NUMDEP donde hay una fila
por cada departamento que se traslada al local nuevo. Se desea producir una lista por
orden alfabtico de todos los departamentos, indicando cules se trasladan y cules no.

Dep. de Informtica 38

Você também pode gostar