Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% encontró este documento útil (0 votos)
97 vistas50 páginas

Tema 4 BD

Descargar como pdf o txt
Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1/ 50

AVISO: Esta pgina ha sido generada para facilitar la impresin de los contenidos.

Los enlaces externos a otras


pginas no sern funcionales.

Realizacin de consultas.

Caso prctico
Una de las cosas ms importantes que ofrece una
base de datos es la opcin de poder consultar los
datos que guarda, por eso Ana y Juan van a intentar
sacar el mximo partido a las tablas que han
guardado y sobre ellas van a obtener toda aquella
informacin que su cliente les ha solicitado. Sabemos
que dependiendo de quin consulte la base de datos,
se debe ofrecer un tipo de informacin u otra. Es por
esto que deben crear distintas consultas y vistas.

Ana sabe que existen muchos tipos de operadores con los que puede "jugar" para
crear consultas y tambin tiene la posibilidad de crear campos nuevos donde podrn
hacer clculos e incluso trabajar con varias tablas relacionadas a la vez.

Actualmente estn con una base de datos en la que se ha almacenado informacin


sobre los empleados de la empresa que tiene la pgina de juegos online, los
departamentos en los que trabajan y los estudios de sus empleados. Se est
guardando el historial laboral y salarial de todos los empleados. Ya que tienen una
base de datos para sus clientes, han visto que tambin sera conveniente tener
registrada esta otra informacin interna de la empresa.

De este modo pueden llevar un control ms exhaustivo de sus empleados, salario y


especializacin. Podrn conocer cunto pagan en sueldos, que departamento es el
que posee mayor nmero de empleados, el salario medio, etc. Para obtener esta
informacin necesitarn consultar la base utilizando principalmente el comando
SELECT.

1.- Introduccin.

Caso prctico
Juan quiere comenzar con consultas bsicas a los datos, cosas bastante concretas y
sencillas de manera que se obtenga informacin relevante de cada una de las
tablas. Tambin quieren realizar algunos clculos como conocer el salario medio de
cada empleado, o el mayor salario de cada departamento, o saber cunto tiempo
lleva cada empleado en la empresa.
lleva cada empleado en la empresa.

En unidades anteriores has aprendido que SQL es un conjunto de sentencias u rdenes que se
necesitan para acceder a los datos. Este lenguaje es utilizado por la mayora de las aplicaciones
donde se trabaja con datos para acceder a ellos. Es decir, es la va de comunicacin entre el
usuario y la base de datos.

SQL naci a partir de la publicacin "A relational model of data for large shared data banks" de
Edgar Frank

Codd. IBM aprovech el modelo que planteaba Codd para desarrollar un lenguaje acorde con el
recin nacido modelo relacional, a este primer lenguaje se le llam SEQUEL (Structured English
QUEry Language). Con el tiempo SEQUEL se convirti en SQL (Structured Query Language).
En 1979, la empresa Relational Software sac al mercado la primera implementacin comercial
de SQL. Esa empresa es la que hoy conocemos como Oracle.

Actualmente SQL sigue siendo el estndar en lenguajes de acceso a base de datos


relacionales.

En 1992, ANSI e ISO completaron la estandarizacin de SQL y se denieron las sentencias


bsicas que deba contemplar SQL para que fuera estndar. A este SQL se le denomin ANSI-
SQL o SQL92.

Hoy en da todas las bases de datos comerciales cumplen con este estndar, eso s, cada
fabricante aade sus mejoras al lenguaje SQL.

La primera fase del trabajo


con cualquier base de datos
comienza con sentencias
DDL (en espaol Lenguaje de
Denicin de Datos), puesto
que antes de poder
almacenar y recuperar
informacin debimos denir
las estructuras donde agrupar
la informacin: las tablas.

La siguiente fase ser manipular los datos, es decir, trabajar con sentencias DML (en espaol
Lenguaje de Manipulacin de Datos). Este conjunto de sentencias est orientado a consultas y
manejo de datos de los objetos creados. Bsicamente consta de cuatro sentencias: SELECT,
INSERT, DELETE y UPDATE. En esta unidad nos centraremos en una de ellas, que es la
sentencia para consultas: SELECT.

Las sentencias SQL que se vern a continuacin pueden ser ejecutadas desde el entorno web
Application Express de Oracle utilizando el botn SQL en la pgina de inicio, y desplegando su
lista desplegable elegir Comandos SQL > Introducir Comando.

Tambin se pueden indicar las sentencias SQL desde el entorno de SQL*Plus que ofrece Oracle
y que puedes encontrar en Inicio > Todos los programas > Base de Datos Oracle Express
Edition > Ejecutar Lnea de Comandos SQL.
Si optas por abrir esa aplicacin (Ejecutar Lnea de
Comandos SQL), el primer paso que debe realizarse para
manipular los datos de una determinada tabla, es
conectarse utilizando un nombre de usuario con los
permisos necesarios para hacer ese tipo de operaciones a
la tabla deseada. Utiliza para ello la orden CONNECT
seguida del nombre de usuario. Posteriormente, solicitar la
contrasea correspondiente a dicho usuario.

Para ejecutar cualquiera de las sentencias SQL que aprenders en los siguientes puntos,
simplemente debes escribirla completa y pulsar Intro para que se inicie su ejecucin.

Autoevaluacin
Con qu sentencias se denen las estructuras donde agrupar la informacin, es
decir, las tablas?

DML.
DDL.
DCL.

2.- La sentencia SELECT.

Caso prctico
Ana est trabajando con la tabla Partidas, de aqu
quiere ver qu informacin es la ms importante, para
as crear las consultas ms sencillas pero a la vez
ms frecuentes. Sabe que con SQL y utilizando el
comando SELECT puede sacar provecho a los datos
contenidos en una tabla.

Cmo podemos seleccionar los datos que nos interesen dentro de una base de datos? Para
recuperar o seleccionar los datos, de una o varias tablas puedes valerte del lenguaje SQL, para
ello utilizars la sentencia SELECT, que consta de cuatro partes bsicas:

Clusula SELECT seguida de la descripcin de lo que se desea ver, es decir, de los


nombres de las columnas que quieres que se muestren separadas por comas simples (" ,
"). Esta parte es obligatoria.
Clusula FROM seguida del nombre de las tablas de las que proceden las columnas de
arriba, es decir, de donde vas a extraer los datos. Esta parte tambin es obligatoria.
Clusula WHERE seguida de un criterio de seleccin o condicin. Esta parte es opcional.
Clusula ORDER BY seguida por un criterio de ordenacin. Esta parte tambin es
opcional.

Por tanto, una primera sintaxis quedara de la siguiente forma:

SELECT [ALL | DISTINCT] columna1, columna2, ... FROM tabla1, tabla2, ... WHERE condicin

Recomendacin
Las clusulas ALL y DISTINCT son opcionales.

Si incluyes la clusula ALL despus de SELECT, indicars que quieres


seleccionar todas las las estn o no repetidas. Es el valor por defecto y no se
suele especicar.
Si incluyes la clusula DISTINCT despus de SELECT, se suprimirn aquellas
las del resultado que tengan igual valor que otras.

Autoevaluacin
Qu se debe indicar a continuacin de la clusula FROM?

Las columnas que queremos seleccionar.
Los criterios con los que ltro la seleccin.
Las tablas de donde se van a extraer los datos.
La ordenacin ascendente.

2.1.- Clusula SELECT.


Ya has visto que a continuacin de la sentencia SELECT debemos especicar cada una de las
columnas que queremos seleccionar. Adems, debemos tener en cuenta lo siguiente:

Se pueden nombrar a las columnas anteponiendo el nombre de la tabla de la que


proceden, pero esto es opcional y quedara: NombreTabla.NombreColumna

Si queremos incluir todas las columnas de una tabla podemos utilizar el comodn asterisco
("*"). Quedara as: SELECT * FROM NombreTabla;

Tambin podemos ponerle alias a los nombres de las columnas. Cuando se consulta una
base de datos, los nombres de las columnas se usan como cabeceras de presentacin. Si
ste resulta largo, corto o poco descriptivo, podemos usar un alias. Para ello a
continuacin del nombre de la columna ponemos entre comillas dobles el alias que demos
a esa columna. Veamos un ejemplo:

SELECT F_Nacimiento "Fecha de Nacimiento" FROM USUARIOS;

Tambin podemos sustituir el nombre de las columnas por


constantes, expresiones o funciones SQL. Un ejemplo:

SELECT 4*3/100 "MiExpresin", Password FROM


USUARIOS;

Para saber ms
Si quieres conocer algo ms sobre esta sentencia y ver algunos ejemplos del uso de
SELECT aqu tienes el siguiente enlace:

La clusula SELECT.

Ejercicio resuelto
Si quieres practicar algunos ejercicios puedes ayudar a Ana con algunas consultas.
Para ello te facilitamos las tablas que ha creado recientemente para la base de datos
con la que actualmente estn trabajando. En el siguiente documento tienes los datos
que te permitirn realizar algunos ejemplos de esta unidad. Recuerda que los
ejemplos irn apareciendo bajo el epgrafe Ejercicio Resuelto.

Tablas y registros para realizar algunos de los ejemplos. (0.001 MB)

Tambin tienes algunos datos incluidos para probar las distintas consultas que
crees. A partir de ahora nos referiremos a estos datos como tablas de la empresa
JuegosCA.

Por tanto lo primero que tienes que hacer es abrir el editor de SQL, para ello debes ir
a Base de Datos de Oracle 10g Express y a continuacin pulsar en Ejecutar Lnea
de Comandos SQL. Aparecer una pantalla donde tienes que realizar los siguientes
pasos:

1. Conectarte a travs de un usuario.


2. Ejecutar el archivo que has bajado, para ello debes escribir
@Ruta_donde_se_encuentra_el_archivo/BD04_CONT_R07_02.sql

En este ejercicio te pedimos que ejecutes el archivo y crees las tablas necesarias
para poder realizar ejercicios posteriores.

2.2.- Clusula FROM.

Al realizar la consulta o seleccin has visto que puedes elegir las columnas
que necesites, pero de dnde extraigo la informacin?

En la sentencia SELECT debemos establecer de dnde se obtienen las


columnas que vamos a seleccionar, para ello disponemos en la sintaxis de
la clusula FROM.

Por tanto, en la clusula FROM se denen los nombres de las tablas de las
que proceden las columnas.

Si se utiliza ms de una, stas deben aparecer separadas por comas. A


este tipo de consulta se denomina consulta combinada o join. Ms adelante
vers que para que la consulta combinada pueda realizarse, necesitaremos
aplicar una condicin de combinacin a travs de una clusula WHERE.

Tambin puedes aadir el nombre del usuario que es propietario de esas tablas, indicndolo de
la siguiente manera:

USUARIO.TABLA

de este modo podemos distinguir entre las tablas de un usuario y otro (ya que esas tablas
pueden tener el mismo nombre).

Tambin puedes asociar un alias a las tablas para abreviar, en este caso no es necesario que lo
encierres entre comillas.

Pongamos un ejemplo:

SELECT * FROM USUARIOS U;

2.3.- Clusula WHERE.


Podramos desear seleccionar los datos de una tabla que cumplan una
determinada condicin? Hasta ahora hemos podido ver la sentencia
SELECT para obtener todas o un subconjunto de columnas de una o
varias tablas. Pero esta seleccin afectaba a todas las las (registros) de
la tabla. Si queremos restringir esta seleccin a un subconjunto de las
debemos especicar una condicin que deben cumplir aquellos registros
que queremos seleccionar. Para poder hacer esto vamos a utilizar la
clusula WHERE.

A continuacin de la palabra WHERE ser donde pongamos la condicin


que han de cumplir las las para salir como resultado de dicha consulta.

El criterio de bsqueda o condicin puede ser ms o menos sencillo y


para crearlo se pueden conjugar operadores de diversos tipos, funciones o expresiones ms o
menos complejas.

Si en nuestra tabla USUARIOS, necesitramos un listado de los usuarios que son mujeres,
bastara con crear la siguiente consulta:

SELECT nombre, apellidos FROM


USUARIOS WHERE sexo = 'M';

Ms adelante te mostraremos los operadores con los que podrs crear condiciones de diverso
tipo.

Para saber ms
Aqu te adelantamos los operadores para que vayas conocindolos. Con ellos
trabajars cuando hayas adquirido algunos conocimientos ms:

Operadores SQL

2.4.- Ordenacin de registros. Clusula


ORDER BY.

En la consulta del ejemplo anterior hemos obtenido una lista de nombres y apellidos de las
usuarias de nuestro juego. Sera conveniente que aparecieran ordenadas por apellidos, ya que
siempre quedar ms profesional adems de ms prctico. De este modo, si necesitramos
localizar un registro concreto la bsqueda sera ms rpida. Cmo lo haremos? Para ello
usaremos la clusula ORDER BY.

ORDER BY se utiliza para especicar el criterio de ordenacin de la respuesta a nuestra


consulta. Tendramos:
SELECT [ALL | DISTINCT] columna1, columna2, ... FROM
tabla1, tabla2, ... WHERE condicin1, condicin2, ... ORDER
BY columna1 [ASC | DESC], columna2 [ASC | DESC], ,
columnaN [ASC | DESC];

Despus de cada columna de ordenacin se puede incluir el tipo de


ordenacin (ascendente o descendente) utilizando las palabras
reservadas ASC o DESC. Por defecto, y si no se pone nada, la
ordenacin es ascendente.

Debes saber que es posible ordenar por ms de una columna. Es ms, puedes ordenar no solo
por columnas sino a travs de una expresin creada con columnas, una constante (aunque no
tendra mucho sentido) o funciones SQL.

En el siguiente ejemplo, ordenamos por apellidos y en caso de empate por nombre:

SELECT nombre, apellidos FROM USUARIOS


ORDER BY apellidos, nombre;

Puedes colocar el nmero de orden del campo por el que quieres que se ordene en lugar de su
nombre, es decir, referenciar a los campos por su posicin en la lista de seleccin. Por ejemplo,
si queremos el resultado del ejemplo anterior ordenado por localidad:

SELECT nombre, apellidos, localidad FROM usuarios


ORDER BY 3;

Si colocamos un nmero mayor a la cantidad de campos de la lista de seleccin, aparece un


mensaje de error y la sentencia no se ejecuta.

Se puede utilizar cualquier tipo de datos para ordenar? No todos los tipos de campos te
servirn para ordenar, nicamente aquellos de tipo carcter, nmero o fecha.

Autoevaluacin
Relaciona cada clusula de la sentencia SELECT con la informacin que debe
seguirle:
Ejercicio de relacionar Clusula Relacin Informacin que le sigue.
WHERE 1. Ordenacin.

ORDER BY 2. Columnas.

FROM 3. Tablas.

SELECT 4. Condiciones.

Ejercicio resuelto
Utilizando las tablas y datos de la empresa JuegosCA descargados anteriormente,
vamos a realizar una consulta donde obtengamos de la tabla ESTUDIOS, DNI de los
empleados ordenados por Universidad descendente y ao de manera ascendente.

SELECT EMPLEADO_DNI FROM ESTUDIOS


ORDER BY UNIVERSIDAD DESC, AO;

3.- Operadores.

Caso prctico
En el proyecto en el que actualmente trabajan Ana y Juan,
tendrn que realizar consultas que cumplan unos criterios
concretos, por ejemplo, obtener el nmero de jugadores
que tienen cierto nmero de crditos o aquellos que son
mujeres e incluso conocer el nmero de usuarios que son
de una provincia y adems sean hombres.

Para poder realizar este tipo de consultas necesitaremos


utilizar operadores que sirvan para crear las expresiones
necesarias. Ana y Juan conocen los 4 tipos de operadores
con los que se puede trabajar: relacionales, aritmticos, de concatenacin y lgicos.

Veamos que en la clusula WHERE podamos incluir expresiones para ltrar el conjunto de
datos que queramos obtener. Para crear esas expresiones necesitas utilizar distintos
operadores de modo que puedas comparar, utilizar la lgica o elegir en funcin de una suma,
resta, etc.

Los operadores son smbolos que permiten realizar operaciones matemticas, concatenar
cadenas o hacer comparaciones.

Oracle reconoce 4 tipos de operadores:

1. Relacionales o de comparacin.
2. Aritmticos.
3. De concatenacin.
4. Lgicos.

Cmo se utilizan y para qu sirven? En los siguientes apartados responderemos a estas


cuestiones.

Para saber ms
Si quieres conocer un poco ms sobre los operadores visita este enlace:

Operadores.

3.1.- Operadores de comparacin.

Los puedes conocer con otros nombres como relacionales, nos


permitirn comparar expresiones, que pueden ser valores concretos de
campos, variables, etc.

Los operadores de comparacin son smbolos que se usan como su


nombre indica para comparar dos valores. Si el resultado de la
comparacin es correcto la expresin considerada es verdadera, en
caso contrario es falsa.

Tenemos los siguientes operadores y su operacin:

Operadores y su signicado. OPERADOR SIGNIFICADO


= Igualdad.

!=, < >, ^= Desigualdad.

< <

> Mayor que.

<= Menor o igual que.

>= Mayor o igual que.

IN Igual que cualquiera de los miembros entre parntesis.

NOT IN Distinto que cualquiera de los miembros entre parntesis.

BETWEEN Entre. Contenido dentro del rango.

NOT
Fuera del rango.
BETWEEN

Se utiliza sobre todo con textos y permite obtener columnas cuyo valor en un
LIKE campo cumpla una condicin textual. Utiliza una cadena que puede contener
'_abc%' los smbolos "%" que sustituye a un conjunto de caracteres o "_" que sustituye
a un carcter.

IS NULL Devuelve verdadero si el valor del campo de la la que examina es nulo.

El valor NULL signicaba valor inexistente o desconocido y por tanto es tratado de


forma distinta a otros valores. Si queremos vericar que un valor es NULL no sern
validos los operadores que acabamos de ver. Debemos utilizar los valores IS NULL
como se indica en la tabla o IS NOT NULL que devolver verdadero si el valor del
campo de la la no es nulo.

Adems, cuando se utiliza un ORDER BY, los valores NULL se presentarn en


primer lugar si se emplea el modo ascendente y al nal si se usa el descendente.

Si queremos obtener aquellos empleados cuyo salario es superior a 1000 podemos crear la
siguiente consulta:

SELECT nombre FROM EMPLEADOS WHERE SALARIO > 1000; Ahora queremos
aquellos empleados cuyo apellido comienza por R: SELECT nombre FROM EMPLEADOS
WHERE APELLIDO1 LIKE 'R %';

Ejercicio resuelto
Utilizando las tablas y datos de la empresa JuegosCA descargados anteriormente,
vamos a realizar una consulta donde obtengamos las universidades de Sevilla o
Cdiz.

SELECT UNIV_COD, NOMBRE_UNIV FROM UNIVERSIDADES WHERE CIUDAD IN (


ciudades que coincidan textualmente con las que ponemos entre comillas.

Para saber ms
Los operadores que se utilizan en MySQL puedes verlos en el siguiente enlace:

Operadores de comparacin en MySQL.

3.2.- Operadores aritmticos y de


concatenacin.

Aprendimos que los operadores son smbolos que permiten realizar distintos tipos de
operaciones. Los operadores aritmticos permiten realizar clculos con valores numricos. Son
los siguientes:

Operadores aritmticos y su signicado. OPERADOR SIGNIFICADO


+ Suma

- Resta

* Multiplicacin

/ Divisin
Utilizando expresiones con operadores es posible obtener salidas en
las cuales una columna sea el resultado de un clculo y no un campo
de una tabla.

Mira este ejemplo en el que obtenemos el salario aumentado en un 5%


de aquellos empleados que cobran menos de 1000:

SELECT SALARIO*1,05 FROM


EMPLEADOS WHERE SALARIO<=1000;

Cuando una expresin aritmtica se calcula sobre valores NULL, el resultado es el propio valor
NULL.

Para concatenar cadenas de caracteres existe el operador de concatenacin (" | | "). Oracle
puede convertir automticamente valores numricos a cadenas para una concatenacin.

En la tabla EMPLEADOS tenemos separados en dos campos el primer y segundo apellido de


los empleados, si necesitramos mostrarlos juntos podramos crear la siguiente consulta:

SELECT Nombre, Apellido1 || Apellido2 FROM


EMPLEADOS;

Si queremos dejar un espacio entre un apellido y otro, debemos concatenar tambin el espacio
en blanco de la siguiente manera:

SELECT Nombre, Apellido1 || ' ' ||Apellido2 FROM EMPLEADOS;

Para saber ms
Los operadores que se utilizan en MySQL puedes verlos en el siguiente enlace:

Operadores aritmticos en MySQL.

3.3.- Operadores lgicos.

Habr ocasiones en las que tengas que evaluar ms de una expresin y necesites vericar que
se cumple una nica condicin, otras veces comprobar si se cumple una u otra o ninguna de
ellas. Para poder hacer esto utilizaremos los operadores lgicos.

Tenemos los siguientes:

Operadores lgicos y su signicado. OPERADOR SIGNIFICADO


AND Devuelve verdadero si sus expresiones a derecha e izquierda son ambas verdaderas.

Devuelve verdadero si alguna de sus expresiones a derecha o izquierda son


OR
verdaderas.

Invierte la lgica de la expresin que le precede, si la expresin es verdadera


NOT
devuelve falsa y si es falsa devuelve verdadera.

Fjate en los siguientes ejemplos:

Si queremos obtener aquellos empleados en cuyo historial salarial tengan


sueldo menor o igual a 800 o superior a 2000:

SELECT empleado_dni FROM HISTORIAL_SALARIAL


WHERE salario<=800 OR salario>2000;

Ejercicio resuelto
Utilizando las tablas y datos de la empresa JuegosCA descargados anteriormente,
vamos a realizar una consulta donde obtengamos todos nombres de trabajos menos
el de contable.

SELECT NOMBRE_TRAB FROM TRABAJOS WHERE


NOMBRE_TRAB NOT IN ('CONTABLE');
3.4.- Precedencia.

Con frecuencia utilizaremos la sentencia SELECT acompaada de


expresiones muy extensas y resultar difcil saber que parte de dicha
expresin se evaluar primero, por ello es conveniente conocer el orden de
precedencia que tiene Oracle:

1. Se evala la multiplicacin (*) y la divisin (/) al mismo nivel.


2. A continuacin sumas (+) y restas (-).
3. Concatenacin (| |).
4. Todas las comparaciones (<, >, ).
5. Despus evaluaremos los operadores IS NULL, IN NOT NULL, LIKE,
BETWEEN.
6. NOT.
7. AND.
8. OR.

Si quisiramos variar este orden necesitaramos utilizar parntesis.

Autoevaluacin
En la siguiente consulta:

SELECT APELLIDOS FROM JUGADORES


WHERE APELLIDOS LIKE 'A%S%';

Qu estaramos seleccionando?

Aquellos jugadores cuyos apellidos contienen la letra A y la S.
Aquellos jugadores cuyos apellidos comienzan por la letra A y contienen la letra S.
Aquellos jugadores cuyos apellidos no contienen ni la letra A ni la S.
Todos los apellidos de todos los jugadores menos los que su apellido comienza por
S.

Para saber ms
Tambin tenemos orden de precedencia en MySQL:

Precedencia en MySQL.

4.- Consultas calculadas.


Caso prctico
A la empresa ha llegado Carlos que est en fase de
prcticas y como anda un poco desubicado ha
comenzado su trabajo revisando la teora y prctica
que han dado en clase. No recuerda bien como se
creaban campos nuevos a partir de otros ya existentes
en la base de datos. Sabe que es algo sencillo pero no
quiere meter la pata ya que est ayudando a Juan en
un proyecto que acaba de entrar.

Lo que har ser practicar a partir de una tabla que tenga bastantes campos
numricos de manera que pueda manipular la informacin sin modicar nada.

En clase trabajaban con la tabla ARTICULOS que tena, entre otros, los campos
Precio y Cantidad. A partir de ellos podra realizar consultas calculadas para obtener
el precio con IVA incluido, un descuento sobre el precio e incluso aumentar ese
precio en un porcentaje concreto. Seguro que se pone al da rpidamente.

En algunas ocasiones es interesante realizar operaciones con algunos campos para obtener
informacin derivada de stos. Si tuviramos un campo Precio, podra interesarnos calcular el
precio incluyendo el IVA o si tuviramos los campos Sueldo y Paga Extra, podramos necesitar
obtener la suma de los dos campos. Estos son dos ejemplos simples pero podemos construir
expresiones mucho ms complejas. Para ello haremos uso de la creacin de campos
calculados.

Los operadores aritmticos se pueden utilizar para hacer clculos en las consultas.

Estos campos calculados se obtienen a travs de la sentencia SELECT poniendo a continuacin


la expresin que queramos. Esta consulta no modicar los valores originales de las columnas
ni de la tabla de la que se est obteniendo dicha consulta, nicamente mostrar una columna
nueva con los valores calculados. Por ejemplo:

SELECT Nombre, Credito, Credito + 25 FROM


USUARIOS;

Con esta consulta hemos creado un campo que tendr como nombre la expresin utilizada.
Podemos ponerle un alias a la columna creada aadindolo detrs de la expresin junto con la
palabra AS. En nuestro ejemplo quedara de la siguiente forma:

SELECT Nombre, Credito, Credito + 25 AS CreditoNuevo FROM USUARIOS;


Autoevaluacin
Los campos calculados pueden ir en:
La clusula SELECT.
La clusula WHERE.
La clusula FROM.

5.- Funciones.

Caso prctico
Juan le ha pedido a Ana que calcule la edad actual de los
usuarios que tienen registrados en la base de datos pues
sera interesante realizar estadsticas mensuales sobre los
grupos de edad que acceden al sistema y en funcin de ello
obtener algunos resultados interesantes para la empresa.
Para realizar el clculo de la edad tendramos que echar
mano a funciones que nos ayuden con los clculos. Existen
funciones que nos facilitarn la tarea y nos ayudarn a
obtener informacin que de otro modo resultara
complicado.

Has pensado en todas las operaciones que puedes realizar con los datos que guardas en una
base de datos? Seguro que son muchsimas. Pues bien, en casi todos los Sistemas Gestores
de Base de Datos existen funciones ya creadas que facilitan la creacin de consultas ms
complejas. Dichas funciones varan segn el SGBD, veremos aqu las que utiliza Oracle.

Las funciones son realmente operaciones que se realizan sobre los datos y que realizan un
determinado clculo. Para ello necesitan unos datos de entrada llamados parmetros o
argumentos y en funcin de stos, se realizar el clculo de la funcin que se est utilizando.
Normalmente los parmetros se especican entre parntesis.

Las funciones se pueden incluir en las clusulas SELECT, WHERE y ORDER BY.

Las funciones se especican de la siguiente manera:

NombreFuncin [(parmetro1, [parmetro2, )]


Puedes anidar funciones dentro de funciones.

Existe una gran variedad para cada tipo de datos:

numricas,
de cadena de caracteres,
de manejo de fechas,
de conversin,
otras

Oracle proporciona una tabla con la que podemos hacer pruebas, esta tabla se llama
Dual y contiene un nico campo llamado DUMMY y una sola la.

Podremos utilizar la tabla Dual en algunos de los ejemplos que vamos a ver en los siguientes
apartados.

5.1.- Funciones numricas.

Cmo obtenemos el cuadrado de un nmero o su valor


absoluto? Nos referimos a valores numricos y por tanto
necesitaremos utilizar funciones numricas.

Para trabajar con campos de tipo nmero tenemos las siguientes


funciones:

ABS(n)
Calcula el valor absoluto de un nmero n.

Ejemplo:

SELECT ABS(-17) FROM DUAL; -- Resultado: 17

EXP(n)
Calcula n , es decir, el exponente en base e del nmero n.

Ejemplo:

SELECT EXP(2) FROM DUAL; -- Resultado: 7,38

CEIL(n)
Calcula el valor entero inmediatamente superior o igual al argumento n.
Ejemplo:

SELECT CEIL(17.4) FROM DUAL; -- Resultado: 18

FLOOR(n)
Calcula el valor entero inmediatamente inferior o igual al parmetro n.

Ejemplo:

SELECT FLOOR(17.4) FROM DUAL; -- Resultado: 17

MOD(m,n)
Calcula el resto resultante de dividir m entre n.

Ejemplo:

SELECT MOD(15, 2) FROM DUAL; --Resultado: 1

POWER(valor, exponente)
Eleva el valor al exponente indicado.

Ejemplo:

SELECT POWER(4, 5) FROM DUAL; -- Resultado: 1024

ROUND(n, decimales)
Redondea el nmero n al siguiente nmero con el nmero de decimales que se indican.

Ejemplo:

SELECT ROUND(12.5874, 2) FROM DUAL; -- Resultado: 12.59

SQRT(n)
Calcula la raz cuadrada de n.

Ejemplo:
SELECT SQRT(25) FROM DUAL; --Resultado: 5

TRUNC(m,n)
Trunca un nmero a la cantidad de decimales especicada por el segundo argumento. Si
se omite el segundo argumento, se truncan todos los decimales. Si "n" es negativo, el
nmero es truncado desde la parte entera.

Ejemplos:

SELECT TRUNC(127.4567, 2) FROM DUAL; -- Resultado: 127.45

SELECT TRUNC(4572.5678, -2) FROM DUAL; -- Resultado: 4500

SELECT TRUNC(4572.5678, -1) FROM DUAL; -- Resultado: 4570

SELECT TRUNC(4572.5678) FROM DUAL; -- Resultado: 4572

SIGN(n)
Si el argumento "n"es un valor positivo, retorna 1, si es negativo, devuelve -1 y 0 si es 0.

SELECT SIGN(-23) FROM DUAL; Resultado: -1

Para saber ms
Aqu encontrars las funciones que has visto y algunas ms.

Ms funciones numricas.

5.2.- Funciones de cadena de caracteres.

Ya vers como es muy comn manipular campos de tipo carcter o


cadena de caracteres. Como resultado podremos obtener caracteres o
nmeros. Estas son las funciones ms habituales:

CHR(n)
Devuelve el carcter cuyo valor codicado es n.

Ejemplo:

SELECT CHR(81) FROM DUAL; --Resultado: Q

ASCII(n)
Devuelve el valor ASCII de n.

Ejemplo:

SELECT ASCII('O') FROM DUAL; --Resultado: 79

CONCAT(cad1, cad2)
Devuelve las dos cadenas unidas. Es equivalente al operador ||

Ejemplo:

SELECT CONCAT('Hola', 'Mundo') FROM DUAL; --Resultado: HolaMundo

LOWER(cad)
Devuelve la cadena cad con todos sus caracteres en minsculas.

Ejemplo:
SELECT LOWER('En MInsculAS') FROM DUAL; --Resultado: en minsculas

UPPER(cad)
Devuelve la cadena cad con todos sus caracteres en maysculas.

Ejemplo:

SELECT UPPER('En MAysculAS') FROM DUAL; --Resultado: EN MAYSCULAS

INITCAP(cad)
Devuelve la cadena cad con su primer carcter en mayscula.

Ejemplo:

SELECT INITCAP('hola') FROM DUAL; --Resultado: Hola

LPAD(cad1, n, cad2)
Devuelve cad1 con longitud n, ajustada a la derecha, rellenando por la izquierda con cad2.

Ejemplo:

SELECT LPAD('M', 5, '*') FROM DUAL; --Resultado: ****M

RPAD(cad1, n, cad2)
Devuelve cad1 con longitud n, ajustada a la izquierda, rellenando por la derecha con cad2.

Ejemplo:

SELECT RPAD('M', 5, '*') FROM DUAL; --Resultado: M****

REPLACE(cad, ant, nue)


Devuelve cad en la que cada ocurrencia de la cadena ant ha sido sustituida por la cadena
nue.

Ejemplo:

SELECT REPLACE('correo@gmail.es', 'es', 'com') FROM DUAL; --Resultado: correo@gm


SUBSTR(cad, m, n)
Devuelve la cadena cad compuesta por n caracteres a partir de la posicin m.

Ejemplo:

SELECT SUBSTR('1234567', 3, 2) FROM DUAL; --Resultado: 34

LENGTH(cad)
Devuelve la longitud de cad.

Ejemplo:

SELECT LENGTH('hola') FROM DUAL; --Resultado: 4

TRIM(cad)
Elimina los espacios en blanco a la izquierda y la derecha de cad y los espacios dobles del
interior.

Ejemplo:

SELECT TRIM(' Hola de nuevo ') FROM DUAL; --Resultado: Hola de nuevo

LTRIM(cad)
Elimina los espacios a la izquierda que posea cad.

Ejemplo:

SELECT LTRIM(' Hola') FROM DUAL; --Resultado: Hola

RTRIM(cad)
Elimina los espacios a la derecha que posea cad.

Ejemplo:

SELECT RTRIM('Hola ') FROM DUAL; --Resultado: Hola

INSTR(cad, cadBuscada [, posInicial [, nAparicin]])


Obtiene la posicin en la que se encuentra la cadena buscada en la cadena inicial cad. Se
puede comenzar a buscar desde una posicin inicial concreta e incluso indicar el nmero
de aparicin de la cadena buscada. Si no encuentra nada devuelve cero.

Ejemplo:

SELECT INSTR('usuarios', 'u') FROM DUAL; --Resultado: 1 SELECT INSTR('usuarios',


'u', 2) FROM DUAL; --Resultado: 3 SELECT INSTR('usuarios', 'u', 2, 2) FROM DUAL; --
Resultado: 0

Autoevaluacin
En la siguiente consulta: SELECT LENGTH("Adis") FROM DUAL; qu
obtendramos?

5
4
6
Nos devolvera un error.

5.3.- Funciones de manejo de fechas.

La fecha de emisin de una factura, de llegada de un avin, de


ingreso en una web, podramos seguir poniendo innidad de
ejemplos, lo que signica que es una informacin que se requiere
en muchas situaciones y es importante guardar.

En los SGBD se utilizan mucho las fechas. Oracle tiene dos tipos
de datos para manejar fechas, son DATE y TIMESTAMP.

DATE almacena fechas concretas incluyendo a veces la


hora.
TIMESTAMP almacena un instante de tiempo ms concreto que puede incluir hasta
fracciones de segundo.

Podemos realizar operaciones numricas con las fechas:

Le podemos sumar nmeros y esto se entiende como sumarles das, si ese nmero tiene
decimales se suman das, horas, minutos y segundos.
La diferencia entre dos fechas tambin nos dar un nmero de das.

En Oracle tenemos las siguientes funciones ms comunes:

SYSDATE Devuelve la fecha y hora actuales. Ejemplo: SELECT SYSDATE FROM DUAL;
--Resultado: 26/07/11

SYSTIMESTAMP Devuelve la fecha y hora actuales en formato TIMESTAMP. Ejemplo:


SELECT SYSTIMESTAMP FROM DUAL; --Resultado: 26-JUL-11 08.32.59,609000 PM
+02:00

ADD_MONTHS(fecha, n) Aade a la fecha el nmero de meses indicado con n. Ejemplo:


SELECT ADD_MONTHS('27/07/11', 5) FROM DUAL; --Resultado: 27/12/11

MONTHS_BETWEEN(fecha1, fecha2) Devuelve el nmero de meses que hay entre


fecha1 y fecha2. Ejemplo: SELECT MONTHS_BETWEEN('12/07/11','12/03/11') FROM
DUAL; --Resultado: 4

LAST_DAY(fecha) Devuelve el ltimo da del mes al que pertenece la fecha. El valor


devuelto es tipo DATE. Ejemplo: SELECT LAST_DAY('27/07/11') FROM DUAL; --
Resultado: 31/07/11

NEXT_DAY(fecha, d) Indica el da que corresponde si aadimos a la fecha el da d. El da


devuelto puede ser texto ('Lunes', Martes', ..) o el nmero del da de la semana (1=lunes,
2=martes, ..) dependiendo de la conguracin. Ejemplo: SELECT
NEXT_DAY('31/12/11','LUNES') FROM DUAL; --Resultado: 02/01/12

EXTRACT(valor FROM fecha) Extrae un valor de una fecha concreta. El valor puede ser
day, month, year, hours, etc. Ejemplo: SELECT EXTRACT(MONTH FROM SYSDATE)
FROM DUAL; --Resultado: 7

En Oracle: Los operadores aritmticos "+" (ms) y "-" (menos) pueden emplearse para las
fechas. Por ejemplo:

SELECT SYSDATE 5;

Devolvera la fecha correspondiente a 5 das antes de la fecha actual.

Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo
fecha.
Autoevaluacin
Cules de estas armaciones sobre funciones de manejo de fechas son ciertas?
Existen dos tipos de fechas de datos con las que podemos trabajar, DATE y
TIMESTAMP.
Se puede poner como argumento el nombre de un campo de cualquier tipo.
Le podemos sumar o restar nmeros, lo cual se entiende como sumarle o restarle
das.
La diferencia entre dos fechas nos dar un nmero de das.

5.4.- Funciones de conversin.

Los SGBD tienen funciones que pueden pasar de un tipo de dato


a otro. Oracle convierte automticamente datos de manera que el
resultado de una expresin tenga sentido. Por tanto, de manera
automtica se pasa de texto a nmero y al revs. Ocurre lo
mismo para pasar de tipo texto a fecha y viceversa. Pero existen
ocasiones en que queramos realizar esas conversiones de modo
explcito, para ello contamos con funciones de conversin.

TO_NUMBER(cad, formato) Convierte textos en nmeros.


Se suele utilizar para dar un formato concreto a los nmeros. Los formatos que podemos
utilizar son los siguientes:

Formatos para nmeros y su signicado. Smbolo Signicado


Posiciones numricas. Si el nmero que se quiere visualizar contiene menos dgitos de
9
los que se especican en el formato, se rellena con blancos.

0 Visualiza ceros por la izquierda hasta completar la longitud del formato especicado.

$ Antepone el signo de dlar al nmero.

Coloca en la posicin donde se incluya, el smbolo de la moneda local (se puede


L
congurar en la base de datos mediante el parmetro NSL_CURRENCY)

S Aparecer el smbolo del signo.

D Posicin del smbolo decimal, que en espaol es la coma.

G Posicin del separador de grupo, que en espaol es el punto.

TO_CHAR(d, formato) Convierte un nmero o fecha d a cadena de caracteres, se utiliza


normalmente para fechas ya que de nmero a texto se hace de forma implcita como
hemos visto antes.
TO_DATE( cad, formato) Convierte textos a fechas. Podemos indicar
el formato con el que queremos que aparezca.

Para las funciones TO_CHAR y TO_DATE, en el caso de fechas,


indicamos el formato incluyendo los siguientes smbolos:

Formatos para fechas y su signicado. Smbolo Signicado


YY Ao en formato de dos cifras

YYYY Ao en formato de cuatro cifras

MM Mes en formato de dos cifras

MON Las tres primeras letras del mes

MONTH Nombre completo del mes

DY Da de la semana en tres letras

DAY Da completo de la semana

DD Da en formato de dos cifras

D Da de la semana del 1 al 7

Q Semestre

WW Semana del ao

AM Indicador a.m.
PM Indicador p.m.

HH12 Hora de 1 a 12
HH24 Hora de 0 a 23

MI Minutos de 0 a 59

SS Segundos dentro del minuto


SSSS Segundos dentro desde las 0 horas

5.5.- Otras funciones: NVL y DECODE.

Recuerdas que era el valor NULL? Cualquier columna de una


tabla poda contener un valor nulo independientemente al tipo de
datos que tuviera denido. Eso s, esto no era as en los casos en
que denamos esa columna como no nula (NOT NULL), o que
fuera clave primaria (PRIMARY KEY).

Cualquier operacin que se haga con un valor NULL devuelve un


NULL. Por ejemplo, si se intenta dividir por NULL, no nos
aparecer ningn error sino que como resultado obtendremos un
NULL (no se producir ningn error tal y como puede suceder si intentramos dividir por cero).
Tambin es posible que el resultado de una funcin nos de un valor nulo.

Por tanto, es habitual encontrarnos con estos valores y es entonces cuando aparece la
necesidad de poder hacer algo con ellos. Las funciones con nulos nos permitirn hacer algo en
caso de que aparezca un valor nulo.

NVL(valor, expr1)
Si valor es NULL, entonces devuelve expr1. Ten en cuenta que expr1 debe ser del mismo
tipo que valor.

Y no habr alguna funcin que nos permita evaluar expresiones? La respuesta es armativa y
esa funcin se llama DECODE.

DECODE(expr1, cond1, valor1 [, cond2, valor2, ...], default )


Esta funcin evala una expresin expr1, si se cumple la primera condicin (cond1)
devuelve el valor1, en caso contrario evala la siguiente condicin y as hasta que una de
las condiciones se cumpla. Si no se cumple ninguna condicin se devuelve el valor por
defecto que hemos llamado default.

Si en la tabla EMPLEADOS queremos un listado de sus direcciones, podemos pedir que cuando
una direccin no exista, aparezca el texto No tiene direccin, para ello podemos utilizar la
siguiente consulta:

SELECT NVL(DIRECC1, 'No tiene direccin conocida') FROM EMPLEADOS;

Obtendremos:

Resultado de la sentencia SELECT DIRECCIONES


No tiene direccin conocida

C/Sol, 1

Autoevaluacin
Qu funcin convierte un nmero o fecha a cadena de caracteres?

TO_DATE.
TO_CHAR.
DECODE.
TO_NUMBER.

6.- Consultas de resumen.


Caso prctico
Ada le ha pedido a Juan que le eche una mano en otro de
los proyectos en los que est inmersa la empresa. Necesita
que cree varias consultas de resumen sobre unas tablas de
empleados de banca. Est interesada en obtener el salario
medio de los empleados clasicado por tipo de empleado, y
quiere tambin que obtenga el total de empleados por
sucursal.
Realmente no es un trabajo difcil ya que las consultas de
resumen son muy fciles de crear, pero Ada est tan
ocupada que no tiene tiempo para esos detalles.

Seguro que alguna vez has necesitado realizar clculos sobre un campo para obtener algn
resultado global, por ejemplo, si tenemos una columna donde estamos guardando las notas que
obtienen unos alumnos o alumnas en Matemticas, podramos estar interesados en saber cual
es la nota mxima que han obtenido o la nota media.

La sentencia SELECT nos va a permitir obtener resmenes de los datos de modo vertical. Para
ello consta de una serie de clusulas especcas (GROUP BY, HAVING) y tenemos tambin
unas funciones llamadas de agrupamiento o de agregado que son las que nos dirn qu
clculos queremos realizar sobre los datos (sobre la columna).

Hasta ahora las consultas que hemos visto daban como resultado un subconjunto de las de la
tabla de la que extraamos la informacin. Sin embargo, este tipo de consultas que vamos a ver
no corresponde con ningn valor de la tabla sino un total calculado sobre los datos de la tabla.
Esto har que las consultas de resumen tengan limitaciones que iremos viendo.

Las funciones que podemos utilizar se llaman de agrupamiento (de agregado). stas toman un
grupo de datos (una columna) y producen un nico dato que resume el grupo. Por ejemplo, la
funcin SUM() acepta una columna de datos numricos y devuelve la suma de estos.

El simple hecho de utilizar una funcin de agregado en una consulta la convierte en


consulta de resumen.

Todas las funciones de agregado tienen una estructura muy parecida: FUNCIN ([ALL|
DISTINCT] Expresin) y debemos tener en cuenta que:

La palabra ALL indica que se tienen que tomar todos los valores de la columna. Es el valor
por defecto.
La palabra DISTINCT indica que se considerarn todas las repeticiones del mismo valor
como uno solo (considera valores distintos).
El grupo de valores sobre el que acta la funcin lo determina el resultado de la expresin
que ser el nombre de una columna o una expresin basada en una o varias columnas.
Por tanto, en la expresin nunca puede aparecer ni una funcin de agregado ni una
subconsulta.
Todas las funciones se aplican a las las del origen de datos una vez ejecutada la clusula
WHERE (si la tuviramos).
Todas las funciones (excepto COUNT) ignoran los valores NULL.
Podemos encontrar una funcin de agrupamiento dentro de una lista de seleccin en
cualquier sitio donde pudiera aparecer el nombre de una columna. Es por eso que puede
formar parte de una expresin pero no se pueden anidar funciones de este tipo.
No se pueden mezclar funciones de columna con nombres de columna ordinarios, aunque
hay excepciones que veremos ms adelante.

Ya estamos preparados para conocer cules son estas funciones de agregado (o


agrupamiento). Las veremos a continuacin.

Para saber ms
Puedes acceder a este enlace si quieres conocer ms sobre este tipo de consultas.

Consultas de resumen.

6.1.- Funciones de agregado: SUM y COUNT.

Sumar y contar las o datos contenidos en los campos es algo bastante


comn. Imagina que para nuestra tabla Usuarios necesitamos sumar el
nmero de crditos total que tienen nuestros jugadores. Con una
funcin que sumara los valores de la columna crdito sera suciente,
siempre y cuando lo agrupramos por cliente, ya que de lo contrario lo
que obtendramos sera el total de todos los clientes jugadores.

La funcin SUM:
SUM([ALL|DISTINCT] expresin)
Devuelve la suma de los valores de la expresin.
Slo puede utilizarse con columnas cuyo tipo de dato sea nmero. El resultado ser
del mismo tipo aunque puede tener una precisin mayor.
Por ejemplo,
SELECT SUM( credito) FROM Usuarios;

La funcin COUNT:
COUNT([ALL|DISTINCT] expresin)
Cuenta los elementos de un campo. Expresin contiene el nombre del campo que
deseamos contar. Los operandos de expresin pueden incluir el nombre del campo,
una constante o una funcin.
Puede contar cualquier tipo de datos incluido texto.
COUNT simplemente cuenta el nmero de registros sin tener en cuenta qu valores
se almacenan.
La funcin COUNT no cuenta los registros que tienen campos NULL a menos que
expresin sea el carcter comodn asterisco (*).
Si utilizamos COUNT(*), calcularemos el total de las, incluyendo aquellas que
contienen valores NULL.
Por ejemplo,
SELECT COUNT(nombre) FROM Usuarios;
SELECT COUNT(*) FROM Usuarios;
Ejercicio resuelto
Utilizando las tablas y datos de la empresa JuegosCA descargados anteriormente,
vamos a realizar una consulta donde contemos el nmero de empleados que son
mujeres.

SELECT COUNT(Nombre) FROM EMPLEADOS WHERE SEXO='M';

6.2.- Funciones de agregado: MIN y MAX.

Y si pudiramos encontrar el valor mximo y mnimo de una lista


enormemente grande? Esto es lo que nos permiten hacer las
siguientes funciones.

Funcin MIN:
MIN ([ALL| DISTINCT] expresin)
Devuelve el valor mnimo de la expresin sin considerar los
nulos (NULL).
En expresin podemos incluir el nombre de un campo de
una tabla, una constante o una funcin (pero no otras
funciones agregadas de SQL).
Un ejemplo sera:
SELECT MIN(credito) FROM Usuarios;
Funcin MAX:
MAX ([ALL| DISTINCT] expresin)
Devuelve el valor mximo de la expresin sin considerar los nulos (NULL).
En expresin podemos incluir el nombre de un campo de una tabla, una constante o
una funcin (pero no otras funciones agregadas de SQL).
Un ejemplo,
SELECT MAX (credito) FROM Usuarios;

6.3.- Funciones de agregado: AVG, VAR,


STDEV y STDEVP.

Quizs queramos obtener datos estadsticos de los datos


guardados en nuestra base de datos. Para ello podemos hacer
uso de las funciones que calculan el promedio, la varianza y la
desviacin tpica.

Funcin AVG
AVG ([ALL| DISTINCT] expresin)
Devuelve el promedio de los valores de un grupo, para
ello se omiten los valores nulos (NULL).
El grupo de valores ser el que se obtenga como resultado de la expresin y sta
puede ser un nombre de columna o una expresin basada en una columna o varias
de la tabla.
Se aplica a campos tipo nmero y el tipo de dato del resultado puede variar segn
las necesidades del sistema para representar el valor.
Funcin VAR
VAR ([ALL| DISTINCT] expresin)
Devuelve la varianza estadstica de todos los valores de la expresin.
Como tipo de dato admite nicamente columnas numricas. Los valores nulos
(NULL) se omiten.
Funcin STDEV
STDEV ([ALL| DISTINCT] expresin)
Devuelve la desviacin tpica estadstica de todos los valores de la expresin.
Como tipo de dato admite nicamente columnas numricas. Los valores nulos
(NULL) se omiten.

Ejercicio resuelto
Utilizando las tablas y datos de la empresa JuegosCA descargados anteriormente,
vamos a realizar una consulta donde obtengamos la media del salario mnimo y
mximo de la tabla TRABAJOS.

SELECT AVG(SALARIO_MIN), AVG(SALARIO_MAX) FROM TRABAJOS;

Autoevaluacin
Cules de las siguientes armaciones sobre las consultas de resumen son ciertas?
Toman un grupo de datos de una columna.
Producen un nico dato que resume el grupo.
Utilizar una funcin de agregado en una consulta la convierte en consulta de
resumen.
Dan como resultado un subconjunto de las de la tabla.

7.- Agrupamiento de registros.


Caso prctico
Juan ha estado realizando algunas consultas de
resumen y ahora quiere continuar sacando todo el
jugo posible a las tablas realizando operaciones como
las anteriores pero agrupndolas por algn campo.
Hay veces que se obtiene mucha informacin si
estudiamos los datos por grupos, como puede ser el
nmero de jugadores por provincia, o el saldo medio
segn el sexo del jugador para as poder obtener
conclusiones sobre la informacin guardada.

Hasta aqu las consultas de resumen que hemos visto obtienen totales de
todas las las de un campo o una expresin calculada sobre uno o varios
campos. Lo que hemos obtenido ha sido una nica la con un nico dato.

Ya vers como en muchas ocasiones en las que utilizamos consultas de


resumen nos va a interesar calcular totales parciales, es decir, agrupados
segn un determinado campo.

De este modo podramos obtener de una tabla EMPLEADOS, en la que se


guarda su sueldo y su actividad dentro de la empresa, el valor medio del
sueldo en funcin de la actividad realizada en la empresa. Tambin
podramos tener una tabla clientes y obtener el nmero de veces que ha
realizado un pedido, etc.

En todos estos casos en lugar de una nica la de resultados necesitaremos una la por cada
actividad, cada cliente, etc.

Podemos obtener estos subtotales utilizando la clusula GROUP BY.

La sintaxis es la siguiente: SELECT columna1,


columna2, ... FROM tabla1, tabla2, ... WHERE
condicin1, condicin2, GROUP BY columna1,
columna2, HAVING condicin ORDER BY
ordenacin;

En la clusula GROUP BY se colocan las columnas por las que vamos a agrupar. En
la clusula HAVING se especica la condicin que han de cumplir los grupos para
que se realice la consulta.

Es muy importante que te jes bien en el orden en el que se ejecutan las clusulas:

1. WHERE que ltra las las segn las condiciones que pongamos.
2. GROUP BY que crea una tabla de grupos nueva.
3. HAVING ltra los grupos.
4. ORDER BY que ordena o clasica la salida.

Las columnas que aparecen en el SELECT y que no aparezcan en la clusula


GROUP BY deben tener una funcin de agrupamiento. Si esto no se hace as
producir un error. Otra opcin es poner en la clasula GROUP BY las mismas
columnas que aparecen en SELECT.

Veamos un par de ejemplos:

SELECT provincia, SUM(credito) FROM Usuarios


GROUP BY provincia;

Obtenemos la suma de crditos de nuestros usuarios agrupados por provincia. Si estuviramos


interesados en la suma de crditos agrupados por provincia pero nicamente de las provincias
de Cdiz y Badajz nos quedara:

SELECT provincia, SUM(credito) FROM Usuarios GROUP BY provincia HAVING provincia = 'C

Autoevaluacin
Relaciona cada clusula con su orden de ejecucin:
Ejercicio de relacionar Clusula. Relacin. Funcin.
WHERE 1. PRIMERO

ORDER BY 2. SEGUNDO

HAVING 3. TERCERO

GROUP BY 4. CUARTO

8.- Consultas multitablas.

Caso prctico
Hasta ahora Juan ha estado haciendo uso de
consultas a una nica tabla, pero eso limita la
obtencin de resultados. Si esas tablas estn
relacionadas Juan podr coger informacin de cada
una de ellas segn lo que le interese. En las tablas de
la empresa JuegosCA, tiene por un lado la tabla que
recoge los datos del empleado y por otra su historial
laboral. En esta ltima tabla, lo nico que recogemos
de los empleados es su cdigo. Como a Juan le
interesa obtener el historial laboral incluyendo nombres y apellidos de sus
empleados, debe utilizar la informacin que viene en ambas tablas.

Recuerda que una de las propiedades de las bases de datos


relacionales era que distribuamos la informacin en varias tablas que a
su vez estaban relacionadas por algn campo comn. As evitbamos
repetir datos. Por tanto, tambin ser frecuente que tengamos que
consultar datos que se encuentren distribuidos por distintas tablas.

Si disponemos de una tabla USUARIOS cuya clave principal es Login y


esta tabla a su vez est relacionada con la tabla PARTIDAS a travs
del campo Cod_Creacin. Si quisiramos obtener el nombre de los
usuarios y las horas de las partidas de cada jugador necesitaramos
coger datos de ambas tablas pues las horas se guardan en la tabla PARTIDAS. Esto signica
que cogeremos las de una y de otra.

Imagina tambin que en lugar de tener una tabla USUARIOS, dispusiramos de dos por
tenerlas en servidores distintos. Lo lgico es que en algn momento tendramos que unirlas.

Hasta ahora las consultas que hemos usado se referan a una sola tabla, pero tambin es
posible hacer consultas usando varias tablas en la misma sentencia SELECT. Esto permitir
realizar distintas operaciones como son:

La composicin interna.
La composicin externa.

En la versin SQL de 1999 se especica una nueva sintaxis para consultar varias tablas que
Oracle incorpora, as que tambin la veremos. La razn de esta nueva sintaxis era separar las
condiciones de asociacin respecto a las condiciones de seleccin de registros.

La sintaxis es la siguiente:

SELECT tabla1.columna1, tabla1.columna2, , tabla2.columna1, tabla2.columna2, FROM ta


JOIN tabla2] | [NATURAL JOIN tabla2] | [JOIN tabla2 USING (columna) | [JOIN tabla2 ON
(tabla1.columna=tabla2.columna)] | [LEFT | RIGTH | FULL OUTER JOIN tabla2 ON
(tabla1.columna=tabla2.columna)]

8.1.- Composiciones internas.

Qu ocurre si combinamos dos o ms tablas sin ninguna restriccin? El resultado ser un


producto cartesiano.

El producto cartesiano entre dos tablas da como resultado todas las combinaciones de todas las
las de esas dos tablas.

Se indica poniendo en la clusula FROM las tablas que queremos componer separadas por
comas. Y puedes obtener el producto cartesiano de las tablas que quieras.

Como lo que se obtiene son todas las posibles combinaciones de las, debes tener especial
cuidado con las tablas que combinas. Si tienes dos tablas de 10 las cada una, el resultado
tendr 10x10 las, a medida que aumentemos el nmero de las que contienen las tablas,
mayor ser el resultado nal, con lo cual se puede considerar que nos
mayor ser el resultado nal, con lo cual se puede considerar que nos
encontraremos con una operacin costosa.

Esta operacin no es de las ms utilizadas ya que coge una la de una


tabla y la asocia con todos y cada uno de las las de la otra tabla,
independientemente de que tengan relacin o no. Lo ms normal es que
queramos seleccionar los registros segn algn criterio.

Necesitaremos discriminar de alguna forma para que nicamente


aparezcan las de una tabla que estn relacionadas con la otra tabla. A
esto se le llama asociar tablas (JOIN).

Para hacer una composicin interna se parte de un producto cartesiano y


se eliminan aquellas las que no cumplen la condicin de composicin.

Lo importante en las composiciones internas es emparejar los campos que han de tener valores
iguales.

Las reglas para las composiciones son:

Pueden combinarse tantas tablas como se desee.


El criterio de combinacin puede estar formado por ms de una pareja de columnas.
En la clusula SELECT pueden citarse columnas de ambas tablas, condicionen o no, la
combinacin.
Si hay columnas con el mismo nombre en las distintas tablas, deben identicarse
especicando la tabla de procedencia o utilizando un alias de tabla.

Las columnas que aparecen en la clusula WHERE se denominan columnas de


emparejamiento ya que son las que permiten emparejar las las de las dos tablas.
stas no tienen por qu estar incluidas en la lista de seleccin. Emparejaremos
tablas que estn relacionadas entres s y adems, una de las columnas de
emparejamiento ser clave principal en su tabla. Cuando emparejamos campos
debemos especicar de la siguiente forma: NombreTabla1. Camporelacionado1 =
NombreTabla2.Camporelacionado2.

Puedes combinar una tabla consigo misma pero debes poner de manera obligatoria un alias a
uno de los nombres de la tabla que vas a repetir.

Veamos un ejemplo, si queremos obtener el historial laboral de los empleados incluyendo


nombres y apellidos de los empleados, la fecha en que entraron a trabajar y la fecha de n de
trabajo si ya no continan en la empresa, tendremos:

SELECT Nombre, Apellido1, Apellido2, Fecha_inicio, Fecha_n FROM EMPLEADOS,


HISTORIAL_LABORAL WHERE HISTORIAL_LABORAL.Empleado_DNI=
EMPLEADOS.DNI;

Vamos a obtener el historial con los nombres de departamento, nombre y apellidos del
empleado de todos los departamentos:

SELECT Nombre_Dpto, Nombre, Apellido1, Apellido2 FROM DEPARTAMENTOS,


EMPLEADOS, HISTORIAL_LABORAL WHERE EMPLEADOS.DNI=
HISTORIAL_LABORAL. EMPLEADO_DNI AND
HISTORIAL_LABORAL.DPTO_COD = DEPARTAMENTOS. DPTO_COD;
Ejercicio resuelto
Utilizando las tablas y datos de la empresa JuegosCA descargados anteriormente,
vamos a realizar una consulta donde obtengamos el nombre de los empleados junto
a su salario.

SELECT Nombre, Apellido1, Apellido2, Salario FROM EMPLEADOS,


HISTORIAL_SALARIAL WHERE HISTORIAL_SALARIAL.Empleado_DNI.=
EMPLEADOS.DNI;

Obtener un listado con el histrico laboral de un empleador cuyo DNI sea '12345'. En
dicho listado interesa conocer el nombre del puesto, as como el rango salarial.

SELECT T.NOMBRE_TRAB, T.SALARIO_MIN, T.SALARIO_MAX, HL.EMPLEADO_DN


TRABAJOS T, HISTORIAL_LABORAL HL WHERE T.TRABAJO_COD=HL.TRAB_COD

8.2.- Composiciones externas.

Has pensado que puede que te interese seleccionar algunas las de


una tabla aunque stas no tengan correspondencia con las las de la otra
tabla? Esto puede ser necesario.

Imagina que tenemos en una base de datos guardadas en dos tablas la


informacin de los empleados de la empresa (Cod_empleado, Nombre,
Apellidos, salario y Cod_dpto) por otro lado los departamentos
(Codigo_dep, Nombre) de esa empresa. Recientemente se ha
remodelado la empresa y se han creado un par de departamentos ms
pero no se les ha asignado los empleados. Si tuviramos que obtener un
informe con los datos de los empleados por departamento, seguro que
deben aparecer esos departamentos aunque no tengan empleados. Para
poder hacer esta combinacin usaremos las composiciones externas.

Cmo es el formato? Muy sencillo, aadiremos un signo ms entre parntesis (+) en la


igualdad entre campos que ponemos en la clusula WHERE. El carcter (+) ir detrs del
nombre de la tabla en la que deseamos aceptar valores nulos.

En nuestro ejemplo, la igualdad que tenemos en la clusula WHERE es Cod_dpto (+)=


Codigo_dep ya que es en la tabla empleados donde aparecern valores nulos.
Ejercicio resuelto
Obtener un listado con los nombres de los distintos departamentos y sus jefes con
sus datos personales. Ten en cuenta que deben aparecer todos los departamentos
aunque no tengan asignado ningn jefe.

SELECT D.NOMBRE_DPTO, D.JEFE, E.NOMBRE, E.APELLIDO1, E.APELLIDO2


DEPARTAMENTOS D, EMPLEADOS E WHERE D.JEFE = E.DNI(+);

Autoevaluacin
Si queremos incluir aquellas las que no tienen an correspondencia con la tabla
relacionada, tendremos que poner un signo ms entre parntesis:

Delante del nombre de la tabla en la clusula FROM.
Delante del nombre del campo que relaciona donde sabemos que hay valores
nulos.
Detrs del nombre del campo que relaciona donde sabemos que hay valores nulos.
Delante del nombre del campo que relaciona donde sabemos que no hay valores
nulos.

8.3.- Composiciones en la versin SQL99.

Como has visto, SQL incluye en esta versin mejoras de la


sintaxis a la hora de crear composiciones en consultas. Recuerda
que la sintaxis es la siguiente:

SELECT tabla1.columna1, tabla1.columna2, ,


tabla2.columna1, tabla2.columna2, FROM tabla1
[CROSS JOIN tabla2] | [NATURAL JOIN tabla2] | [JOIN
tabla2 USING (columna)] | [JOIN tabla2 ON
(tabla1.columna=tabla2.columna)] | [LEFT | RIGTH | FULL OUTER JOIN tabla2 ON
(tabla1.columna=tabla2.columna)];

CROSS JOIN: crear un producto cartesiano de las las de ambas tablas por lo que podemos
olvidarnos de la clusula WHERE.

NATURAL JOIN: detecta automticamente las claves de unin, basndose en el nombre de la


columna que coincide en ambas tablas. Por supuesto, se requerir que las columnas de unin
tengan el mismo nombre en cada tabla. Adems, esta caracterstica funcionar incluso si no
estn denidas las claves primarias o ajenas.

JOIN USING: las tablas pueden tener ms de un campo para relacionar y no siempre queremos
que se relacionen por todos los campos. Esta clusula permite establecer relaciones indicando
qu campo o campos comunes se quieren utilizar para ello.

JOIN ON: se utiliza para unir tablas en la que los nombres de columna no coinciden en ambas
tablas o se necesita establecer asociaciones ms complicadas.

OUTER JOIN: se puede eliminar el uso del signo (+) para composiciones externas utilizando un
OUTER JOIN, de este modo resultar ms fcil de entender.

LEFT OUTER JOIN: es una composicin externa izquierda, todas las las de la tabla de la
izquierda se devuelven, aunque no haya ninguna columna correspondiente en las tablas
combinadas.

RIGTH OUTER JOIN: es una composicin externa derecha, todas las las de la tabla de la
derecha se devuelven, aunque no haya ninguna columna correspondiente en las tablas
combinadas.

FULL OUTER JOIN: es una composicin externa en la que se devolvern todas las las de los
campos no relacionados de ambas tablas.

Podramos transformar algunas de las consultas con las que hemos estado trabajando:

Queramos obtener el historial laboral de los empleados incluyendo nombres y apellidos de los
empleados, la fecha en que entraron a trabajar y la fecha de n de trabajo si ya no continan en
la empresa. Es una consulta de composicin interna, luego utilizaremos JOIN ON:

SELECT E.Nombre, E.Apellido1, E.Apellido2, H.Fecha_inicio, H.Fecha_n FROM EMPLEADOS


JOIN HISTORIAL_LABORAL H ON (H.Empleado_DNI= E.DNI);

Queramos tambin, obtener un listado con los nombres de los distintos departamentos y sus
jefes con sus datos personales. Ten en cuenta que deben aparecer todos los departamentos
aunque no tengan asignado ningn jefe. Aqu estamos ante una composicin externa, luego
podemos utilizar OUTER JOIN:

SELECT D.NOMBRE_DPTO, D.JEFE, E.NOMBRE, E.APELLIDO1, E.APELLIDO2 FROM


DEPARTAMENTOS D LEFT OUTER JOIN EMPLEADOS E ON ( D.JEFE = E.DNI);

Para saber ms
En MySQL tambin se utilizan las composiciones, aqu puedes verlo:

Composiciones.
9.- Otras consultas multitablas: Unin,
Interseccin y diferencia de consultas.

Caso prctico
Ana le cuenta a Carlos que ya tienen terminado casi
todo el trabajo, pero que no le importa ensearle otros
tipos de consultas que no han necesitado utilizar en
esta ocasin pero que es conveniente conocer, se
reere al uso de uniones, intersecciones y diferencia
de consultas. Le explicar que es muy parecido a la
teora de conjuntos que recordar de haber terminado
hace poco sus estudios.

Seguro que cuando empieces a trabajar con bases de datos llegar un


momento en que dispongas de varias tablas con los mismos datos
guardados para distintos registros y quieras unirla en una nica tabla.
Esto se puede hacer? Es una operacin muy comn junto a otras. Al
n y al cabo, una consulta da como resultado un conjunto de las y con
conjuntos podemos hacer entre otras, tres tipos de operaciones
comunes como son: unin, interseccin y diferencia.

UNION: combina las las de un primer SELECT con las las de otro
SELECT, desapareciendo las las duplicadas.

INTERSECT: examina las las de dos SELECT y devolver aquellas que aparezcan en ambos
conjuntos. Las las duplicadas se eliminarn.

MINUS: devuelve aquellas las que estn en el primer SELECT pero no en el segundo. Las las
duplicadas del primer SELECT se reducirn a una antes de comenzar la comparacin.

Para estas tres operaciones es muy importante que utilices en los dos SELECT el mismo
nmero y tipo de columnas y en el mismo orden.

Estas operaciones se pueden combinar anidadas, pero es conveniente utilizar parntesis para
indicar que operacin quieres que se haga primero.

Veamos un ejemplo de cada una de ellas.

UNIN: Obtener los nombres y ciudades de todos los proveedores y clientes de Alemania.

SELECT NombreCia, Ciudad FROM PROVEEDORES WHERE Pais = 'Alemania' UNION


SELECT NombreCia, Ciudad FROM CLIENTES WHERE Pais = 'Alemania';

INTERSECCIN: Una academia de idiomas da clases de ingls, frances y portugues; almacena


los datos de los alumnos en tres tablas distintas una llamada "ingles", en una tabla denominada
"frances" y los que aprenden portugues en la tabla "portugues". La academia necesita el nombre
y domicilio de todos los alumnos que cursan los tres idiomas para enviarles iformacin sobre los
exmenes.

SELECT nombre, domicilio FROM ingles INTERSECT SELECT


nombre, domicilio FROM frances INTERSECT SELECT nombre,
domicilio FROM portugues;

DIFERENCIA: Ahora la academia necesita el nombre y domicilio solo de todos los alumnos que
cursan ingls (no quiere a los que ya cursan portugus pues va a enviar publicidad referente al
curso de portugus).

SELECT nombre, domicilio FROM INGLES MINUS SELECT


nombre,domicilio FROM PORTUGUES;

Autoevaluacin
Cules de las siguientes armaciones son correctas?
La unin combina las las de un primer SELECT con las las de otro SELECT,
desapareciendo las las duplicadas.
La diferencia devuelve aquellas las que estn en el primer SELECT pero no en el
segundo.
La interseccin examina las las de un SELECT y de otro y devolver aquellas que
aparezcan en ambos conjuntos.
En uniones, intersecciones y diferencias, los dos SELECT deben tener el mismo
nmero pero no tienen por qu tener el mismo tipo de columnas.

10.- Subconsultas.

Caso prctico
Es posible consultar dentro de otra consulta? pregunta Carlos.

Ha estado pensando que a veces va a necesitar ltrar los datos en funcin de un


resultado que a priori desconoce. Ana se pone manos a la obra porque ve que ha
llegado el momento de explicarle a Carlos las subconsultas.
A veces tendrs que utilizar en una consulta los resultados de otra que llamaremos subconsulta.
La sintaxis es:

SELECT listaExpr FROM tabla WHERE


expresin OPERADOR ( SELECT listaExpr
FROM tabla);

La subconsulta puede ir dentro de las clusulas WHERE, HAVING o FROM.

El OPERADOR puede ser >, <, >=, <=, !=, = o IN. Las subconsultas que se utilizan con estos
operadores devuelven un nico valor, si la subconsulta devolviera ms de un valor devolvera un
error.

Como puedes ver en la sintaxis, las subconsultas deben ir entre parntesis y a la derecha del
operador.

Pongamos un ejemplo:

SELECT Nombre_empleado, sueldo FROM EMPLEADOS


WHERE SUELDO < (SELECT SUELDO FROM
EMPLEADOS WHERE Nombre_emple = 'Ana');

Obtendramos el nombre de los empleados y el sueldo de aquellos que cobran menos que Ana.

Los tipos de datos que devuelve la subconsulta y la columna con la que se compara ha de ser el
mismo.

Qu hacemos si queremos comparar un valor con varios, es decir, si queremos que la


subconsulta devuelva ms de un valor y comparar el campo que tenemos con dichos valores?
Imagina que queremos ver si el sueldo de un empleado que es administrativo es mayor o igual
que el sueldo medio de otros puestos en la empresa. Para saberlo deberamos calcular el
sueldo medio de las dems ocupaciones que tiene la empresa y stos compararlos con la de
nuestro empleado. Como ves, el resultado de la subconsulta es ms de una la. Qu
hacemos?

Cuando el resultado de la subconsulta es ms de una la, SQL utiliza instrucciones especiales


entre el operador y la consulta. Estas instrucciones son:

ANY. Compara con cualquier la de la consulta. La instruccin es vlida si hay un registro


en la subconsulta que permite que la comparacin sea cierta.
ALL. Compara con todas las las de la consulta. La instruccin resultar cierta si es cierta
toda la comparacin con los registros de la subconsulta.
IN. No utiliza comparador, lo que hace es comprobar si el valor se encuentra en el
resultado de la subconsulta.
NOT IN. Comprueba si un valor no se encuentra en una subconsulta.

En la siguiente consulta obtenemos el empleado que menos cobra:

SELECT nombre, sueldo FROM EMPLEADOS WHERE sueldo <= ALL (SELECT
sueldo FROM EMPLEADOS);

Autoevaluacin
Relaciona cada instruccin con su funcin:
Ejercicio de relacionar Instruccin. Relacin. Funcin.
ANY 1. Compara con cualquier la de la consulta.

2. Comprueba si el valor se encuentra en el resultado de la


ALL
subconsulta.

IN 3. Compara con todas las las de la consulta.

OT
4. Comprueba si un valor no se encuentra en una subconsulta.
IN

Para saber ms
Quieres ms ejemplos con los que practicar?

Ejercicios SQL.

Anexo I.- Creacin de tablas y preparacin


de Oracle.

Para comenzar crearemos a partir de un usuario con privilegios el usuario ANA y pondremos
una contrasea. Adems, le daremos posibilidad de crear tablas.
Desconectamos a este usuario, ya que queremos crear las tablas e insertar los datos en el
nuevo usuario creado.

Vamos a utilizar la lnea de comandos de SQL para ejecutar el archivo descargado, para ello
seguiremos los pasos que aparecen a continuacin:

1. Vamos a Base de Datos de Oracle 10g Express.


2. Pulsamos en Ejecutar Lnea de Comandos SQL. Aparecer la siguiente pantalla:

3. Ejecutamos la instruccin: connect ana/ana.


Cuando ejecutamos el comando debe decirnos que ya est conectado:

4. Ahora ya podemos ejecutar el archivo del siguiente modo:


@Ruta_donde_se_encuentra_el_archivo/BD04_CONT_R07_02.sql

En nuestro caso, el archivo est guardado directamente en la unidad C para que nos resulte
ms fcil localizarlo:
Si todo es correcto, deberan crearse las tablas e insertarse los datos que contiene el archivo:

A partir de aqu ya tienes un usuario con tablas y datos inlcuidos para poder practicar a la vez
que Ana.

Puedes hacerlo a travs de lnea de comandos o entrando a entorno web Application Express
de Oracle utilizando el botn SQL en la pgina de inicio, y desplegando su lista desplegable
elegir Comandos SQL > Introducir Comando.

Anexo.- Licencias de recursos.

Licencias de recursos utilizados en la Unidad de Trabajo. Recurso (1) Datos del recurso (1)
Recurso (2) Datos del recurso (2)
Autora:
Microsoft.
Autora: Oracle. Licencia:
Licencia: Copyright. (Cita). Copyright (cita).
Procedencia: Elaboracin Procedencia:
Propia. Captura de pantalla Elaboracin
Oracle Express. Propia. Captura
Windows XP.

Autora:
Stockbyte.
Licencia: Uso
educativo no
Autora: Oracle. comercial para
Licencia: Copyright (cita). plataformas
Procedencia: Elaboracin pblicas de
Propia. Captura de pantalla Formacin
SQL*Express. Profesional a
distancia.
Procedencia:
CD-DVD Num.
V07.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
CD165. distancia.
Procedencia:
CD-DVD Num.
CD109.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
CD109. distancia.
Procedencia:
CD-DVD Num.
CDV43.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
CDV43. distancia.
Procedencia:
CD-DVD Num.
CDV43.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
ECD001. distancia.
Procedencia:
CD-DVD Num.
CD165.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
CD EP006. distancia.
Procedencia:
CD-DVD Num.
CD EP006.

Autora: Oracle.
Autora: Stockbyte.
Licencia:
Licencia: Uso educativo no
Copyright (cita).
comercial para plataformas
Procedencia:
pblicas de Formacin
Elaboracin
Profesional a distancia.
Propia. Captura
Procedencia: CD-DVD Num.
de pantalla
CD EP006.
Oracle Express.

Autora: Oracle.
Licencia:
Autora: Oracle.
Copyright (cita).
Licencia: Copyright (cita).
Procedencia:
Procedencia: Elaboracin
Elaboracin
Propia. Captura de pantalla
Propia. Captura
Oracle Express.
de pantalla
Oracle Express.

Autora: Oracle.
Licencia:
Autora: Oracle. Copyright (cita).
Licencia: Copyright (cita). Procedencia:
Procedencia: Elaboracin Elaboracin
Propia. Captura de pantalla Propia. Captura
Oracle Express. de pantalla
Oracle Express.

Autora: Oracle.
Licencia:
Autora: Oracle.
Copyright (cita).
Licencia: Copyright (cita).
Procedencia:
Procedencia: Elaboracin
Elaboracin
Propia. Captura de pantalla
Propia. Captura
Oracle Express.
de pantalla
Oracle Express.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
CD EP006. distancia.
Procedencia:
CD-DVD Num.
CD V43.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Profesional a
Num.CD165. distancia.
Procedencia:
CD-DVD Num.
SD174.

Autora: Oracle.
Licencia:
Autora: Oracle.
Copyright (cita).
Licencia: Copyright (cita).
Procedencia:
Procedencia: Elaboracin
Elaboracin
Propia. Captura de pantalla
Propia. Captura
Oracle Express.
de pantalla
Oracle Express.

Autora:
Stockbyte.
Licencia: Uso
educativo no
Autora: Stockbyte.
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
SD174. distancia.
Procedencia:
CD-DVD Num.
ECD001.

Autora: Oracle.
Autora: Stockbyte. Licencia:
Licencia: Uso educativo no Copyright (cita).
comercial para plataformas Procedencia:
pblicas de Formacin Elaboracin
Profesional a distancia. Propia. Captura
Procedencia: CD-DVD Num. de
CD109. pantalla Oracle
Express.

Autora:
Stockbyte.
Licencia: Uso
educativo no
Autora: Oracle. comercial para
Licencia: Copyright (cita). plataformas
Procedencia: Elaboracin pblicas de
Propia. Captura de pantalla Formacin
Oracle Express. Profesional a
distancia.
Procedencia:
CD-DVD Num.
SD174.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
EP006_. distancia.
Procedencia:
CD-DVD Num.
ECD001.

Autora:
Stockbyte.
Licencia: Uso
Autora: Stockbyte. educativo no
Licencia: Uso educativo no comercial para
comercial para plataformas plataformas
pblicas de Formacin pblicas de
Profesional a distancia. Formacin
Procedencia: CD-DVD Num. Profesional a
ECD001. distancia.
Procedencia:
CD-DVD Num.
SD174.

Autora: Oracle
Autora: Stockbyte.
Licencia:
Licencia: Uso educativo no
Copyright (Cita)
comercial para plataformas
Procedencia:
pblicas de Formacin
Elaboracin
Profesional a distancia.
Propia. Captura
Procedencia: CD-DVD Num.
de pantalla
CD73.
Oracle Express

Autora: Oracle
Licencia:
Autora: Oracle
Copyright (Cita)
Licencia: Copyright (Cita)
Procedencia:
Procedencia: Elaboracin
Elaboracin
Propia. Captura de pantalla
Propia. Captura
Oracle Express
de pantalla
Oracle Express

Autora: Oracle
Licencia:
Autora: Oracle
Copyright (Cita)
Licencia: Copyright (Cita)
Procedencia:
Procedencia: Elaboracin
Elaboracin
Propia. Captura de pantalla
Propia. Captura
Oracle Express
de pantalla
Oracle Express

Autora: Oracle
Licencia: Copyright (Cita)
Procedencia: Elaboracin
Propia. Captura de pantalla
Oracle Express

También podría gustarte