Existen varios objetos de base de datos: tablas, constraints (restricciones), vistas, secuencias,
ndices, agrupamientos (clusters), disparadores (triggers), instantaneas (snapshots),
procedimientos, funciones, paquetes, sinnimos, usuarios, perfiles, privilegios, roles, etc.
Aparece una tabla que nos muestra en cada fila, los datos de una tabla especfica; en la
columna "TABLE_NAME" aparece el nombre de cada tabla existente.
Al crear una tabla debemos resolver qu campos (columnas) tendr y que tipo de datos
almacenarn cada uno de ellos, es decir, su estructura.
La tabla debe ser definida con un nombre que la identifique y con el cual accederemos a ella.
Creamos una tabla llamada "usuarios" y entre parntesis definimos los campos y sus tipos:
Cada campo con su tipo debe separarse con comas de los siguientes, excepto el ltimo.
Cuando se crea una tabla debemos indicar su nombre y definir al menos un campo con su tipo
de dato. En esta tabla "usuarios" definimos 2 campos:
Para nombres de tablas, se puede utilizar cualquier caracter permitido para nombres de
directorios, el primero debe ser un caracter alfabtico y no puede contener espacios. La
longitud mxima es de 30 caracteres.
Si intentamos crear una tabla con un nombre ya existente (existe otra tabla con ese nombre),
mostrar un mensaje indicando que a tal nombre ya lo est utilizando otro objeto y la
sentencia no se ejecutar.
Para ver la estructura de una tabla usamos el comando "describe" junto al nombre de la tabla:
describe usuarios;
Esta es la estructura de la tabla "usuarios"; nos muestra cada campo, su tipo y longitud y otros
valores que no analizaremos por el momento.
Para eliminar una tabla usamos "drop table" junto al nombre de la tabla a eliminar:
Si intentamos eliminar una tabla que no existe, aparece un mensaje de error indicando tal
situacin y la sentencia no se ejecuta.
Problema:
Para probar todos los ejercicios resueltos y propuestos debemos ingresar al sqldeveloper.exe
y luego en el entorno crear una nueva conexin:
Vamos a crear una tabla denominada "usuarios". En primer lugar vamos a eliminar la tabla
"usuarios" porque si ya existe no podremos crear otra con el mismo nombre.
Aparece un mensaje que indica que la sentencia "create table" ha sido procesada.
Cada usuario ocupar un registro de esta tabla, con su respectivo nombre y clave.
describe usuarios;
Nos informa que la tabla "usuarios" tiene 2 campos, el campo "nombre" de tipo "varchar2" de
30 caracteres de longitud y el campo "clave", de tipo "varchar2" de 10 caracteres de longitud.
La columna "Null" aparece vaca y la explicaremos ms adelante.
Intentemos crear una tabla con el mismo nombre, mostrar un mensaje indicando que ya hay
un objeto llamado "usuarios" y la sentencia no se ejecutar:
Eliminemos la tabla:
Primer problema:
Necesita almacenar los datos de amigos en una tabla. Los datos que guardar sern: apellido,
nombre, domicilio y telfono.
3- Cree una tabla llamada "agenda", debe tener los siguientes campos: apellido, varchar2(30);
nombre, varchar2(20); domicilio, varchar2 (30) y telefono, varchar2(11)
Un mensaje indica que la tabla ha sido creada exitosamente.
describe agenda;
Segundo problema:
Necesita almacenar informacin referente a los libros de su biblioteca personal. Los datos que
guardar sern: ttulo del libro, nombre del autor y nombre de la editorial.
3- Cree una tabla llamada "libros". Debe definirse con los siguientes campos: titulo,
varchar2(20); autor, varchar2(30) y editorial, varchar2(15)
7- Elimine la tabla
describe libros;
Un registro es una fila de la tabla que contiene los datos propiamente dichos. Cada registro
tiene un dato por cada columna (campo). Nuestra tabla "usuarios" consta de 2 campos,
"nombre" y "clave".
Al ingresar los datos de cada registro debe tenerse en cuenta la cantidad y el orden de los
campos.
Usamos "insert into", luego el nombre de la tabla, detallamos los nombres de los campos
entre parntesis y separados por comas y luego de la clusula "values" colocamos los valores
para cada campo, tambin entre parntesis y separados por comas.
Note que los datos ingresados, como corresponden a cadenas de caracteres se colocan entre
comillas simples.
El comando "select" recupera los registros de una tabla. Con el asterisco indicamos que
muestre todos los campos de la tabla "usuarios".
Aparece la tabla, sus campos y registros ingresados; si no tiene registros, apareceran
solamente los campos y la tabla vaca).
Es importante ingresar los valores en el mismo orden en que se nombran los campos: En el
siguiente ejemplo se lista primero el campo "clave" y luego el campo "nombre" por eso, los
valores tambin se colocan en ese orden:
Si ingresamos los datos en un orden distinto al orden en que se nombraron los campos, no
aparece un mensaje de error y los datos se guardan de modo incorrecto.
En el siguiente ejemplo se colocan los valores en distinto orden en que se nombran los
campos, el valor de la clave (la cadena "Boca") se guardar en el campo "nombre" y el valor
del nombre (la cadena "Luis") en el campo "clave":
Problema:
Si existe la eliminamos:
Creamos una nueva tabla denominada "usuarios" con los siguientes campos:
No tiene, la tabla aparece vaca, solamente vemos las columnas que muestran los nombres de
sus campos.
NOMBRE CLAVE
-------------
Mariano payaso
Ingresamos los datos en un orden distinto al orden en que se nombran los campos, no aparece
un mensaje de error y los datos se guardan de modo incorrecto:
NOMBRE CLAVE
-------------
Mariano payaso
Juan River
Boca Luis
La tabla tiene 3 registros. Note que la clave "Boca" se guard en el campo "nombre" y el
nombre de usuario "Luis" en el campo "clave".
Primer problema:
2- Cree una tabla llamada "agenda". Debe tener los siguientes campos: apellido (cadena de
30), nombre (cadena de 20), domicilio (cadena de 30) y telefono (cadena de 11)
Ver solucin
describe agenda;
Segundo problema:
Trabaje con la tabla "libros" que almacena los datos de los libros de su propia biblioteca.
2- Cree una tabla llamada "libros". Debe definirse con los siguientes campos: titulo (cadena de
20), autor (cadena de 30) y editorial (cadena de 15)
describe libros;
4 - Tipos de datos
Ya explicamos que al crear una tabla debemos resolver qu campos (columnas) tendr y que
tipo de datos almacenar cada uno de ellos, es decir, su estructura.
El tipo de dato especifica el tipo de informacin que puede guardar un campo: caracteres,
nmeros, etc.
Estos son algunos tipos de datos bsicos de Oracle (posteriormente veremos otros y con ms
detalle):
Antes de crear una tabla debemos pensar en sus campos y optar por el tipo de dato adecuado
para cada uno de ellos.
Por ejemplo, si en un campo almacenaremos nmeros telefnicos o un nmeros de
documento, usamos "varchar2", no "number" porque si bien son dgitos, con ellos no
realizamos operaciones matemticas. Si en un campo guardaremos apellidos, y suponemos
que ningn apellido superar los 20 caracteres, definimos el campo "varchar2(20)". Si en un
campo almacenaremos precios con dos decimales que no superarn los 999.99 pesos
definimos un campo de tipo "number(5,2)", es decir, 5 dgitos en total, con 2 decimales. Si en
un campo almacenaremos valores enteros de no ms de 3 dgitos, definimos un campo de tipo
"number(3,0)".
4 - Tipos de datos
Problema:
Vamos a crear una tabla llamada "libros" para almacenar informacin de los libros de una
librera. Necesitamos los siguientes campos:
Al crear la tabla, entonces, elegimos el tipo de dato ms adecuado para cada campo:
describe libros;
Aparece la siguiente informacin:
Veamos lo que sucede si intentamos ingresar para el campo "titulo" una cadena de ms de 20
caracteres:
vamos a cortar la cadena para que SQL Server acepte el ingreso del registro:
Veamos qu sucede si intentamos ingresar para el campo "cantidad" un valor fuera de rango:
Oracle omiti el ltimo dgito decimal porque el campo slo admita 2 decimales.
4 - Tipos de datos
Primer problema:
Un videoclub que alquila pelculas en video almacena la informacin de sus pelculas en una
tabla llamada "peliculas"; para cada pelcula necesita los siguientes datos:
6- Intente ingresar una pelcula con valor de cantidad fuera del rango permitido:
8- Muestre todos los registros para ver cmo se almacen el ltimo registro ingresado.
Ver solucin
describe peliculas;
Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados" que guarda los
siguientes datos: nombre, documento, sexo, domicilio, sueldobasico.
9- Elimine la tabla
describe empleados;
Hemos aprendido cmo ver todos los registros de una tabla, empleando la instruccin "select".
La sintaxis bsica y general es la siguiente:
Podemos especificar el nombre de los campos que queremos ver, separndolos por comas:
La lista de campos luego del "select" selecciona los datos correspondientes a los campos
nombrados. En el ejemplo anterior seleccionamos los campos "titulo" y "autor" de la tabla
"libros", mostrando todos los registros.
Problema:
Trabajamos con la tabla "libros" que almacena los datos de los libros de una librera.
Eliminamos la tabla:
Creamos la tabla:
describe libros;
Recuperamos solamente el ttulo, autor y editorial de todos los libros especificando los
nombres de los campos separados por comas:
Con la siguiente sentencia seleccionamos los ttulos y precios de todos los libros:
TITULO PRECIO
-----------------------------------------------
El aleph 25.50
Alicia en el pais de las maravillas 10
Matematica estas ahi 18.8
EDITORIAL CANTIDAD
-------------------------
Emece 100
Atlantida 200
Siglo XXI 200
Note que en todos los casos recuperamos TODOS los registros, pero solamente ALGUNOS
campos que especificamos.
Primer problema:
2- Cree la tabla:
Ver solucin
Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".
2- Cree la tabla:
7- Realice un "select" mostrando el documento, sexo y sueldo bsico de todos los empleados.
describe empleados;
select nombre,documento,domicilio
from empleados;
select documento,sexo,sueldobasico
from empleados;
Existe una clusula, "where" con la cual podemos especificar condiciones para una consulta
"select". Es decir, podemos recuperar algunos registros, slo los que cumplan con ciertas
condiciones indicadas con la clusula "where". Por ejemplo, queremos ver el usuario cuyo
nombre es "Marcelo", para ello utilizamos "where" y luego de ella, la condicin:
Para las condiciones se utilizan operadores relacionales (tema que trataremos ms adelante
en detalle). El signo igual(=) es un operador relacional. Para la siguiente seleccin de
registros especificamos una condicin que solicita los usuarios cuya clave es igual a "River":
select nombre,clave
from usuarios
where clave='River';
Si ningn registro cumple la condicin establecida con el "where", no aparecer ningn
registro.
select nombre
from usuarios
where clave='River';
En la consulta anterior solicitamos el nombre de todos los usuarios cuya clave sea igual a
"River".
Problema:
Trabajamos con la tabla "usuarios" que consta de 2 campos: nombre de usuario y clave.
Eliminamos la tabla si ya existe:
Creamos la tabla:
describe usuarios;
Realizamos una consulta especificando una condicin, queremos ver toda la informacin del
usuario cuyo nombre es "Marcelo":
Nos muestra todos los campos del registro en el cual el campo "nombre" es igual a "Marcelo".
Primer problema:
Trabaje con la tabla "agenda" en la que registra los datos de sus amigos.
1- Elimine "agenda"
2- Cree la tabla, con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20),
domicilio (cadena de 30) y telefono (cadena de 11):
7- Seleccione los nombres y domicilios de quienes tengan apellido igual a "Lopez" (3 registros)
8- Seleccione los nombres y domicilios de quienes tengan apellido igual a "lopez" (en
minsculas)
No aparece ningn registro, ya que la cadena "Lopez" noe s igual a la cadena "lopez".
describe agenda;
Un comercio que vende artculos de computacin registra los datos de sus artculos en una
tabla llamada "articulos".
describe articulos;
5- Seleccione todos los datos de los registros cuyo nombre sea "impresora" (2 registros)
describe articulos;
7 - Operadores relacionales
Los operadores son smbolos que permiten realizar operaciones matemticas, concatenar
cadenas, hacer comparaciones.
Los operadores relacionales (o de comparacin) nos permiten comparar dos expresiones, que
pueden ser variables, valores de campos, etc.
Los operadores relacionales vinculan un campo con un valor para que Oracle compare cada
registro (el campo especificado) con el valor dado.
= igual
<> distinto
> mayor
< menor
>= mayor o igual
<= menor o igual
Podemos seleccionar los registros cuyo autor sea diferente de "Borges", para ello usamos la
condicin:
Podemos comparar valores numricos. Por ejemplo, queremos mostrar los ttulos y precios de
los libros cuyo precio sea mayor a 20 pesos:
Queremos seleccionar los libros cuyo precio sea menor o igual a 30:
Los operadores relacionales comparan valores del mismo tipo. Se emplean para comprobar si
un campo cumple con una condicin.
No son l
7 - Operadores relacionales
Problema:
Seleccionamos los registros cuyo precio supere los 20 pesos, slo el ttulo y precio:
select titulo,precio
from libros
where precio>20;
Note que el valor con el cual comparamos el campo "precio", como es numrico, no se coloca
entre comillas. Los libros cuyo precio es menor a 20 pesos no aparecen en la seleccin.
7 - Operadores relacionales
Primer problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en una
tabla con ese nombre.
1- Elimine "articulos"
6- Seleccione los artculos cuyo precio sea mayor o igual a 400 (3 registros)
7- Seleccione el cdigo y nombre de los artculos cuya cantidad sea menor a 30 (2 registros)
describe articulos;
select codigo,nombre
from articulos
where cantidad<30;
Un video club que alquila pelculas en video almacena la informacin de sus pelculas en
alquiler en una tabla denominada "peliculas".
1- Elimine la tabla.
5- Seleccione el ttulo de todas las pelculas en las que el actor NO sea "Tom Cruise" (2
registros)
6- Muestre todos los campos, excepto "duracion", de todas las pelculas de las que haya ms
de 2 copias (2 registros)
select titulo,actor,cantidad
from peliculas
where cantidad >2;
Sintaxis bsica:
Si no queremos eliminar todos los registros, sino solamente algunos, debemos indicar cul o
cules; para ello utilizamos el comando "delete" junto con la clausula "where" con la cual
establecemos la condicin que deben cumplir los registros a borrar.
Por ejemplo, queremos eliminar aquel registro cuyo nombre de usuario es "Marcelo":
Si solicitamos el borrado de un registro que no existe, es decir, ningn registro cumple con la
condicin especificada, aparecer un mensaje indicando que ningn registro fue eliminado,
pues no encontr registros con ese dato.
Tenga en cuenta que si no colocamos una condicin, se eliminan todos los registros de la
tabla especificada.
Problema:
Como ningn registro cumple con la condicin especificada (nombre igual a Marcelo),
aparecer un mensaje indicando que ningn registro fue borrado.
No hay registros.
Primer problema:
Trabaje con la tabla "agenda" que registra la informacin referente a sus amigos.
1- Elimine la tabla.
2- Cree la tabla con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20),
domicilio (cadena de 30) y telefono (cadena de 11):
5- Elimine los registros cuyo nmero telefnico sea igual a "4545454" (2 registros)
Un comercio que vende artculos de computacin registra los datos de sus artculos en una
tabla con ese nombre.
1- Elimine "articulos"
describe libros;
Para modificar uno o varios datos de uno o varios registros utilizamos "update" (actualizar).
Sintaxis bsica:
Utilizamos "update" junto al nombre de la tabla y "set" junto con el campo a modificar y su
nuevo valor.
Por ejemplo, en nuestra tabla "usuarios", queremos cambiar los valores de todas las claves,
por "RealMadrid":
update usuarios set clave='RealMadrid';
Podemos modificar algunos registros, para ello debemos establecer condiciones de seleccin
con "where".
Si Oracle no encuentra registros que cumplan con la condicin del "where", un mensaje indica
que ningn registro fue modificado.
Para ello colocamos "update", el nombre de la tabla, "set" junto al nombre del campo y el
nuevo valor y separado por coma, el otro nombre del campo con su nuevo valor.
Problema:
Creamos la tabla:
Necesitamos cambiar el valor de la clave del usuario llamado "Federicolopez" por "Boca":
Vimos que si Oracle no encuentra registros que cumplan con la condicin del "where", un
mensaje indica que ningn registro se modifica:
Primer problema:
Trabaje con la tabla "agenda" que almacena los datos de sus amigos.
4- Modifique el registro cuyo nombre sea "Juan" por "Juan Jose" (1 registro actualizado)
5- Actualice los registros cuyo nmero telefnico sea igual a "4545454" por "4445566" (2
registros)
6- Actualice los registros que tengan en el campo "nombre" el valor "Juan" por "Juan Jose"
(ningn registro afectado porque ninguno cumple con la condicin del "where")
1- Elimine la tabla y crela con los siguientes campos: titulo (cadena de 30 caracteres de
longitud), autor (cadena de 20), editorial (cadena de 15) y precio (entero no mayor a 999.99):
5- Modifique los registros cuyo autor sea igual a "Paenza", por "Adrian Paenza" (1 registro)
6- Nuevamente, modifique los registros cuyo autor sea igual a "Paenza", por "Adrian Paenza"
(ningn registro afectado porque ninguno cumple la condicin)
8- Actualice el valor del campo "editorial" por "Emece S.A.", para todos los registros cuya
editorial sea igual a "Emece" (3 registros)
10 - Comentarios
en la lnea anterior, todo lo que est luego de los guiones (hacia la derecha) no se ejecuta.
Para agregar varias lneas de comentarios, se coloca una barra seguida de un asterisco (/*) al
comienzo del bloque de comentario y al finalizarlo, un asterisco seguido de una barra (*/)
Por ejemplo, en nuestra tabla de libros, podemos tener valores nulos en el campo "precio"
porque es posible que para algunos libros no le hayamos establecido el precio para la venta.
Veamos un ejemplo. Tenemos nuestra tabla "libros". El campo "titulo" no debera estar vaco
nunca, igualmente el campo "autor". Para ello, al crear la tabla, debemos especificar que
tales campos no admitan valores nulos:
Para especificar que un campo NO admita valores nulos, debemos colocar "not null" luego de
la definicin del campo.
En el ejemplo anterior, los campos "editorial" y "precio" si admiten valores nulos.
Cuando colocamos "null" estamos diciendo que admite valores nulos (caso del campo
"editorial"); por defecto, es decir, si no lo aclaramos, los campos permiten valores nulos (caso
del campo "precio").
Cualquier campo, de cualquier tipo de dato permite ser definido para aceptar o no valores
nulos. Un valor "null" NO es lo mismo que un valor 0 (cero) o una cadena de espacios en
blanco (" ").
Si ingresamos los datos de un libro, para el cual an no hemos definido el precio podemos
colocar "null" para mostrar que no tiene precio:
Note que el valor "null" no es una cadena de caracteres, NO se coloca entre comillas.
Entonces, si un campo acepta valores nulos, podemos ingresar "null" cuando no conocemos el
valor.
Una cadena vaca es interpretada por Oracle como valor nulo; por lo tanto, si ingresamos una
cadena vaca, se almacena el valor "null".
Si intentamos ingresar el valor "null" (o una cadena vaca) en campos que no admiten valores
nulos (como "titulo" o "autor"), Oracle no lo permite, muestra un mensaje y la insercin no se
realiza; por ejemplo:
Cuando vemos la estructura de una tabla con "describe", en la columna "Null", aparece "NOT
NULL" si el campo no admite valores nulos y no aparece en caso que si los permita.
Para recuperar los registros que contengan el valor "null" en algn campo, no podemos utilizar
los operadores relacionales vistos anteriormente: = (igual) y <> (distinto); debemos utilizar los
operadores "is null" (es igual a null) y "is not null" (no es null).
Entonces, para que un campo no permita valores nulos debemos especificarlo luego de definir
el campo, agregando "not null". Por defecto, los campos permiten valores nulos, pero
podemos especificarlo igualmente agregando "null".
Problema:
Creamos la tabla especificando que los campos "titulo" y "autor" no admitan valores nulos:
Ingresamos otro registro, con valor nulo para el campo "editorial", campo que admite valores
"null":
Ingresamos otro registro, con valor nulo para los dos campos que lo admiten:
Veamos lo que sucede si intentamos ingresar el valor "null" en campos que no lo admiten,
como "titulo":
Para ver cules campos admiten valores nulos y cules no, vemos la estructura de la tabla:
describe libros;
nos muestra, en la columna "Null", que los campos "titulo" y "autor" estn definidos "not null",
es decir, no permiten valores nulos, los otros dos campos si los admiten.
Dijimos que la cadena vaca es interpretada como valor "null". Vamos a ingresar un registro
con cadena vaca para el campo "editorial":
No aparece ningn valor en la columna "editorial" del libro "Uno", almacen "null".
Dijimos que una cadena de espacios NO es igual a una cadena vaca o valor "null". Vamos a
ingresar un registro y en el campo "editorial" guardaremos una cadena de 3 espacios:
Recuperamos los registros que contengan en el campo "editorial" una cadena de 3 espacios:
Primer problema:
Una farmacia guarda informacin referente a sus medicamentos en una tabla llamada
"medicamentos".
4- Ingrese algunos registros con valores "null" para los campos que lo admitan:
6- Ingrese un registro con valor "0" para el precio y cadena vaca para el laboratorio.
7- Intente ingresar un registro con cadena vaca para el nombre (mensaje de error)
8- Intente ingresar un registro con valor nulo para un campo que no lo admite (aparece un
mensaje de error)
11- Recupere los registros cuyo laboratorio sea distinto de ' '(cadena de 1 espacio) (1 registro)
Ver solucin
describe medicamentos;
Segundo problema:
Trabaje con la tabla que almacena los datos sobre pelculas, llamada "peliculas".
1- Elimine la tabla:
5- Recupere todos los registros para ver cmo Oracle los almacen.
6- Intente ingresar un registro con valor nulo para campos que no lo admiten (aparece un
mensaje de error)
describe peliculas;
Para recuperar los registros que contengan el valor "null" en algn campo, no podemos utilizar
los operadores relacionales vistos anteriormente: = (igual) y <> (distinto); debemos utilizar los
operadores "is null" (es igual a null) y "is not null" (no es null).
Con la siguiente sentencia recuperamos los libros que contienen valor nulo en el campo
"editorial":
Con la primera sentencia veremos los libros cuya editorial almacena el valor "null"
(desconocido); con la segunda, los libros cuya editorial guarda una cadena de 3 espacios en
blanco.
Para obtener los registros que no contienen "null", se puede emplear "is not null", esto
mostrar los registros con valores conocidos.
Para ver los libros que NO tienen valor "null" en el campo "precio" tipeamos:
Problema:
Recuperamos los registros en los cuales est almacenado el valor "null" en el campo
"editorial":
Dijimos que una cadena de espacios NO es igual a una cadena vaca o valor "null". Vamos a
ingresar un registro y en el campo "editorial" guardaremos una cadena de 3 espacios:
Recuperamos los registros que contengan el valor "null" en el campo "editorial" y luego
aquellos que tengan una cadena de 3 espacios:
Con la primera sentencia veremos los libros cuya editorial es igual a "null" (desconocido); con
la segunda, los libros cuya editorial almacena una cadena de espacios.
Primer problema:
Una farmacia guarda informacin referente a sus medicamentos en una tabla llamada
"medicamentos".
4- Ingrese algunos registros con valores "null" para los campos que lo admitan:
6- Ingrese un registro con valor "0" para el precio y cadena vaca para el laboratorio.
7- Intente ingresar un registro con cadena vaca para el nombre (mensaje de error)
8- Intente ingresar un registro con valor nulo para un campo que no lo admite (aparece un
mensaje de error)
9- Recupere los registros que contengan valor "null" en el campo "laboratorio" (3 registros)
10- Recupere los registros que contengan valor "null" en el campo "precio", luego los que
tengan el valor 0 en el mismo campo. Note que el resultado es distinto (2 y 1 registros
respectivamente)
11- Recupere los registros cuyo laboratorio no contenga valor nulo (1 registro)
12- Recupere los registros cuyo precio sea distinto de 0, luego los que sean distintos de "null"
(1 y 2 resgistros respectivamente)
Note que la salida de la primera sentencia no muestra los registros con valor 0 y tampoco los
que tienen valor nulo; el resultado de la segunda sentencia muestra los registros con valor
para el campo precio (incluso el valor 0).
14- Recupere los registros cuyo laboratorio sea "null" y luego los que contengan 1 espacio (3 y
1 registros respectivamente)
Note que la salida de la primera sentencia no muestra los registros con valores para el campo
"laboratorio" (un caracter espacio es un valor); el resultado de la segunda sentencia muestra
los registros con el valor " " para el campo precio.
15- Recupere los registros cuyo laboratorio sea distinto de ' '(cadena de 1 espacio), luego los
que sean distintos de "null" (1 y 2 registros respectivamente)
Note que la salida de la primera sentencia no muestra los registros con valor ' ' y tampoco los
que tienen valor nulo; el resultado de la segunda sentencia muestra los registros con valor
para el campo laboratorio (incluso el valor ' ')
Ver solucin
drop table medicamentos;
create table medicamentos(
codigo number(5) not null,
nombre varchar2(20) not null,
laboratorio varchar2(20),
precio number(5,2),
cantidad number(3,0) not null
);
describe medicamentos;
Trabaje con la tabla que almacena los datos sobre pelculas, llamada "peliculas".
1- Elimine la tabla:
5- Recupere todos los registros para ver cmo Oracle los almacen.
6- Intente ingresar un registro con valor nulo para campos que no lo admiten (aparece un
mensaje de error)
8- Actualice los registros que tengan valor de duracin desconocido (nulo) por "120" (1 registro
actualizado)
9- Coloque 'Desconocido' en el campo "actor" en los registros que tengan valor nulo en dicho
campo (2 registros)
11- Muestre todos los registros con valor nulo en el campo "actor" (ninguno)
12- Actualice la pelcula en cuyo campo "duracion" hay 0 por "null" (1 registro)
14- Borre todos los registros en los cuales haya un valor nulo en "duracion" (1 registro)
describe peliculas;
Una clave primaria es un campo (o varios) que identifica un solo registro (fila) en una tabla.
Para un valor del campo clave existe solamente un registro.
Veamos un ejemplo, si tenemos una tabla con datos de personas, el nmero de documento
puede establecerse como clave primaria, es un valor que no se repite; puede haber personas
con igual apellido y nombre, incluso el mismo domicilio (padre e hijo por ejemplo), pero su
documento ser siempre distinto.
Si tenemos la tabla "usuarios", el nombre de cada usuario puede establecerse como clave
primaria, es un valor que no se repite; puede haber usuarios con igual clave, pero su nombre
de usuario ser siempre diferente.
Podemos establecer que un campo sea clave primaria al momento de crear la tabla o luego
que ha sido creada. Vamos a aprender a establecerla al crear la tabla. No existe una nica
manera de hacerlo, por ahora veremos la sintaxis ms sencilla.
Lo que hacemos agregar, luego de la definicin de cada campo, "primary key" y entre
parntesis, el nombre del campo que ser clave primaria.
En el siguiente ejemplo definimos una clave primaria, para nuestra tabla "usuarios" para
asegurarnos que cada usuario tendr un nombre diferente y nico:
Una tabla slo puede tener una clave primaria. Cualquier campo (de cualquier tipo) puede ser
clave primaria, debe cumplir como requisito, que sus valores no se repitan ni sean nulos. Por
ello, al definir un campo como clave primaria, automticamente Oracle lo convierte a "not
null".
Luego de haber establecido un campo como clave primaria, al ingresar los registros, Oracle
controla que los valores para el campo establecido como clave primaria no estn repetidos en
la tabla; si estuviesen repetidos, muestra un mensaje y la insercin no se realiza. Es decir, si
en nuestra tabla "usuarios" ya existe un usuario con nombre "juanperez" e intentamos ingresar
un nuevo usuario con nombre "juanperez", aparece un mensaje y la instruccin "insert" no se
ejecuta.
Igualmente, si realizamos una actualizacin, Oracle controla que los valores para el campo
establecido como clave primaria no estn repetidos en la tabla, si lo estuviese, aparece un
mensaje indicando que se viola la clave primaria y la actualizacin no se realiza.
Podemos ver el campo establecido como clave primaria de una tabla realizando la siguiente
consulta:
Eliminamos la tabla:
Al campo "nombre" no lo definimos "not null", pero al establecerse como clave primaria,
Oracle lo convierte en "not null", veamos que en la columna "NULL" aparece "NOT NULL":
describe usuarios;
Recordemos que cuando un campo es clave primaria, sus valores no se repiten. Intentamos
ingresar un valor de clave primaria existente:
Cuando un campo es clave primaria, sus valores no pueden ser nulos. Intentamos ingresar el
valor "null" en el campo clave primaria:
Si realizamos alguna actualizacin, Oracle controla que los valores para el campo establecido
como clave primaria no estn repetidos en la tabla. Intentemos actualizar el nombre de un
usuario colocando un nombre existente:
TABLE_NAME COLUMN_NAME
--------------------------------------------
USUARIOS NOMBRE
indicando que la tabla "usuarios" tiene establecido el campo "nombre" como clave primaria.
Primer problema:
1- Elimine la tabla:
2- Crela con los siguientes campos, estableciendo como clave primaria el campo "codigo":
6- Intente actualizar el cdigo del libro "Martin Fierro" a "1" (mensaje de error)
9- Vea qu campo de la tabla "libros" (en minsculas) fue establecido como clave primaria
La tabla aparece vaca porque Oracle no encuentra la tabla "libros", ya que almacena los
nombres de las tablas con maysculas.
Segundo problema:
Un instituto de enseanza almacena los datos de sus estudiantes en una tabla llamada
"alumnos".
2- Cree la tabla con la siguiente estructura intentando establecer 2 campos como clave
primaria, el campo "documento" y "legajo":
describe alumnos;
Aprendimos que para borrar todos los registro de una tabla se usa "delete" sin condicin
"where".
Tambin podemos eliminar todos los registros de una tabla con "truncate table". Sintaxis:
La sentencia "truncate table" vaca la tabla (elimina todos los registros) y conserva la
estructura de la tabla.
La diferencia con "drop table" es que esta sentencia elimina la tabla, no solamente los
registros, "truncate table" la vaca de registros.
La diferencia con "delete" es la siguiente, al emplear "delete", Oracle guarda una copia de los
registros borrados y son recuperables, con "truncate table" no es posible la recuperacin
porque se libera todo el espacio en disco ocupado por la tabla; por lo tanto, "truncate table"
es ms rpido que "delete" (se nota cuando la cantidad de registros es muy grande).
14 - Vaciar la tabla (truncate table)
Problema:
Trabajamos con la tabla "libros" que almacena los datos de los libros de una librera.
Eliminamos la tabla:
Creamos la tabla:
Truncamos la tabla:
Eliminamos la tabla:
Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir
los campos y sus tipos ms precisos, segn el caso.
Podemos almacenar letras, smbolos y dgitos con los que no se realizan operaciones
matemticas, por ejemplo, cdigos de identificacin, nmeros de documentos, nmeros
telefnicos. Tenemos los siguientes tipos:
1) char(x): define una cadena de caracteres de longitud fija determinada por el argumento
"x". Si se omite el argumento, por defecto coloca 1. "char" viene de character, que significa
caracter en ingls. Su rango es de 1 a 2000 caracteres.
Que sea una cadena de longitud fija significa que, si definimos un campo como "char(10)" y
almacenamos el valor "hola" (4 caracteres), Oracle rellenar las 6 posiciones restantes con
espacios, es decir, ocupar las 10 posiciones; por lo tanto, si la longitud es invariable, es
conveniente utilizar el tipo char; caso contrario, el tipo varchar2.
Si almacenamos "hola" en un campo definido "char(10)" Oracle almacenar "hola ".
3) nchar(x): es similar a "char" excepto que permite almacenar caracteres ASCII, EBCDIC y
Unicode; su rango va de 1 a 1000 caracteres porque se emplean 2 bytes por cada caracter.
Por ejemplo, si en un campo definido como varchar2(5) ingresamos el valor 12345, lo toma
como si hubisemos tipeado '12345', igualmente, si ingresamos el valor 23.56, lo convierte a
'23.56'. Si el valor numrico, al ser convertido a cadena supera la longitud definida, aparece
un mensaje de error y la sentencia no se ejecuta.
Para almacenar cadenas que varan en su longitud, es decir, no todos los registros tendrn la
misma longitud en un campo determinado, se emplea "varchar2" en lugar de "char".
Por ejemplo, en campos que guardamos nombres y apellidos, no todos los nombres y apellidos
tienen la misma longitud.
Para almacenar cadenas que no varan en su longitud, es decir, todos los registros tendrn la
misma longitud en un campo determinado, se emplea "char".
Por ejemplo, definimos un campo "codigo" que constar de 5 caracteres, todos los registros
tendrn un cdigo de 5 caracteres, ni ms ni menos.
Problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus
productos.
Los campos "nombre", "domicilio" y "ciudad" almacenarn valores cuya longitud vara, por ello
elegimos el tipo "varchar2" y le damos a cada uno una longitud mxima estimando su tamao.
El campo "sexo" se define de tipo "char", porque necesitamos solamente 1 caracter "f" o "m",
que siempre ser fijo. El campo "telefono" tambin se define como varchar2 porque no todos
los nmeros telefnicos tienen la misma longitud.
Ingresamos un registro:
Intentamos ingresar una cadena de mayor longitud que la definida en el campo "sexo":
Ingresamos el mismo registro, esta vez con un slo caracter para el campo "sexo":
Ingresamos un nmero telefnico olvidando las comillas, es decir, como un valor numrico:
Primer problema:
Una concesionaria de autos vende autos usados y almacena los datos de los autos en una tabla
llamada "autos".
2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo, estableciendo el campo
"patente" como clave primaria:
Segundo problema:
Una empresa almacena los datos de sus clientes en una tabla llamada "clientes".
3- Analice la definicin de los campos. Se utiliza char(8) para el documento porque siempre
constar de 8 caracteres. Para el nmero telefnico se usar "varchar2" y no un tipo numrico
porque si bien es un nmero, con l no se realizarn operaciones matemticas.
5- Intente ingresar un registro con ms caracteres que los permitidos para el campo "telefono"
6- Intente ingresar un registro con ms caracteres que los permitidos para el campo
"documento"
Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir
los campos y sus tipos ms precisos, segn el caso.
Los valores numricos no se ingresan entre comillas. Se utiliza el punto como separador de
decimales.
El parmetro "t" indica el nmero total de dgitos (contando los decimales) que contendr el
nmero como mximo (es la precisin). Su rango va de 1 a 38. El parmetro "d" indica el
mximo de dgitos decimales (escala). La escala puede ir de -84 a 127. Para definir nmero
enteros, se puede omitir el parmetro "d" o colocar un 0.
Un campo definido "number(5,2)" puede contener cualquier nmero entre -999.99 y 999.99.
Para especificar nmero enteros, podemos omitir el parmetro "d" o colocar el valor 0.
Si intentamos almacenar un valor mayor fuera del rango permitido al definirlo, tal valor no se
carga, aparece un mensaje indicando tal situacin y la sentencia no se ejecuta.
Por ejemplo, si definimos un campo de tipo "number(4,2)" e intentamos guardar el valor
123.45, aparece un mensaje indicando que el valor es demasiado grande para la columna. Si
ingresamos un valor con ms decimales que los definidos, el valor se carga pero con la
cantidad de decimales permitidos, los dgitos sobrantes se omiten.
2) float (x): almacena un nmero en punto decimal. El parmetro indica la precisin binaria
mxima; con un rango de 1 a 126. Si se omite, por defecto es 126.
Para ambos tipos numricos:
- si ingresamos un valor con ms decimales que los permitidos, redondea al ms cercano; por
ejemplo, si definimos "float(4,2)" e ingresamos el valor "12.686", guardar "12.69",
redondeando hacia arriba; si ingresamos el valor "12.682", guardar "12.67", redondeando
hacia abajo.
- si ingresamos una cadena, Oracle intenta convertirla a valor numrico, si dicha cadena
consta solamente de dgitos, la conversin se realiza, luego verifica si est dentro del rango,
si es as, la ingresa, sino, muestra un mensaje de error y no ejecuta la sentencia. Si la cadena
contiene caracteres que Oracle no puede convertir a valor numrico, muestra un mensaje de
error y la sentencia no se ejecuta.
Por ejemplo, definimos un campo de tipo "numberl(5,2)", si ingresamos la cadena '12.22', la
convierte al valor numrico 12.22 y la ingresa; si intentamos ingresar la cadena '1234.56', la
convierte al valor numrico 1234.56, pero como el mximo valor permitido es 999.99,
muestra un mensaje indicando que est fuera de rango. Si intentamos ingresar el valor
'12y.25', Oracle no puede realizar la conversin y muestra un mensaje de error.
Problema:
Eliminamos la tabla:
Note que definimos el campo "codigo" de tipo "number(5)", esto es porque estimamos que no
tendremos ms de 99999 libros, y no colocamos decimales porque necesitamos nmeros
enteros.
Como en el campo "precio" no almacenaremos valores mayores a 9999.99, definimos el campo
de tipo "number(6,2)".
Como los valores para el campo "cantidad" no superarn los 9999, definimos el campo de tipo
"number(4)", no colocamos decimales porque necesitamos valores enteros.
Trunc el valor.
Trunc el valor.
Intentamos ingresar una cadena que Oracle no pueda convertir a valor numrico en el campo
"precio":
Error.
Primer problema:
Un banco tiene registrados las cuentas corrientes de sus clientes en una tabla llamada
"cuentas".
La tabla contiene estos datos:
2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar los datos descriptos
arriba:
- Nmero de cuenta: entero hasta 9999, no nulo, no puede haber valores repetidos, clave
primaria;
Note que hay dos cuentas, con distinto nmero de cuenta, de la misma persona.
4- Seleccione todos los registros cuyo saldo sea mayor a "4000" (2 registros)
5- Muestre el nmero de cuenta y saldo de todas las cuentas cuyo propietario sea "Juan
Lopez" (2 registros)
7- Muestre todas las cuentas cuyo nmero es igual o mayor a "3000" (2 registros)
drop table cuentas;
Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados" que guarda los
siguientes datos: nombre, documento, sexo, domicilio, sueldobasico.
1- Elimine la tabla:
4- Ingrese un valor de "sueldobasico" con ms decimales que los definidos (redondea los
decimales al valor ms cercano 800.89)
6- Muestre todos los empleados cuyo sueldo no supere los 900 pesos
Hemos aprendido a ingresar registros listando todos los campos y colocando valores para
todos y cada uno de ellos luego de "values".
Si ingresamos valores para todos los campos, podemos omitir la lista de nombres de los
campos.
Por ejemplo, si tenemos creada la tabla "libros" con los campos "titulo", "autor" y "editorial",
podemos ingresar un registro de la siguiente manera:
Tambin es posible ingresar valores para algunos campos. Ingresamos valores solamente para
los campos "titulo" y "autor":
Oracle almacenar el valor "null" en el campo "editorial", para el cual no hemos explicitado un
valor.
- la lista de campos debe coincidir en cantidad y tipo de valores con la lista de valores luego
de "values". Si se listan ms (o menos) campos que los valores ingresados, aparece un mensaje
de error y la sentencia no se ejecuta.
- si ingresamos valores para todos los campos podemos obviar la lista de campos.
- podemos omitir valores para los campos que permitan valores nulos (se guardar "null"); si
omitimos el valor para un campo "not null", la sentencia no se ejecuta.
Problema:
Trabajamos con la tabla "libros" que almacena los datos de los libros de una librera.
Eliminamos la tabla:
Creamos la tabla:
Si ingresamos valores para todos los campos, podemos omitir la lista de campos:
insert into libros
values (1,'Uno','Richard Bach','Planeta');
No podemos omitir el valor para un campo declarado "not null", como el campo "codigo":
Primer problema:
Un banco tiene registrados las cuentas corrientes de sus clientes en una tabla llamada
"cuentas".
2- Cree la tabla :
3- Ingrese un registro con valores para todos sus campos, omitiendo la lista de campos.
8- Intente ingresar un registro sin valor para un campo definido "not null".
Hemos visto que si al insertar registros no se especifica un valor para un campo que admite
valores nulos, se ingresa automticamente "null". A este valor se le denomina valor por
defecto o predeterminado.
Para campos de cualquier tipo no declarados "not null", es decir, que admiten valores nulos,
el valor por defecto es "null". Para campos declarados "not null", no existe valor por defecto,
a menos que se declare explcitamente con la clusula "default".
Podemos establecer valores por defecto para los campos cuando creamos la tabla. Para ello
utilizamos "default" al definir el campo. Por ejemplo, queremos que el valor por defecto del
campo "autor" de la tabla "libros" sea "Desconocido" y el valor por defecto del campo
"cantidad" sea "0":
Si al ingresar un nuevo registro omitimos los valores para el campo "autor" y "cantidad",
Oracle insertar los valores por defecto; en "autor" colocar "Desconocido" y en cantidad "0".
La clusula "default" debe ir antes de "not null" (si existiese), sino aparece un mensaje de
error.
Para ver si los campos de la tabla "libros" tiene definidos valores por defecto y cules son,
podemos realizar la siguiente consulta:
select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'libros';
Muestra una fila por cada campo, en la columna "data_default" aparece el valor por defecto
(si lo tiene), en la columna "nullable" aparece "N" si el campo no est definido "not null" y "Y"
si admite valores "null".
Tambin se puede utilizar "default" para dar el valor por defecto a los campos en sentencias
"insert", por ejemplo:
Los campos para los cuales no se ingresan valores en un "insert" tomarn los valores por
defecto:
- si est declarado explcitamente "not null" y no tiene valor "default", no hay valor por
defecto, as que causar un error y el "insert" no se ejecutar.
Un campo slo puede tener un valor por defecto. Una tabla puede tener todos sus campos con
valores por defecto. Que un campo tenga valor por defecto no significa que no admita valores
nulos, puede o no admitirlos.
Un campo definido como clave primaria acepta un valor "default", pero no tiene sentido ya
que el valor por defecto solamente podr ingresarse una vez; si intenta ingresarse cuando
otro registro ya lo tiene almacenado, aparecer un mensaje de error indicando que se intenta
duplicar la clave.
Problema:
Eliminamos la tabla:
Creamos la tabla estableciendo valores por defecto para los campos "autor" y "cantidad":
Oracle ingresar el registro con el ttulo, editorial y precio especificados, en "autor" colocar
"Desconocido" y en cantidad "0", vemoslo:
Si ingresamos un registro sin valor para el campo "precio", que admite valores nulos, se
ingresar "null" en ese campo:
Veamos si los campos de la tabla "libros" tiene definidos valores por defecto y cules son:
select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'LIBROS';
Muestra una fila por cada campo, en la columna "data_default" aparece el valor por defecto
(si lo tiene), en la columna "nullable" aparece "N" si el campo no est definido "not null" y "Y"
si permite valores nulos.
Podemos emplear "default" para dar el valor por defecto a algunos campos al ingresar un
registro:
Que un campo tenga valor por defecto no significa que no admita valores nulos, puede o no
admitirlos. Podemos ingresar el valor "null" en el campo "cantidad":
Primer problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus
productos.
Todos los campos admiten valores nulos; hay 3 campos con valores predeterminados.
5- Ingrese algunos registros sin especificar valores para algunos campos para ver cmo opera
la clusula "default":
Los campos de aquellos registros para los cuales no se ingres valor almacenaron el valor por
defecto ("null" o el especificado con "default").
select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'VISITANTES';
Segundo problema:
Una pequea biblioteca de barrio registra los prstamos de sus libros en una tabla llamada
"prestamos". En ella almacena la siguiente informacin: ttulo del libro, documento de
identidad del socio a quien se le presta el libro, fecha de prstamo, fecha en que tiene que
devolver el libro y si el libro ha sido o no devuelto.
2- Cree la tabla:
4- Ingrese algunos registros omitiendo el valor para los campos que lo admiten.
6- Ingrese un registro colocando "default" en los campos que lo admiten y vea cmo se
almacen.
7- Intente ingresar un registro colocando "default" como valor para un campo que no admita
valores nulos y no tenga definido un valor por defecto.
select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'PRESTAMOS';
Aprendimos que los operadores son smbolos que permiten realizar distintos tipos de
operaciones.
Dijimos que Oracle tiene 4 tipos de operadores: 1) relacionales o de comparacin (los vimos),
2) aritmticos, 3) de concatenacin y 4) lgicos (lo veremos ms adelante).
Es posible obtener salidas en las cuales una columna sea el resultado de un clculo y no un
campo de una tabla.
Si queremos ver los ttulos, precio y cantidad de cada libro escribimos la siguiente sentencia:
select titulo,precio,cantidad
from libros;
Si queremos saber el monto total en dinero de un ttulo podemos multiplicar el precio por la
cantidad por cada ttulo, pero tambin podemos hacer que Oracle realice el clculo y lo
incluya en una columna extra en la salida:
Si queremos saber el precio de cada libro con un 10% de descuento podemos incluir en la
sentencia los siguientes clculos:
select titulo,precio,
precio-(precio*0.1)
from libros;
select titulo||'-'||autor
from libros;
Problema:
Eliminamos la tabla:
Creamos la tabla:
select titulo,precio,
precio-(precio*0.1)
from libros;
select titulo||'-'||autor
from libros;
Primer problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en una
tabla con ese nombre.
1- Elimine la tabla:
2- Cree la tabla:
4- El comercio quiere aumentar los precios de todos sus artculos en un 15%. Actualice todos
los precios empleando operadores aritmticos.
5- Vea el resultado.
6- Muestre todos los artculos, concatenando el nombre y la descripcin de cada uno de ellos
separados por coma.
8- Recupere todos los datos de las impresoras para verificar que la actualizacin se realiz.
9- Muestre todos los artculos concatenado los campos para que aparezcan de la siguiente
manera "Cod. 101: impresora Epson Stylus C45 $460,92 (15)"
Una manera de hacer ms comprensible el resultado de una consulta consiste en cambiar los
encabezados de las columnas. Por ejemplo, tenemos la tabla "libros" con un campo "cantidad"
(entre otros) en el cual se almacena la cantidad de libros en stock; queremos que al mostrar
la informacin de dicha tabla aparezca como encabezado del campo "cantidad" el texto
"stock", para ello colocamos un alias de la siguiente manera:
select titulo,
cantidad as stock,
precio
from libros;
Para reemplazar el nombre de un campo del encabezado por otro, se coloca la palabra clave
"as" seguido del texto del encabezado.
Si el alias consta de una sola cadena las comillas no son necesarias, pero si contiene ms de
una palabra, es necesario colocarla entre comillas dobles:
select titulo,
cantidad as "stock disponible",
precio
from libros;
select titulo,precio,
precio*0.1 as descuento,
precio-(precio*0.1) as "preciofinal"
from libros;
Entonces, un "alias" se usa como nombre de un campo o de una expresin. En estos casos, son
opcionales, sirven para hacer ms comprensible el resultado.
Problema:
Eliminamos la tabla:
Creamos la tabla:
select titulo,
cantidad as stock,
precio
from libros;
select titulo,
cantidad as "stock disponible",
precio
from libros;
Recuperamos el ttulo, autor, precio, descuento del 10% y precio final con descuento,
empleando un alias para las 2 ltimas columnas:
select titulo,autor,precio,
precio*0.1 as descuento,
precio-(precio*0.1) as "precio final"
from libros;
select titulo,precio,
precio-(precio*0.1) "precio con descuento"
from libros;
20 - Alias (encabezados de columnas)
Primer problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en una
tabla con ese nombre.
1- Elimine la tabla:
2- Cree la tabla:
5- Muestre los precios de todos los artculos, concatenando el nombre y la descripcin con el
encabezado "artculo" (sin emplear "as" ni comillas)
6- Muestre todos los campos de los artculos y un campo extra, con el encabezado "monto
total" en la que calcule el monto total en dinero de cada artculo (precio por cantidad)
7- Muestre la descripcin de todas las impresoras junto al precio con un 20% de recargo con
un encabezado que lo especifique.
Las siguientes son algunas de las funciones que ofrece Oracle para trabajar con cadenas de
caracteres:
- chr(x): retorna un caracter equivalente al cdigo enviado como argumento "x". Ejemplo:
- initcap(cadena): retorna la cadena enviada como argumento con la primera letra (letra
capital) de cada palabra en mayscula. Ejemplo:
retorna "www.oracle.com'.
- translate(): reemplaza cada ocurrencia de una serie de caracteres con otra serie de
acracteres. La diferencia con "replace" es que aquella trabaja con cadenas de caracteres y
reemplaza una cadena completa por otra, en cambio "translate" trabaja con caracteres
simples y reemplaza varios. En el siguiente ejemplo se especifica que se reemplacen todos los
caracteres "O" por el caracter "0", todos los caracteres "S" por el caracter "5" y todos los
caracteres "G" por "6":
select translate('JORGE LUIS BORGES','OSG','056') from dual;--'J0R6E
LUI5 B0R6E5'
Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo
caracter.
21 - Funciones string
Problema:
Eliminamos la tabla:
Creamos la tabla:
Mostramos slo los 12 primeros caracteres de los ttulos de los libros y sus autores, empleando
la funcin "substr":
Mostramos slo los 20 primeros caracteres de los ttulos de los libros y rellenando los espacios
restantes con "*", empleando la funcin "rpad":
Mostramos el ttulo y el precio de todos los libros concatenando el signo "$" a los precios:
select titulo,replace(editorial,'Emece','Sudamericana')
from libros;
Recuperamos el autor de todos los libros reemplazando las letras "abc" por "ABC"
respectivamente (empleando "translate"):
Mostramos la posicin de la primera ocurrencia de la cadena "pais" en los ttulos de los libros:
Note que los ttulos que no contienen la subcadena "pais" muestran el valor cero.
22 - Funciones matemticas.
Las funciones numricas aceptan parmetros de entrada de tipo numrico y retornan valores
numricos.
Oracle tiene algunas funciones para trabajar con nmeros. Aqu presentamos algunas.
La tabla dual es una tabla virtual que existe en todas las Bases de datos Oracle.
- sqrt(x): devuelve la raiz cuadrada del valor enviado como argumento. Ejemplo:
Oracle dispone de funciones trigonomtricas que retornan radianes, calculan seno, coseno,
inversas, etc.: acos, asin, atan, atan2, cos, cosh, exp, ln, log, sin, sinh, tan, tanh. No las
veremos en detalle.
Problema:
Una empresa almacena los datos de sus empleados en una tabla denominada "empleados".
Eliminamos la tabla:
Creamos la tabla:
Vamos a mostrar los sueldos de los empleados redondeando el valor hacia abajo y luego hacia
arriba (empleamos "floor" y "ceil"):
Note que los valores devueltos segn la funcin empleada, son diferentes.
Devuelve el valor 4.
Retorna 9.
Oracle dispone de varias funciones que operan con tipos de datos "date". Estas son algunas:
Retorna 05/09/07
En Oracle: Los operadores aritmticos "+" (ms) y "-" (menos) pueden emplearse con fechas.
Por ejemplos:
select sysdate-3:
Retorna 10/12/07
Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo
date.
Problema:
Eliminamos la tabla:
Creamos la tabla:
Muestre la fecha que ser 15 das despus de "24/08/2007" empleando el operador "+":
Retorna 08/09/07.
Muestre la fecha que 20 das antes del "12/08/2007" empleando el operador "-":
Retorna 23/07/07.
Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el ttulo:
Tambin podemos colocar el nmero de orden del campo por el que queremos que se ordene
en lugar de su nombre, es decir, referenciar a los campos por su posicin en la lista de
seleccin. Por ejemplo, queremos el resultado del "select" ordenado por "precio":
select titulo,autor,precio
from libros order by 3;
Por defecto, si no aclaramos en la sentencia, los ordena de manera ascendente (de menor a
mayor). Podemos ordenarlos de mayor a menor, para ello agregamos la palabra clave "desc":
select *libros
order by editorial desc;
Tambin podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial":
Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sentido
ascendente y "editorial" en sentido descendente:
Debe aclararse al lado de cada campo, pues estas palabras claves afectan al campo
inmediatamente anterior.
Es posible ordenar por un campo que no se lista en la seleccin incluso por columnas
calculados.
Se puede emplear "order by" con campos de tipo caracter, numrico y date.
Primer problema:
En una pgina web se guardan los siguientes datos de las visitas: nombre, mail, pais y fecha.
1- Elimine la tabla "visitas" y crela con la siguiente estructura:
5- Muestre el nombre del usuario, pais y el mes, ordenado por pais (ascendente) y el mes
(descendente)
6- Muestre los mail, pas, ordenado por pas, de todos los que visitaron la pgina en octubre
(4 registros)
Hasta el momento, hemos aprendido a establecer una condicin con "where" utilizando
operadores relacionales. Podemos establecer ms de una condicin con la clusula "where",
para ello aprenderemos los operadores lgicos.
Si queremos recuperar todos los libros cuyo autor sea igual a "Borges" y cuyo precio no supere
los 20 pesos, necesitamos 2 condiciones:
Los registros recuperados en una sentencia que une dos condiciones con el operador "and",
cumplen con las 2 condiciones.
Queremos ver los libros cuyo autor sea "Borges" y/o cuya editorial sea "Planeta":
En la sentencia anterior usamos el operador "or"; indicamos que recupere los libros en los
cuales el valor del campo "autor" sea "Borges" y/o el valor del campo "editorial" sea "Planeta",
es decir, seleccionar los registros que cumplan con la primera condicin, con la segunda
condicin y con ambas condiciones.
Los registros recuperados con una sentencia que une dos condiciones con el operador "or",
cumplen una de las condiciones o ambas.
Queremos recuperar los libros que NO cumplan la condicin dada, por ejemplo, aquellos cuya
editorial NO sea "Planeta":
Los registros recuperados en una sentencia en la cual aparece el operador "not", no cumplen
con la condicin a la cual afecta el "NOT".
Los parntesis se usan para encerrar condiciones, para que se evalen como una sola
expresin.
Cuando explicitamos varias condiciones con diferentes operadores lgicos (combinamos "and",
"or") permite establecer el orden de prioridad de la evaluacin; adems permite diferenciar
las expresiones ms claramente.
Si bien los parntesis no son obligatorios en todos los casos, se recomienda utilizarlos para
evitar confusiones.
El orden de prioridad de los operadores lgicos es el siguiente: "not" se aplica antes que "and"
y "and" antes que "or", si no se especifica un orden de evaluacin mediante el uso de
parntesis. El orden en el que se evalan los operadores con igual nivel de precedencia es
indefinido, por ello se recomienda usar los parntesis.
Problema:
Recuperamos los libros cuyo autor sea igual a "Borges" y cuyo precio no supere los 20 pesos:
Seleccionamos los libros cuyo autor es "Borges" y/o cuya editorial es "Planeta":
Note que aparecen todos los libros de "Borges" y todos los libros de "Planeta", algunos
cumplen ambas condiciones.
Note que el primer resultado retorna todos los libros de "Borges" (primera condicin) y todos
los libros de "Paidos" con precio inferior a 20 (segunda condicin) (registros 1,2,6 y 8); la
segunda recupera todos los libros de "Borges" o de "Paidos" (primera condicin) cuyo precio
sea inferior a 20 (segunda condicin) (registros 1,6 y 8).
dicin especificada.
Primer problema:
4- Recupere los cdigos y nombres de los medicamentos cuyo laboratorio sea "Roche' y cuyo
precio sea menor a 5 (1 registro cumple con ambas condiciones)
5- Recupere los medicamentos cuyo laboratorio sea "Roche" o cuyo precio sea menor a 5 (4
registros)
6- Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer" y cuya cantidad sea=100.
Luego muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya cantidad NO
sea=100
7- Recupere los nombres de los medicamentos cuyo precio est entre 2 y 5 inclusive (2
registros)
8- Elimine todos los registros cuyo laboratorio sea igual a "Bayer" y su precio sea mayor a 10 (1
registro eliminado)
9- Cambie la cantidad por 200, de todos los medicamentos de "Roche" cuyo precio sea mayor
a 5 (1 registro afectado)
11- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea menor a 3 (3
registros borrados)
Ver solucin
Segundo problema:
Trabajamos con la tabla "peliculas" de un video club que alquila pelculas en video.
4- Recupere los registros cuyo actor sea "Tom Cruise" o "Richard Gere" (3 registros)
5- Recupere los registros cuyo actor sea "Tom Cruise" y duracin menor a 100 (ninguno cumple
ambas condiciones)
6- Recupere los nombres de las pelculas cuya duracin se encuentre entre 100 y 120
minutos(5 registros)
7- Cambie la duracin a 200, de las pelculas cuyo actor sea "Daniel R." y cuya duracin sea
180 (1 registro afectado)
9- Borre todas las pelculas donde el actor NO sea "Tom Cruise" y cuya duracin sea mayor o
igual a 100 (2 registros eliminados)
drop table peliculas;
Hemos visto los operadores relacionales: = (igual), <> (distinto), > (mayor), < (menor), >=
(mayor o igual), <= (menor o igual), is null/is not null (si un valor es NULL o no).
Otro operador relacional es "between", trabajan con intervalos de valores.
Hasta ahora, para recuperar de la tabla "libros" los libros con precio mayor o igual a 20 y
menor o igual a 40, usamos 2 condiciones unidas por el operador lgico "and":
Averiguamos si el valor de un campo dado (precio) est entre los valores mnimo y mximo
especificados (20 y 40 respectivamente).
Problema:
Para seleccionar los libros cuyo precio NO est entre un intervalo de valores antecedemos
"not" al "between":
Recuperamos los ttulos y edicin de los libros cuya fecha de edicin se encuentre entre
'01/05/2000' y '01/05/2007', ordenados por fecha de edicin:
Primer problema:
En una pgina web se guardan los siguientes datos de las visitas: nmero de visita, nombre,
mail, pais, fechayhora de la visita.
Segundo problema:
3- Recupere los nombres y precios de los medicamentos cuyo precio est entre 5 y 15 (2
registros)
4- Seleccione los registros cuya cantidad se encuentre entre 100 y 200 (3 registros)
5- Recupere los remedios cuyo vencimiento se encuentre entre la fecha actual y '01/01/2008'
inclusive (2 registros)
6- Elimine los remedios cuyo vencimiento se encuentre entre el ao 2007 y 2008 inclusive (3
registros)
drop table medicamentos;
Se utiliza "in" para averiguar si el valor de un campo est incluido en una lista de valores
especificada.
En la siguiente sentencia usamos "in" para averiguar si el valor del campo autor est incluido
en la lista de valores especificada (en este caso, 2 cadenas).
Hasta ahora, para recuperar los libros cuyo autor sea 'Paenza' o 'Borges' usbamos 2
condiciones:
Empleando "in" averiguamos si el valor del campo est incluido en la lista de valores
especificada; con "not" antecediendo la condicin, invertimos el resultado, es decir,
recuperamos los valores que no se encuentran (no coinciden) con la lista de valores.
Los valores "null" no se consideran.
Problema:
Eliminamos la tabla:
Creamos la tabla:
Recuperamos los libros cuyo cdigo se encuentre en la siguiente lista de valores (1,3,5,7,9):
Primer problema:
4- Recupere los nombres y precios de los medicamentos cuyo laboratorio sea "Bayer" o "Bago"
empleando el operador "in" (4 registros)
5- Recupere los nombres y precios de los medicamentos cuyo laboratorio NO sea "Bayer" o
"Bago" empleando el operador "in" (1 registro)
Note que los valores nulos no se incluyen.
7- Recupere los registros cuyas fechas de vencimiento se encuentra entre enero de 2005 y
enero del 2007 (emplee el operador apropiado) (2 registros)
8- Recupere los registros cuyo ao de vencimiento sea 2005 o 2006 (emplee el operador
apropiado) (2 registros)
Hemos realizado consultas utilizando operadores relacionales para comparar cadenas. Por
ejemplo, sabemos recuperar los libros cuyo autor sea igual a la cadena "Borges":
El operador igual ("=") nos permite comparar cadenas de caracteres, pero al realizar la
comparacin, busca coincidencias de cadenas completas, realiza una bsqueda exacta.
slo aparecer el primer registro, ya que la cadena "Borges" no es igual a la cadena "J.L.
Borges".
Esto sucede porque el operador "=" (igual), tambin el operador "<>" (distinto) comparan
cadenas de caracteres completas. Para comparar porciones de cadenas utilizamos los
operadores "like" y "not like".
Entonces, podemos comparar trozos de cadenas de caracteres para realizar consultas. Para
recuperar todos los registros cuyo autor contenga la cadena "Borges" debemos tipear:
Note que el smbolo "%" ya no est al comienzo, con esto indicamos que el ttulo debe tener
como primera letra la "M" y luego, cualquier cantidad de caracteres.
As como "%" reemplaza cualquier cantidad de caracteres, el guin bajo "_" reemplaza un
caracter, es otro caracter comodn. Por ejemplo, queremos ver los libros de "Lewis Carroll"
pero no recordamos si se escribe "Carroll" o "Carrolt", entonces tipeamos esta condicin:
"like" se emplea con tipos de datos caracter y date. Si empleamos "like" con tipos de datos
que no son caracteres, Oracle convierte (si es posible) el tipo de dato a caracter. Por
ejemplo, queremos buscar todos los libros cuyo precio se encuentre entre 10.00 y 19.99:
Los valores nulos no se incluyen en las bsquedas con "like" y "not like".
Problema:
Eliminamos la tabla:
Creamos la tabla:
Recuperamos todos los libros que contengan en el campo "autor" la cadena "Borges":
Si queremos ver los libros de "Lewis Carroll" pero no recordamos si se escribe "Carroll" o
"Carrolt", podemos emplear el comodn "_" (guin bajo) y establecer la siguiente condicin:
Note que especificamos que los 2 primeros caracteres (2 guiones bajos) pueden ser cualquier
caracter, luego una barra seguida de "05" y que finalice con cualquier nmero de caracteres.
Recuperamos todos los libros cuyo precio se encuentra entre 10.00 y 19.99:
Note que especificamos que el segundo caracter (1 guin bajo) puede ser cualquier valor,
luego una coma y que finalice con cualquier nmero de caracteres.
Primer problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados".
1- Elimine la tabla:
2- Cree la tabla:
4- Muestre todos los empleados con apellido "Perez" empleando el operador "like" (1 registro)
Note que no incluye los "perez" (que comienzan con minscula).
5- Muestre todos los empleados cuyo domicilio comience con "Co" y tengan un "8" (2 registros)
7- Seleccione todos los empleados cuyo documento NO comience con 2 y cuyo nombre finalice
en "ez" (1 registro)
8- Recupere todos los nombres que tengan una "G" o una "J" en su nombre o apellido (3
registros)
9- Muestre los nombres y seccin de los empleados que pertenecen a secciones que
comiencen con "S" o "G" y tengan 8 caracteres (3 registros)
10- Muestre los nombres y seccin de los empleados que pertenecen a secciones que NO
comiencen con "S" (3 registros)
11- Muestre todos los nombres y sueldos de los empleados cuyos sueldos se encuentren entre
500,00 y 599,99 empleando "like" (2 registros)
12- Muestre los empleados que hayan ingresado en la dcada del 90 (5 registros)
13- Agregue 50 centavos a todos los sueldos que no tengan centavos (4 registros) y verifique
recuperando todos los registros.
14- Elimine todos los empleados cuyos apellidos comiencen con "p" (minscula) (2 registros)
Existen en Oracle funciones que nos permiten contar registros, calcular sumas, promedios,
obtener valores mximos y mnimos. Estas funciones se denominan funciones de grupo y
operan sobre un conjunto de valores (registros), no con datos individuales y devuelven un
nico valor.
Imaginemos que nuestra tabla "libros" contiene muchos registros. Para averiguar la cantidad
sin necesidad de contarlos manualmente usamos la funcin "count()":
select count(*)
from libros;
La funcin "count()" cuenta la cantidad de registros de una tabla, incluyendo los que tienen
valor nulo.
Tambin podemos utilizar esta funcin junto con la clausula "where" para una consulta ms
especfica. Queremos saber la cantidad de libros de la editorial "Planeta":
select count(*)
from libros
where editorial='Planeta';
Para contar los registros que tienen precio (sin tener en cuenta los que tienen valor nulo),
usamos la funcin "count()" y en los parntesis colocamos el nombre del campo que
necesitamos contar:
select count(precio)
from libros;
Note que "count(*)" retorna la cantidad de registros de una tabla (incluyendo los que tienen
valor "null") mientras que "count(precio)" retorna la cantidad de registros en los cuales el
campo "precio" no es nulo. No es lo mismo. "count(*)" cuenta registros, si en lugar de un
asterisco colocamos como argumento el nombre de un campo, se contabilizan los registros
cuyo valor en ese campo NO es nulo.
Problema:
Eliminamos la tabla:
Creamos la tabla:
select count(*)
from libros;
Note que incluye todos los libros aunque tengan valor nulo en algn campo.
select count(*)
from libros
where editorial='Planeta';
Existen 2 libros de editorial "Planeta".
Contamos los registros que tienen precio (sin tener en cuenta los que tienen valor nulo),
usando la funcin "count(precio)":
select count(precio)
from libros;
select count(editorial)
from libros;
Primer problema:
1- Elimine la tabla:
7- Cuente la cantidad de remedios con precio conocido, cuyo laboratorio comience con "B" (2
registros)
select count(*)
from medicamentos;
select count(laboratorio)
from medicamentos;
select count(precio)
from medicamentos
where laboratorio like 'B%';
select count(numerolote) from medicamentos;
select count(fechavencimiento)
from medicamentos;
Hemos visto que Oracle dispone de funciones que nos permiten contar registros, calcular
sumas, promedios, obtener valores mximos y mnimos, las funciones de grupo. Las funciones
de grupo operan sobre un conjunto de valores (registros) y retornan un solo valor.
Se pueden usar en una instruccin "select" y combinarlas con la clusula "group by" (la
veremos posteriormente).
Todas estas funciones retornan "null" si ningn registro cumple con la condicion del "where"
(excepto "count" que en tal caso retorna cero).
El tipo de dato del campo determina las funciones que se pueden emplear con ellas.
Las relaciones entre las funciones de agrupamiento y los tipos de datos es la siguiente:
La funcin "sum()" retorna la suma de los valores que contiene el campo especificado. Si
queremos saber la cantidad total de libros que tenemos disponibles para la venta, debemos
sumar todos los valores del campo "cantidad":
select sum(cantidad)
from libros;
Para averiguar el valor mximo o mnimo de un campo usamos las funciones "max()" y "min()"
respectivamente. Queremos saber cul es el mayor precio de todos los libros:
select max(precio)
from libros;
Entonces, dentro del parntesis de la funcin colocamos el nombre del campo del cul
queremos el mximo valor.
La funcin "avg()" retorna el valor promedio de los valores del campo especificado. Queremos
saber el promedio del precio de los libros referentes a "PHP":
select avg(precio)
from libros
where titulo like '%PHP%';
Ahora podemos entender porque estas funciones se denominan "funciones de grupo", porque
operan sobre conjuntos de registros, no con datos individuales.
Si realiza una consulta con la funcin "count" incluyendo entre parntesis un campo y la tabla
contiene 18 registros, 2 de los cuales contienen valor nulo en "precio", el resultado devuelve
un total de 16 filas porque no considera aquellos con valor nulo.
Todas las funciones de grupo, excepto "count(*)", excluye los valores nulos de los campos;
"count(*)" cuenta todos los registros, incluidos los que contienen "null".
Problema:
Eliminamos la tabla:
Creamos la tabla:
Para conocer la cantidad total de libros, sumamos las cantidades de cada uno:
select sum(cantidad)
from libros;
Retorna 880; verifique la suma, sumando los valores de todos los registros del campo
"cantidad".
select sum(cantidad)
from libros
where editorial='Emece';
retorna 300.
select max(precio)
from libros;
retorna 45.
select min(precio)
from libros
where autor like '%Rowling%';
retorna 0 (cero).
select avg(precio)
from libros
where titulo like '%PHP%';
Devuelve 25. Note que hay 3 libros sobre "PHP", pero uno de ellos tiene precio nulo entonces
Oracle no lo incluye para calcular el promedio.
select min(edicion)
from libros;
Retorna 10/10/80.
Necesitamos conocer el mayor valor de "codigo":
select max(codigo)
from libros;
Retorna 9920.
Primer problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados".
12- Muestre el promedio de sueldos de todo los empleados (3400. Note que hay un sueldo nulo
y no es tenido en cuenta)
13- Muestre el promedio de sueldos de los empleados de la seccin "Secretara" (2100. Note
que hay 3 registros de la seccin solicitada, pero como uno de ellos tiene sueldo nulo, no es
tenido en cuenta)
16- Realice la misma consulta anterior pero ahora de los empleados de la seccin "Recursos".
Al no existir tal seccin, "count(*)" y "count(domicilio)" retornan 0 (cero) y las dems
funciones de grupo retornan "null".
select count(*)
from empleados;
select count(fechaingreso)
from empleados;
select count(sueldo)
from empleados;
select count(sueldo)
from empleados
where seccion='Secretaria';
select max(cantidadhijos)
from empleados
where nombre like '%Perez%';
select max(fechaingreso),min(fechaingreso)
from empleados;
select avg(sueldo)
from empleados;
select avg(sueldo)
from empleados
where seccion='Secretaria';
select avg(cantidadhijos)
from empleados
where seccion='Sistemas';
select
count(*),count(domicilio),sum(cantidadhijos),avg(sueldo),min(fechaingreso),max(f
echaingreso)
from empleados;
select
count(*),count(domicilio),sum(cantidadhijos),avg(sueldo),min(fechaingreso),max(f
echaingreso)
from empleados where seccion='Recursos';
Hemos aprendido que las funciones de grupo permiten realizar varios clculos operando con
conjuntos de registros.
Las funciones de grupo solas producen un valor de resumen para todos los registros de un
campo.
Podemos generar valores de resumen para un solo campo, combinando las funciones de
agregado con la clusula "group by", que agrupa registros para consultas detalladas.
Entonces, para saber la cantidad de libros que tenemos de cada editorial, utilizamos la
funcin "count()", agregamos "group by" (que agrupa registros) y el campo por el que
deseamos que se realice el agrupamiento, tambin colocamos el nombre del campo a
recuperar; la sintaxis bsica es la siguiente:
Para obtener la cantidad libros con precio no nulo, de cada editorial utilizamos la funcin
"count()" envindole como argumento el campo "precio", agregamos "group by" y el campo por
el que deseamos que se realice el agrupamiento (editorial):
Como resultado aparecen los nombres de las editoriales y la cantidad de registros de cada
una, sin contar los que tienen precio nulo.
Recuerde la diferencia de los valores que retorna la funcin "count()" cuando enviamos como
argumento un asterisco o el nombre de un campo: en el primer caso cuenta todos los registros
incluyendo los que tienen valor nulo, en el segundo, los registros en los cuales el campo
especificado es no nulo.
Para saber el mximo y mnimo valor de los libros agrupados por editorial:
select editorial,
max(precio) as mayor,
min(precio) as menor
from libros
group by editorial;
Para calcular el promedio del valor de los libros agrupados por editorial:
Si incluye una clusula "where", slo se agrupan los registros que cumplen las condiciones.
Vamos a contar y agrupar por editorial considerando solamente los libros cuyo precio sea
menor a 30 pesos:
Entonces, usamos "group by" para organizar registros en grupos y obtener un resumen de
dichos grupos. Oracle produce una columna de valores por cada grupo, devolviendo filas por
cada grupo especificado.
Problema:
Eliminamos la tabla:
Creamos la tabla:
Queremos saber la cantidad de libros de cada editorial, utilizando la clusula "group by":
select editorial, count(*)
from libros
group by editorial;
EDITORIAL COUNT(*)
--------------------------
Paidos 2
2
Planeta 2
Emece 3
Siglo XXI 1
El resultado muestra los nombres de las editoriales y la cantidad de registros para cada valor
del campo. Note que los valores nulos se procesan como otro grupo.
La salida es la siguiente:
EDITORIAL COUNT(PRECIO)
------------------------------
Paidos 2
2
Planeta 1
Emece 2
Siglo XXI 1
Aparecen los nombres de las editoriales y la cantidad de registros de cada una, sin contar los
que tienen precio nulo.
Obtenemos el mximo y mnimo valor de los libros agrupados por editorial, en una sola
sentencia:
select editorial,
max(precio) as mayor,
min(precio) as menor
from libros
group by editorial;
Note que las editoriales que no tienen libros que cumplan la condicin (sus precios superan
los 30 pesos), no aparecen en la salida.
Primer problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus
productos.
5- Queremos la cantidad visitantes con telfono no nulo, de cada ciudad (4 filas devueltas)
6- Necesitamos el total del monto de las compras agrupadas por sexo (3 filas)
Note que los registros con valor nulo en el campo "sexo" se procesan como un grupo diferente.
7- Se necesita saber el mximo y mnimo valor de compra agrupados por sexo y ciudad (6
filas)
9- Cuente y agrupe por ciudad sin tener en cuenta los visitantes que no tienen mail (3 filas)
select sexo,ciudad,
max(montocompra) as mayor,
min(montocompra) as menor
from visitantes
group by sexo,ciudad;
select ciudad,
avg(montocompra) as "promedio de compras"
from visitantes
group by ciudad;
select ciudad,
count(*) as "cantidad con mail"
from visitantes
where mail is not null and
mail<>'no tiene'
group by ciudad;
Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados".
7- Calcule el promedio de sueldo por seccin de los empleados con hijos (4 filas)
Si queremos saber la cantidad de libros agrupados por editorial pero considerando slo
algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente
instruccin:
Veamos otros ejemplos. Queremos el promedio de los precios agrupados por editorial, pero
solamente de aquellos grupos cuyo promedio supere los 25 pesos:
Ambas devuelven el mismo resultado, pero son diferentes. La primera, selecciona todos los
registros rechazando los de editorial "Planeta" y luego los agrupa para contarlos. La segunda,
selecciona todos los registros, los agrupa para contarlos y finalmente rechaza fila con la
cuenta correspondiente a la editorial "Planeta".
Veamos otros ejemplos combinando "where" y "having". Queremos la cantidad de libros, sin
considerar los que tienen precio nulo, agrupados por editorial, sin considerar la editorial
"Planeta":
Aqu, selecciona los registros rechazando los que no cumplan con la condicin dada en
"where", luego los agrupa por "editorial" y finalmente rechaza los grupos que no cumplan con
la condicin dada en el "having".
Se emplea la clusula "having" con funciones de grupo, esto no puede hacerlo la clusula
"where". Por ejemplo queremos el promedio de los precios agrupados por editorial, de
aquellas editoriales que tienen ms de 2 libros:
En una clusula "having" puede haber varias condiciones. Cuando utilice varias condiciones,
tiene que combinarlas con operadores lgicos (and, or, not).
Podemos encontrar el mayor valor de los libros agrupados y ordenados por editorial y
seleccionar las filas que tengan un valor menor a 100 y mayor a 30:
Problema:
Eliminamos la tabla:
Creamos la tabla:
Nos devuelve:
EDITORIAL COUNT(*)
------------------------
Paidos 2
2
Planeta 4
Emece 3
Siglo XXI 1
Queremos saber la cantidad de libros agrupados por editorial pero considerando slo algunos
grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instruccin:
La salida es la siguiente:
EDITORIAL COUNT(*)
-------------------------
Planeta 4
Emece 3
Queremos el promedio de los precios de los libros agrupados por editorial, pero solamente de
aquellos grupos cuyo promedio supere los 25 pesos:
Queremos la cantidad de libros, sin considerar los que tienen precio nulo (where), agrupados
por editorial (group by), sin considerar la editorial "Planeta" (having):
Necesitamos el promedio de los precios agrupados por editorial, de aquellas editoriales que
tienen ms de 2 libros:
Buscamos el mayor valor de los libros agrupados y ordenados por editorial y seleccionamos las
filas que tienen un valor menor a 100 y mayor a 30:
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes".
5- Obtenga el total de los registros agrupados por ciudad y provincia sin considerar los que
tienen menos de 2 clientes (3 filas)
6- Obtenga el total de los clientes que viven en calle "San Martin" (where), agrupados por
provincia (group by), de aquellas ciudades que tengan menos de 2 clientes (having) y
omitiendo la fila correspondiente a la ciudad de "Cordoba" (having) (2 filas devueltas)
drop table clientes;
Segundo problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus
productos.
4- Obtenga el total de las compras agrupados por ciudad y sexo de aquellas filas que
devuelvan un valor superior a 50 (3 filas)
5- Obtenga el total de las compras agrupados por ciudad y sexo (group by), considerando slo
los montos de compra superiores a 50 (where), los visitantes con telfono (where), sin
considerar la ciudad de "Cordoba" (having), ordenados por ciudad (order by) (2 filas)
6- Muestre el monto mayor de compra agrupado por ciudad, siempre que dicho valor supere
los 50 pesos (having), considerando slo los visitantes de sexo femenino y domicilio conocido
(where) (2 filas)
7- Agrupe por ciudad y sexo, muestre para cada grupo el total de visitantes, la suma de sus
compras y el promedio de compras, ordenado por la suma total y considerando las filas con
promedio superior a 30 (3 filas)
select ciudad,sexo,
sum(montocompra) as Total
from visitantes
group by ciudad,sexo
having sum(montocompra)>50;
Con la clusula "distinct" se especifica que los registros con ciertos datos duplicados sean
obviadas en el resultado. Por ejemplo, queremos conocer todos los autores de los cuales
tenemos libros, si utilizamos esta sentencia:
Note que en los tres casos anteriores aparece "null" como un valor para "autor" Si slo
queremos la lista de autores conocidos, es decir, no queremos incluir "null" en la lista,
podemos utilizar la sentencia siguiente:
Para contar los distintos autores, sin considerar el valor "null" usamos:
Note que si contamos los autores sin "distinct", no incluir los valores "null" pero si los
repetidos:
select count(autor)
from libros;
Podemos combinarla con "where". Por ejemplo, queremos conocer los distintos autores de la
editorial "Planeta":
La clusula "distinct" afecta a todos los campos presentados. Para mostrar los ttulos y
editoriales de los libros sin repetir ttulos ni editoriales, usamos:
Note que los registros no estn duplicados, aparecen ttulos iguales pero con editorial
diferente, cada registro es diferente.
Problema:
Eliminamos la tabla:
Creamos la tabla:
Note que aparece "null" como un valor para "autor" Para obtener la lista de autores
conocidos, es decir, no incluyendo "null" en la lista:
La combinamos con "where" para obtener los distintos autores de la editorial "Planeta":
Contamos los distintos autores que tiene cada editorial empleando "group by":
Mostramos los ttulos y editoriales de los libros sin repetir ttulos ni editoriales:
Note que los registros no estn duplicados, aparecen ttulos iguales pero con editorial
diferente, cada registro es diferente.
Una empresa tiene registrados sus clientes en una tabla llamada "clientes".
7- Combine con "where" para obtener las distintas ciudades de la provincia de Cordoba (3
registros)
8- Contamos las distintas ciudades de cada provincia empleando "group by" (3 filas)
drop table clientes;
Segundo problema:
La provincia almacena en una tabla llamada "inmuebles" los siguientes datos de los inmuebles
y sus propietarios para cobrar impuestos:
1- Elimine la tabla:
drop table inmuebles;
5- Recupere los distintos documentos de los propietarios y luego muestre los distintos
documentos de los propietarios, sin repetir y vea la diferencia (9 y 6 registros
respectivamente)
8- Cuente la cantidad de inmuebles con domicilio en 'San Martin', sin repetir la ciudad (2
registros). Compare con la sentencia anterior.
Note que si hay 2 personas con igual nombre y apellido aparece una sola vez.
11- Muestre la cantidad de inmuebles que tiene cada propietario en barrios conocidos,
agrupando por documento (6 registros)
12- Realice la misma consulta anterior pero en esta oportunidad, sin repetir barrio (6
registros)
select count(ciudad)
from inmuebles
where domicilio like 'San Martin %';
Las claves primarias pueden ser simples, formadas por un solo campo o compuestas, ms de
un campo.
Recordemos que una clave primaria identifica un solo registro en una tabla.
Para un valor del campo clave existe solamente un registro. Los valores no se repiten ni
pueden ser nulos.
Existe una playa de estacionamiento que almacena cada da los datos de los vehculos que
ingresan en la tabla llamada "vehiculos" con los siguientes campos:
Necesitamos definir una clave primaria para una tabla con los datos descriptos arriba. No
podemos usar solamente la patente porque un mismo auto puede ingresar ms de una vez en
el da a la playa; tampoco podemos usar la hora de entrada porque varios autos pueden
ingresar a una misma hora. Tampoco sirven los otros campos.
Como ningn campo, por si slo cumple con la condicin para ser clave, es decir, debe
identificar un solo registro, el valor no puede repetirse, debemos usar dos campos.
Definimos una clave compuesta cuando ningn campo por si solo cumple con la condicin para
ser clave.
En este ejemplo, un auto puede ingresar varias veces en un da a la playa, pero siempre ser
a distinta hora.
Usamos 2 campos como clave, la patente junto con la hora de llegada, as identificamos
unvocamente cada registro.
Nombramos los campos que formarn parte de la clave separados por comas.
Al ingresar los registros, Oracle controla que los valores para los campos establecidos como
clave primaria no estn repetidos en la tabla; si estuviesen repetidos, muestra un mensaje y
la insercin no se realiza. Lo mismo sucede si realizamos una actualizacin.
Para ver la clave primaria de una tabla podemos realizar la siguiente consulta:
Entonces, si un solo campo no identifica unvocamente un registro podemos definir una clave
primaria compuesta, es decir formada por ms de un campo.
Problema:
Una playa de estacionamiento almacena cada da los datos de los vehculos que ingresan en la
tabla llamada "vehiculos".
Seteamos el formato de "date" para que nos muestre nicamente la hora y los minutos, ya que
en esta playa, se almacenan los datos de los vehculos diariamente:
Eliminamos la tabla:
Si ingresamos un registro repitiendo el valor de uno de los campos que forman parte de la
clave, si lo acepta:
Note que cada registro es nico, dos de ellos tienen la misma patente, pero diferente hora de
llegada.
Recordemos que los campos que forman parte de la clave primaria no aceptan valores nulos,
aunque no se haya aclarado en la definicin de la tabla:
describe vehiculos;
vemos que los campos que forman parte de la clave primaria (patente y horallegada) tienen
"NOT NULL" en la columna "Null", es decir, no admiten valores nulos.
Para ver la clave primaria de una tabla podemos realizar la siguiente consulta:
Los dos campos son clave primaria, "POSITION" indica el orden en que fueron definidos los
campos.
34 - Clave primaria compuesta
Primer problema:
Un consultorio mdico en el cual trabajan 3 mdicos registra las consultas de los pacientes en
una tabla llamada "consultas".
1- Elimine la tabla:
3- Setee el formato de "date" para que nos muestre da, mes, ao, hora y minutos:
4- Un mdico slo puede atender a un paciente en una fecha y hora determinada. En una
fecha y hora determinada, varios mdicos atienden a distintos pacientes. Cree la tabla
definiendo una clave primaria compuesta:
4- Ingrese varias consultas para un mismo mdico en distintas horas el mismo da:
6- Intente ingresar una consulta para un mismo mdico en la misma hora el mismo da
(mensaje de error)
7- Intente cambiar la hora de la consulta de "Acosta Betina" por una no disponible ("8:30")
(error)
9- Ingrese una consulta para el da "06/11/2006" a las 10 hs. para el doctor "Perez"
11- Recupere todos los datos de las consultas programadas para el "05/11/2006 8:00" (2
registros)
Segundo problema:
Un club dicta clases de distintos deportes. En una tabla llamada "inscriptos" almacena la
informacin necesaria.
3- Necesitamos una clave primaria que identifique cada registro. Un socio puede inscribirse
en varios deportes en distintos aos. Un socio no puede inscribirse en el mismo deporte el
mismo ao. Varios socios se inscriben en un mismo deporte en distintos aos. Cree la tabla
con una clave compuesta:
4- Setee el formato de "date" para que nos muestre solamente el ao (no necesitamos las
otras partes de la fecha ni la hora)
12- Muestre el deporte y ao de todas las incripciones del socio documento "12222222" (6
registros)
Hemos aprendido que existen varios objetos de base de datos, hasta ahora hemos visto
TABLAS y algunas FUNCIONES predefinidas. Otro objeto de base de datos es la secuencia.
Una secuencia (sequence) se emplea para generar valores enteros secuenciales nicos y
asignrselos a campos numricos; se utilizan generalmente para las claves primarias de las
tablas garantizando que sus valores no se repitan.
Una secuencia es una tabla con un campo numrico en el cual se almacena un valor y cada
vez que se consulta, se incrementa tal valor para la prxima consulta.
Sintaxis general:
- La clusula "start with" indica el valor desde el cual comenzar la generacin de nmeros
secuenciales. Si no se especifica, se inicia con el valor que indique "minvalue".
Si bien, las secuencias son independientes de las tablas, se utilizarn generalmente para una
tabla especfica, por lo tanto, es conveniente darle un nombre que referencie a la misma.
Otro ejemplo:
Dijimos que las secuencias son tablas; por lo tanto se accede a ellas mediante consultas,
empleando "select". La diferencia es que utilizamos pseudocolumnas para recuperar el valor
actual y el siguiente de la secuencia. Estas pseudocolumnas pueden incluirse en el "from" de
una consulta a otra tabla o de la tabla "dual".
Para recuperar los valores de una secuencia empleamos las pseudocolumnas "currval" y
"nextval".
Primero debe inicializarse la secuencia con "nextval". La primera vez que se referencia
"nextval" retorna el valor de inicio de la secuencia; las siguientes veces, incrementa la
secuencia y nos retorna el nuevo valor:
NOMBRESECUENCIA.NEXTVAL;
NOMBRESECUENCIA.CURRVAL;
Creamos una secuencia para el cdigo de la tabla "libros", especificando el valor mximo, el
incremento y que no sea circular:
Recuerde que la primera vez que se referencie la secuencia debe emplearse "nextval" para
inicializarla.
Para ver todas las secuencias de la base de datos actual realizamos la siguiente consulta:
Tambin podemos ver todos los objetos de la base de datos actual tipeando;
En la tabla resultado aparecen todos los objetos de la base de datos, incluidas las secuencias;
si es una secuencia en la columna OBJECT_TYPE se muestra "SEQUENCE".
Podemos consultar "all_objects" especificando que nos muestre el nombre de todas las
secuencias:
Problema:
Aparece una tabla que nos muestra todas las secuencias; la columna "SEQUENCE_NAME"
contiene el nombre de cada secuencia; las dems columnas nos informan sobre cada una de
las secuencias de la base de datos actual (propietario, valores mnimo y mximo, valor de
incremento, si es circular o no, etc.).
Para acceder a las secuencias (que son tablas) empleamos "select" y la tabla "dual".
Retorna 1.
Note que al crear la tabla no se hace referencia en ningn momento a la secuencia que luego
servir para dar valores secuenciales a su clave primaria.
Veamos todos los objetos de la base de datos actual que contengan en su nombre la cadena
"LIBROS":
select object_name,object_type
from all_objects
where object_name like '%LIBROS%';
Si consultamos todos los objetos de la base de datos veremos que tal secuencia ya no existe:
select object_name,object_type
from all_objects
where object_name like '%LIBROS%';
35 - Secuencias (create sequence - currval - nextval - drop sequence)
Primer problema:
Una empresa registra los datos de sus empleados en una tabla llamada "empleados".
2- Cree la tabla:
4- Ingrese algunos registros, empleando la secuencia creada para los valores de la clave
primaria:
5- Recupere los registros de "libros" para ver los valores de clave primaria.
8- Ingrese un nuevo empleado (recuerde que la secuencia ya tiene el prximo valor, emplee
"currval" para almacenar el valor de legajo)
9- Recupere los registros de "libros" para ver el valor de clave primaria ingresado
anteriormente.
Mensaje de error porque el legajo est repetido y la clave primaria no puede repetirse.
Ahora si lo permite, pues el valor retornado por "currval" no est repetido en la tabla
"empleados".
17- Vea todos los objetos de la base de datos actual que contengan en su nombre la cadena
"EMPLEADOS".
19- Consulte todos los objetos de la base de datos que sean secuencias y verifique que
"sec_legajoempleados" ya no existe.
select object_name,object_type
from all_objects
where object_name like '%EMPLEADOS%';
select object_name,object_type
from all_objects
where object_type='SEQUENCE';
Es posible modificar una secuencia, su valor de incremento, los valores mnimo y mximo y el
atributo "cycle" (el valor de inicio no puede modificarse); para ello empleamos la sentencia
"alter sequence". Sintaxis:
Los valores de incremento y mnimo han sido modificados, los dems atributos no
especificados en la sentencia "alter sequence" se mantienen.
Problema:
La creamos definiendo 1 como valor de inicio, 1 de incremento, 999 como valor mximo, 1
como mnimo valor y no circular:
Ahora el valor de incremento es 2 y el mximo 99999, los dems valores permanecen como
fueron definidos.
Primer problema:
Una empresa registra los datos de sus empleados en una tabla llamada "empleados".
1- Elimine la tabla "empleados":
2- Cree la tabla:
4- Ingrese algunos registros, empleando la secuencia creada para los valores de la clave
primaria.
5- Recupere los registros de "libros" para ver los valores de clave primaria.
Oracle muestra un mensaje de error indicando que la secuencia ha llegado a su valor mximo.
16- Consulte todos los objetos de la base de datos que sean secuencias y verifique que
"sec_legajoempleados" ya no existe.
select object_name,object_type
from all_objects
where object_type='SEQUENCE';
37 - Integridad de datos
Es importante, al disear una base de datos y las tablas que contiene, tener en cuenta la
integridad de los datos, esto significa que la informacin almacenada en las tablas debe ser
vlida, coherente y exacta.
Oracle ofrece ms alternativas, adems de las aprendidas, para restringir y validar los datos,
las veremos ordenadamente y al finalizar haremos un resumen de las mismas.
Las restricciones (constraints) son un mtodo para mantener la integridad de los datos,
asegurando que los valores ingresados sean vlidos y que las relaciones entre las tablas se
mantenga.
Pueden definirse al crear la tabla ("create table") o agregarse a una tabla existente
(empleando "alter table") y se pueden aplicar a un campo o a varios. Tambin es posible
habilitarlas y deshabilitarlas.
- primary key: a nivel de tabla. Es un campo o varios que identifican cada registro de una
tabla.
- foreign key: a nivel de tabla. Establece que un campo (o varios) relacione una clave
primaria de una tabla con otra.
- check: a nivel de tabla. Restringe los valores que pueden ingresarse en un campo especifico.
Se pueden crear, modificar y eliminar las restricciones sin eliminar la tabla y volver a crearla.
Para obtener informacin de las restricciones podemos consultar los catlogos "all_objects",
"all_constraints" y "all_cons_columns".
El catlogo "all_constraints" retorna varias columnas, entre ellas: OWNER (propietario),
CONSTRAINT_NAME (nombre de la restriccin), CONSTRAINT_TYPE (tipo de restriccin, si es
primary key (P), foreign key (), unique (U), etc.), TABLE_NAME (nombre de la tabla),
SEARCH_CONDITION (en caso de ser Check u otra), DELETE_RULE (), STATUS (estado),
DEFERRABLE (), DEFERRED (), VALIDATED (), GENERATED (), INDEX_OWNER (), INDEX_NAME ().
La restriccin "primary key" asegura que los valores sean nicos para cada registro.
Anteriormente, para establecer una clave primaria para una tabla emplebamos la siguiente
sintaxis al crear la tabla, por ejemplo:
Cada vez que establecamos la clave primaria para la tabla, Oracle creaba automticamente
una restriccin "primary key" para dicha tabla. Dicha restriccin, a la cual no le dbamos un
nombre, reciba un nombre dado por Oracle que consta de una serie de letras y nmeros
aleatorios.
Podemos agregar una restriccin "primary key" a una tabla existente con la sintaxis bsica
siguiente:
En el siguiente ejemplo definimos una restriccin "primary key" para nuestra tabla "libros"
para asegurarnos que cada libro tendr un cdigo diferente y nico:
Con esta restriccin, si intentamos ingresar un registro con un valor para el campo "codigo"
que ya existe o el valor "null", aparece un mensaje de error, porque no se permiten valores
duplicados ni nulos. Igualmente, si actualizamos.
Por convencin, cuando demos el nombre a las restricciones "primary key" seguiremos el
formato "PK_NOMBRETABLA_NOMBRECAMPO".
Cuando agregamos una restriccin a una tabla que contiene informacin, Oracle controla los
datos existentes para confirmar que cumplen las exigencias de la restriccin, si no los
cumple, la restriccin no se aplica y aparece un mensaje de error. Por ejemplo, si intentamos
definir la restriccin "primary key" para "libros" y hay registros con cdigos repetidos o con un
valor "null", la restriccin no se establece.
Se permite definir solamente una restriccin "primary key" por tabla, que asegura la unicidad
de cada registro de una tabla.
Problema:
Nos informa que la tabla "libros" (TABLE_NAME) tiene una restriccin de tipo "primary key"
(muestra "P" en "CONSTRAINT_TYPE") creada por "SYSTEM" (OWNER) cuyo nombre es
"SYS_C004427" (nombre dado por Oracle).
Ahora si podremos definir la restriccin "primary key" para nuestra tabla "libros":
Nos informa que la tabla "libros" (TABLE_NAME) tiene una restriccin de tipo "primary key"
(muestra "P" en "CONSTRAINT_TYPE") creada por "SYSTEM" (OWNER) cuyo nombre es
"PK_libros_codigo" (nombre dado por nosotros al agregarla).
Si intentamos ingresar un registro con un valor para el campo "codigo" que ya existe, no lo
permite:
describe libros;
Un mensaje nos indica que la tabla solamente puede tener UNA clave primaria.
Primer problema:
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados".
1- Elimine la tabla:
4- Intente establecer una restriccin "primary key" para la tabla para que el documento no se
repita ni admita valores nulos.
No lo permite porque la tabla contiene datos que no cumplen con la restriccin, debemos
eliminar (o modificar) el registro que tiene documento duplicado.
Segundo problema:
Una empresa de remises tiene registrada la informacin de sus vehculos en una tabla llamada
"remis".
1- Elimine la tabla:
drop table remis;
39 - Restriccin unique
Anteriormente aprendimos la restriccin "primary key", otra restriccin que asegura valores
nicos para cada registro es "unique".
Se pueden aplicar varias restricciones de este tipo a una misma tabla, y pueden aplicarse a
uno o varios campos que no sean clave primaria.
Se emplea cuando ya se estableci una clave primaria (como un nmero de legajo) pero se
necesita asegurar que otros datos tambin sean nicos y no se repitan (como nmero de
documento).
Ejemplo:
Por convencin, cuando demos el nombre a las restricciones "unique" seguiremos la misma
estructura:
Recuerde que cuando agregamos una restriccin a una tabla que contiene informacin, Oracle
controla los datos existentes para confirmar que cumplen la condicin de la restriccin, si no
los cumple, la restriccin no se aplica y aparece un mensaje de error. En el caso del ejemplo
anterior, si la tabla contiene nmeros de documento duplicados, la restriccin no podr
establecerse; si podr establecerse si tiene valores nulos.
39 - Restriccin unique
Problema:
Creamos la tabla:
Nos informa:
Primer problema:
Una empresa de remises tiene registrada la informacin de sus vehculos en una tabla llamada
"remis".
1- Elimine la tabla:
3- Ingrese algunos registros, 2 de ellos con patente repetida y alguno con patente nula.
4- Agregue una restriccin "primary key" para el campo "numero".
5- Intente agregar una restriccin "unique" para asegurarse que la patente del remis no
tomar valores repetidos.
No se puede porque hay valores duplicados, un mensaje indica que se encontraron claves
duplicadas.
40 - Restriccion check
La restriccin "check" especifica los valores que acepta un campo, evitando que se ingresen
valores inapropiados.
Trabajamos con la tabla "libros" de una librera que tiene los siguientes campos: codigo,
titulo, autor, editorial, preciomin (que indica el precio para los minoristas) y preciomay (que
indica el precio para los mayoristas).
Este tipo de restriccin verifica los datos cada vez que se ejecuta una sentencia "insert" o
"update", es decir, acta en inserciones y actualizaciones.
La condicin puede hacer referencia a otros campos de la misma tabla. Por ejemplo, podemos
controlar que el precio mayorista no sea mayor al precio minorista:
Por convencin, cuando demos el nombre a las restricciones "check" seguiremos la misma
estructura: comenzamos con "CK", seguido del nombre de la tabla, del campo y alguna
palabra con la cual podamos identificar fcilmente de qu se trata la restriccin, por si
tenemos varias restricciones "check" para el mismo campo.
Un campo puede tener varias restricciones "check" y una restriccin "check" puede incluir
varios campos.
Las condiciones para restricciones "check" tambin pueden incluir una lista de valores. Por
ejemplo establecer que cierto campo asuma slo los valores que se listan:
...
check (CAMPO in ('lunes','miercoles','viernes'));
Si un campo permite valores nulos, "null" es un valor aceptado aunque no est incluido en la
condicin de restriccin.
Si intentamos establecer una restriccin "check" para un campo que entra en conflicto con
otra restriccin "check" establecida al mismo campo, Oracle no lo permite. Pero si
establecemos una restriccin "check" para un campo que entra en conflicto con un valor
"default" establecido para el mismo campo, Oracle lo permite; pero al intentar ingresar un
registro, aparece un mensaje de error.
Un campo con una restriccin "primary key" o "unique" puede tener una (o varias)
restricciones "check".
40 - Restriccion check
Problema:
Agregamos una restriccin "check" para asegurar que los valores de los campos
correspondientes a precios no puedan ser negativos:
Intentamos ingresar un valor invlido para algn campo correspondiente al precio, que vaya
en contra de la restriccin (por ejemplo el valor "-15"):
aparecer un mensaje de error indicando que hay conflicto con la restriccin de control
creada anteriormente y la insercin no se realiza.
Si intentamos agregar una restriccin que no permita que el precio mayorista supere el precio
minorista:
Ahora Oracle si nos permite agregar la restriccin "check" que impida que se ingresen valores
para "preciomay" superiores a "preciomin":
Note que en el caso de las restricciones de control, en las cuales muestra "C" en el tipo de
constraint, la columna "SEARCH_CONDITION" muestra la regla que debe cumplirse; en caso de
ser una restriccin "primary key" o unique", esa columna queda vaca.
Mensaje de error.
Consultamos "user_cons_columns":
40 - Restriccion check
Primer problema:
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados".
1- Elimine la tabla:
3- Agregue una restriccin "check" para asegurarse que no se ingresen valores negativos para
el sueldo.
Note que el campo "sueldo" tiene establecido un valor por defecto (el valor -1) que va contra
la restriccin; Oracle no controla esto, permite establecer la restriccin, pero al intentar
ingresar un registro con el valor por defecto en tal campo, muestra un mensaje de error.
4- Intente ingresar un registro con la palabra clave "default" en el campo "sueldo" (mensaje de
error)
6- Intente agregar otra restriccin "check" al campo sueldo para asegurar que ninguno supere
el valor 5000.
La sentencia no se ejecuta porque hay un sueldo que no cumple la restriccin.
8- Establezca una restriccin "check" para "seccion" que permita solamente los valores
"Sistemas", "Administracion" y "Contadura".
10- Establezca una restriccin "check" para "cantidadhijos" que permita solamente valores
entre 0 y 15.
12- Intente agregar un registro que vaya contra alguna de las restricciones al campo "sueldo".
Mensaje de error porque se infringe la restriccin "CK_empleados_sueldo_positivo".
14- Intente modificar el valor de algn registro en el campo "seccion" cambindolo por uno
que no est incluido en la lista de permitidos.
15- Intente agregar una restriccin al campo seccin para aceptar solamente valores que
comiencen con la letra "B".
17- Intente agregar una restriccin "primary key" para el campo "documento".
No lo permite porque existe un registro con valor nulo en tal campo.
18- Elimine el registro que infringe la restriccin y establezca la restriccin del punto 17.
select constraint_name
from user_cons_columns
where table_name='EMPLEADOS' and
column_name='SUELDO';
Segundo problema:
Una playa de estacionamiento almacena los datos de los vehculos que ingresan en la tabla
llamada "vehiculos".
1- Setee el formato de "date" para que nos muestre da, mes, ao, hora y minutos:
4- Agregue una restriccin de control que especifique que el campo "tipo" acepte solamente
los valores "auto" y "moto":
5- Intente modificar el valor del campo "tipo" ingresando un valor inexistente en la lista de
valores permitidos por la restriccin establecida a dicho campo.
7- Agregue una restriccin de control al campo "fechahoraentrada" que establezca que sus
valores no sean posteriores a "fechahorasalida".
Sabemos que si agregamos una restriccin a una tabla que contiene datos, Oracle los controla
para asegurarse que cumplen con la condicin de la restriccin, si algn registro no la
cumple, la restriccin no se establecece.
Es posible deshabilitar esta comprobacin estableciendo una restriccin sin comprobar los
datos existentes en la tabla.
Podemos hacerlo cuando agregamos la restriccin (de cualquier tipo) a una tabla para que
Oracle acepte los valores ya almacenados que infringen la restriccin. Para ello debemos
incluir la opcin "novalidate" en la instruccin "alter table":
La restriccin no se aplica en los datos existentes, pero si intentamos ingresar un nuevo valor
que no cumpla la restriccin (o actualizarlo), Oracle no lo permite.
Para saber si una restriccin est validada o no, podemos consultar el catlogo
"user_constraints" y fijarnos lo que informa la columna "validated".
Tambin podemos deshabilitar las restricciones para agregar o actualizar datos sin
comprobarla:
Por defecto (si no especificamos) la opcin es "validate", es decir, controla los datos
existentes y "enable", es decir, controla futuros ingresos y actualizaciones.
Para habilitar una restriccin deshabilitada se ejecuta la misma instruccin pero con la
clusula "enable":
Para saber si una restriccin est habilitada o no, podemos consultar el catlogo
"user_constraints" y fijarnos lo que informa la columna "status".
Cuando habilitamos una restriccin "primary key" o "unique" con "enable", los datos existentes
DEBEN cumplir con la restriccin; aunque coloquemos "novalidate" junto a "enable", Oracle no
permite que se habilite la restricin y valida los datos existentes de todas maneras. No sucede
lo mismo con una restriccin "check"; podemos habilitar una restriccin de control con
"enable" y "novalidate", Oracle habilita la restriccin para futuros ingresos y actualizaciones y
NO valida los datos existentes.
Entonces, "enable" o "disable" activa o desactiva la restriccin para los nuevos datos ("enable"
es la opcin predeterminada si no se especifica); "validate" o "novalidate" es la opcin para
validar la restriccin en los datos existentes ("validate" es la predetermidada si se omite).
- validate y disable: comprueba los valores existentes pero no las posteriores inserciones y
actualizaciones;
- novalidate y enabled: no comprueba los datos existentes, pero si los posteriores ingresos y
actualizaciones;
Problema:
Intentamos agregar una restriccin "primary key" para asegurar que los cdigos no se repitan,
pero como ya tenemos almacenado registros que infringen la restriccin, Oracle nos mostrar
un mensaje de error:
Si ingresamos un registro con cdigo existente, Oracle lo permite, porque la restriccin est
en estado "disabled":
No lo permite, aun cuando especificamos que no valide los datos existentes, Oracle realiza la
verificacin igualmente.
Intentamos agregamos una restriccin "check" que no permita valores negativos para el
precio:
El resultado es el siguiente:
Note que Oracle lo permite, no valida los datos existentes, pero si fuera otro tipo de
restriccin, no lo permitira.
Consultamos "user_constraints":
Primer problema:
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados".
1- Elimine la tabla:
3- Intente agregar una restriccin "check" para asegurarse que no se ingresen valores
negativos para el sueldo sin especificar validacin ni estado:
No se permite porque hay un valor negativo almacenado y por defecto la opcin es "validate".
8- Intente establecer una restriccin "check" para "seccion" que permita solamente los valores
"Sistemas", "Administracion" y "Contadura" sin especificar validacin:
13- Deshabilite la restriccin para poder realizar la actualizacin del punto precedente.
14- Agregue una restriccin "primary key" para el campo "codigo" deshabilitada.
25- Intente habilitar la restriccin "PK_empleados_codigo" sin validar los datos existentes.
27- Elimine el registro que infringe con las restricciones "primary key" y "unique".
- validated: indica si valida los datos existentes en la tabla (validated) o no (no validate)
Cuando eliminamos una tabla, todas las restricciones que fueron establecidas en ella, se
eliminan tambin.
La condicin de control que debe cumplir una restriccin de control no puede modificarse,
hay que eliminar la restriccin y volver a crearla; igualmente con las restricciones "primary
key" y "unique", no pueden modificarse los campos.
Problema:
Definimos una restriccin "primary key" para nuestra tabla "libros" para asegurarnos que cada
libro tendr un cdigo diferente y nico:
Definimos una restriccin "check" para asegurarnos que el precio no ser negativo:
Definimos una restriccin "unique" para los campos "titulo", "autor" y "editorial":
- 1 "check" , que se cre al definir "not null" el campo "codigo", el nombre le fue dado por
Oracle;
- 1 "primary key" y
- 1 "unique".
Vemos si se eliminaron:
Aparecen 2 restricciones.
Primer problema:
Una playa de estacionamiento almacena cada da los datos de los vehculos que ingresan en la
tabla llamada "vehiculos".
1- Setee el formato de "date" para que nos muestre hora y minutos:
3- Establezca una restriccin "check" que admita solamente los valores "a" y "m" para el
campo "tipo":
5- Ingrese un vehculo.
14- Elimine la restriccin de control que establece que el campo "patente" no sea nulo
(busque el nombre consultando "user_constraints").
17- La playa quiere incluir, para el campo "tipo", adems de los valores permitidos "a" (auto) y
"m" (moto), el caracter "c" (camin). No puede modificar la restriccin, debe eliminarla y
luego redefinirla con los 3 valores.
44 - Indices.
Los ndices sirven para acceder a los registros de una tabla rpidamente, acelerando la
localizacin de la informacin.
Los ndices se emplean para facilitar la obtencin de informacin de una tabla. El indice de
una tabla desempea la misma funcin que el ndice de un libro: permite encontrar datos
rpidamente; en el caso de las tablas, localiza registros.
1) recorriendo las tablas; comenzando el principio y extrayendo los registros que cumplen las
condiciones de la consulta; lo cual implica posicionar las cabezas lectoras, leer el dato,
controlar si coincide con lo que se busca (como si pasramos una a una las pginas de un libro
buscando un tema especfico).
2) empleando ndices; recorriendo la estructura de rbol del ndice para localizar los registros
y extrayendo los que cumplen las condiciones de la consulta (comparando con un libro,
diremos que es como leer el ndice y luego de encontrar el tema buscado, ir directamente a
la pgina indicada).
Un ndice posibilita el acceso directo y rpido haciendo ms eficiente las bsquedas. Sin
ndice, Oracle debe recorrer secuencialmente toda la tabla para encontrar un registro.
Los ndices son estructuras asociadas a tablas, una tabla que almacena los campos indexados
y se crean para acelerar las consultas.
Es importante identificar el o los campos por los que sera til crear un ndice, aquellos
campos por los cuales se realizan bsquedas con frecuencia: claves primarias, claves externas
o campos que combinan tablas.
No se recomienda crear ndices sobre campos que no se usan con frecuencia en consultas o en
tablas muy pequeas.
Los cambios sobre la tabla, como insercin, actualizacin o eliminacin de registros, son
incorporados automticamente.
Cuando creamos una restriccin "primary key" o "unique" a una tabla, Oracle
automticamente crea un ndice sobre el campo (o los campos) de la restriccin y le da el
mismo nombre que la restriccin. En caso que la tabla ya tenga un ndice, Oracle lo usa, no
crea otro.
Oracle permite crear distintos tipos de ndices. "Normal" es el standard de Oracle, son ndices
tipo rbol binario; contiene una entrada por cada valor de clave que almacena la direccin
donde se encuentra el dato. Es el tipo predeterminado y el ms comn (el nico que
estudiaremos).
Es importante identificar el o los campos por los que sera til crear un ndice, aquellos
campos por los cuales se realizan bsquedas con frecuencia: claves primarias, claves externas
o campos que combinan tablas.
No se recomienda crear ndices sobre campos que no se usan con frecuencia en consultas o en
tablas muy pequeas.
Los ndices pueden ser: no nicos (los valores pueden estar repetidos) o nicos (los valores no
pueden duplicarse). De modo predeterminado, si no se especifica el tipo de ndice, se crea
uno no nico.
Para identificar los ndices fcilmente, podemos agregar un prefijo al nombre del ndice, por
ejemplo "I" y luego el nombre de la tabla y/o campo.
Si se intenta crear un ndice nico para un campo que tiene valores duplicados, Oracle no lo
permite.
Cuando creamos una restriccin "primary key" o "unique" sobre una tabla, Oracle
automticamente crea un ndice sobre el campo (o los campos) de la restriccin y le da el
mismo nombre que la restriccin. En caso que la tabla ya tenga un ndice, Oracle lo usa, no
crea otro.
Para obtener informacin sobre los ndices podemos consultar varios diccionarios.
1) "user_indexes": nos muestra las siguientes columnas (entre otras que no analizaremos):
Consultamos "user_constraints":
Aparece 1 fila, mostrando el nombre del ndice, indicando que es normal y nico.
select index_name,column_name,column_position
from user_ind_columns
where table_name='EMPLEADOS';
Igualmente, si hay un ndice nico sobre un campo y luego intentamos ingresar un registro con
un valor repetido para el campo indexado, Oracle no lo permite.
Oracle no lo permite.
"INDEX_NAME".
Primer problema:
Un profesor guarda algunos datos de sus alumnos en una tabla llamada "alumnos".
10- Intente crear un ndice nico para la tabla "alumnos" sobre el campo "notafinal"
12- Indexe la tabla "alumnos" por los campos "curso" y "materia" (ndice no nico)
13- Intente crear un ndice nico sobre "materia" (error pues hay datos duplicados)
16- Vea todos los ndices de la base de datos activa que contengan en su nombre el patrn
"%EMPLEADOS%" (5 filas retornadas)
select index_name,column_name,column_position
from user_ind_columns
where table_name='ALUMNOS';
46 - Indices (eliminar)
Los ndices usados por las restricciones "primary key" y "unique" no pueden eliminarse con
"drop index", se eliminan automticamente cuando quitamos la restriccin.
Problema:
select index_name,uniqueness
from user_indexes
where table_name='EMPLEADOS';
No aparece en la lista.
Eliminamos la tabla:
46 - Indices (eliminar)
Primer problema:
Un profesor guarda algunos datos de sus alumnos en una tabla llamada "alumnos".
8- Agregue a la tabla una restriccin nica sobre el campo "documento" y verifique que no se
cre un ndice, Oracle emplea el ndice creado en el punto anterior.
12- Elimine el ndice "I_alumnos_documento", ahora puede hacerlo porque no hay restriccin
que lo utilice.
15- Verifique que el ndice "PK_alumnos_legajo" fue eliminado (porque fue creado por Oracle
al establecerse la restriccin)
16- Cree un ndice compuesto por los campos "curso" y "materia", no nico.
18- Elimine la tabla "alumnos" y verifique que todos los ndices han sido eliminados junto con
ella.
select index_name,uniqueness
from user_indexes
where table_name='ALUMNOS';
select index_name,uniqueness
from user_indexes
where table_name='ALUMNOS';
select index_name,uniqueness
from user_indexes
where table_name='ALUMNOS';
select index_name,uniqueness
from user_indexes
where table_name='ALUMNOS';
select index_name,uniqueness
from user_indexes
where table_name='ALUMNOS';
Hasta el momento hemos trabajado con una sola tabla, pero generalmente, se trabaja con
ms de una.
Para evitar la repeticin de datos y ocupar menos espacio, se separa la informacin en varias
tablas. Cada tabla almacena parte de la informacin que necesitamos registrar.
Por ejemplo, los datos de nuestra tabla "libros" podran separarse en 2 tablas, una llamada
"libros" y otra "editoriales" que guardar la informacin de las editoriales. En nuestra tabla
"libros" haremos referencia a la editorial colocando un cdigo que la identifique. Veamos:
De esta manera, evitamos almacenar tantas veces los nombres de las editoriales en la tabla
"libros" y guardamos el nombre en la tabla "editoriales"; para indicar la editorial de cada libro
agregamos un campo que hace referencia al cdigo de la editorial en la tabla "libros" y en
"editoriales".
Veamos un ejemplo:
Hay tres tipos de combinaciones. En los siguientes captulos explicamos cada una de ellas.
Un join es una operacin que relaciona dos o ms tablas para obtener un resultado que
incluya datos (campos y registros) de ambas; las tablas participantes se combinan segn los
campos comunes a ambas tablas.
Tambin es posible emplear varias combinaciones en una consulta "select", incluso puede
combinarse una tabla consigo misma.
La combinacin interna emplea "join", que es la forma abreviada de "inner join". Se emplea
para obtener informacin de dos tablas y combinar dicha informacin en una salida.
select CAMPOS
from TABLA1
join TABLA2
on CONDICIONdeCOMBINACION;
Ejemplo:
- combinamos esa tabla con "join" y el nombre de la otra tabla ("editoriales"); se especifica
qu tablas se van a combinar y cmo;
La condicion de combinacin, es decir, el o los campos por los que se van a combinar (parte
"on"), se especifica segn las claves primarias y externas.
Note que en la consulta, al nombrar el campo usamos el nombre de la tabla tambin. Cuando
las tablas referenciadas tienen campos con igual nombre, esto es necesario para evitar
confusiones y ambiguedades al momento de referenciar un campo. En el ejemplo, si no
especificamos "editoriales.codigo" y solamente tipeamos "codigo", Oracle no sabr si nos
referimos al campo "codigo" de "libros" o de "editoriales" y mostrar un mensaje de error
indicando que "codigo" es ambiguo.
Entonces, si las tablas que combinamos tienen nombres de campos iguales, DEBE especificarse
a qu tabla pertenece anteponiendo el nombre de la tabla al nombre del campo, separado
por un punto (.).
Si una de las tablas tiene clave primaria compuesta, al combinarla con la otra, en la clusula
"on" se debe hacer referencia a la clave completa, es decir, la condicin referenciar a todos
los campos clave que identifican al registro.
Se puede incluir en la consulta join la clusula "where" para restringir los registros que
retorna el resultado; tambin "order by", "distinct", etc..
Se emplea este tipo de combinacin para encontrar registros de la primera tabla que se
correspondan con los registros de la otra, es decir, que cumplan la condicin del "on". Si un
valor de la primera tabla no se encuentra en la segunda tabla, el registro no aparece; si en la
primera tabla el valor es nulo, tampoco aparece.
select l.codigo,titulo,autor,nombre
from libros l
join editoriales e
on l.codigoeditorial=e.codigo;
En algunos casos (como en este ejemplo) el uso de alias es para fines de simplificacin y hace
ms legible la consulta si es larga y compleja, pero en algunas consultas es absolutamente
necesario.
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Eliminamos ambas tablas:
Note que los libros cuyo cdigo de editorial NO se encuentra en "editoriales" no aparecen en
el resultado de la consulta. El libro "Java en 10 minutos" tiene cdigo de editorial 5, y ese
cdigo no est presente en "editoriales"; el libro "Matemtica estas ahi" tiene valor nulo en
"codigoeditorial", por lo tanto, tampoco se muestra en el join.
Mostramos el cdigo del libro, ttulo, autor y nombre de la editorial realizando un join y
empleando alias:
select l.codigo,titulo,autor,nombre
from libros l
join editoriales e
on codigoeditorial=e.codigo;
Realizamos la misma consulta anterior agregando un "where" para obtener solamente los
libros de la editorial "Siglo XXI":
select l.codigo,titulo,autor,nombre
from libros l
join editoriales e
on codigoeditorial=e.codigo
where e.nombre='Siglo XXI';
Obtenemos ttulo, autor y nombre de la editorial, esta vez ordenados por ttulo:
select titulo,autor,nombre
from libros l
join editoriales e
on codigoeditorial=e.codigo
order by titulo;
48 - Combinacin interna (join)
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una
tabla "provincias" donde registra los nombres de las provincias.
5- Obtenga la misma informacin anterior pero ordenada por nombre de provincia (join y
order by)
6- Recupere todos los datos de los clientes de la provincia "Santa Fe" (join con where) (2
registros devueltos)
select c.nombre,domicilio,ciudad,p.nombre
from clientes c
join provincias p
on c.codigoprovincia=p.codigo;
select c.nombre,domicilio,ciudad,p.nombre
from clientes c
join provincias p
on c.codigoprovincia=p.codigo
order by p.nombre;
select c.nombre,domicilio,ciudad
from clientes c
join provincias p
on c.codigoprovincia=p.codigo
where p.nombre='Santa Fe';
Segundo problema:
Un club dicta clases de distintos deportes. Almacena la informacin en una tabla llamada
"inscriptos" que incluye el documento, el nombre, el deporte y si la matricula esta paga o no y
una tabla llamada "inasistencias" que incluye el documento, el deporte y la fecha de la
inasistencia.
Note que la condicin es compuesta porque para identificar los registros de la tabla
"inasistencias" necesitamos ambos campos.
Note que la persona con documento '25555555' no aparece en la consulta porque no est
presente en "inasistencias".
5- Obtenga el nombre, deporte y las fechas de inasistencias de todos los inscriptos que
pagaron la matrcula (4 registros)
select nombre,insc.deporte,ina.fecha
from inscriptos insc
join inasistencias ina
on insc.documento=ina.documento and
insc.deporte=ina.deporte
order by nombre, insc.deporte;
Vimos que una combinacin interna (join) encuentra registros de la primera tabla que se
correspondan con los registros de la segunda, es decir, que cumplan la condicin del "on" y si
un valor de la primera tabla no se encuentra en la segunda tabla, el registro no aparece.
Las combinaciones externas combinan registros de dos tablas que cumplen la condicin, ms
los registros de la segunda tabla que no la cumplen; es decir, muestran todos los registros de
las tablas relacionadas, an cuando no haya valores coincidentes entre ellas.
Este tipo de combinacin se emplea cuando se necesita una lista completa de los datos de
una de las tablas y la informacin que cumple con la condicin. Las combinaciones externas
se realizan solamente entre 2 tablas.
Hay tres tipos de combinaciones externas: "left outer join", "right outer join" y "full outer
join"; se pueden abreviar con "left join", "right join" y "full join" respectivamente.
Vamos a estudiar las primeras.
Se emplea una combinacin externa izquierda para mostrar todos los registros de la tabla de
la izquierda. Si no encuentra coincidencia con la tabla de la derecha, el registro muestra los
campos de la segunda tabla seteados a "null".
select titulo,nombre
from editoriales e
left join libros l
on codigoeditorial = e.codigo;
El resultado mostrar el ttulo y nombre de la editorial; las editoriales de las cuales no hay
libros, es decir, cuyo cdigo de editorial no est presente en "libros" aparece en el resultado,
pero con el valor "null" en el campo "titulo".
Entonces, un "left join" se usa para hacer coincidir registros en una tabla (izquierda) con otra
tabla (derecha); si un valor de la tabla de la izquierda no encuentra coincidencia en la tabla
de la derecha, se genera una fila extra (una por cada valor no encontrado) con todos los
campos correspondientes a la tabla derecha seteados a "null". La sintaxis bsica es la
siguiente:
select CAMPOS
from TABLAIZQUIERDA
left join TABLADERECHA
on CONDICION;
En el siguiente ejemplo solicitamos el ttulo y el nombre la editorial, la sentencia es similar a
la anterior, la diferencia est en el orden de las tablas:
select titulo,nombre
from libros l
left join editoriales e
on codigoeditorial = e.codigo;
El resultado mostrar el ttulo del libro y el nombre de la editorial; los ttulos cuyo cdigo de
editorial no est presente en "editoriales" aparecen en el resultado, pero con el valor "null" en
el campo "nombre".
Un "left join" puede tener clausula "where" que restringa el resultado de la consulta
considerando solamente los registros que encuentran coincidencia en la tabla de la derecha,
es decir, cuyo valor de cdigo est presente en "libros":
select titulo,nombre
from editoriales e
left join libros l
on e.codigo=codigoeditorial
where codigoeditorial is not null;
Tambin podemos mostrar las editoriales que NO estn presentes en "libros", es decir, que NO
encuentran coincidencia en la tabla de la derecha:
select titulo,nombre
from editoriales e
left join libros l
on e.codigo=codigoeditorial
where codigoeditorial is null;
49 - Combinacin externa izquierda (left join)
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Eliminamos ambas tablas, las creamos y agregamos a cada una de ellas restricciones nicas
para los campos "codigo" de ambas tablas:
Realizamos una combinacin izquierda para obtener los ttulos de los libros, incluyendo el
nombre de la editorial:
select titulo,nombre
from editoriales e
left join libros l
on codigoeditorial = e.codigo;
Las editoriales de las cuales no hay libros, es decir, cuyo cdigo de editorial no est presente
en "libros" o tienen valor nulo, aparece en el resultado, pero con el valor "null" en el campo
"titulo" (caso de "Siglo XXI", "Sudamericana" y "Norma").
select titulo,nombre
from libros l
left join editoriales e
on codigoeditorial = e.codigo;
El resultado mostrar el ttulo del libro y el nombre de la editorial; los ttulos cuyo cdigo de
editorial no est presente en "editoriales" o tienen valor nulo, aparecen en el resultado, pero
con el valor "null" en el campo "nombre" (caso de los libros "El quijote..." y "Java...").
select titulo,nombre
from editoriales e
left join libros l
on e.codigo=codigoeditorial
where codigoeditorial is not null;
Mostramos las editoriales que NO estn presentes en "libros", es decir, que NO encuentran
coincidencia en la tabla de la derecha:
select nombre
from editoriales e
left join libros l
on e.codigo=codigoeditorial
where codigoeditorial is null;
Aparecen 3 editoriales.
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una
tabla "provincias" donde registra los nombres de las provincias.
1- Elimine las tablas "clientes" y "provincias", crelas y agregue restricciones nicas para los
campos "codigo" de ambas tablas:
2- Ingrese algunos registros para ambas tablas. Incluya valores nulos para el campo "codigo"
de "provincias" y valores nulos para el campo "codigoprovincia" de "clientes". Incluya en
"clientes" un cdigo de provincia que no exista en "provincias":
Note que los clientes de "Santa Rosa", "Villa Maria" y "La Plata" se muestran seteados a null en
la columna corespondiente al nombre de la provincia porque tienen valores nulos o
inexistentes.
5- Muestre solamente los clientes de las provincias que existen en "provincias" (4 registros)
Note que los clientes de "Jujuy", "Salta", "Santa Cruz" y "Corrientes" se muestran seteados a
null en los campos pertenecientes a la tabla "clientes" porque tienen valores nulos o
inexistentes en dicha tabla.
6- Muestre todos los clientes cuyo cdigo de provincia NO existe en "provincias" ordenados por
nombre del cliente (3 registros)
Vimos que una combinacin externa izquierda (left join) encuentra registros de la tabla
izquierda que se correspondan con los registros de la tabla derecha y si un valor de la tabla
izquierda no se encuentra en la tabla derecha, el registro muestra los campos
correspondientes a la tabla de la derecha seteados a "null".
Una combinacin externa derecha ("right outer join" o "right join") opera del mismo modo slo
que la tabla derecha es la que localiza los registros en la tabla izquierda.
El resultado mostrar el ttulo y nombre de la editorial; las editoriales de las cuales no hay
libros, es decir, cuyo cdigo de editorial no est presente en "libros" aparece en el resultado,
pero con el valor "null" en el campo "titulo".
Es FUNDAMENTAL tener en cuenta la posicin en que se colocan las tablas en los "outer join".
En un "left join" la primera tabla (izquierda) es la que busca coincidencias en la segunda tabla
(derecha); en el "right join" la segunda tabla (derecha) es la que busca coincidencias en la
primera tabla (izquierda).
En la siguiente consulta empleamos un "left join" para conseguir el mismo resultado que el
"right join" anterior":
select titulo,nombre
from editoriales e
left join libros l
on codigoeditorial = e.codigo;
Note que la tabla que busca coincidencias ("editoriales") est en primer lugar porque es un
"left join"; en el "right join" precedente, estaba en segundo lugar.
Un "right join" hace coincidir registros en una tabla (derecha) con otra tabla (izquierda); si un
valor de la tabla de la derecha no encuentra coincidencia en la tabla izquierda, se genera una
fila extra (una por cada valor no encontrado) con todos los campos correspondientes a la
tabla izquierda seteados a "null". La sintaxis bsica es la siguiente:
select CAMPOS
from TABLAIZQUIERDA
right join TABLADERECHA
on CONDICION;
Un "right join" tambin puede tener clusula "where" que restringa el resultado de la consulta
considerando solamente los registros que encuentran coincidencia en la tabla izquierda:
select titulo,nombre
from libros l
right join editoriales e
on e.codigo=codigoeditorial
where codigoeditorial is not null;
Mostramos las editoriales que NO estn presentes en "libros", es decir, que NO encuentran
coincidencia en la tabla de la derecha empleando un "right join":
select titulo,nombre
from libros l
right join editoriales e
on e.codigo=codigoeditorial
where codigoeditorial is null;
50 - Combinacin externa derecha (right join)
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Eliminamos ambas tablas, las creamos y agregamos dos restricciones "primary key" sobre los
campos "codigo" de las dos tablas:
Las editoriales de las cuales no hay libros, es decir, cuyo cdigo de editorial no est presente
en "libros" aparece en el resultado, pero con el valor "null" en el campo "titulo"; caso de la
editorial "Siglo XXI".
Mostramos las editoriales que NO estn presentes en "libros" (que NO encuentran coincidencia
en "editoriales"):
select nombre
from libros l
right join editoriales e
on e.codigo=codigoeditorial
where codigoeditorial is null;
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una
tabla "provincias" donde registra los nombres de las provincias.
3- Muestre todos los datos de los clientes, incluido el nombre de la provincia empleando un
"right join".
4- Obtenga la misma salida que la consulta anterior pero empleando un "left join".
5- Empleando un "right join", muestre solamente los clientes de las provincias que existen en
"provincias" (5 registros)
6- Muestre todos los clientes cuyo cdigo de provincia NO existe en "provincias" ordenados por
ciudad (2 registros)
Vimos que un "left join" encuentra registros de la tabla izquierda que se correspondan con los
registros de la tabla derecha y si un valor de la tabla izquierda no se encuentra en la tabla
derecha, el registro muestra los campos correspondientes a la tabla de la derecha seteados a
"null". Aprendimos tambin que un "right join" opera del mismo modo slo que la tabla
derecha es la que localiza los registros en la tabla izquierda.
Una combinacin externa completa ("full outer join" o "full join") retorna todos los registros
de ambas tablas. Si un registro de una tabla izquierda no encuentra coincidencia en la tabla
derecha, las columnas correspondientes a campos de la tabla derecha aparecen seteadas a
"null", y si la tabla de la derecha no encuentra correspondencia en la tabla izquierda, los
campos de esta ltima aparecen conteniendo "null".
Veamos un ejemplo:
select titulo,nombre
from editoriales e
full join libros l
on codigoeditorial = e.codigo;
La salida del "full join" precedente muestra todos los registros de ambas tablas, incluyendo los
libros cuyo cdigo de editorial no existe en la tabla "editoriales" y las editoriales de las cuales
no hay cor
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Eliminamos ambas tablas, las creamos y agregamos dos claves nicas sobre los campos
"codigo" de ambas tablas:
Realizamos una combinacin externa completa para obtener todos los registros de ambas
tablas, incluyendo los libros cuyo cdigo de editorial no existe en la tabla "editoriales" y las
editoriales de las cuales no hay correspondencia en "libros":
Note que el libro "El aleph" cuyo valor de "codigoeditorial" es null, muestra "null" en la
columna "editorial" y las editoriales "Sudamericana" y "Siglo XXI" muestran "null" en el campo
"titulo".
respondencia en "libros".
Primer problema:
Un club dicta clases de distintos deportes. Almacena la informacin en una tabla llamada
"deportes" en la cual incluye el nombre del deporte y el nombre del profesor y en otra tabla
llamada "inscriptos" que incluye el documento del socio que se inscribe, el deporte y si la
matricula est paga o no.
1- Elimine las tablas, crelas y agregue dos restricciones, una "primary key" sobre el campo
"codigo" de "deportes" y otra compuesta por "documento" y "codigodeporte" de "inscriptos":
Note que uno de los registros tiene seteado a null la columna "deporte".
4- Empleando un "left join" con "deportes" obtenga todos los datos de los inscriptos (7
registros)
6- Muestre los deportes para los cuales no hay inscriptos, empleando un "left join" (1 registro)
7- Muestre los documentos de los inscriptos a deportes que no existen en la tabla "deportes"
(1 registro)
8- Emplee un "full join" para obtener todos los datos de ambas tablas, incluyendo las
inscripciones a deportes inexistentes en "deportes" y los deportes que no tienen inscriptos (8
registros)
Note que uno de los registros con documento "22222222" tiene seteado a "null" los campos
correspondientes a "deportes" porque el cdigo "5" no est presente en "deportes"; otro
registro, que muestra "tenis" y "Marcelo Roca", tiene valores nulos en los campos
correspondientes a la tabla "inscriptos", ya que, para el deporte con cdigo 1, no hay
inscriptos.
drop table deportes;
drop table inscriptos;
select nombre
from deportes d
left join inscriptos i
on codigodeporte=codigo
where codigodeporte is null;
select documento
from inscriptos i
left join deportes d
on codigodeporte=codigo
where codigo is null;
Las combinaciones cruzadas (cross join) muestran todas las combinaciones de todos los
registros de las tablas combinadas. Para este tipo de join no se incluye una condicin de
enlace. Se genera el producto cartesiano en el que el nmero de filas del resultado es igual al
nmero de registros de la primera tabla multiplicado por el nmero de registros de la segunda
tabla, es decir, si hay 3 registros en una tabla y 4 en la otra, retorna 12 filas.
select CAMPOS
from TABLA1
cross join TABLA2;
Veamos un ejemplo. Un pequeo restaurante almacena los nombres y precios de sus comidas
en una tabla llamada "comidas" y en una tabla denominada "postres" los mismos datos de sus
postres.
Si necesitamos conocer todas las combinaciones posibles para un men, cada comida con cada
postre, empleamos un "cross join":
La salida muestra cada plato combinado con cada uno de los postres.
Como cualquier tipo de "join", puede emplearse una clusula "where" que condicione la
salida.
Problema:
Un pequeo restaurante tiene almacenados los nombres y precios de sus comidas en una tabla
llamada "comidas" y en una tabla denominada "postres" los mismos datos de sus postres.
Eliminamos las tablas:
El restaurante quiere combinar los registros de ambas tablas para mostrar los distintos
menes que ofrece. Lo hacemos usando un "cross join":
La salida muestra cada plato combinado con cada uno de los postres. Se obtienen 8 registros.
En la siguiente combinacin cruzada, agregamos una columna que calcula el precio total de
cada men:
La salida muestra cada plato combinado con cada uno de los postres y el precio total de cada
men. Se obtienen 8 registros.
Primer problema:
Una agencia matrimonial almacena la informacin de sus clientes de sexo femenino en una
tabla llamada "mujeres" y en otra la de sus clientes de sexo masculino llamada "varones".
3- La agencia necesita la combinacin de todas las personas de sexo femenino con las de sexo
masculino. Use un "cross join" (12 filas)
5- Forme las parejas pero teniendo en cuenta que no tengan una diferencia superior a 10 aos
(8 filas)
select m.nombre,m.edad,v.nombre,v.edad
from mujeres m
cross join varones v;
select m.nombre,m.edad,v.nombre,v.edad
from mujeres m
cross join varones v
where m.edad>40 and
v.edad>40;
select m.nombre,m.edad,v.nombre,v.edad
from mujeres m
cross join varones v
where m.edad-v.edad between -10 and 10;
Segundo problema:
Una empresa de seguridad almacena los datos de sus guardias de seguridad en una tabla
llamada "guardias". tambin almacena los distintos sitios que solicitaron sus servicios en una
tabla llamada "tareas".
4- La empresa quiere que todos sus empleados realicen todas las tareas. Realice un "cross
join" (20 filas)
5- En este caso, la empresa quiere que todos los guardias de sexo femenino realicen las tareas
de "vigilancia interior" y los de sexo masculino de "vigilancia exterior". Realice una "cross join"
con un "where" que controle tal requisito (10 filas)
select nombre,t.domicilio,descripcion
from guardias
cross join tareas t;
select nombre,t.domicilio,descripcion
from guardias g
cross join tareas t
where (g.sexo='f' and t.descripcion='vigilancia interior') or
(g.sexo='m' and t.descripcion='vigilancia exterior');
53 - Autocombinacin
- nombre varchar(20),
- precio decimal (4,2) y
- rubro char(6)-- que indica con 'plato' si es un plato principal y
'postre' si es postre.
Podemos obtener la combinacin de todos los platos empleando un "cross join" con una sola
tabla:
select c1.nombre,
c2.nombre,
c1.precio+c2.precio as total
from comidas c1
cross join comidas c2;
En la consulta anterior se emple un "where" que especifica que se combine "plato" con
"postre".
En una autocombinacin se combina una tabla con una copia de si misma. Para ello debemos
utilizar 2 alias para la tabla. Para evitar que aparezcan filas duplicadas, debemos emplear un
"where".
53 - Autocombinacin
Problema:
Un pequeo restaurante tiene almacenados los nombres, precios y rubro de sus comidas en
una tabla llamada "comidas".
Eliminamos la tabla:
Creamos la tabla:
select c1.nombre,
c2.nombre,
c1.precio+c2.precio as total
from comidas c1
cross join comidas c2;
Note que aparecen filas duplicadas, por ejemplo, "ravioles" se combina con "ravioles" y la
combinacin "ravioles- flan" se repite como "flan- ravioles". Debemos especificar que combine
el rubro "plato" con "postre":
La salida muestra cada plato combinado con cada postre, y una columna extra que calcula el
total del men.
Tambin se puede realizar una autocombinacin con "join":
53 - Autocombinacin
Primer problema:
Una agencia matrimonial almacena la informacin de sus clientes en una tabla llamada
"clientes".
3- La agencia necesita la combinacin de todas las personas de sexo femenino con las de sexo
masculino. Use un "cross join" (12 filas)
5- Realice la misma autocombinacin que el punto 3 pero agregue la condicin que las parejas
no tengan una diferencia superior a 5 aos (5 filas)
select cm.nombre,cm.edad,cv.nombre,cv.edad
from clientes cm
cross join clientes cv
where cm.sexo='f' and cv.sexo='m';
select cm.nombre,cm.edad,cv.nombre,cv.edad
from clientes cm
join clientes cv
on cm.nombre<>cv.nombre
where cm.sexo='f' and cv.sexo='m';
select cm.nombre,cm.edad,cv.nombre,cv.edad
from clientes cm
cross join clientes cv
where cm.sexo='f' and cv.sexo='m' and
cm.edad-cv.edad between -5 and 5;
Segundo problema:
Varios clubes de barrio se organizaron para realizar campeonatos entre ellos. La tabla
llamada "equipos" guarda la informacin de los distintos equipos que jugarn.
4- Cada equipo jugar con todos los dems 2 veces, una vez en cada sede. Realice un "cross
join" para combinar los equipos teniendo en cuenta que un equipo no juega consigo mismo (12
filas)
6- Realice un "cross join" para combinar los equipos para que cada equipo juegue con cada
uno de los otros una sola vez (6 filas)
Podemos usar "group by" y las funciones de agrupamiento con combinaciones de tablas.
Para ver la cantidad de libros de cada editorial consultando la tabla "libros" y "editoriales",
tipeamos:
Las editoriales que no tienen libros no aparecen en la salida porque empleamos un "join".
Empleamos otra funcin de agrupamiento con "left join". Para conocer el mayor precio de los
libros de cada editorial usamos la funcin "max()", hacemos un "left join" y agrupamos por
nombre de la editorial:
En la sentencia anterior, mostrar, para la editorial de la cual no haya libros, el valor "null"
en la columna calculada.
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Note que las editoriales que no tienen libros no aparecen en la salida porque empleamos un
"join".
La sentencia anterior mostrar, para la editorial de la cual no haya libros, el valor "null" en la
columna calculada.
Primer problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus
productos y en otra tabla llamada "ciudades" los nombres de las ciudades.
5- Muestre el promedio de gastos de las visitas agrupados por ciudad y sexo (4 filas)
Note que aparece el monto "95,4" con valor nulo en el campo correspondiente a la ciudad, ya
que ese registro tiene un valor inexistente en "ciudades".
select c.nombre,
count(*) as cantidad
from ciudades c
join visitantes v
on codigociudad=c.codigo
group by c.nombre;
select c.nombre,sexo,
avg(montocompra) as "promedio de compra"
from ciudades c
join visitantes v
on codigociudad=c.codigo
group by c.nombre,sexo;
select c.nombre,
count(mail) as "tienen mail"
from ciudades c
join visitantes v
on codigociudad=c.codigo
group by c.nombre;
select c.nombre,
max(montocompra)
from visitantes v
join ciudades c
on codigociudad=c.codigo
group by c.nombre;
select c.nombre,
max(montocompra)
from visitantes v
left join ciudades c
on codigociudad=c.codigo
group by c.nombre;
55 - Combinar ms de 2 tablas
La librera almacena los datos de sus libros en tres tablas: libros, editoriales y autores.
En la tabla "libros" un campo "codigoautor" hace referencia al autor y un campo
"codigoeditorial" referencia la editorial.
Para recuperar todos los datos de los libros empleamos la siguiente consulta:
select titulo,a.nombre,e.nombre
from autores a
join libros l
on codigoautor=a.codigo
join editoriales e
on codigoeditorial=e.codigo;
Analicemos la consulta anterior. Indicamos el nombre de la tabla luego del "from" ("autores"),
combinamos esa tabla con la tabla "libros" especificando con "on" el campo por el cual se
combinarn; luego debemos hacer coincidir los valores para el enlace con la tabla
"editoriales" enlazndolas por los campos correspondientes. Utilizamos alias para una
sentencia ms sencilla y comprensible.
Note que especificamos a qu tabla pertenecen los campos cuyo nombre se repiten en las
tablas, esto es necesario para evitar confusiones y ambiguedades al momento de referenciar
un campo.
Los libros cuyo cdigo de autor no se encuentra en "autores" y cuya editorial no existe en
"editoriales", no aparecen porque realizamos una combinacin interna.
select titulo,a.nombre,e.nombre
from autores a
right join libros l
on codigoautor=a.codigo
left join editoriales e
on codigoeditorial=e.codigo;
En la consulta anterior solicitamos el ttulo, autor y editorial de todos los libros que
encuentren o no coincidencia con "autores" ("right join") y a ese resultado lo combinamos con
"editoriales", encuentren o no coincidencia.
Es posible realizar varias combinaciones para obtener informacin de varias tablas. Las tablas
deben tener claves externas relacionadas con las tablas a combinar.
En consultas en las cuales empleamos varios "join" es importante tener en cuenta el orden de
las tablas y los tipos de "join".
55 - Combinar ms de 2 tablas
Problema:
Una librera almacena la informacin de sus libros para la venta en tres tablas, "libros",
"autores" y "editoriales".
Recuperamos todos los datos de los libros consultando las tres tablas:
Note que no aparecen los libros cuyo cdigo de autor no se encuentra en "autores" (caso de
"Java en 10 minutos" y "Matematica estas ahi") y cuya editorial no existe en "editoriales" (caso
de "Matematica estas ahi" y "Java de la A a la Z"), esto es porque realizamos una combinacin
interna.
Primer problema:
Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda los datos de
los socios, en una tabla llamada "deportes" la informacin referente a los diferentes deportes
que se dictan y en una tabla denominada "inscriptos", las inscripciones de los socios a los
distintos deportes.
Un socio puede inscribirse en varios deportes el mismo ao. Un socio no puede inscribirse en
el mismo deporte el mismo ao. Distintos socios se inscriben en un mismo deporte en el
mismo ao.
8- Ingrese una inscripcin con un cdigo de deporte inexistente y un documento de socio que
no exista en "socios":
9- Muestre el nombre del socio, el nombre del deporte en que se inscribi y el ao empleando
diferentes tipos de join (8 filas):
10- Muestre todos los datos de las inscripciones (excepto los cdigos) incluyendo aquellas
inscripciones cuyo cdigo de deporte no existe en "deportes" y cuyo documento de socio no se
encuentra en "socios" (10 filas)
11- Muestre todas las inscripciones del socio con documento "22222222" (3 filas)
select s.nombre,d.nombre,ao
from deportes d
right join inscriptos i
on codigodeporte=d.codigo
left join socios s
on i.documento=s.documento;
select s.nombre,d.nombre,ao,matricula
from deportes d
full join inscriptos i
on codigodeporte=d.codigo
full join socios s
on s.documento=i.documento;
select s.nombre,d.nombre,ao,matricula
from deportes d
join inscriptos i
on codigodeporte=d.codigo
join socios s
on s.documento=i.documento
where s.documento='22222222';
Tambin vimos que es posible emplear varios tipos de combinaciones en una consulta, incluso
puede combinarse una tabla consigo misma.
Existen otros tipos de "join" en Oracle, que veremos rpidamente, ya que se resuelven con los
que vimos anteriormente, bsicamente lo que cambia es la sintaxis.
1) combinacin natural: realiza un join entre dos tablas cuando los campos por los cuales se
enlazan tienen el mismo nombre. Involucra claves primarias y forneas.
Sintaxis:
select CAMPOS
from TABLA1
natural join TABLA2;
Ejemplo:
Sintaxis:
select CAMPOS
from TABLA1
join TABLA2
using (CAMPOenCOMUN);
Ejemplo:
select CAMPOS
from TABLA1
join TABLA2
on CAMPOTABLA1=CAMPOTABLA2(+);
Es decir, se coloca el modificador "(+)" luego del campo de la tabla de la derecha para indicar
que se incluyan los que tienen valor nulo.
Las siguientes consultas retornan el mismo resultado. Una de ellas emplea "left join" y la otra
un "join" con el modificador "(+)":
Ambas mostrarn el ttulo y nombre de la editorial; los libros cuyo cdigo de editorial no est
presente en "editoriales" aparecern con el valor "null" en la columna "editorial".
select CAMPOS
from TABLA1
join TABLA2
on CAMPOTABLA1(+)=CAMPOTABLA2;
Entonces, se coloca el modificador "(+)" luego del campo de la tabla de la izquierda para
indicar que se incluyan los que tienen valor nulo.
Las siguientes consultas retornan el mismo resultado. Una de ellas emplea "right join" y la
otra un "join" con el modificador "(+)":
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Realizamos una combinacin izquierda y luego un "join" con el modificador "(+)"; ambas
consultas retornan el mismo resultado:
Ambas mostrarn el ttulo y nombre de la editorial; los libros cuyo cdigo de editorial no est
presente en "editoriales" aparecern con el valor "null" en la columna "editorial".
Realizamos una combinacin derecha y luego obtenemos el mismo resultado empleando "join"
y el modificador "(+)":
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una
tabla "provincias" donde registra los nombres de las provincias.
3- Muestre todos los datos de los clientes, incluido el nombre de la provincia empleando un
"left join" (7 filas)
4- Obtenga la misma salida que la consulta anterior pero empleando un "join" con el
modificador (+)
Note que en los puntos 3 y 4, los registros "Garcia Luis" y "Torres Fabiola" aparecen aunque no
encuentran coincidencia en "provincias", mostrando "null" en la columna "provincia".
5- Muestre todos los datos de los clientes, incluido el nombre de la provincia empleando un
"right join" para que las provincias de las cuales no hay clientes tambin aparezcan en la
consulta (7 filas)
6- Obtenga la misma salida que la consulta anterior pero empleando un "join" con el
modificador (+)
Note que en los puntos 5 y 6, las provincias "Salta" y "Corrientes" aparecen aunque no
encuentran coincidencia en "clientes", mostrando "null" en todos los campos de tal tabla.
7- Intente colocar en una consulta "join", el modificador "(+)" en ambos campos del enlace
(mensaje de error)
8- Intente realizar un natural join entre ambas tablas mostrando el nombre del cliente, la
ciudad y nombre de la provincia (las tablas tienen 2 campos con igual nombre
"codigoprovincia" y "nombre"; mensaje de error)
9- Realice una combinacin entre ambas tablas empleando la clusula "using" (5 filas)
drop table clientes;
drop table provincias;
Segundo problema:
Un club dicta clases de distintos deportes. Almacena la informacin en una tabla llamada
"inscriptos" que incluye el documento, el nombre, el deporte y si la matricula esta paga o no y
una tabla llamada "inasistencias" que incluye el documento, el deporte y la fecha de la
inasistencia.
Note que la condicin es compuesta porque para identificar los registros necesitamos ambos
campos. Note que la persona con documento '25555555' aparece en la consulta an cuando no
est presente en "inasistencias".
5- Intente realizar un natural join entre ambas tablas mostrando el nombre del inscripto, el
deporte y la fecha de inasistencia (mensaje de error porque hay 2 campos con igual nombre)
6- Realice una combinacin entre ambas tablas mostrando toda la informacin y empleando la
clusula "using" (6 filas)
select ins.documento,nombre,ins.deporte,ina.fecha
from inscriptos ins
left join inasistencias ina
on ins.documento=ina.documento and
ins.deporte=ina.deporte;
select ins.documento,nombre,ins.deporte,ina.fecha
from inscriptos ins
join inasistencias ina
on ins.documento=ina.documento(+) and
ins.deporte=ina.deporte(+);
select ins.documento,nombre,ins.deporte,ina.fecha
from inscriptos ins
join inasistencias ina
on ins.documento=ina.documento(+) and
ins.deporte=ina.deporte;
select nombre,ins.deporte,fecha
from inscriptos ins
natural join
inasistencias ina;
57 - Clave fornea
Un campo que no es clave primaria en una tabla y sirve para enlazar sus valores con otra
tabla en la cual es clave primaria se denomina clave fornea, externa o ajena.
En el ejemplo de la librera en que utilizamos las tablas "libros" y "editoriales" con estos
campos:
el campo "codigoeditorial" de "libros" es una clave fornea, se emplea para enlazar la tabla
"libros" con "editoriales" y es clave primaria en "editoriales" con el nombre "codigo".
Las claves forneas y las claves primarias deben ser del mismo tipo para poder enlazarse. Si
modificamos una, debemos modificar la otra para que los valores se correspondan.
Cuando alteramos una tabla, debemos tener cuidado con las claves forneas. Si modificamos
el tipo, longitud o atributos de una clave fornea, sta puede quedar inhabilitada para hacer
los enlaces.
Entonces, una clave fornea es un campo (o varios) empleados para enlazar datos de 2 tablas,
para establecer un "join" con otra tabla en la cual es clave primaria.
Hemos visto que una de las alternativas que Oracle ofrece para asegurar la integridad de
datos es el uso de restricciones (constraints). Aprendimos que las restricciones se establecen
en tablas y campos asegurando que los datos sean vlidos y que las relaciones entre las tablas
se mantengan.
Con la restriccin "foreign key" se define un campo (o varios) cuyos valores coinciden con la
clave primaria de la misma tabla o de otra, es decir, se define una referencia a un campo con
una restriccin "primary key" o "unique" de la misma tabla o de otra.
La integridad referencial asegura que se mantengan las referencias entre las claves primarias
y las externas. Por ejemplo, controla que si se agrega un cdigo de editorial en la tabla
"libros", tal cdigo exista en la tabla "editoriales".
Tambin controla que no pueda eliminarse un registro de una tabla ni modificar la clave
primaria si una clave externa hace referencia al registro. Por ejemplo, que no se pueda
eliminar o modificar un cdigo de "editoriales" si existen libros con dicho cdigo.
La siguiente es la sintaxis parcial general para agregar una restriccin "foreign key":
Analicmosla:
- luego de "foreign key", entre parntesis se coloca el campo de la tabla a la que le aplicamos
la restriccin que ser establecida como clave fornea,
Para agregar una restriccin "foreign key" al campo "codigoeditorial" de "libros", tipeamos:
En el ejemplo implementamos una restriccin "foreign key" para asegurarnos que el cdigo de
la editorial de la de la tabla "libros" ("codigoeditorial") est asociada con un cdigo vlido en
la tabla "editoriales" ("codigo").
Cuando agregamos cualquier restriccin a una tabla que contiene informacin, Oracle
controla los datos existentes para confirmar que cumplen con la restriccin, si no los cumple,
la restriccin no se aplica y aparece un mensaje de error. Por ejemplo, si intentamos agregar
una restriccin "foreign key" a la tabla "libros" y existe un libro con un valor de cdigo para
editorial que no existe en la tabla "editoriales", la restriccin no se agrega.
Acta en inserciones. Si intentamos ingresar un registro (un libro) con un valor de clave
fornea (codigoeditorial) que no existe en la tabla referenciada (editoriales), Oracle muestra
un mensaje de error. Si al ingresar un registro (un libro), no colocamos el valor para el campo
clave fornea (codigoeditorial), almacenar "null", porque esta restriccin permite valores
nulos (a menos que se haya especificado lo contrario al definir el campo).
La cantidad y tipo de datos de los campos especificados luego de "foreign key" DEBEN
coincidir con la cantidad y tipo de datos de los campos de la clusula "references".
Esta restriccin se puede definir dentro de la misma tabla (lo veremos ms adelante) o entre
distintas tablas.
No se puede eliminar una tabla referenciada en una restriccin "foreign key", aparece un
mensaje de error.
Una restriccion "foreign key" no puede modificarse, debe eliminarse (con "alter table" y "drop
constraint") y volverse a crear.
Para ver informacin acerca de esta restriccin podemos consultar los diccionarios
"user_constraints" y "user_cons_columns".
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Mensaje de error; pues el campo "codigo" de la tabla "editoriales" no fue definida clave
primaria ni nica.
Mensaje de error. Oracle controla que los datos existentes no violen la restriccin que
intentamos establecer, como existe un valor de "codigoeditorial" inexistente en "editoriales",
la restriccin no puede establecerse.
Consultamos "user_cons_columns":
CONSTRAINT_NAME COLUMN_NAME
-------------------------------------------
FK_LIBROS_CODIGOEDITORIAL EDITORIALEDITORIAL
Note que en "codigoeditorial" almacen "null", porque esta restriccin permite valores nulos
(a menos que se haya especificado lo contrario al definir el campo).
Un mensaje nos informa que la restriccin de clave externa est siendo violada, existen
registros que hacen referencia al que queremos eliminar.
Un mensaje de error indica que la accin no puede realizarse porque la tabla es referenciada
por una "foreign key".
58 - Restricciones (foreign key)
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una
tabla "provincias" donde registra los nombres de las provincias.
2- Intente agregar una restriccin "foreign key" a la tabla "clientes" que haga referencia al
campo "codigo" de "provincias"
14- Elimine la restriccin "foreign key" de "clientes" y luego elimine la tabla "provincias"
La restriccin "foreign key", que define una referencia a un campo con una restriccin
"primary key" o "unique" se puede definir entre distintas tablas (como hemos aprendido) o
dentro de la misma tabla.
Una mutual almacena los datos de sus afiliados en una tabla llamada "afiliados". Algunos
afiliados inscriben a sus familiares. La tabla contiene un campo que hace referencia al
afiliado que lo incorpor a la mutual, del cual dependen.
En caso que un afiliado no haya sido incorporado a la mutual por otro afiliado, el campo
"afiliadotitular" almacenar "null".
Establecemos una restriccin "foreign key" para asegurarnos que el nmero de afiliado que se
ingrese en el campo "afiliadotitular" exista en la tabla "afiliados":
Luego de aplicar esta restriccin, cada vez que se ingrese un valor en el campo
"afiliadotitular", Oracle controlar que dicho nmero exista en la tabla, si no existe, mostrar
un mensaje de error.
Problema:
Una mutual almacena los datos de sus afiliados en una tabla llamada "afiliados". Algunos
afiliados inscriben a sus familiares. La tabla contiene un campo que hace referencia al
afiliado que lo incorpor a la mutual, del cual dependen.
En caso que un afiliado no haya sido incorporado a la mutual por otro afiliado, el campo
"afiliadotitular" almacenar "null".
Establecemos una restriccin "foreign key" para asegurarnos que el nmero de afiliado que se
ingrese en el campo "afiliadotitular" exista en la tabla "afiliados":
Podemos eliminar un afiliado, siempre que no haya otro afiliado que haga referencia a l en
"afiliadotitular", es decir, si el "numero" del afiliado est presente en algn registro en el
campo "afiliadotitular":
Los nombres de las tres primeras restricciones son dadas por Oracle.
La tabla tiene una restriccin "check", una "primary key", una "unique" y una "foreign key".
Nos informa que la restriccin nica est establecida sobre "numero"; la "primary key" sobre
"documento", la restriccin de chequeo sobre "documento" y la "foreign key" sobre
"afiliadotitular".
Ingresamos un nuevo registro con un valor para "afiliadotitular" existente:
Primer problema:
Una empresa registra los datos de sus clientes en una tabla llamada "clientes". Dicha tabla
contiene un campo que hace referencia al cliente que lo recomend denominado
"referenciadopor". Si un cliente no ha sido referenciado por ningn otro cliente, tal campo
almacena "null".
3- Intente agregar una restriccin "foreign key" para evitar que en el campo "referenciadopor"
se ingrese un valor de cdigo de cliente que no exista.
No se permite porque existe un registro que no cumple con la restriccin que se intenta
establecer.
4- Cambie el valor invlido de "referenciadopor" del registro que viola la restriccin por uno
vlido:
Podemos eliminar una restriccin "foreign key" con "alter table". La sintaxis bsica es la
misma que para cualquier otra restriccin:
No se puede eliminar una tabla si una restriccin "foreign key" hace referencia a ella.
Cuando eliminamos una tabla que tiene una restriccin "foreign key", la restriccin tambin
se elimina.
Aprendimos (cuando vimos los otros tipos de restricciones) que si agregamos una restriccin a
una tabla que contiene datos, Oracle los controla para asegurarse que cumplen con la
restriccin y que es posible deshabilitar esta comprobacin. Lo hacemos incluyendo la opcin
"novalidate" en la instruccin "alter table"; en tal caso, La restriccin no se aplica en los datos
existentes, pero si intentamos ingresar un nuevo valor que no cumpla la restriccin (o
actualizarlo), Oracle no lo permite.
Para saber si una restriccin est validada o no, podemos consultar el catlogo
"user_constraints" y fijarnos lo que informa la columna "validated".
Tambin aprendimos que podemos deshabilitar las restricciones para agregar o actualizar
datos sin comprobarla. Para evitar la comprobacin de datos en inserciones y actualizaciones
agregamos "disable" en la instruccin "alter table".
Para habilitar una restriccin "foreign key" deshabilitada se ejecuta la misma instruccin pero
con la clusula "enable".
Por defecto (si no se especifica) las opciones son "validate" (es decir, controla los datos
existentes) y "enable" (controla futuros ingresos y actualizaciones).
Para saber si una restriccin est habilitada o no, podemos consultar el catlogo
"user_constraints" y fijarnos lo que informa la columna "status".
Podemos habilitar una restriccin "foreign key" con "enable" y "novalidate", en tal caso Oracle
habilita la restriccin para futuros ingresos y actualizaciones y NO valida los datos existentes.
Entonces, "enable" o "disable" activa o desactiva la restriccin para los nuevos datos ("enable"
es la opcin predeterminada si no se especifica); "validate" o "novalidate" es la opcin para
validar la restriccin en los datos existentes ("validate" es la predeterminada si se omite).
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Agregamos una restriccin "foreign key" a la tabla "libros" para evitar que se ingresen cdigos
de editoriales inexistentes en "editoriales". Incluimos la opcin "novalidate" para evitar la
comprobacin de la restriccin en los datos existentes (note que hay un libro que tiene un
cdigo de editorial invlido):
Habilitamos la restriccin:
Oracle mostrar un mensaje indicando que no se pueden validar los datos existentes porque
existen valores invlidos.
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una
tabla "provincias" donde registra los nombres de las provincias.
4- Intente agregar una restriccin "foreign key" para que los cdigos de provincia de "clientes"
existan en "provincias" sin especificar la opcin de comprobacin de datos
No se puede porque al no especificar opcin para la comprobacin de datos, por defecto es
"validate" y hay un registro que no cumple con la restriccin.
13- Intente alterar la restriccin "foreign key" para que valide los datos existentes
14- Elimine los registros que no cumplen la restriccin y modifique la restriccin a "enable" y
"validate"
select constraint_name,status,validated
from user_constraints
where table_name='CLIENTES';
select constraint_name,status,validated
from user_constraints
where table_name='CLIENTES';
La restriccin "foreign key" tiene la clusula "on delete", que son opcionales. Esta clusula
especifica cmo debe actuar Oracle frente a eliminaciones en las tablas referenciadas en la
restriccin.
- "set null": indica que si eliminamos un registro de la tabla referenciada (TABLA2) cuyo valor
existe en la tabla principal (TABLA1), dicho registro se elimine y los valores coincidentes en la
tabla principal se seteen a "null".
- "cascade": indica que si eliminamos un registro de la tabla referenciada en una "foreign key"
(TABLA2), los registros coincidentes en la tabla principal (TABLA1), tambin se eliminen; es
decir, si eliminamos un registro al cual una clave fornea referencia, dicha eliminacin se
extiende a la otra tabla (integridad referencial en cascada).
Veamos un ejemplo. Definimos una restriccin "foreign key" a la tabla "libros" estableciendo el
campo "codigoeditorial" como clave fornea que referencia al campo "codigo" de la tabla
"editoriales". La tabla "editoriales" tiene como clave primaria el campo "codigo".
Especificamos la accin en cascada para las eliminaciones:
- se especifica accin para eliminaciones ("on delete set null") y se elimina un registro de la
tabla referenciada en la "foreign key" (editoriales) cuyo valor de clave primaria (codigo)
existe en la tabla principal (libros), la accin se realiza y se setean a "null" todos los valores
coincidentes en la tabla principal (libros).
La restriccin "foreign key" NO tiene una clusula para especificar acciones para
actualizaciones.
Si intentamos actualizar un registro de la tabla referenciada por una restriccin "foreign key"
cuyo valor de clave primaria existe referenciada en la tabla que tiene dicha restriccin, la
accin no se ejecuta y aparece un mensaje de error. Esto sucede porque, por defecto (y como
nica opcin), para actualizaciones existe "no action".
Problema:
Una librera almacena la informacin de sus libros para la venta en dos tablas, "libros" y
"editoriales".
Establecemos una restriccin "foreign key" para evitar que se ingrese en "libros" un cdigo de
editorial inexistente en "editoriales" con la opcin "on cascade" para eliminaciones:
Consultamos "user_constraints":
Si eliminamos una editorial, se borra tal editorial de "editoriales" y todos los registros de
"libros" de dicha editorial:
Establecemos una restriccin "foreign key" sobre "codigoeditorial" de "libros" con la opcin "set
null" para eliminaciones:
alter table libros
add constraint FK_libros_codigoeditorial
foreign key (codigoeditorial)
references editoriales(codigo)
on delete set null;
Consultamos "user_constraints":
Si eliminamos una editorial cuyo cdigo est presente en "libros", se borra tal editorial de
"editoriales" y todos los registros de "libros" de dicha editorial se setean con el valor "null":
Ahora, los libros "Martin Fierro" y "Aprenda PHP" tiene valor nulo en "codigoeditorial".
Establecemos una restriccin "foreign key" sobre "codigoeditorial" de "libros" sin especificar
opcin para eliminaciones:
Consultamos "user_constraints":
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una
tabla "provincias" donde registra los nombres de las provincias.
4- Establezca una restriccin "foreign key" especificando la accin "set null" para
eliminaciones.
5- Elimine el registro con cdigo 3, de "provincias" y consulte "clientes" para ver qu cambios
ha realizado Oracle en los registros coincidentes
Todos los registros con "codigoprovincia" 3 han sido seteados a null.
10- Consulte el diccionario "user_constraints" para ver qu accin se ha establecido para las
eliminaciones sobre las restricciones "foreign key" de la tabla "clientes"
11- Elimine el registro con cdigo 2, de "provincias"
12- Verifique que el cambio se realiz en cascada, es decir, que se elimin en la tabla
"provincias" y todos los clientes de la provincia eliminada
14- Establezca una restriccin "foreign key" sin especificar accin para eliminaciones
15- Intente eliminar un registro de la tabla "provincias" cuyo cdigo exista en "clientes"
16- Consulte el diccionario "user_constraints" para ver qu accin se ha establecido para las
eliminaciones sobre la restriccin "FK_CLIENTES_CODIGOPROVINCIA"
Segundo problema:
Un club dicta clases de distintos deportes. En una tabla llamada "deportes" guarda la
informacin de los distintos deportes que se ensean; en una tabla "socios", los datos de los
socios y en una tabla "inscripciones" almacena la informacin necesaria para las inscripciones
de los distintos socios a los distintos deportes.
3- Establezca una restriccin "foreign key" para "inscripciones" que haga referencia al campo
"codigo" de "deportes" indicando la accin "cascade" para eliminaciones
4- Establezca una restriccin "foreign key" para "inscripciones" que haga referencia al campo
"documento" de "socios" que permita la eliminacin "set null" (Recuerde que se pueden
establecer varias restricciones "foreign key" sobre una misma tabla)
11- Verifique que se han eliminado los registros de "inscripciones" cuyo cdigo de deporte
corresponda a "natacion"
63 - Informacin de user_constraints
- validated: indica si valida los datos existentes en la tabla (validated) o no (no validate).
Hasta el momento hemos agregado restricciones a tablas existentes con "alter table"; tambin
pueden establecerse al momento de crear una tabla (en la instruccin "create table").
- "foreign key" para establecer el campo "codigoeditorial" como clave externa que haga
referencia al campo "codigo" de "editoriales y permita eliminaciones en cascada;
- "foreign key" para establecer el campo "codigoautor" como clave externa que haga
referencia al campo "codigo" de "autores" y permita eliminaciones "set null";
- de control sobre "precio" para que no admita valores nulos, deshabilitada;
Las restricciones se agregan a la tabla, separadas por comas; colocando "constraint" seguido
del nombre de la restriccin, el tipo y los campos (si es una "primary key", "unique" o "foreign
key") o la condicin (si es de control); tambin puede especificarse el estado y la validacin
de datos (por defecto es "enable" y "validate"); y en el caso de las "foreign key", la opcin
para eliminaciones.
Si definimos una restriccin "foreign key" al crear una tabla, la tabla referenciada debe existir
y debe tener definida la clave primaria o nica a la cual hace referencia la "foreign key".
Problema:
Recuerde eliminar en primer lugar "libros", pues si las tablas existen y "libros" hace referencia
con una restriccin "foreign key" a "editoriales" y "autores", tales tablas no podrn eliminarse
hasta que ninguna restriccin las referencie.
Creamos la tabla "autores" con una restriccin "primary key", una "unique" y una "check":
Recuerde que si definimos una restriccin "foreign key" al crear una tabla, la tabla
referenciada debe existir, por ello creamos las tablas "editoriales" y "autores" antes que
"libros".
Una tabla nos informa que hay una restriccin de control y una "primary key", ambas
habilitadas y validan los datos existentes.
Oracle nos informa que hay 3 restricciones de control, una "primary key" y una nica.
Note que un libro tiene precio nulo, la tabla "libros" tiene una restriccin de control que no
admite precios nulos, pero est deshabilitada.
Eliminamos un autor:
Veamos si se setearon a "null" los libros de tal autor (la restriccin "FK_LIBROS_AUTORES" as
lo especifica):
Primer problema:
- "deportes": que guarda un cdigo, nombre del deporte, da de la semana que se dicta y
documento del profesor instructor;
2- Considere que:
5- Ingrese registros en "deportes". Ingrese el mismo da para distintos deportes, un deporte sin
da confirmado, un deporte sin profesor definido:
insert into deportes values(1,'basquet','lunes',null);
insert into deportes values(2,'futbol','lunes','23333333');
insert into deportes values(3,'natacion',null,'22222222');
insert into deportes values(4,'padle',default,'23333333');
insert into deportes values(5,'tenis','jueves',null);
8- Realice un "join" (del tipo que sea necesario) para mostrar todos los datos del socio junto
con el nombre de los deportes en los cuales est inscripto, el da que tiene que asistir y el
nombre del profesor que lo instruir (5 registros)
9- Realice la misma consulta anterior pero incluya los socios que no estn inscriptos en ningn
deporte (6 registros)
10- Muestre todos los datos de los profesores, incluido el deporte que dicta y el da,
incluyendo los profesores que no tienen asignado ningn deporte, ordenados por documento
(4 registros)
11- Muestre todos los deportes y la cantidad de inscriptos en cada uno de ellos, incluyendo
aquellos deportes para los cuales no hay inscriptos, ordenados por nombre de deporte (5
registros)
19- Vea qu sucedi con los registros de "deportes" cuyo "documentoprofesor" exista en
"profesores"
Fue seteado a null porque la restriccin "foreign key" sobre "documentoprofesor" de
"deportes" fue definida "on delete set null".
20- Elimine un socio que est inscripto
21- Vea qu sucedi con los registros de "inscriptos" cuyo "numerosocio" exista en "socios"
Fue eliminado porque la restriccin "foreign key" sobre "numerosocio" de "inscriptos" fue
definida "on delete cascade".
65 - Unin
Se usan cuando los datos que se quieren obtener pertenecen a distintas tablas y no se puede
acceder a ellos con una sola consulta.
Es necesario que las tablas referenciadas tengan tipos de datos similares, la misma cantidad
de campos y el mismo orden de campos en la lista de seleccin de cada consulta.
Hay tres operadores de conjuntos: union, intersect y minus. Veremos en primer lugar "union".
CONSULTA1
union
CONSULTA2;
Recuerde que las consultas DEBEN tener el mismo numero de valores retornados y los valores
deben ser del mismo tipo.
La academia necesita el nombre y domicilio de todos los alumnos, de todos los cursos para
enviarles una tarjeta de felicitacin para el da del alumno.
Para obtener los datos necesarios de ambas tablas en una sola consulta necesitamos realizar
una unin:
Los encabezados del resultado de una unin son los que se especifican en el primer "select".
El operador de conjunto "union" no retorna duplicados; es decir, si un registro de la primer
consulta es igual a otro registro de la segunda consulta, tal registro aparece una sola vez. Si
queremos que se incluyan TODOS los registros, an duplicados, debemos emplear "union all":
65 - Unin
Problema:
Una academia de enseanza de idiomas da clases de ingls y frances; almacena los datos de
los alumnos que estudian ingls en una tabla llamada "ingles" y los que estn inscriptos en
"francs" en una tabla denominada "frances".
La academia necesita el nombre y domicilio de todos los alumnos, de todos los cursos para
enviarles una tarjeta de invitacin para un festejo el da del alumno.
Empleamos el operador "union" para obtener dicha informacin de ambas tablas:
Note que existen dos alumnos (Daniel Duarte y Estela Esper) que cursan ambos idiomas, estn
presentes en la tabla "ingles" y "frances"; tales registros aparecen una sola vez en el resultado
de "union". Si queremos que los registros duplicados aparezcan, debemos emplear "all":
Podemos agregar una columna extra a la consulta con el encabezado "curso" en la que
aparezca el literal "ingls" o "francs" segn si la persona cursa uno u otro idioma:
Recuerde que los encabezados de los campos son los que se especifican en el primer "select".
Si queremos que el nombre tenga un encabezado "alumno" debemos especificar un alias en la
primer consulta. Si ordenamos por un campo que tiene un alias, debemos especificar el alias
no el nombre del campo. En la siguiente consulta realizamos una unin, colocamos un alias al
campo "nombre" y ordenamos el resultado por tal alias:
Primer problema:
Una clnica almacena los datos de los mdicos en una tabla llamada "medicos" y los datos de
los pacientes en otra denominada "pacientes".
4- La clnica necesita el nombre y domicilio de mdicos y pacientes para enviarles una tarjeta
de invitacin a la inauguracin de un nuevo establecimiento. Emplee el operador "union" para
obtener dicha informacin de ambas tablas (7 registros)
Note que existen dos mdicos que tambin estn presentes en la tabla "pacientes"; tales
registros aparecen una sola vez en el resultado de "union".
5- Realice la misma consulta anterior pero esta vez, incluya los registros duplicados. Emplee
"union all" (9 registros)
6- Realice la misma consulta anterior y esta vez ordene el resultado por nombre (9 registros)
7- Agregue una columna extra a la consulta con el encabezado "condicion" en la que aparezca
el literal "mdico" o "paciente" segn si la persona es uno u otro (9 registros)
Segundo problema:
4- El supermercado quiere enviar una tarjeta de salutacin a todos los proveedores, clientes y
empleados y necesita el nombre y domicilio de todos ellos. Emplee el operador "union" para
obtener dicha informacin de las tres tablas. Ordene la informacin por nombre. La consulta
a la tabla "empleados" debe incluir el nombre y el apellido (10 registros)
5- Realice la misma operacin de unin anterior, pero ahora incluya los registros duplicados y
ordnelos por nombre (12 registros)
Note que "Luis Luque" es proveedor y cliente y que "Juan Garcia" es cliente y empleado; por lo
tanto ambos aparecen 2 veces.
6- Realice la misma consulta anterior y agregue una columna con un literal para indicar si es
un proveedor, un cliente o un empleado(12 registros)
66 - Interseccin
Continuamos aprendiendo las operaciones de conjuntos. Aprendimos "union" y "union all",
ahora veremos "intersect".
Como cualquier otra operacin de conjuntos, "intersect" se emplea cuando los datos que se
quieren obtener pertenecen a distintas tablas y no se puede acceder a ellos con una sola
consulta.
Del mismo modo, las tablas referenciadas DEBEN tener tipos de datos similares, la misma
cantidad de campos y el mismo orden de campos en la lista de seleccin de cada consulta que
intervenga en la interseccin.
Sintaxis:
SENTENCIASELECT1
intersect
SENTENCIASELECT2;
No olvide que las consultas DEBEN tener el mismo numero de valores retornados y los valores
deben ser del mismo tipo.
Una academia de enseanza de idiomas da clases de ingls, frances y portugues; almacena los
datos de los alumnos que estudian ingls en una tabla llamada "ingles", los que estn
inscriptos en "francs" 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 una tarjeta de descuento.
Para obtener los datos necesarios de las tres tablas en una sola consulta necesitamos realizar
una intreseccin:
66 - Interseccin
Problema:
Una academia de enseanza de idiomas da clases de ingls, frances y portugues; almacena los
datos de los alumnos que estudian ingls en una tabla llamada "ingles", los que estn
inscriptos en "francs" en una tabla denominada "frances" y los que cursan portugues en
latabla "portugues".
La academia necesita el nombre y domicilio de todos los alumnos que cursan los tres idiomas
para enviarles una tarjeta de descuento.
Obtenemos los datos necesarios de las tres tablas en una sola consulta realizando una
interseccin entre ellas:
Aparece solamente un registro, correspondiente a "Daniel Duarte", que est en las tres tablas.
Note que los alumnos que solamente asisten a una clase o solamente a dos, no aparecen en el
resultado.
Si queremos los registros que estn presentes en ms de dos tablas podemos realizar una
consulta combinando los operadores de interseccin y de unin:
En la consulta anterior, la primera interseccin (ingls con francs) retorna 2 registros (Esper
y Duarte); la segunda interseccin (ingls y portugues) retorna 2 registros (Caseros y Duarte);
unimos estos dos resultados con "union" y obtenemos 3 registros (Caseros, Duarte y Esper); la
tercera interseccin (francs y portugus) retorna 2 registros (Duarte y Gozalez) que al
"unirlos" al resultado de la primera unin (Caseros, Duarte y Esper) nos devuelve 4 registros.
Note que algunas consultas se encierran entre parntesis para especificar que la operacin se
realiza entre las tablas incluidas en ellos.
66 - Interseccin
Primer problema:
Una clnica almacena los datos de los mdicos en una tabla llamada "medicos" y los datos de
los pacientes en otra denominada "pacientes".
4- La clnica necesita el nombre y domicilio de mdicos y pacientes para enviarles una tarjeta
de invitacin a la inauguracin de un nuevo establecimiento. Emplee el operador "union" para
obtener dicha informacin de ambas tablas (7 registros)
Note que existen dos mdicos que tambin estn presentes en la tabla "pacientes"; tales
registros aparecen una sola vez en el resultado de "union".
5- La clnica necesita el nombre y domicilio de los pacientes que tambin son mdicos para
enviarles una tarjeta de descuento para ciertas prcticas. Emplee el operador "intersect" para
obtener dicha informacin de ambas tablas
Segundo problema:
4- El supermercado quiere enviar un bono de descuento a todos los empleados que son
clientes. Realice una combinacin de interseccin entre las tablas "clientes" y "empleados" (4
registros)
5- Se necesitan los nombres de aquellos proveedores que son clientes y tambin empleados
del supermercado (presentes en las tres tablas). Realice las operaciones necesarias (2
registros)
67 - Minus
Como cualquier otra operacin de conjuntos, "minus" se emplea cuando los datos que se
quieren obtener pertenecen a distintas tablas y no se puede acceder a ellos con una sola
consulta. Del mismo modo, las tablas referenciadas DEBEN tener tipos de datos similares, la
misma cantidad de campos y el mismo orden de campos en la lista de seleccin de cada
consulta que intervenga en la operacin de resta.
Sintaxis:
SENTENCIASELECT1
minus
SENTENCIASELECT2;
No olvide que las consultas DEBEN tener el mismo numero de valores retornados y los valores
deben ser del mismo tipo.
Una academia de enseanza de idiomas da clases de ingls y frances; almacena los datos de
los alumnos que estudian ingls en una tabla llamada "ingles" y los que estn inscriptos en
"francs" en una tabla denominada "frances".
La academia necesita el nombre y domicilio de todos los alumnos que cursan solamente ingls
(no presentes en la tabla "frances") para enviarles publicidad referente al curso de francs.
Empleamos el operador "minus" para obtener dicha informacin:
Obtenemos los registros de la primer consulta que NO coinciden con ningn registro de la
segunda consulta.
67 - Minus
Problema:
Una academia de enseanza de idiomas da clases de ingls y frances; almacena los datos de
los alumnos que estudian ingls en una tabla llamada "ingles" y los que estn inscriptos en
"francs" en una tabla denominada "frances".
La academia necesita el nombre y domicilio de todos los alumnos que cursan solamente ingls
(no presentes en la tabla "frances") para enviarles publicidad referida al curso de francs.
Empleamos el operador "minus" para obtener dicha informacin:
El resultado muestra los registros de la primer consulta que NO coinciden con ningn registro
de la segunda consulta.
Los registros presentes en ambas tablas (Daniel Duarte y Estela Esper), no aparecen en el
resultado final.
La academia necesita el nombre y domicilio de todos los alumnos que cursan solamente
francs (no presentes en la tabla "ingles") para enviarles publicidad referida al curso de
ingls. Empleamos el operador "minus" para obtener dicha informacin:
El resultado muestra los registros de la primer consulta que NO coinciden con ningn registro
de la segunda consulta. Los registros presentes en ambas tablas (Daniel Duarte y Estela
Esper), no aparecen en el resultado final.
Si queremos los alumnos que cursan un solo idioma (registros de "ingles" y de "frances" que no
coinciden), podemos unir ambas tablas y luego restarle la interseccin:
Podemos obtener el mismo resultado anterior con la siguiente consulta en la cual se buscan
los registros de "ingles" que no coinciden con "frances" y los registros de "frances" que no
coinciden con "ingles" y luego se unen ambos resultados:
Primer problema:
Una clnica almacena los datos de los mdicos en una tabla llamada "medicos" y los datos de
los pacientes en otra denominada "pacientes".
4- La clnica necesita el nombre y domicilio de mdicos y pacientes para enviarles una tarjeta
de invitacin a la inauguracin de un nuevo establecimiento. Emplee el operador "union" para
obtener dicha informacin de ambas tablas (7 registros)
5- Se necesitan los nombres de los mdicos que tambin son pacientes de la clnica. Realice
una interseccin entre las tablas.
6- La clnica necesita los nombres de los pacientes que no son mdicos. Realice una operacin
de resta.
7- Se necesitan los registros que no coinciden en ambas tablas. Realice la operacin
necesaria.
Segundo problema:
Un colegio guarda los datos de los alumnos que estn cursando primer ao en una tabla
denominada "primero", los datos de los alumnos que estn cursando segundo ao en una tabla
llamada "segundo" y en la tabla "inscriptos2" los datos de los alumnos inscriptos para segundo
ao para el siguiente ao.
4- El colegio quiere saber los nombres de los inscriptos a segundo del ao prximo que repiten
segundo (presentes en "segundo" y en "inscriptos2") (1 registro):
5- El colegio quiere saber los nombres de los alumnos que estn cursando primero y estn
inscriptos para segundo el prximo ao (presentes en "inscriptos2" y en "primero") (3 registros)
6- El colegio quiere saber los nombres y domicilios de los alumnos inscriptos para segundo que
no estn cursando este ao en este colegio (presentes en "inscriptos2" y ausentes en "primero"
y "segundo") para enviarles una nota con la fecha para una reunin informativa (3 registros)
7- El colegios quiere saber los nombres de los alumnos inscriptos para segundo el prximo
ao, que estn cursando primero o segundo este ao (presentes en "inscriptos2" y en "primero"
o "segundo). Realice las operaciones necesarias. (4 registros)
8- El colegio necesita los nombres de los alumnos que estn cursando primero y no estn
inscriptos el prximo ao en segundo para enviarles un mail preguntando la razn por la cual
no se han anotado an (2 registros)
"alter table" permite modificar la estructura de una tabla. Podemos utilizarla para agregar,
modificar y eliminar campos de una tabla.
Para agregar un nuevo campo a una tabla empleamos la siguiente sintaxis bsica:
describe libros;
Para agregar un campo "not null", la tabla debe estar vaca o debe especificarse un valor por
defecto. Esto es sencillo de entender, ya que si la tabla tiene registros, el nuevo campo se
llenara con valores nulos; si no los admite, debe tener un valor por defecto para llenar tal
campo en los registros existentes.
Problema:
Creamos la tabla:
Agregamos el campo "cantidad" a la tabla "libros", de tipo number(4), con el valor por defecto
cero y que NO acepta valores nulos:
describe libros;
Agregamos un nuevo campo "precio" a la tabla "libros", de tipo number(4) que acepta valores
nulos:
describe libros;
Intentamos agregar un nuevo campo "autor" de tipo varchar2(30) que no admita valores nulos:
Mensaje de error. Si el campo no aceptar valores nulos y no tiene definido un valor por
defecto, no se pueden llenar los registros existentes con ningn valor. Por ello, debemos
definirlo con un valor por defecto:
Primer problema:
4- Agregue un campo "seccion" de tipo caracter que no permita valores nulos y verifique que
el nuevo campo existe
describe empleados;
describe empleados;
describe empleados;
"alter table" permite modificar la estructura de una tabla. Hemos aprendido a agregar
campos, tambin podemos modificarlos.
describe libros;
Se pueden modificar todos los atributos o algunos; los que no se especifican, no cambian.
Algunas consideraciones para tener en cuenta al modificar los campos de una tabla:
a) si se cambia el tipo de dato de un campo, la tabla debe estar vaca. Por ejemplo, de
number a caracteres o viceversa.
b) no puede modificarse el tipo de dato de un campo "foreign key" o referenciado por una
"foreign key", a menos que el cambio no afecte la restriccin.
d) para modificar un campo disminuyendo la longitud (precisin o escala) del tipo de dato, la
tabla DEBE estar vaca, los registros DEBEN tener valores nulos en tal campo o los datos
existentes deben ser inferiores o iguales a la nueva longitud. Para alterar la longitud (escala o
precisin) aumentndola, no es necesario que la tabla est vaca.
e) se puede modificar un campo definido "null" a "not null", siempre que la tabla est vaca o
no contenga valores nulos.
g) si un campo tiene un valor por defecto y se modifica el tipo de dato de tal campo, Oracle
analiza que el valor por defecto pueda convertirse al nuevo tipo de dato cuando sea necesario
insertarlo; si el valor por defecto no se puede convertir al nuevo tipo de dato que se intenta
modificar, la modificacin del campo no se realiza. Por ejemplo, si un campo definido char(8)
tiene un valor por defecto '00000000' y se modifica tal campo a tipo number(8), Oracle
permite el cambio ya que al insertar el valor por defecto, lo convierte a nmero (0)
automticamente; si el valor por defecto no se puede convertir (por ejemplo 'a000000') a
valor numrico, la modificacin del campo no se realiza.
Problema:
Modificamos el campo precio para que tome valores de 6 dgitos incluyendo 2 decimales y
acepte valores nulos:
describe libros;
Ahora si podemos cambiar el tipo de dato de "precio", los registros existentes contienen "null"
en tal campo:
Verificamos el cambio:
describe libros;
describe editoriales;
Oracle permite modificar el campo "precio" a "char(8)". Si luego ingresamos un registro sin
valor para "precio", guardar el valor por defecto (0) convertido a cadena ('0'):
Redefinimos el valor por defecto del campo "precio" (que ahora es de tipo char) a "cero":
Mensaje de error.
Modificamos el valor por defecto para que luego pueda ser convertido:
Vaciamos la tabla:
Oracle permite modificar el campo "precio" a "char(8)". Si luego ingresamos un registro sin
valor para "precio", guardar el valor por defecto (0) convertido a cadena ('0'):
Primer problema:
5- Intente modificar el campo "nombre" de "empleados" para que permita cadenas variables
de 6 caracteres (menor longitud)
Oracle no lo permite, porque un valor en tal campo consta de 7 caracteres.
10- Intente modificar el campo "nombre" de "empleados" para que no admita valores nulos.
Mensaje de error, la tabla contiene valores nulos en tal campo.
11- Modifique el valor nulo por uno vlido del campo "nombre" de "empleados" y luego realice
la modificacin del punto anterior.
describe empleados;
describe empleados;
70 - Eliminar campos (alter table- drop)
Vimos que "alter table" permite modificar la estructura de una tabla, agregando, modificando
y eliminando campos.
No pueden eliminarse los campos a los cuales hace referencia una restriccin "foreign key".
Si eliminamos un campo que tiene una restriccin "primary key", "unique", "check" o "foreign
key", la restriccin tambin se elimina.
describe libros;
70 - Eliminar campos (alter table- drop)
Problema:
describe libros;
Recuerde que no pueden eliminarse los campos referenciados por una "foreign key".
Intentamos eliminar el campo "codigo" de "editoriales":
describe libros;
Ahora si podemos eliminar el campo "codigo" de "editoriales", pues la restriccin "foreign key"
que haca referencia a ella ya no existe:
select index_name,column_name,column_position
from user_ind_columns
where table_name='LIBROS';
Recuerde que si elimina un campo indizado, su ndice tambin se elimina. Eliminamos el
campo "autor" de "libros":
Veamos si existe el ndice compuesto creado anteriormente sobre los campos "titulo" y "autor"
de "libros":
select index_name,column_name,column_position
from user_ind_columns
where table_name='LIBROS';
Ya no existe.
La tabla ahora solamente consta de un campo, por lo tanto, no puede eliminarse, pues la
tabla no puede quedar vaca de campos:
Mensaje de error.
Primer problema:
8- Elimine el campo "sueldo" y verifique que la restriccin sobre tal campo se ha eliminado
describe empleados;
describe secciones;
Podemos agregar un campo a una tabla y en el mismo momento aplicarle una restriccin.
Para agregar un campo y establecer una restriccin, la sintaxis bsica es la siguiente:
Agregamos a la tabla "libros", el campo "codigo" de tipo number(4) not null y una restriccin
"primary key":
Agregamos a la tabla "libros", el campo "precio" de tipo number(6,2) y una restriccin "check":
Problema:
describe libros;
Agregamos el campo "codigo" de tipo number(4) not null y en la misma sentencia una
restriccin "primary key":
Agregamos el campo "precio" de tipo number(6,2) y una restriccin "check" que no permita
valores negativos para dicho campo:
describe libros;
select *from user_constraints where table_name='LIBROS';
Primer problema:
4- Agregue el campo "hijos" de tipo number(2) y en la misma sentencia una restriccin "check"
que no permita valores superiores a 30
7- Agregue el campo "sueldo" de tipo number(6,2) no nulo, con el valor por defecto 0 y una
restriccin "check" que no permita valores negativos para dicho campo
describe empleados;
select *from user_constraints where table_name='EMPLEADOS';
describe empleados;
Una subconsulta (subquery) es una sentencia "select" anidada en otra sentencia "select",
"insert", "update" o "delete" (o en otra subconsulta).
Las subconsultas se emplean cuando una consulta es muy compleja, entonces se la divide en
varios pasos lgicos y se obtiene el resultado con una nica instruccin y cuando la consulta
depende de los resultados de otra consulta.
Generalmente, una subconsulta se puede reemplazar por combinaciones y estas ltimas son
ms eficientes.
- un solo valor,
- en lugar de una expresin, siempre que devuelvan un solo valor o una lista de valores.
- que retornen un conjunto de registros de varios campos en lugar de una tabla o para
obtener el mismo resultado que una combinacin (join).
- las que retornan un solo valor escalar que se utiliza con un operador de comparacin o en
lugar de una expresin.
- las que retornan una lista de valores, se combinan con "in", o los operadores "any", "some" y
"all".
Una subconsulta puede reemplazar una expresin. Dicha subconsulta debe devolver un valor
escalar (o una lista de valores de un campo).
Las subconsultas que retornan un solo valor escalar se utiliza con un operador de comparacin
o en lugar de una expresin:
select CAMPOS
from TABLA
where CAMPO OPERADOR (SUBCONSULTA);
Si queremos saber el precio de un determinado libro y la diferencia con el precio del libro
ms costoso, anteriormente debamos averiguar en una consulta el precio del libro ms
costoso y luego, en otra consulta, calcular la diferencia con el valor del libro que solicitamos.
Podemos conseguirlo en una sola sentencia combinando dos consultas:
select titulo,precio,
precio-(select max(precio) from libros) as diferencia
from libros
where titulo='Uno';
Note que el campo del "where" de la consulta exterior es compatible con el valor retornado
por la expresin de la subconsulta.
Problema:
select titulo,precio,
precio-(select max(precio) from libros) as diferencia
from libros
where titulo='Uno';
Primer problema:
2- Crela con los campos necesarios. Agregue una restriccin "primary key" para el campo
"documento" y una "check" para validar que el campo "nota" se encuentre entre los valores 0 y
10:
4- Obtenga todos los datos de los alumnos con la nota ms alta, empleando subconsulta
5- Realice la misma consulta anterior pero intente que la consulta interna retorne, adems
del mximo valor de nota, el nombre del alumno.
Mensaje de error, porque la lista de seleccin de una subconsulta que va luego de un
operador de comparacin puede incluir slo un campo o expresin (excepto si se emplea
"exists" o "in").
6- Muestre los alumnos que tienen una nota menor al promedio, su nota, y la diferencia con el
promedio.
select alumnos.*
from alumnos
where nota=
(select max(nota) from alumnos);
select alumnos.*
from alumnos
where nota=
(select nombre, max(nota) from alumnos);
select alumnos.*,
(select avg(nota) from alumnos)-nota as diferencia
from alumnos
where nota<
(select avg(nota) from alumnos);
74 - Subconsultas con in
Vimos que una subconsulta puede reemplazar una expresin. Dicha subconsulta debe devolver
un valor escalar o una lista de valores de un campo; las subconsultas que retornan una lista
de valores reemplazan a una expresin en una clusula "where" que contiene la palabra clave
"in".
El resultado de una subconsulta con "in" (o "not in") es una lista. Luego que la subconsulta
retorna resultados, la consulta exterior los usa.
Este ejemplo muestra los nombres de las editoriales que ha publicado libros de un
determinado autor:
select nombre
from editoriales
where codigo in
(select codigoeditorial
from libros
where autor='Richard Bach');
La subconsulta (consulta interna) retorna una lista de valores de un solo campo
(codigoeditorial) que la consulta exterior luego emplea al recuperar los datos.
Se averigua si el cdigo devuelto por la consulta externa se encuentra dentro del conjunto de
valores retornados por la consulta interna.
Una combinacin (join) siempre puede ser expresada como una subconsulta; pero una
subconsulta no siempre puede reemplazarse por una combinacin que retorne el mismo
resultado. Si es posible, es aconsejable emplear combinaciones en lugar de subconsultas, son
ms eficientes.
Se recomienda probar las subconsultas antes de incluirlas en una consulta exterior, as puede
verificar que retorna lo necesario, porque a veces resulta difcil verlo en consultas anidadas.
Tambin podemos buscar valores No coincidentes con una lista de valores que retorna una
subconsulta; por ejemplo, las editoriales que no han publicado libros de un autor especfico:
select nombre
from editoriales
where codigo not in
(select codigoeditorial
from libros
where autor='Richard Bach');
74 - Subconsultas con in
Problema:
Queremos conocer el nombre de las editoriales que han publicado libros del autor "Richard
Bach":
select nombre
from editoriales
where codigo in
(select codigoeditorial
from libros
where autor='Richard Bach');
Probamos la subconsulta separada de la consulta exterior para verificar que retorna una lista
de valores de un solo campo:
select codigoeditorial
from libros
where autor='Richard Bach';
Tambin podemos buscar las editoriales que no han publicado libros de "Richard Bach":
select nombre
from editoriales
where codigo not in
(select codigoeditorial
from libros
where autor='Richard Bach');
74 - Subconsultas con in
Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tambin tiene una
tabla "ciudades" donde registra los nombres de las ciudades.
4- Necesitamos conocer los nombres de las ciudades de aquellos clientes cuyo domicilio es en
calle "San Martin", empleando subconsulta.
6- Obtenga los nombre de las ciudades de los clientes cuyo apellido no comienza con una
letra especfica (letra "G"), empleando subconsulta.
7- Pruebe la subconsulta del punto 6 separada de la consulta exterior para verificar que
retorna una lista de valores de un solo campo.
select nombre
from ciudades
where codigo in
(select codigociudad
from clientes
where domicilio like 'San Martin %');
select nombre
from ciudades
where codigo not in
(select codigociudad
from clientes
where nombre like 'G%');
select codigociudad
from clientes
where nombre like 'G%';
"any" y "some" son sinnimos. Chequean si alguna fila de la lista resultado de una subconsulta
se encuentra el valor especificado en la condicin.
Compara un valor escalar con los valores de un campo y devuelven "true" si la comparacin
con cada valor de la lista de la subconsulta es verdadera, sino "false".
...VALORESCALAR OPERADORDECOMPARACION
any (SUBCONSULTA);
Queremos saber los ttulos de los libros de "Borges" que pertenecen a editoriales que han
publicado tambin libros de "Richard Bach", es decir, si los libros de "Borges" coinciden con
ALGUNA de las editoriales que public libros de "Richard Bach":
select titulo
from libros
where autor='Borges' and
codigoeditorial = any
(select e.codigo
from editoriales e
join libros l
on codigoeditorial=e.codigo
where l.autor='Richard Bach');
La consulta interna (subconsulta) retorna una lista de valores de un solo campo (puede
ejecutar la subconsulta como una consulta para probarla), luego, la consulta externa compara
cada valor de "codigoeditorial" con cada valor de la lista devolviendo los ttulos de "Borges"
que coinciden.
"all" tambin compara un valor escalar con una serie de valores. Chequea si TODOS los valores
de la lista de la consulta externa se encuentran en la lista de valores devuelta por la consulta
interna.
Sintaxis:
Queremos saber si TODAS las editoriales que publicaron libros de "Borges" coinciden con
TODAS las editoriales que publicaron libros de "Richard Bach":
select titulo
from libros
where autor='Borges' and
codigoeditorial = all
(select e.codigo
from editoriales e
join libros l
on codigoeditorial=e.codigo
where l.autor='Richard Bach');
La consulta interna (subconsulta) retorna una lista de valores de un solo campo (puede
ejecutar la subconsulta como una consulta para probarla), luego, la consulta externa compara
cada valor de "codigoeditorial" con cada valor de la lista, si TODOS coinciden, devuelve los
ttulos.
Queremos saber si ALGUN precio de los libros de "Borges" es mayor a ALGUN precio de los
libros de "Richard Bach":
select titulo,precio
from libros
where autor='Borges' and
precio > any
(select precio
from libros
where autor='Bach');
El precio de cada libro de "Borges" es comparado con cada valor de la lista de valores
retornada por la subconsulta; si ALGUNO cumple la condicin, es decir, es mayor a ALGUN
precio de "Richard Bach", se lista.
select titulo,precio
from libros
where autor='borges' and
precio > all
(select precio
from libros
where autor='bach');
El precio de cada libro de "Borges" es comparado con cada valor de la lista de valores
retornada por la subconsulta; si cumple la condicin, es decir, si es mayor a TODOS los
precios de "Richard Bach" (o al mayor), se lista.
Problema:
Mostramos los ttulos de los libros de "Borges" de editoriales que han publicado tambin libros
de "Richard Bach":
select titulo
from libros
where autor like '%Borges%' and
codigoeditorial = any
(select e.codigo
from editoriales e
join libros l
on codigoeditorial=e.codigo
where l.autor like '%Bach%');
select titulo
from libros
where autor like '%Borges%' and
codigoeditorial = all
(select e.codigo
from editoriales e
join libros l
on codigoeditorial=e.codigo
where l.autor like '%Bach%');
Mostramos los ttulos y precios de los libros "Borges" cuyo precio supera a ALGUN precio de los
libros de "Richard Bach":
select titulo,precio
from libros
where autor like '%Borges%' and
precio > any
(select precio
from libros
where autor like '%Bach%');
select titulo,precio
from libros
where autor like '%Borges%' and
precio > all
(select precio
from libros
where autor like '%Bach%');
Primer problema:
Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada
"inscriptos" en la cual almacena el nmero de "socio", el cdigo del deporte en el cual se
inscribe y la cantidad de cuotas pagas (desde 0 hasta 10 que es el total por todo el ao), y
una tabla denominada "socios" en la que guarda los datos personales de cada socio.
4- Muestre el nmero de socio, el nombre del socio y el deporte en que est inscripto con un
join de ambas tablas
5- Muestre los socios que se sern compaeros en tenis y tambin en natacin (empleando
subconsulta)
9- Muestre los deportes en los cuales el socio 2 pag ms cuotas que ALGUN deporte en los
que se inscribi el socio 1
select deporte from inscriptos i where numerosocio=2 and cuotas>any (select cuotas from
inscriptos where numerosocio=1);
10- Realice la misma consulta anterior pero empleando "some" en lugar de "any"
11- Muestre los deportes en los cuales el socio 2 pag ms cuotas que TODOS los deportes en
que se inscribi el socio 1
select numero,nombre,deporte
from socios s
join inscriptos i
on numerosocio=numero;
select nombre
from socios
join inscriptos i
on numero=numerosocio
where deporte='natacion' and
numero= any
(select numerosocio
from inscriptos i
where deporte='tenis');
select deporte
from inscriptos i
where numerosocio=1 and
deporte= any
(select deporte
from inscriptos i
where numerosocio=2);
select deporte
from inscriptos i
where numerosocio=1 and
deporte in
(select deporte
from inscriptos i
where numerosocio=2);
select i1.deporte
from inscriptos i1
join inscriptos i2
on i1.deporte=i2.deporte
where i1.numerosocio=1 and
i2.numerosocio=2;
select deporte
from inscriptos i
where numerosocio=2 and
cuotas>any
(select cuotas
from inscriptos
where numerosocio=1);
select deporte
from inscriptos i
where numerosocio=2 and
cuotas>some
(select cuotas
from inscriptos
where numerosocio=1);
select deporte
from inscriptos i
where numerosocio=2 and
cuotas>all
(select cuotas
from inscriptos
where numerosocio=1);
76 - Subconsultas correlacionadas
Un almacn almacena la informacin de sus ventas en una tabla llamada "facturas" en la cual
guarda el nmero de factura, la fecha y el nombre del cliente y una tabla denominada
"detalles" en la cual se almacenan los distintos items correspondientes a cada factura: el
nombre del artculo, el precio (unitario) y la cantidad.
Se necesita una lista de todas las facturas que incluya el nmero, la fecha, el cliente, la
cantidad de artculos comprados y el total:
select f.*,
(select count(d.numeroitem)
from Detalles d
where f.numero=d.numerofactura) as cantidad,
(select sum(d.preciounitario*cantidad)
from Detalles d
where f.numero=d.numerofactura) as total
from facturas f;
El segundo "select" retorna una lista de valores de una sola columna con la cantidad de items
por factura (el nmero de factura lo toma del "select" exterior); el tercer "select" retorna una
lista de valores de una sola columna con el total por factura (el nmero de factura lo toma
del "select" exterior); el primer "select" (externo) devuelve todos los datos de cada factura.
76 - Subconsultas correlacionadas
Problema:
Un almacn almacena la informacin de sus ventas en una tabla llamada "facturas" en la cual
guarda el nmero de factura, la fecha y el nombre del cliente y una tabla denominada
"detalles" en la cual se almacenan los distintos items correspondientes a cada factura: el
nombre del artculo, el precio (unitario) y la cantidad.
Se necesita una lista de todas las facturas que incluya el nmero, la fecha, el cliente, la
cantidad de artculos comprados y el total en dinero:
select f.*,
(select count(d.numeroitem)
from detalles d
where f.numero=d.numerofactura) as cantidad,
(select sum(d.precio*cantidad)
from detalles d
where f.numero=d.numerofactura) as total
from facturas f;
76 - Subconsultas correlacionadas
Primer problema:
Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada
"inscriptos" en la cual almacena el nmero de "socio", el cdigo del deporte en el cual se
inscribe y la cantidad de cuotas pagas (desde 0 hasta 10 que es el total por todo el ao), y
una tabla denominada "socios" en la que guarda los datos personales de cada socio.
4- Se necesita un listado de todos los socios que incluya nombre y domicilio, la cantidad de
deportes a los cuales se ha inscripto, empleando subconsulta.
5- Se necesita el nombre de todos los socios, el total de cuotas que debe pagar (10 por cada
deporte) y el total de cuotas pagas, empleando subconsulta.
select nombre,domicilio,
(select count(*)
from inscriptos i
where s.numero=i.numerosocio) as deportes
from socios s;
select nombre,
(select (count(*)*10)
from inscriptos i
where s.numero=i.numerosocio) as total,
(select sum(i.cuotas)
from inscriptos i
where s.numero=i.numerosocio) as pagas
from socios s;
select nombre,
count(i.deporte)*10 as total,
sum(i.cuotas) as pagas
from socios s
join inscriptos i
on numero=numerosocio
group by nombre;
77 - Exists y No Exists
Los operadores "exists" y "not exists" se emplean para determinar si hay o no datos en una
lista de valores.
Cuando se coloca en una subconsulta el operador "exists", Oracle analiza si hay datos que
coinciden con la subconsulta, no se devuelve ningn registro, es como un test de existencia;
Oracle termina la recuperacin de registros cuando por lo menos un registro cumple la
condicin "where" de la subconsulta.
En este ejemplo se usa una subconsulta correlacionada con un operador "exists" en la clusula
"where" para devolver una lista de clientes que compraron el artculo "lapiz":
select cliente,numero
from facturas f
where exists
(select *from Detalles d
where f.numero=d.numerofactura
and d.articulo='lapiz');
Podemos buscar los clientes que no han adquirido el artculo "lapiz" empleando "if not exists":
select cliente,numero
from facturas f
where not exists
(select *from Detalles d
where f.numero=d.numerofactura
and d.articulo='lapiz');
77 - Exists y No Exists
Primer problema:
Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada
"inscriptos" en la cual almacena el nmero de "socio", el cdigo del deporte en el cual se
inscribe y la cantidad de cuotas pagas (desde 0 hasta 10 que es el total por todo el ao), y
una tabla denominada "socios" en la que guarda los datos personales de cada socio.
4- Emplee una subconsulta con el operador "exists" para devolver la lista de socios que se
inscribieron en un determinado deporte.
5- Busque los socios que NO se han inscripto en un deporte determinado empleando "not
exists".
6- Muestre todos los datos de los socios que han pagado todas las cuotas.
7- Obtenga el mismo resultado de la consulta anterior pero esta vez emplee una combinacin.
select nombre
from socios s
where exists
(select *from inscriptos i
where s.numero=i.numerosocio
and i.deporte='natacion');
select nombre
from socios s
where not exists
(select *from inscriptos i
where s.numero=i.numerosocio
and i.deporte='natacion');
select s.*
from socios s
where exists
(select *from inscriptos i
where s.numero=i.numerosocio
and i.cuotas=10);
Algunas sentencias en las cuales la consulta interna y la externa emplean la misma tabla
pueden reemplazarse por una autocombinacin.
Por ejemplo, queremos una lista de los libros que han sido publicados por distintas
editoriales.
Otro ejemplo: Buscamos todos los libros que tienen el mismo precio que "El aleph" empleando
subconsulta:
select titulo
from libros
where titulo<>'El aleph' and
precio =
(select precio
from libros
where titulo='El aleph');
La subconsulta retorna un solo valor. Podemos obtener la misma salida empleando "join".
Buscamos los libros cuyo precio supere el precio promedio de los libros por editorial:
select l1.titulo,l1.editorial,l1.precio
from libros l1
where l1.precio >
(select avg(l2.precio)
from libros l2
where l1.editorial= l2.editorial);
Por cada valor de l1, se evala la subconsulta, si el precio es mayor que el promedio.
Se puede conseguir el mismo resultado empleando un "join" con "having".
Problema:
Obtenemos la lista de los libros que han sido publicados por distintas editoriales empleando
una consulta correlacionada:
Buscamos todos los libros que tienen el mismo precio que "El aleph" empleando subconsulta:
select titulo
from libros
where titulo<>'El aleph' and
precio =
(select precio
from libros
where titulo='El aleph');
select l1.titulo
from libros l1
join libros l2
on l1.precio=l2.precio
where l2.titulo='El aleph' and
l1.titulo<>l2.titulo;
Buscamos los libros cuyo precio supera el precio promedio de los libros por editorial:
select l1.titulo,l1.editorial,l1.precio
from libros l1
where l1.precio >
(select avg(l2.precio)
from libros l2
where l1.editorial= l2.editorial);
select l1.titulo,l1.editorial,l1.precio
from libros l1
join libros l2
on l1.editorial=l2.editorial
group by l1.editorial, l1.titulo, l1.precio
having l1.precio > avg(l2.precio);
78 - Subconsulta simil autocombinacion
Primer problema:
Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada
"deportes" en la cual almacena el nombre del deporte, el nombre del profesor que lo dicta, el
da de la semana que se dicta y el costo de la cuota mensual.
1- Elimine la tabla:
2- Cree la tabla:
6- Buscamos todos los deportes que se dictan el mismo da que un determinado deporte
(natacion) empleando subconsulta (1 registro)
select nombre
from deportes
where nombre<>'natacion' and
dia =
(select dia
from deportes
where nombre='natacion');
select d1.nombre
from deportes d1
join deportes d2
on d1.dia=d2.dia
where d2.nombre='natacion' and
d1.nombre<>d2.nombre;
Dijimos que podemos emplear subconsultas en sentencias "insert", "update", "delete", adems
de "select".
Eliminamos todos los libros de las editoriales que tiene publicados libros de "Juan Perez":
La subconsulta es una combinacin que retorna una lista de valores que la consulta externa
emplea al seleccionar los registros para la eliminacin.
Problema:
Eliminamos todos los libros de las editoriales que tiene publicados libros de "Juan Perez":
Primer problema:
Un supermercado almacena los datos de sus empleados en una tabla denominada "empleados"
y en una tabla llamada "sucursales" los cdigos y ciudades de las diferentes sucursales.
5- Realice un join para mostrar el documento, nombre, sueldo, ciudad y provincia de todos
los empleados
10- El supermercado cerrar todas las sucursales de la provincia de "Cordoba". Elimine los
empleados que pertenezcan a sucursales de tal provincia empleando subconsulta.
Segundo problema:
Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada
"inscriptos" en la cual almacena el nmero de "socio", el cdigo del deporte en el cual se
inscribe y si la matricula est o no paga, y una tabla denominada "socios" en la que guarda los
datos personales de cada socio.
4- Realice una combinacin mostrando todos los datos de "socios", el deporte y la matrcula
de todos los socios (se encuentren o no en "inscriptos")
6- Elimine todas las inscripciones de los socios que deben alguna matrcula empleando
subconsulta
select numero,documento,nombre,domicilio,deporte,matricula
from socios s
full join inscriptos i
on numerosocio=numero;
80 - Subconsulta e insert
Aprendimos que una subconsulta puede estar dentro de un "select", "update" y "delete";
tambin puede estar dentro de un "insert".
Entonces, se puede insertar registros en una tabla con la salida devuelta por una consulta a
otra tabla; para ello escribimos la consulta y le anteponemos "insert into" junto al nombre de
la tabla en la cual ingresaremos los registros y los campos que se cargarn (si se ingresan
todos los campos no es necesario listarlos).
Se pueden insertar valores en una tabla con el resultado de una consulta que incluya
cualquier tipo de "join".
80 - Subconsulta e insert
Problema:
Un profesor almacena las notas de sus alumnos en una tabla llamada "alumnos" (documento,
nombre, nota). Tiene otra tabla llamada "aprobados" (documento,nota) en la que guarda los
alumnos que han aprobado el ciclo.
Note que no se listan los campos en los cuales se cargan los datos porque tienen el mismo
nombre que los de la tabla de la cual extraemos la informacin.
Primer problema:
2-Crelas:
Podemos crear una tabla e insertar datos en ella en una sola sentencia consultando otra tabla
(o varias) con esta sintaxis:
Es decir, se crea una nueva tabla y se inserta en ella el resultado de una consulta a otra
tabla.
Tenemos la tabla "libros" de una librera y queremos crear una tabla llamada "editoriales" que
contenga los nombres de las editoriales.
Podemos crear la tabla "editoriales" con el campo "nombre" consultando la tabla "libros" y en
el mismo momento insertar la informacin:
La tabla "editoriales" se ha creado con el campo "nombre" seleccionado del campo "editorial"
de "libros".
Los campos de la nueva tabla tienen el mismo nombre, tipo de dato y valores almacenados
que los campos listados de la tabla consultada; si se quiere dar otro nombre a los campos de
la nueva tabla se deben especificar alias.
Podemos emplear "group by", funciones de agrupamiento y "order by" en las consultas.
Tambin podemos crear una tabla que contenga datos de 2 o ms tablas empleando
combinaciones.
Tenemos la tabla "libros" de una librera y queremos crear una tabla llamada "editoriales" que
contenga los nombres de las editoriales.
Creamos una tabla llamada "editoriales" que contenga los nombres de las editoriales
obteniendo tales nombres de la tabla "libros":
Necesitamos una nueva tabla llamada "librosporeditorial" que contenga la cantidad de libros
de cada editorial. Primero eliminamos la tabla:
Queremos una tabla llamada "ofertas20" que contenga los mismos campos que "libros" y
guarde los libros con un precio menor o igual a 20. Primero eliminamos la tabla "ofertas20":
La consulta anterior retorna los libros de la tabla "libros" cuyo precio es menor o igual a 20 y
los almacena en la nueva tabla ("ofertas20") ordenados en forma descendente por precio.
Note que no se listan los campos a extraer, se coloca un asterisco para indicar que se incluyen
todos los campos.
Agregamos una columna a la tabla "editoriales" que contiene la ciudad en la cual est la casa
central de cada editorial:
Queremos una nueva tabla llamada "librosdecordoba" que contenga los ttulos y autores de los
libros de editoriales de Cordoba. En primer lugar, la eliminamos:
Consultamos las 2 tablas y guardamos el resultado en la nueva tabla que estamos creando:
Primer problema:
Un supermercado almacena los datos de sus empleados en una tabla denominada "empleados"
y en una tabla llamada "sucursales" los cdigos y ciudades de las diferentes sucursales.
5- Realice un join para mostrar todos los datos de "empleados" incluyendo la ciudad de la
sucursal
6-Cree una tabla llamada "secciones" que contenga las secciones de la empresa (primero
elimnela)
8- Se necesita una nueva tabla llamada "sueldosxseccion" que contenga la suma de los sueldos
de los empleados por seccin (de todas las sucursales). Primero elimine la tabla
10- Se necesita una nueva tabla llamada "sucursalCordoba" que contenga los nombres y
seccin de los empleados de la ciudad de Crdoba. En primer lugar, eliminamos la tabla.
Luego, consulte las tablas "empleados" y "sucursales" y guarde el resultado en la nueva tabla
select documento,nombre,domicilio,seccion,sueldo,ciudad
from empleados
join sucursales
on codigosucursal=codigo;
Una vista es un objeto. Una vista es una alternativa para mostrar datos de varias tablas; es
como una tabla virtual que almacena una consulta. Los datos accesibles a travs de la vista
no estn almacenados en la base de datos, en la base de datos se guarda la definicin de la
vista y no el resultado de ella.
Entonces, una vista almacena una consulta como un objeto para utilizarse posteriormente.
Las tablas consultadas en una vista se llaman tablas base. En general, se puede dar un
nombre a cualquier consulta y almacenarla como una vista.
Una vista suele llamarse tambin tabla virtual porque los resultados que retorna y la manera
de referenciarlas es la misma que para una tabla.
<="" p="">
Podemos crear vistas con: un subconjunto de registros y campos de una tabla; una unin de
varias tablas; una combinacin de varias tablas; un subconjunto de otra vista, combinacin de
vistas y tablas.
Los nombres para vistas deben seguir las mismas reglas que cualquier identificador. Para
distinguir una tabla de una vista podemos fijar una convencin para darle nombres, por
ejemplo, colocar el sufijo ?vista? y luego el nombre de las tablas consultadas en ellas.
Los campos y expresiones de la consulta que define una vista DEBEN tener un nombre. Se
debe colocar nombre de campo cuando es un campo calculado o si hay 2 campos con el mismo
nombre. Note que en el ejemplo, al concatenar los campos "apellido" y "nombre" colocamos
un alias; si no lo hubisemos hecho aparecera un mensaje de error porque dicha expresin
DEBE tener un encabezado, Oracle no lo coloca por defecto.
Los nombres de los campos y expresiones de la consulta que define una vista DEBEN ser nicos
(no puede haber dos campos o encabezados con igual nombre). Note que en la vista definida
en el ejemplo, al campo "s.nombre" le colocamos un alias porque ya haba un encabezado (el
alias de la concatenacin) llamado "nombre" y no pueden repetirse, si sucediera, aparecera
un mensaje de error.
La diferencia es que se colocan entre parntesis los encabezados de las columnas que
aparecern en la vista. Si no los colocamos y empleamos la sintaxis vista anteriormente, se
emplean los nombres de los campos o alias (que en este caso habra que agregar) colocados
en el "select" que define la vista. Los nombres que se colocan entre parntesis deben ser
tantos como los campos o expresiones que se definen en la vista.
Al crear una vista, Oracle verifica que existan las tablas a las que se hacen referencia en ella;
no se puede crear una vista que referencie tablas inexistentes. No se puede crear una vista si
existe un objeto con ese nombre.
Se aconseja probar la sentencia "select" con la cual definiremos la vista antes de crearla para
asegurarnos que el resultado que retorna es el imaginado.
Una vista siempre est actualizada; si modificamos las tablas base (a las cuales referencia la
vista), la vista mostrar los cambios.
Problema:
Una empresa almacena la informacin de sus empleados en dos tablas llamadas "empleados" y
"secciones".
Vemos la informacin:
Hemos aprendido que los registros resultantes de una vista no se almacena en la base de
datos, sino la definicin de la vista, por lo tanto, al modificar las tablas referenciadas por la
vista, el resultado de la vista cambia.
Modificamos una fecha en la tabla "empleados" y luego consultamos la vista para verificar que
est actualizada:
update empleados set fechaingreso='10/09/2000' where
fechaingreso='10/09/1998';
Primer problema:
4- Cree una vista en la que aparezca el nombre del socio, el deporte, el da, el nombre del
profesor y el estado de la matrcula (deben incluirse los socios que no estn inscriptos en
ningn deporte, los cursos para los cuales no hay inscriptos y los profesores que no tienen
designado deporte tambin)
6- Realice una consulta a la vista donde muestre la cantidad de socios inscriptos en cada
deporte (agrupe por deporte y da) ordenados por cantidad
7- Muestre (consultando la vista) los cursos (deporte y da) para los cuales no hay inscriptos (3
registros)
8- Muestre los nombres de los socios que no se han inscripto en ningn curso (consultando la
vista) (1 registro)
9- Muestre (consultando la vista) los profesores que no tienen asignado ningn deporte an (1
registro)
10- Muestre (consultando la vista) el nombre de los socios que deben matrculas (1 registro)
11- Consulte la vista y muestre los nombres de los profesores y los das en que asisten al club
para dictar sus clases (9 registros)
13- Muestre todos los socios que son compaeros en tenis los lunes (2 registros)
14- Intente crear una vista denominada "vista_inscriptos" que muestre la cantidad de
inscriptos por curso, incluyendo el nmero del curso, el nombre del deporte y el da
15- Elimine la vista "vista_inscriptos" y crela para que muestre la cantidad de inscriptos por
curso, incluyendo el nmero del curso, el nombre del deporte y el da
select profesor from vista_club where deporte is null and profesor is not null;
select socio from vista_club where deporte is not null and matricula <> 's';
83 - Vistas (informacin)
Las vistas son objetos, as que para obtener informacin de ellos pueden consultarse los
siguientes catlogos.
"user_catalog" nos muestra todos los objetos del usuario actual, incluidas las vistas. En la
columna "table_type" aparece "view" si es una vista. Ejemplo:
"user_objects" nos muestra informacin sobre todos los objetos del usuario actual. En la
columna "OBJECT_TYPE" muestra "view" si es una vista, aparece la fecha de creacin y dems
informacin que no analizaremos por el momento.
Para ver todos los objetos del usuario actual que son vistas tipeamos:
"user_views" nos muestra informacin referente a todas las vistas del usuario actual, el
nombre de la vista, la longitud del texto, el texto que la define, etc.
Con la siguiente sentencia obtenemos informacin sobre todas las vistas cuyo nombre
comience con la cadena "VISTA":
Si se elimina una tabla a la que hace referencia una vista, la vista no se elimina, hay que
eliminarla explcitamente.
Problema:
Una empresa almacena la informacin de sus empleados en dos tablas llamadas "empleados" y
"secciones".
Eliminamos la vista:
Se puede insertar, actualizar o eliminar datos de una tabla a travs de una vista, teniendo en
cuenta lo siguiente, las modificaciones que se realizan a las vistas:
- pueden generar errores si afectan a campos a las que la vista no hace referencia. Por
ejemplo, si se ingresa un registro en una vista que consulta una tabla que tiene campos not
null que no estn incluidos en la vista.
Problema:
Una empresa almacena la informacin de sus empleados en dos tablas llamadas "empleados" y
"secciones".
Consultamos la vista:
No podemos ingresar un registro en la vista "vista_empleados" porque tal vista tiene campos
calculados ("nombre", que es una concatenacin de "apellido" y "nombre"), adems afecta a 2
tablas ("empleados" y "secciones") y hay campos no accesibles desde la vista que no admiten
valores nulos. Si ejecutamos el siguiente "insert", Oracle mostrar un mensaje de error:
Podemos ingresar un registro en la vista "vista_empleados2" porque tal vista afecta a una sola
tabla y los campos de ""empleados" no accesibles desde la vista admiten valores nulos:
Vemos la tabla "empleados" para comprobar que el nuevo registro insertado desde la vista
est presente en "empleados", los campos para los cuales no se ingresaron datos, almacenan
el valor "null":
Primer problema:
4- Realice un join para mostrar todos los datos de todas las tablas, sin repetirlos (7 registros)
6- Cree la vista "vista_cursos" que muestre el nmero, deporte y da de todos los cursos.
12- Elimine la vista "vista_inscriptos" y crela para que muestre el documento y nombre del
socio, el numero de curso, el deporte y da de los cursos en los cuales est inscripto
Con la clusula "with read only" (slo lectura) evitamos que se puedan realizar inserciones,
actualizaciones y eliminaciones mediante una vista.
Sintaxis:
Evitamos que Oracle acepte "insert", "update" o "delete" sobre la vista si colocamos "with read
only" luego de la subconsulta que define una vista.
Oracle responde con un mensaje de error ante cualquier "insert", "update" o "delete" realizado
sobre la vista.
Problema:
Una empresa almacena la informacin de sus empleados en una tabla llamada "empleados".
Eliminamos la tabla:
Creamos la vista "vista_empleados2", igual que "vista_empleados", pero ahora colocamos "with
read only" para impedir que puedan ejecutarse "insert", "update" y "delete" sobre esta vista:
No lo permite.
Oracle no lo permite porque la vista fue definida con "with read only".
Oracle no lo permite porque la vista fue definida con "with read only".
Primer problema:
Una empresa almacena la informacin de sus clientes en una tabla llamada "clientes".
1- Elimine la tabla:
2- Cree la tabla:
4- Cree o reemplace la vista "vista_clientes" para que recupere el nombre y ciudad de todos
los clientes
5- Cree o reemplace la vista "vista_clientes2" para que recupere el nombre y ciudad de todos
los clientes no permita modificaciones.
7- Intente ingresar el siguiente registro mediante la vista que permite slo lectura
Oracle no lo permite.
12- Elimine todos los clientes de "Buenos Aires" a travs de la vista "vista_clientes"
Para modificar una vista puede eliminarla y volver a crearla o emplear "create or replace".
Sintaxis:
Con "create or replace view" se modifica la definicin de una vista existente o se crea si no
existe.
Problema:
Una empresa almacena la informacin de sus empleados en dos tablas llamadas "empleados" y
"secciones".
Consultamos la vista:
Primer problema:
4- Cree o reemplace la vista "vista_inscriptos" que muestre el documento y nombre del socio,
el deporte, el da y la matrcula, de todas las inscripciones no pagas
5- Consulte la vista
Es posible obligar a todas las instrucciones de modificacin de datos que se ejecutan en una
vista a cumplir ciertos criterios.
Con la clusula "with check option", no se permiten modificaciones en aquellos campos que
afecten a los registros que retorna la vista. Es decir, no podemos modificar el campo "seccin"
porque al hacerlo, tal registro ya no aparecera en la vista; si podemos actualizar los dems
campos. Por ejemplo, si intentamos actualizar a "Sistemas" el campo "seccion" de un registro
mediante la vista, Oracle muestra un mensaje de error.
La misma restriccin surge al ejecutar un "insert" sobre la vista; solamente podemos ingregar
registros con el valor "Administracion" para "seccion"; si intentamos ingresar un registro con
un valor diferente de "Administracion" para el campo "seccion", Oracle mostrar un mensaje
de error.
Sintaxis bsica:
Problema:
Una empresa almacena la informacin de sus empleados en una tabla llamada "empleados".
Eliminamos la tabla:
Creamos la tabla:
Creamos o reemplazamos (si existe) la vista "vista_empleados", para que muestre el nombre,
apellido, sexo y seccin de todos los empleados de "Administracion" agregando la clusula
"with check option" para evitar que se modifique la seccin de tales empleados a travs de la
vista y que se ingresen empleados de otra seccin:
Consultamos la vista:
Oracle acepta la insercin porque ingresamos un valor para "seccion" que incluir el registro
en la vista.
Oracle no acepta la insercin porque ingresamos un valor para "seccion" que excluir el nuevo
registro de la vista.
Primer problema:
Una empresa almacena la informacin de sus clientes en una tabla llamada "clientes".
1- Elimine la tabla:
2- Cree la tabla:
5- Cree o reemplace la vista "vista_clientes2" para que recupere el nombre y ciudad de todos
los clientes que no sean de "Cordoba" empleando "with check option"
7- Intente modificar la ciudad del cliente "Pedro Perez" a "Cordoba" travs de la vista que est
restringida.
8- Realice la misma modificacin que intent en el punto anterior a travs de la vista que no
est restringida
9- Actualice la ciudad del cliente "Oscar Luque" a "Buenos Aires" mediante la vista restringida
Cuando creamos una vista, Oracle verifica que las tablas a las cuales se hace referencia en
ella existan. Si la vista que se intenta crear hace referencia a tablas inexistentes, Oracle
muestra un mensaje de error.
Podemos "forzar" a Oracle a crear una vista aunque no existan los objetos (tablas, vistas, etc.)
que referenciamos en la misma. Para ello debemos agregar "force" al crearla:
De esta manera, podemos crear una vista y despus las tablas involucradas; luego, al
consultar la vista, DEBEN existir las tablas.
Al crear la vista la opcin predeterminada es "no force". Se recomienda crear las tablas y
luego las vistas necesarias.
Otra cuestin a considerar es la siguiente: si crea una vista con "select *" y luego agrega
campos a la estructura de las tablas involucradas, los nuevos campos no aparecern en la
vista; esto es porque los campos se seleccionan al ejecutar "create view"; debe volver a crear
la vista (con "create view" o "create or replace view").
Problema:
Una empresa almacena la informacin de sus empleados en una tabla llamada "empleados".
Eliminamos la tabla:
Creamos la vista "vista_empleados" que muestre algunos campos de "empleados", pero la tabla
"empleados" no existe, por ello, debemos agregar, al crear la vista "force":
Creamos la tabla:
Consultamos la vista:
Creamos o reemplazamos (si existe) la vista "vista_empleados" que muestre todos los campos
de la tabla "empleados":
Consultamos la vista:
select *from vista_empleados;
Note que el nuevo campo agregado a "empleados" no aparece, a pesar que la vista indica que
muestre todos los campos de dicha tabla; esto sucede porque los campos se seleccionan al
ejecutar "create view", para que aparezcan debemos volver a crear la vista:
Consultemos la vista:
Primer problema:
Una empresa almacena la informacin de sus clientes en una tabla llamada "clientes".
1- Elimine la tabla:
3- Intente crear o reemplazar la vista "vista_clientes" para que muestre el nombre, domicilio
y ciudad de todos los clientes de "Cordoba" (sin emplear "force")
Mensaje de error porque la tabla referenciada no existe.
4- Cree o reemplace la vista "vista_clientes" para que recupere el nombre, apellido y ciudad
de todos los clientes de "Cordoba" empleando "force"
5- Cree la tabla:
7- Cree o reemplace la vista "vista_clientes" para que muestre todos los campos de la tabla
"clientes"
8- Consulte la vista
Una vista materializada se define como una vista comn, pero en lugar de almacenar la
definicin de la vista, almacena el resultado de la consulta, es decir, la materializa, como un
objeto persistente en la base de datos.
Sintaxis:
Existen varias clusulas que podemos agregar al crear una vista materializada, pero no las
estudiaremos.
Entonces, una vista materializada almacena su resultado fsicamente. Una vista materializada
(materialized view) es una instantnea (snapshot), son sinnimos.
Para obtener informacin acerca de las vistas materializadas podemos consultar el diccionario
"user_objects", en la columna "object_type" aparecer "materialized view" si es una vista
materializada. Ejemplo:
Tambin podemos consultar "user_mviews" para obtener informacin de todas las vistas
materializadas del usuario actual:
Ejemplo:
Problema:
Un profesor almacena los datos y notas de sus alumnos en dos tablas "alumnos" y notas".
Creamos o reemplazamos una vista normal que muestre el documento del alumnos y el
promedio de sus notas:
Creamos una vista materializada que muestre el documento del alumnos y el promedio de sus
notas:
El resultado es el mismo.
Los promedios de la vista actualizable han cambiado porque al ejecutar el primer "select" se
consultaron las tablas "notas" y "alumnos"; los promedios de la vista materializada no han
cambiado, porque almacenaron el resultado de la consulta, al ejecutar el segundo "select" no
se consultaron las tablas "alumnos" y "notas".
91 - Procedimientos almacenados
Ventajas:
- comparten la lgica de la aplicacin con las otras aplicaciones, con lo cual el acceso y las
modificaciones de los datos se hacen en un solo sitio.
- permiten realizar todas las operaciones que los usuarios necesitan evitando que tengan
acceso directo a las tablas.
- reducen el trfico de red; en vez de enviar muchas instrucciones, los usuarios realizan
operaciones enviando una nica instruccin, lo cual disminuye el nmero de solicitudes entre
el cliente y el servidor.
execute pa_libros_aumentar10;
Problema:
Una librera almacena los datos de sus libros en una tabla denominada "libros".
execute pa_libros_aumentar10;
execute pa_libros_aumentar10;
Primer problema:
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".
exec pa_aumentarsueldo;
exec pa_aumentarsueldo;
execute pa_empleados_antiguos;
Los procedimientos almacenados pueden recibir y devolver informacin; para ello se emplean
parmetros.
Los parmetros se definen luego del nombre del procedimiento. Pueden declararse varios
parmetros por procedimiento, se separan por comas.
Cuando el procedimiento es ejecutado, deben explicitarse valores para cada uno de los
parmetros (en el orden que fueron definidos), a menos que se haya definido un valor por
defecto, en tal caso, pueden omitirse.
Creamos un procedimiento que recibe el nombre de una editorial como parmetro y luego lo
utiliza para aumentar los precios de tal editorial:
execute pa_libros_aumentar10('Planeta');
Creamos otro procedimiento que recibe 2 parmetros, el nombre de una editorial y el valor
de incremento (que tiene por defecto el valor 10):
execute pa_libros_aumentar('Planeta',30);
execute pa_libros_aumentar('Planeta');
En caso que un procedimiento tenga definidos varios parmetros con valores por defecto y al
invocarlo colocamos uno solo, Oracle asume que es el primero de ellos. si son de tipos de
datos diferentes, Oracle los convierte. Por ejemplo, definimos un procedimiento almacenado
de la siguiente manera:
create or replace procedure pa_libros_insertar
(atitulo in varchar2 default null, aautor in varchar2 default
'desconocido',
aeditorial in varchar2 default 'sin especificar', aprecio in number
default 0)
as
begin
insert into libros values (atitulo,aautor,aeditorial,aprecio);
end;
execute pa_libros_insertar('Uno',100);
Oracle asume que los argumentos son el primero y segundo, el registro que se almacenar
ser:
Uno,100,sin especificar,0;
Problema:
Creamos un procedimiento que recibe el nombre de una editorial y luego aumenta en un 10%
los precios de los libros de tal editorial:
create or replace procedure pa_libros_aumentar10(aeditorial in
varchar2)
as
begin
update libros set precio=precio+(precio*0.1)
where editorial=aeditorial;
end;
Ejecutamos el procedimiento:
execute pa_libros_aumentar10('Planeta');
Verificamos que los precios de los libros de la editorial "Planeta" han aumentado un 10%:
Creamos otro procedimiento que recibe 2 parmetros, el nombre de una editorial y el valor
de incremento (que tiene por defecto el valor 10):
execute pa_libros_aumentar('Planeta',30);
Consultamos la tabla "libros" para verificar que los precios de los libros de la editorial
"Planeta" han sido aumentados en un 30%:
execute pa_libros_aumentar('Paidos');
Consultamos la tabla "libros" para verificar que los precios de los libros de la editorial "Paidos"
han sido aumentados en un 10% (valor por defecto):
execute pa_libros_insertar;
execute pa_libros_insertar('Uno',100);
Oracle asume que los argumentos son el primero y segundo, vea cmo se almacen el nuevo
registro:
Primer problema:
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".
5- Verifique que los sueldos de los empleados con ms de 10 aos en la empresa han
aumentado un 20%
6- Ejecute el procedimiento creado anteriormente enviando otros valores como parmetros
(por ejemplo, 8 y 10)
7- Verifique que los sueldos de los empleados con ms de 8 aos en la empresa han
aumentado un 10%
12- Ejecute el procedimiento creado anteriormente envindole valores para los 2 parmetros
y verifique si se ha ingresado en "empleados" un nuevo registro
execute pa_empleados_aumentarsueldo(10,20);
execute pa_empleados_aumentarsueldo(8,10);
execute pa_empleados_aumentarsueldo;
execute pa_empleados_ingresar('32222222','10/10/2007');
select *from empleados;
execute pa_empleado_eliminar('30000000');
Las variables se definen antes del bloque de sentencias; pueden declararse varias.
Los procedimientos almacenados son objetos, as que para obtener informacin de ellos
pueden consultarse los siguientes diccionarios:
- "user_objects": nos muestra todos los objetos de la base de datos seleccionada, incluidos los
procedimientos. En la columna "object_type" aparece "procedure" si es un procedimiento
almacenado.
97 - Funciones
Oracle ofrece varios tipos de funciones para realizar distintas operaciones. Hemos empleado
varias de ellas.
Se pueden emplear las funciones del sistema en cualquier lugar en el que se permita una
expresin en una sentencia "select".
Las funciones, como los procedimientos almacenados son bloques de cdigo que permiten
agrupar y organizar sentencias SQL que se ejecutan al invocar la funcin.
Las funciones tienen una estructura similar a la de los procedimientos. Como los
procedimientos, las funciones tienen una cabecera, una seccin de declaracin de variables y
el bloque "begin...end" que encierra las acciones. Una funcin, adems contiene la clusula
"return".
Para crear una funcin empleamos la instruccin "create function" o "create or replace
function". Si empleamos "or replace", se sobreescribe (se reemplaza) una funcin existente; si
se omite y existe una funcin con el nombre que le asignamos, Oracle mostrar un mensaje
de error indicando tal situacin.
Podemos emplear las funciones en cualquier lugar en el que se permita una expresin en una
sentencia "select", por ejemplo:
El resultado nos mostrar el ttulo de cada libro, el precio y el precio incrementado en un 20%
devuelto por la funcin.
Podemos realizar otros "select" llamando a la funcin con otro valor como segundo
argumento, por ejemplo:
El resultado mostrar el ttulo de cada libro, el precio y el resultado devuelto por la funcin
(si el precio es menor o mayor a $20, la cadena "economico" o "costoso" respectivamente).
Entonces, una funcin es un bloque de cdigo que implementa acciones y que es referenciado
por un nombre. Puede recibir argumentos. La diferencia con los procedimientos es que
retornan un valor siempre.
Para asignar un valor a una variable, dentro de una funcin DEBE usarse ":=" (dos puntos e
igual).
Podemos emplear una funcin sin incluir campos de una tabla. Por ejemplo:
Por ejemplo:
La siguiente funcin recibe dos valores numricos como parmetros y retorna el promedio:
Problema:
Una librera almacena la informacin de sus libros en una tabla llamada "libros".
Eliminamos la tabla:
Creamos o reemplazamos una funcin que reciba 1 parmetro (un valor numrico a
incrementar) y retorne el valor ingresado como argumento con el incremento del 10%:
Realizamos un "select" sobre "libros" que muestre el ttulo, precio y llamamos a la funcin
creada anteriormente para que nos devuelva el precio incrementado en un 10%:
Creamos otra funcin que reciba 2 parmetros, un valor a incrementar y el incremento, y que
nos retorne el valor ingresado como primer argumento con el incremento especificado por el
segundo argumento:
Realizamos un "select" sobre "libros" que muestre el ttulo, precio y el precio incrementado en
un 20% (llamando a la funcin creada anteriormente, enviando como primer argumento el
campo "precio" y como segundo argumento el valor "20"):
Realizamos otro "select" similar al anterior, pero en esta ocasin le enviamos a la funcin otro
valor como segundo argumento:
Creamos o reemplazamos una funcin que recibe un parmetro de tipo numrico y retorna
una cadena de caracteres. Se define una variable en la zona de definicin de variables
denominada "valorretornado" de tipo varchar. En el cuerpo de la funcin empleamos una
estructura condicional (if) para averiguar si el valor enviado como argumento es menor o igual
a 20, si lo es, almacenamos en la variable "valorretornado" la cadena "economico", en caso
contrario guardamos en tal variable la cadena "costoso"; al finalizar la estructura condicional
retornamos la variable "valorretornado":
Realizamos un "select" para mostrar el ttulo, precio y una cadena que indique si el libro es
econmico o costoso (llamando a la funcin creada anteriormente):
Podemos emplear la funcin "f_costoso" sin incluir campos de una tabla. Por ejemplo:
Existen palabras especiales que pertenecen al lenguaje de control de flujo que controlan la
ejecucin de las sentencias, los bloques de sentencias y procedimientos almacenados. Tales
palabras son: "begin... end", "if... else", "while", "break" y "continue", "return" y "waitfor".
"if... else" testea una condicin; se emplea cuando un bloque de sentencias debe ser
ejecutado si una condicin se cumple y si no se cumple, se debe ejecutar otro bloque de
sentencias diferente.
Sintaxis:
if (CONDICION) then
SENTENCIAS-- si la condicin se cumple
else
SENTENCIAS-- si la condicin resulta falsa
end if;
98 - Control de flujo (if)
Problema:
Un profesor almacena las notas de sus alumnos en una tabla denominada "notas".
Eliminamos la tabla:
Creamos o reemplazamos la funcin "f_condicion" que recibe una nota y retorna una cadena
de caracteres indicando si aprueba o no:
Realizamos un "select" sobre "notas" mostrando el nombre y nota del alumno y en una
columna su condicin (empleando la funcin creada anteriormente):
En el siguiente ejemplo omitimos la clusula "else" porque slo indicaremos acciones en caso
que el "if" sea verdadero:
Primer problema:
Un negocio almacena los datos de sus productos en una tabla denominada "productos". Dicha
tabla contiene el cdigo de producto, el precio, el stock mnimo que se necesita (cantidad
mnima requerida antes de comprar ms) y el stock actual (cantidad disponible en depsito).
Si el stock actual es cero, es urgente reponer tal producto; menor al stock mnimo requerido,
es necesario reponer tal producto; si el stock actual es igual o supera el stock minimo, est
en estado normal.
4- Cree una funcin que reciba dos valores numricos correspondientes a ambos stosks. Debe
comparar ambos stocks y retornar una cadena de caracteres indicando el estado de cada
producto, si stock actual es:
- cero: "faltante",
- menor al stock mnimo: "reponer",
- igual o superior al stock mnimo: "normal".
6- Realice la misma funcin que en el punto 4, pero esta vez empleando en la estructura
condicional la sintaxis "if... elsif...end if"
8- Realice una funcin similar a las anteriores, pero esta vez, si el estado es "reponer" o
"faltante", debe especificar la cantidad necesaria (valor necesario para llegar al stock
mnimo)
Segundo problema:
Una clnica almacena la informacin de sus pacientes en una tabla denominada "pacientes".
3- Realice una funcin que reciba la edad del paciente y retorne la cadena "menor" o "mayor"
segn sea menor a 18 aos o no
4- Realice una funcin que reciba el caracter correspondiente al sexo del paciente y retorne
la cadena "femenino" o "masculino"
5- Realice un "select" mostrando el nombre del paciente y empleando las funciones de los
puntos 3 y 4, dos columnas que indiquen si es mayor o menor de edad y el sexo.
Vimos que hay dos estructuras condicionales, aprendimos "if", nos detendremos ahora en
"case".
Aprendimos que el "if" se empleaba cuando tenamos 2 cursos de accin, es decir, se evala
una condicin y se ejecutan diferentes bloques de sentencias segn el resultado de la
condicin sea verdadero o falso.
La estructura "case" es similar a "if", slo que se pueden establecer varias condiciones a
cumplir. Con el "if" solamente podemos o