Documente Academic
Documente Profesional
Documente Cultură
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
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:
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 *
FROM temple ;
Ejemplo: Mostrar los nmeros de empleado de los empleados que son directores.
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.
SELECT numem
FROM scott.temple ;
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
SELECT *
FROM tdepto
WHERE numde = 110 ;
Resultado:
NUMDE NUMCE DIREC TIDIR PRESU DEPDE NOMDE
110 20 180 P 90000 100 DIRECCIN COMERCIAL
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:
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
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.-
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:
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:
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).
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.
Dep. de Informtica 6
I.E.S. TRASSIERRA - Crdoba SQL Plus
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.
Para realizar las bsquedas con LIKE se utilizan los caracteres comodines '%' y '_':
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'.
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.
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:
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.
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.
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
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>
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)
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.
Dep. de Informtica 11
I.E.S. TRASSIERRA - Crdoba SQL Plus
Los predicados vistos hasta ahora son simples. Los operadores lgicos 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.
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.
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.
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)
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.
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
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.
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
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:
Son aquellas que aceptan como entrada argumentos numricos y devuelven valores
numricos. Las msm importantes son:
Ejemplos:
1).- Listar los nombres y nmeros de departamento de los empleados que pertenecen a
departamentos pares.
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 ;
Estas funciones suelen manejar parmetros de tipo carcter y pueden devolver tanto un valor
de tipo carcter como un nmero.
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;
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 ;
Estas funciones operan con argumentos de tipo fecha y devuelven valores de tipo fecha, salvo
la funcin MONTHS_BETWEEN que devuelve un nmero.
Dep. de Informtica 17
I.E.S. TRASSIERRA - Crdoba SQL Plus
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
(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.
Dep. de Informtica 19
I.E.S. TRASSIERRA - Crdoba SQL Plus
En la funcin TO_DA TE para convertir un valor tipo carcter en un formato diferente del
formato por defecto.
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.
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
Ejemplos:
1).- Para cada empleado, listar el mayor valor (en orden alfabtico) de entre el apellido y el
nombre propio.
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".
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 ;
Dep. de Informtica 22
I.E.S. TRASSIERRA - Crdoba SQL Plus
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.
DISTINCT: Hace que la funcin solo considere los distintos valores de la expresin.
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.
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:
Resultado:
SUM(COMIS)/COUNT(*)
506,57143
Dep. de Informtica 23
I.E.S. TRASSIERRA - Crdoba SQL Plus
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
GROUP BY.- Esta clusula permite formar grupos de filas segn un criterio determinado.
Su formato es:
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.
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.
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.
Ejemplo:
Para los departamentos en los que el mayor salario de sus empleados supere los 2500 Euros,
listar su nmero 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 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
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.
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
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
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.
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.
3).- Hallar por orden alfabtico los nombres de los departamentos que dependen de los que
tienen un presupuesto inferior a 30000 euros.
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:
Para seleccionar la suma de salarios para todos los departamentos independientemente de que
tengan empleados o no, tendremos que utilizar un OUTER JOIN:
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.
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.
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.
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
** 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 ;
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.
SELECT nomem
FROM temple E
WHERE salar > (SELECT AVG(salar)
FROM temple
WHERE numde = E.numde)
ORDER BY nomem ;
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;
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:
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.
Son de especial utilidad cuando se trata de manipular tablas completas, componer vistas de
usuario, etc. Aunque tambin 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.
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 ;
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.
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 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
Dep. de Informtica 38