Вы находитесь на странице: 1из 59

1 - Instalacin de Oracle.

Para este curso utilizaremos la versin Oracle 10g XE (Express Edition para Window s) Para descargar el mismo debemos ingresar al sitio de Oracle: Oracle 10g XE Para permitir descargarlo del sitio seleccionamos con el mouse el control Radio "Accept License Agreement". Luego seleccionamos la versin "Oracle Database 10g Express Edition (Universal)" ( OracleXEUniv.exe (216,933,372 bytes)) El sitio de Oracle requiere que nos registremos. Debemos seleccionar "sign up no w" y luego "Create your Oracle account now", es decir crear una cuenta Oracle. Luego de habernos registrado podemos descargar el motor de base de datos Oracle. El paso siguiente es instalar el gestor de base de datos propiamente dicho. Ejec utamos el archivo que acabamos de descargar: OracleXEUniv.exe Debemos ir presionando el botn "siguiente" en el asistente de instalacin, salvo cu ando nos pide ingresar la contrasea de la base de datos, es importante no olvidar dicha clave. Luego de algunos minutos ya tenemos instalado el gestor de bases de datos Oracle en nuestro equipo. La segunda aplicacin que instalaremos ser el "Oracle SQL Developer". Es un entorno visual que nos permite comunicar con nuestro gestor de base de datos Oracle. De sde este entorno aprenderemos a administrar una base de datos Oracle. Debemos ingresar a la siguiente pgina para descargar el Oracle SQL Developer Aceptamos la licencia y seleccionamos "Oracle SQL Developer for Windows (JDK1.5. 0_06 is bundled in this zip) Luego de descargar el archivo procedemos a descomprimir el archivo zip en una ca rpeta (este programa no requiere instalacin) En la carpeta donde descomprimimos debemos ejecutar el archivo sqldeveloper.exe 2 - Crear tablas (create table - describe - all_tables - drop table) Existen varios objetos de base de datos: tablas, constraints (restricciones), vi stas, secuencias, ndices, agrupamientos (clusters), disparadores (triggers), inst antaneas (snapshots), procedimientos, funciones, paquetes, sinnimos, usuarios, pe rfiles, privilegios, roles, etc. Los primeros objetos que veremos son tablas. Una base de datos almacena su informacin en tablas, que es la unidad bsica de alma cenamiento. Una tabla es una estructura de datos que organiza los datos en columnas y filas; cada columna es un campo (o atributo) y cada fila, un registro. La interseccin d e una columna con una fila, contiene un dato especfico, un solo valor. Cada registro contiene un dato por cada columna de la tabla. Cada campo (columna ) debe tener un nombre. El nombre del campo hace referencia a la informacin que a lmacenar. Cada campo (columna) tambin debe definir el tipo de dato que almacenar. Las tablas forman parte de una base de datos. Nosotros trabajaremos con la base de datos ya creada. Para ver las tablas existentes tipeamos: select *from all_tables; 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 sintaxis bsica y general para crear una tabla es la siguiente: create table NOMBRETABLA( NOMBRECAMPO1 TIPODEDATO, ... NOMBRECAMPON TIPODEDATO ); La tabla debe ser definida con un nombre que la identifique y con el cual accede remos a ella. Creamos una tabla llamada "usuarios" y entre parntesis definimos los campos y sus tipos: create table usuarios( nombre varchar2(30), clave varchar2(10) ); Cada campo con su tipo debe separarse con comas de los siguientes, excepto el lti mo. Cuando se crea una tabla debemos indicar su nombre y definir al menos un campo c on su tipo de dato. En esta tabla "usuarios" definimos 2 campos: - nombre: que contendr una cadena de caracteres de 30 caracteres de longitud, que almacenar el nombre de usuario y - clave: otra cadena de caracteres de 10 de longitud, que guardar la clave de cad a usuario. Cada usuario ocupar un registro de esta tabla, con su respectivo nombre y clave. Para nombres de tablas, se puede utilizar cualquier caracter permitido para nomb res 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 ot ro 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; Aparece la siguiente informacin: Name Null Type ------------------------------NOMBRE VARCHAR2(30) CLAVE VARCHAR2(10) 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 elimin ar: drop table NOMBRETABLA; En el siguiente ejemplo eliminamos la tabla "usuarios": drop table usuarios;

Si intentamos eliminar una tabla que no existe, aparece un mensaje de error indi cando tal situacin y la sentencia no se ejecuta. Problema: Para probar todos los ejercicios resueltos y propuestos debemos ingresar al sqld eveloper.exe y luego en el entorno crear una nueva conexin: Elegimos File -> New y seleccionamos "New Connection" y presionamos el botn "Acep tar". Ingresamos los campos Connection Name (por ejemplo ingresamos "prueba"), en el c ampo Username ingresamos el usuario SYSTEM y por ltimo en el campo Password ingre samos la clave que creamos al instalar Oracle. Luego en la ventana que aparece el mansaje "Enter SQL Statement" debemos tipear los comandos SQL y mediante el primer botn "triangulo verde" ejecutaremos el coma ndo SQL donde se encuentra el cursos (tambin podemos ejecutar todos los comando S QL mediante el segundo botn. Veamos las tablas existentes: select *from all_tables; Aparece una tabla que nos muestra todas las tablas; la columna "TABLE_NAME" cont iene el nombre de cada tabla. 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 nomb re. drop table usuarios; Si la tabla no existe aparecer un mensaje indicando tal situacin. Ahora si creamos una tabla llamada "usuarios" con dos campos: - nombre: cadena de caracteres que no supere los 30 caracteres y - clave: cadena que no supere los 10 caracteres: create table USUARIOS( nombre varchar2(30), clave varchar2(10) ); 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. Podemos verificar que se ha creado: select *from all_tables; La tabla "usuarios" Debe aparecer en la lista. Veamos la estructura de la tabla "usuarios": describe usuarios; Aparece la siguiente informacin: Name Null Type ------------------------------NOMBRE VARCHAR2(30) CLAVE VARCHAR2(10) Nos informa que la tabla "usuarios" tiene 2 campos, el campo "nombre" de tipo "v archar2" 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 ade lante.

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: create table usuarios ( nombre varchar(30), clave varchar(10) ); Eliminemos la tabla: drop table usuarios; Verifiquemos si se ha eliminado: select *from all_tables; no debe aparecer la tabla "usuarios". 3 - Ingresar registros (insert into- select)

Un registro es una fila de la tabla que contiene los datos propiamente dichos. C ada registro tiene un dato por cada columna (campo). Nuestra tabla "usuarios" co nsta de 2 campos, "nombre" y "clave". Al ingresar los datos de cada registro debe tenerse en cuenta la cantidad y el o rden de los campos. La sintaxis bsica y general es la siguiente: insert into NOMBRETABLA (NOMBRECAMPO1, ..., NOMBRECAMPOn) values (VALORCAMPO1, ..., VALORCAMPOn); 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" coloc amos los valores para cada campo, tambin entre parntesis y separados por comas. En el siguiente ejemplo se agrega un registro a la tabla "usuarios", en el campo "nombre" se almacenar "Mariano" y en el campo "clave" se guardar "payaso": insert into usuarios (nombre, clave) values ('Mariano','payaso'); Luego de cada insercin aparece un mensaje indicando la cantidad de registros ingr esados. Note que los datos ingresados, como corresponden a cadenas de caracteres se colo can entre comillas simples. Para ver los registros de una tabla usamos "select": select *from usuarios; El comando "select" recupera los registros de una tabla. Con el asterisco indica mos que muestre todos los campos de la tabla "usuarios". Aparece la tabla, sus campos y registros ingresados; si no tiene registros, apar eceran solamente los campos y la tabla vaca). Es importante ingresar los valores en el mismo orden en que se nombran los campo s: En el siguiente ejemplo se lista primero el campo "clave" y luego el campo "n ombre" por eso, los valores tambin se colocan en ese orden: insert into usuarios (clave, nombre) values ('River','Juan');

Si ingresamos los datos en un orden distinto al orden en que se nombraron los ca mpos, 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 nombr an los campos, el valor de la clave (la cadena "Boca") se guardar en el campo "no mbre" y el valor del nombre (la cadena "Luis") en el campo "clave": insert into usuarios (nombre,clave) values ('Boca','Luis'); Problema: Eliminamos la tabla "libros": drop table libros; Vamos a crear una tabla llamada "libros" para almacenar informacin de los libros de una librera. Necesitamos los siguientes campos: -titulo: cadena de caracteres de 20 de longitud, -autor: cadena de caracteres de 15 de longitud, -editorial: caracteres de 10 de longitud, -precio: valor numrico con 2 decimales y que no superar el valor 9999.99 y -cantidad: valor numrico entero que no superar el valor 999. Al crear la tabla, entonces, elegimos el tipo de dato ms adecuado para cada campo : create table libros( titulo varchar2(20), autor varchar2(15), editorial varchar2(10), precio number(6,2), cantidad number(3,0) ); Vemos la estructura de la tabla: describe libros; Aparece la siguiente informacin: Name Null Type -------------------------------------titulo varchar2(20) autor varchar2(15) editorial varchar2(10) precio number(6,2) cantidad number(3) Ingresamos algunos registros: insert into libros (titulo,autor,editorial,precio,cantidad) values ('El aleph','Borges','Emece',25.50,100); insert into libros (titulo,autor,editorial,precio,cantidad) values ('Matematica estas ahi','Paenza','Siglo XXI',18.8,200); Note que al ingresar valores numricos no se utilizan comillas y para el separador de decimales se usa el caracter punto (.). Veamos los registros cargados: select *from libros; Aparece la siguiente tabla: TITULO AUTOR EDITORIAL PRECIO CANTIDAD ---------------------------------------------------------------El Aleph Borges Emece 25,5 100

Matematica estas ahi Paenza Siglo XXI 18,8 200 Veamos lo que sucede si intentamos ingresar para el campo "titulo" una cadena de ms de 20 caracteres: insert into libros (titulo,autor,editorial,precio,cantidad) values ('Alicia en el pais de las maravillas','Lewis Carroll','Atlantida',10,2 00); aparece un mensaje de error y la sentencia no se ejecuta. vamos a cortar la cadena para que SQL Server acepte el ingreso del registro: insert into libros (titulo,autor,editorial,precio,cantidad) values ('Alicia en el pais','Lewis Carroll','Atlantida',10,200); Veamos los registros cargados: select *from libros; La tabla tiene ahora 3 registros. Veamos qu sucede si intentamos ingresar para el campo "cantidad" un valor fuera d e rango: insert into libros (titulo,autor,editorial,precio,cantidad) values ('El gato con botas','Anonimo','Atlantida',10,2000); Oracle muestra un mensaje de error y la sentencia no se ejecuta, es decir, el re gistro no fue ingresado. Veamos qu sucede si intentamos ingresar en el campo "precio" un valor con ms decim ales que los permitidos: insert into libros (titulo,autor,editorial,precio,cantidad) values ('El gato con botas','Anonimo','Atlantida',10.123,200); La sentencia se ejecut, el registro ha sido cargado. Veamos cmo se almacen: select *from libros; Oracle omiti el ltimo dgito decimal porque el campo slo admita 2 decimales. 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: cara cteres, nmeros, etc. Estos son algunos tipos de datos bsicos de Oracle (posteriormente veremos otros y con ms detalle): - varchar2: se emplea para almacenar cadenas de caracteres. Una cadena es una se cuencia de caracteres. Se coloca entre comillas simples; ejemplo: 'Hola', 'Juan Perez', 'Colon 123'. Este tipo de dato definen una cadena de longitud variable e n la cual determinamos el mximo de caracteres entre parntesis. Puede guardar hasta xxx caracteres. Por ejemplo, para almacenar cadenas de hasta 30 caracteres, def inimos un campo de tipo varchar2 (30), es decir, entre parntesis, junto al nombre del campo colocamos la longitud. Si intentamos almacenar una cadena de caracteres de mayor longitud que la defini da, la cadena no se carga, aparece un mensaje indicando tal situacin y la sentenc ia no se ejecuta.

Por ejemplo, si definimos un campo de tipo varchar(10) e intentamos almacenar en l la cadena 'Buenas tardes', aparece un mensaje indicando que el valor es demasi ado grande para la columna. - number(p,s): se usa para guardar valores numricos con decimales, de 1.0 x10-120 a 9.9...(38 posiciones). Definimos campos de este tipo cuando queremos almacena r valores numricos con los cuales luego realizaremos operaciones matemticas, por e jemplo, cantidades, precios, etc. Puede contener nmeros enteros o decimales, positivos o negativos. El parmetro "p" indica la precisin, es decir, el nmero de dgitos en total (contando los decimales) que contendr el nmero como mximo. El parmetro "s" especifica la escala, es decir, el mximo de dgitos decimales. Por ejemplo, un campo definido "number(5,2)" puede con tener cualquier nmero entre 0.00 y 999.99 (positivo o negativo). Para especificar nmero enteros, podemos omitir el parmetro "s" o colocar el valor 0 como parmetro "s". Se utiliza como separador el punto (.). Si intentamos almacenar un valor mayor fuera del rango permitido al definirlo, t al 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 v alor 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 s e carga pero con la cantidad de decimales permitidos, los dgitos sobrantes se omi ten. Antes de crear una tabla debemos pensar en sus campos y optar por el tipo de dat o adecuado para cada uno de ellos. Por ejemplo, si en un campo almacenaremos nmeros telefnicos o un nmeros de document o, usamos "varchar2", no "number" porque si bien son dgitos, con ellos no realiza mos operaciones matemticas. Si en un campo guardaremos apellidos, y suponemos que ningn apellido superar los 20 caracteres, definimos el campo "varchar2(20)". Si e n un campo almacenaremos precios con dos decimales que no superarn los 999.99 pes os definimos un campo de tipo "number(5,2)", es decir, 5 dgitos en total, con 2 d ecimales. Si en un campo almacenaremos valores enteros de no ms de 3 dgitos, defin imos un campo de tipo "number(3,0)". 5 - Recuperar algunos campos (select) Hemos aprendido cmo ver todos los registros de una tabla, empleando la instruccin "select". La sintaxis bsica y general es la siguiente: select *from NOMBRETABLA; El asterisco (*) indica que se seleccionan todos los campos de la tabla. Podemos especificar el nombre de los campos que queremos ver, separndolos por com as: select titulo,autor from libros; La lista de campos luego del "select" selecciona los datos correspondientes a lo s campos nombrados. En el ejemplo anterior seleccionamos los campos "titulo" y " autor" de la tabla "libros", mostrando todos los registros. 6 - Recuperar algunos registros (where)

Hemos aprendido a seleccionar algunos campos de una tabla. Tambin es posible recuperar algunos registros. Existe una clusula, "where" con la cual podemos especificar condiciones para una

consulta "select". Es decir, podemos recuperar algunos registros, slo los que cum plan con ciertas condiciones indicadas con la clusula "where". Por ejemplo, quere mos ver el usuario cuyo nombre es "Marcelo", para ello utilizamos "where" y lueg o de ella, la condicin: select nombre, clave from usuarios where nombre='Marcelo'; La sintaxis bsica y general es la siguiente: select NOMBRECAMPO1, ..., NOMBRECAMPOn from NOMBRETABLA where CONDICION; Para las condiciones se utilizan operadores relacionales (tema que trataremos ms adelante en detalle). El signo igual(=) es un operador relacional. Para la sigui ente seleccin de registros especificamos una condicin que solicita los usuarios cu ya 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 r egistro. Entonces, con "where" establecemos condiciones para recuperar algunos registros. Para recuperar algunos campos de algunos registros combinamos en la consulta la lista de campos y la clusula "where": select nombre from usuarios where clave='River'; En la consulta anterior solicitamos el nombre de todos los usuarios cuya clave s ea igual a "River". 7 - Operadores relacionales

Los operadores son smbolos que permiten realizar operaciones matemticas, concatena r cadenas, hacer comparaciones. Oracle reconoce de 4 tipos de operadores: 1) relacionales (o de comparacin) 2) aritmticos 3) de concatenacin 4) lgicos Por ahora veremos solamente los primeros. Los operadores relacionales (o de comparacin) nos permiten comparar dos expresion es, que pueden ser variables, valores de campos, etc. Hemos aprendido a especificar condiciones de igualdad para seleccionar registros de una tabla; por ejemplo: select *from libros where autor='Borges'; Utilizamos el operador relacional de igualdad.

Los operadores relacionales vinculan un campo con un valor para que Oracle compa re cada registro (el campo especificado) con el valor dado. Los operadores relacionales son los siguientes: = igual <> distinto > mayor < menor >= mayor o igual <= menor o igual Podemos seleccionar los registros cuyo autor sea diferente de "Borges", para ell o usamos la condicin: select * from libros where autor<>'Borges'; Podemos comparar valores numricos. Por ejemplo, queremos mostrar los ttulos y prec ios de los libros cuyo precio sea mayor a 20 pesos: select titulo, precio from libros where precio>20; Queremos seleccionar los libros cuyo precio sea menor o igual a 30: select *from libros where precio<=30; Los operadores relacionales comparan valores del mismo tipo. Se emplean para com probar si un campo cumple con una condicin. No son los nicos, existen otros que veremos mas adelante. 8 - Borrar registros (delete) Para eliminar los registros de una tabla usamos el comando "delete". Sintaxis bsica: delete from NOMBRETABLA; Se coloca el comando delete seguido de la palabra clave "from" y el nombre de la tabla de la cual queremos eliminar los registros. En el siguiente ejemplo se el iminan los registros de la tabla "usuarios": delete from usuarios; Luego, un mensaje indica la cantidad de registros que se han eliminado. Si no queremos eliminar todos los registros, sino solamente algunos, debemos ind icar 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 bor rar. Por ejemplo, queremos eliminar aquel registro cuyo nombre de usuario es "Marcelo ": delete from usuarios where nombre='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 regist ro 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. 9 - Actualizar registros (update)

Decimos que actualizamos un registro cuando modificamos alguno de sus valores. Para modificar uno o varios datos de uno o varios registros utilizamos "update" (actualizar). Sintaxis bsica: update NOMBRETABLA set CAMPO=NUEVOVALOR; Utilizamos "update" junto al nombre de la tabla y "set" junto con el campo a mod ificar y su nuevo valor. El cambio afectar a todos los registros. 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". Por ejemplo, queremos cambiar el valor correspondiente a la clave de nuestro usu ario llamado "Federicolopez", queremos como nueva clave "Boca", necesitamos una condicin "where" que afecte solamente a este registro: update usuarios set clave='Boca' where nombre='Federicolopez'; Si Oracle no encuentra registros que cumplan con la condicin del "where", un mens aje indica que ningn registro fue modificado. Las condiciones no son obligatorias, pero si omitimos la clusula "where", la actu alizacin afectar a todos los registros. Tambin podemos actualizar varios campos en una sola instruccin: update usuarios set nombre='Marceloduarte', clave='Marce' where nombre='Marcelo'; Para ello colocamos "update", el nombre de la tabla, "set" junto al nombre del c ampo y el nuevo valor y separado por coma, el otro nombre del campo con su nuevo valor. 11 - Valores nulos (null)

"null' significa "dato desconocido" o "valor inexistente". A veces, puede desconocerse o no existir el dato correspondiente a algn campo de un registro. En estos casos decimos que el campo puede contener valores nulos. 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.

En contraposicin, tenemos campos que no pueden estar vacos jams. Veamos un ejemplo. Tenemos nuestra tabla "libros". El campo "titulo" no debera es tar vaco nunca, igualmente el campo "autor". Para ello, al crear la tabla, debemo s especificar que tales campos no admitan valores nulos: create table libros( titulo varchar2(30) not null, autor varchar2(20) not null, editorial varchar2(15) null, precio number(5,2) ); 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 nul os. Cuando colocamos "null" estamos diciendo que admite valores nulos (caso del camp o "editorial"); por defecto, es decir, si no lo aclaramos, los campos permiten v alores nulos (caso del campo "precio"). Cualquier campo, de cualquier tipo de dato permite ser definido para aceptar o n o valores nulos. Un valor "null" NO es lo mismo que un valor 0 (cero) o una cade na 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: insert into libros (titulo,autor,editorial,precio) values('El aleph','Borges','Emece',null); Note que el valor "null" no es una cadena de caracteres, NO se coloca entre comi llas. Entonces, si un campo acepta valores nulos, podemos ingresar "null" cuando no co nocemos el valor. Tambin podemos colocar "null" en el campo "editorial" si desconocemos el nombre d e la editorial a la cual pertenece el libro que vamos a ingresar: insert into libros (titulo,autor,editorial,precio) values('Alicia en el pais','Lewis Carroll',null,25); Una cadena vaca es interpretada por Oracle como valor nulo; por lo tanto, si ingr esamos una cadena vaca, se almacena el valor "null". Si intentamos ingresar el valor "null" (o una cadena vaca) en campos que no admit en valores nulos (como "titulo" o "autor"), Oracle no lo permite, muestra un men saje y la insercin no se realiza; por ejemplo: insert into libros (titulo,autor,editorial,precio) values(null,'Borges','Siglo XXI',25); Cuando vemos la estructura de una tabla con "describe", en la columna "Null", ap arece "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 pode mos utilizar los operadores relacionales vistos anteriormente: = (igual) y <> (d istinto); debemos utilizar los operadores "is null" (es igual a null) y "is not null" (no es null).

Los valores nulos no se muestran, aparece el campo vaco. Entonces, para que un campo no permita valores nulos debemos especificarlo luego de definir el campo, agregando "not null". Por defecto, los campos permiten val ores nulos, pero podemos especificarlo igualmente agregando "null". 12 - Operadores relacionales (is null)

Para recuperar los registros que contengan el valor "null" en algn campo, no pode mos utilizar los operadores relacionales vistos anteriormente: = (igual) y <> (d istinto); 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": select *from libros where editorial is null; Recuerde que los valores nulos no se muestran, aparece el campo vaco. Las siguientes sentencias tendrn una salida diferente: select *from libros where editorial is null; select *from libros where editorial=' '; Con la primera sentencia veremos los libros cuya editorial almacena el valor "nu ll" (desconocido); con la segunda, los libros cuya editorial guarda una cadena d e 3 espacios en blanco. Para obtener los registros que no contienen "null", se puede emplear "is not nul l", esto mostrar los registros con valores conocidos. Para ver los libros que NO tienen valor "null" en el campo "precio" tipeamos: select *from libros where precio is not null; 13 - Clave primaria (primary key)

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 docume nto 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 com o clave primaria, es un valor que no se repite; puede haber usuarios con igual c lave, 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. N o existe una nica manera de hacerlo, por ahora veremos la sintaxis ms sencilla. Tenemos nuestra tabla "usuarios" definida con 2 campos ("nombre" y "clave").

La sintaxis bsica y general es la siguiente: create table NOMBRETABLA( CAMPO TIPO, ..., CAMPO TIPO, PRIMARY KEY (CAMPO) ); Lo que hacemos agregar, luego de la definicin de cada campo, "primary key" y entr e parntesis, el nombre del campo que ser clave primaria. En el siguiente ejemplo definimos una clave primaria, para nuestra tabla "usuari os" para asegurarnos que cada usuario tendr un nombre diferente y nico: create table usuarios( nombre varchar2(20), clave varchar2(10), primary key(nombre) ); 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 re pitan ni sean nulos. Por ello, al definir un campo como clave primaria, automtica mente Oracle lo convierte a "not null". Luego de haber establecido un campo como clave primaria, al ingresar los registr os, Oracle controla que los valores para el campo establecido como clave primari a 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 us uario 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 est uviese, aparece un mensaje indicando que se viola la clave primaria y la actuali zacin no se realiza. Podemos ver el campo establecido como clave primaria de una tabla realizando la siguiente consulta: select uc.table_name, column_name from user_cons_columns ucc join user_constraints uc on ucc.constraint_name=uc.constraint_name where uc.constraint_type='P' and uc.table_name='USUARIOS'; No explicaremos la consulta anterior por el momento, slo la ejecutaremos; si la c onsulta retorna una tabla vaca, significa que la tabla especificada no tiene clav e primaria. El nombre de la tabla DEBE ir en maysculas, sino Oracle no la encontr ar. 14 - Vaciar la tabla (truncate table)

Aprendimos que para borrar todos los registro de una tabla se usa "delete" sin c ondicin "where". Tambin podemos eliminar todos los registros de una tabla con "truncate table". Si ntaxis: truncate table NOMBRETABLA; Por ejemplo, queremos vaciar la tabla "libros", usamos:

truncate table libros; La sentencia "truncate table" vaca la tabla (elimina todos los registros) y conse rva la estructura de la tabla. La diferencia con "drop table" es que esta sentencia elimina la tabla, no solame nte los registros, "truncate table" la vaca de registros. La diferencia con "delete" es la siguiente, al emplear "delete", Oracle guarda u na copia de los registros borrados y son recuperables, con "truncate table" no e s 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). 15 - Tipos de datos alfanumricos

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. Para almacenar valores alfanumricos (texto) usamos cadenas de caracteres. Las cadenas se colocan entre comillas simples. Podemos almacenar letras, smbolos y dgitos con los que no se realizan operaciones matemticas, por ejemplo, cdigos de identificacin, nmeros de documentos, nmeros telefni cos. 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 c haracter, 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 "c har(10)" y almacenamos el valor "hola" (4 caracteres), Oracle rellenar las 6 posi ciones restantes con espacios, es decir, ocupar las 10 posiciones; por lo tanto, si la longitud es invariable, es conveniente utilizar el tipo char; caso contrar io, el tipo varchar2. Si almacenamos "hola" en un campo definido "char(10)" Oracle almacenar "hola ". 2) varchar2(x): almacena cadenas de caracteres de longitud variable determinada por el argumento "x" (obligatorio). Que sea una cadena de longitud variable sign ifica que, si definimos un campo como "varchar2(10)" y almacenamos el valor "hol a" (4 caracteres), Oracle solamente ocupa las 4 posiciones (4 bytes y no 10 como en el caso de "char"); por lo tanto, si la longitud es variable, es conveniente utilizar este tipo de dato y no "char", as ocupamos menos espacio de almacenamie nto en disco. Su rango es de 1 a 4000 caracteres. 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. 4) nvarchar2(x): es similar a "varchar2", excepto que permite almacenar caracter es Unicode; su rango va de 1 a 2000 caracteres porque se emplean 2 bytes por cad a caracter. 5 y 6) varchar(x) y char2(x): disponibles en Oracle8. 7) long: guarda caracteres de longitud variable; puede contener hasta 2000000000 caracteres (2 Gb). No admite argumento para especificar su longitud. En Oracle8

y siguientes versiones conviene emplear "clob" y "nlob" para almacenar grandes cantidades de datos alfanumricos. En general se usarn los 2 primeros. Si intentamos almacenar en un campo alfanumrico una cadena de caracteres de mayor longitud que la definida, aparece un mensaje indicando que el valor es demasiad o grande y la sentencia no se ejecuta. Por ejemplo, si definimos un campo de tipo varchar2(10) y le asignamos la cadena 'Aprenda PHP' (11 caracteres), aparece un mensaje y la sentencia no se ejecuta. Si ingresamos un valor numrico (omitiendo las comillas), lo convierte a cadena y lo ingresa como tal. 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 supe ra la longitud definida, aparece un mensaje de error y la sentencia no se ejecut a. Es importante elegir el tipo de dato adecuado segn el caso. 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 r egistros tendrn un cdigo de 5 caracteres, ni ms ni menos. Para almacenar valores superiores a 4000 caracteres se debe emplear "long". 16 - Tipos de datos numricos

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 sepa rador de decimales. Para almacenar valores NUMERICOS Oracle dispone de dos tipos de datos: 1) number(t,d): para almacenar valores enteros o decimales, positivos o negativo s. Su rango va de 1.0 x 10-130 hasta 9.999...(38 nueves). Definimos campos de es te tipo cuando queremos almacenar valores numricos con los cuales luego realizare mos operaciones matemticas, por ejemplo, cantidades, precios, etc. El parmetro "t" indica el nmero total de dgitos (contando los decimales) que conten dr el nmero como mximo (es la precisin). Su rango va de 1 a 38. El parmetro "d" indic a el mximo de dgitos decimales (escala). La escala puede ir de -84 a 127. Para def inir 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 99 9.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, t al 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 par a 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 o miten. 2) float (x): almacena un nmero en punto decimal. El parmetro indica la precisin bi naria 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 cerca no; por ejemplo, si definimos "float(4,2)" e ingresamos el valor "12.686", guard ar "12.69", redondeando hacia arriba; si ingresamos el valor "12.682", guardar "12 .67", redondeando hacia abajo. - si intentamos ingresar un valor fuera de rango, no lo acepta. - 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 d entro del rango, si es as, la ingresa, sino, muestra un mensaje de error y no eje cuta la sentencia. Si la cadena contiene caracteres que Oracle no puede converti r 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 va lor 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 mu estra un mensaje de error. 17 - Ingresar algunos campos Hemos aprendido a ingresar registros listando todos los campos y colocando valor es 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: insert into libros values ('Uno','Richard Bach','Planeta'); Tambin es posible ingresar valores para algunos campos. Ingresamos valores solame nte para los campos "titulo" y "autor": insert into libros (titulo, autor) values ('El aleph','Borges'); Oracle almacenar el valor "null" en el campo "editorial", para el cual no hemos e xplicitado un valor. Al ingresar registros debemos tener en cuenta: - la lista de campos debe coincidir en cantidad y tipo de valores con la lista d

e valores luego de "values". Si se listan ms (o menos) campos que los valores ing resados, 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 ejecut a. 18 - Valores por defecto (default)

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 d enomina valor por defecto o predeterminado. Un valor por defecto se inserta cuando no est presente al ingresar un registro. Para campos de cualquier tipo no declarados "not null", es decir, que admiten va lores 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": create table libros( titulo varchar2(40) not null, autor varchar2(30) default 'Desconocido' not null, editorial varchar2(20), precio number(5,2), cantidad number(3) default 0 ); Si al ingresar un nuevo registro omitimos los valores para el campo "autor" y "c antidad", Oracle insertar los valores por defecto; en "autor" colocar "Desconocido " y en cantidad "0". Entonces, si al definir el campo explicitamos un valor mediante la clusula "defau lt", se ser el valor por defecto. 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 p or defecto (si lo tiene), en la columna "nullable" aparece "N" si el campo no es t 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: insert into libros (titulo,autor,editorial,precio,cantidad) values ('El gato con botas',default,default,default,100);

Entonces, la clusula "default" permite especificar el valor por defecto de un cam po. Si no se explicita, el valor por defecto es "null", siempre que el campo no haya sido declarado "not null". Los campos para los cuales no se ingresan valores en un "insert" tomarn los valor es por defecto: - si permite valores nulos y no tiene clusula "default", almacenar "null"; - si tiene clusula "default" (admita o no valores nulos), el valor definido como predeterminado; - si est declarado explcitamente "not null" y no tiene valor "default", no hay val or 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 ca mpos 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 s entido 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 er ror indicando que se intenta duplicar la clave. 19 - Operadores aritmticos y de concatenacin (columnas calculadas)

Aprendimos que los operadores son smbolos que permiten realizar distintos tipos d e 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). Los operadores aritmticos permiten realizar clculos con valores numricos. Son: multiplicacin (*), divisin (/), suma (+) y resta (-). Es posible obtener salidas en las cuales una columna sea el resultado de un clcul o y no un campo de una tabla. Si queremos ver los ttulos, precio y cantidad de cada libro escribimos la siguien te sentencia: select titulo,precio,cantidad from libros; Si queremos saber el monto total en dinero de un ttulo podemos multiplicar el pre cio por la cantidad por cada ttulo, pero tambin podemos hacer que Oracle realice e l clculo y lo incluya en una columna extra en la salida: select titulo, precio,cantidad, precio*cantidad from libros; Si queremos saber el precio de cada libro con un 10% de descuento podemos inclui r en la sentencia los siguientes clculos: select titulo,precio, precio-(precio*0.1) from libros; Tambin podemos actualizar los datos empleando operadores aritmticos:

update libros set precio=precio-(precio*0.1); Para concatenar cadenas de caracteres existe el operador de concatenacin ||. Para concatenar el ttulo y el autor de cada libro usamos el operador de concatena cin ("||"): select titulo||'-'||autor from libros; Note que concatenamos adems un guin para separar los campos. Oracle puede convertir automticamente valores numricos a cadenas para una concaten acin; por ejemplo, en el siguiente ejemplo mostramos el ttulo y precio de cada lib ro concatenado con el operador "||": select titulo||' $'||precio from libros; 20 - Alias (encabezados de columnas) Una manera de hacer ms comprensible el resultado de una consulta consiste en camb iar 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 e n stock; queremos que al mostrar la informacin de dicha tabla aparezca como encab ezado 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 pala bra clave "as" seguido del texto del encabezado. Si el alias consta de una sola cadena las comillas no son necesarias, pero si co ntiene ms de una palabra, es necesario colocarla entre comillas dobles: select titulo, cantidad as "stock disponible", precio from libros; Tambin se puede crear un alias para columnas calculadas. Por ejemplo: select titulo,precio, precio*0.1 as descuento, precio-(precio*0.1) as "preciofinal" from libros; La palabra clave "as" es opcional, pero es conveniente usarla. Entonces, un "alias" se usa como nombre de un campo o de una expresin. En estos c asos, son opcionales, sirven para hacer ms comprensible el resultado. 21 - Funciones string

Las funciones de manejo de caracteres alfanumricos aceptan argumentos de tipo car acter y retornan caracteres o valores numricos. 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". Ej emplo: select chr(65) from dual;-- retorna 'A'. select chr(100) from dual;-- retorna 'd'. - concat(cadena1,cadena2): concatena dos cadenas de caracteres; es equivalente a l operador ||. Ejemplo: select concat('Buenas',' tardes') from dual;--retorna 'Buenas tardes'. - initcap(cadena): retorna la cadena enviada como argumento con la primera letra (letra capital) de cada palabra en mayscula. Ejemplo: select initcap('buenas tardes alumno') from dual;--retorna 'Buenas Tardes Alumn o'. - lower(cadena): retorna la cadena enviada como argumento en minsculas. "lower" s ignifica reducir en ingls. Ejemplo: select lower('Buenas tardes ALUMNO') from dual;--retorna "buenas tardes alumno" . - upper(cadena): retorna la cadena con todos los caracteres en maysculas. Ejemplo : select upper('www.oracle.com') from dual;-- 'WWW.ORACLE.COM' - lpad(cadena,longitud,cadenarelleno): retorna la cantidad de caracteres especif icados por el argumento "longitud", de la cadena enviada como primer argumento ( comenzando desde el primer caracter); si "longitud" es mayor que el tamao de la c adena enviada, rellena los espacios restantes con la cadena enviada como tercer argumento (en caso de omitir el tercer argumento rellena con espacios); el relle no comienza desde la izquierda. Ejemplos: select lpad('alumno',10,'xyz') from dual;-- retorna 'xyzxalumno' select lpad('alumno',4,'xyz') from dual;-- retorna 'alum' - rpad(cadena,longitud,cadenarelleno): retorna la cantidad de caracteres especif icados por el argumento "longitud", de la cadena enviada como primer argumento ( comenzando desde el primer caracter); si "longitud" es mayor que el tamao de la c adena enviada, rellena los espacios restantes con la cadena enviada como tercer argumento (en caso de omitir el tercer argumento rellena con espacios); el relle no comienza desde la derecha (ltimo caracter). Ejemplos: select rpad('alumno',10,'xyz') from dual;-- retorna 'alumnoxyzx' select rpad('alumno',4,'xyz') from dual;-- retorna 'alum' - ltrim(cadena1,cadena2): borra todas las ocurrencias de "cadena2" en "cadena1", si se encuentran al comienzo; si se omite el segundo argumento, se eliminan los espacios. Ejemplo: select ltrim('la casa de la cuadra','la') from dual;-- ' casa de la cuadra' select ltrim(' es la casa de la cuadra','la') from dual;-- no elimina ningn cara cter select ltrim(' la casa') from dual;-- 'la casa' - rtrim(cadena1,cadena2): borra todas las ocurrencias de "cadena2" en "cadena1", si se encuentran por la derecha (al final de la cadena); si se omite el segundo argumento, se borran los espacios. Ejemplo: select rtrim('la casa lila','la') from dual;-- 'la casa li' select rtrim('la casa lila ','la') from dual;-- no borra ningn caracter select rtrim('la casa lila ') from dual; --'la casa lila' - trim(cadena): retorna la cadena con los espacios de la izquierda y derecha eli minados. "Trim" significa recortar. Ejemplo:

select trim(' oracle ') from dual;--'oracle' - replace(cadena,subcade1,subcade2): retorna la cadena con todas las ocurrencias de la subcadena de reemplazo (subcade2) por la subcadena a reemplazar (subcae1) . Ejemplo: select replace('xxx.oracle.com','x','w') from dual; retorna "www.oracle.com'. - substr(cadena,inicio,longitud): devuelve una parte de la cadena especificada c omo primer argumento, empezando desde la posicin especificada por el segundo argu mento y de tantos caracteres de longitud como indica el tercer argumento. Ejempl o: select substr('www.oracle.com',1,10) from dual;-- 'www.oracle' select substr('www.oracle.com',5,6) from dual;-- 'oracle' - length(cadena): retorna la longitud de la cadena enviada como argumento. "leng ht" significa longitud en ingls. Ejemplo: select length('www.oracle.com') from dual;-- devuelve 14. - instr (cadena,subcadena): devuelve la posicin de comienzo (de la primera ocurre ncia) de la subcadena especificada en la cadena enviada como primer argumento. S i no la encuentra retorna 0. Ejemplos: select instr('Jorge Luis Borges','or') from dual;-- 2 select instr('Jorge Luis Borges','ar') from dual;-- 0, no se encuentra - translate(): reemplaza cada ocurrencia de una serie de caracteres con otra ser ie de acracteres. La diferencia con "replace" es que aquella trabaja con cadenas de caracteres y reemplaza una cadena completa por otra, en cambio "translate" t rabaja con caracteres simples y reemplaza varios. En el siguiente ejemplo se esp ecifica que se reemplacen todos los caracteres "O" por el caracter "0", todos lo s caracteres "S" por el caracter "5" y todos los caracteres "G" por "6": select translate('JORGE LUIS BORGES','OSG','056') from dual;--'J0R6E LUI5 B0R6E 5' Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo caracter. 22 - Funciones matemticas. Las funciones matemticas realizan operaciones con expresiones numricas y retornan un resultado, operan con tipos de datos numricos. Las funciones numricas aceptan parmetros de entrada de tipo numrico y retornan valo res numricos. Oracle tiene algunas funciones para trabajar con nmeros. Aqu presentamos algunas. - abs(x): retorna el valor absoluto del argumento "x". Ejemplo: select abs(-20) from dual;--retorna 20. La tabla dual es una tabla virtual que existe en todas las Bases de datos Oracle . - ceil(x): redondea a entero, hacia arriba, el argumento "x". Ejemplo: select ceil(12.34) from dual;--retorna 13. - floor(x): redondea a entero, hacia abajo, el argumento "x". Ejemplo: select floor(12.34) from dual; --12

- mod(x,y): devuelve el resto de la divisin x/y. Ejemplos: select mod(10,3) from dual;--retorna 1. select mod(10,2) from dual;--retorna 0. - power(x,y): retorna el valor de "x" elevado a la "y" potencia. Ejemplo: select power(2,3) from dual;--retorna 8. - round(n,d): retorna "n" redondeado a "d" decimales; si se omite el segundo arg umento, redondea todos los decimales. Si el segundo argumento es positivo, el nme ro de decimales es redondeado segn "d"; si es negativo, el nmero es redondeado des de la parte entera segn el valor de "d". Ejemplos: select round(123.456,2) from dual;-- retorna "123.46", es decir, redondea desde el segundo decimal. select round(123.456,1) from dual;-- 123.5, es decir, redondea desde el primer decimal. select round(123.456,-1) from dual;-- 120, redondea desde el primer valor enter o (hacia la izquierda). select round(123.456,-2) from dual;-- 100, redondea desde el segundo valor ente ro (hacia la izquierda). select round(123.456) from dual;-- 123. - sign(x): si el argumento es un valor positivo, retorna 1, si es negativo, devu elve -1 y 0 si es 0. Ejemplo: select sign(-120) from dual;--retorna -1 select sign(120) from dual;--retorna 1 - trunc(n,d): trunca un nmero a la cantidad de decimales especificada por el segu ndo argumento. Si se omite el segundo argumento, se truncan todos los decimales. Si "d" es negativo, el nmero es truncado desde la parte entera. Ejemplo: select trunc(1234.5678,2) from dual;--retorna 1234.56 select trunc(1234.5678,-2) from dual;--retorna 1200 select trunc(1234.5678,-1) from dual;--retorna 1230 select trunc(1234.5678) from dual;--retorna 1234 - sqrt(x): devuelve la raiz cuadrada del valor enviado como argumento. Ejemplo: select sqrt(9) from dual;--retorna 3 Oracle dispone de funciones trigonomtricas que retornan radianes, calculan seno, coseno, inversas, etc.: acos, asin, atan, atan2, cos, cosh, exp, ln, log, sin, s inh, tan, tanh. No las veremos en detalle. Se pueden emplear las funciones matemticas enviando como argumento el nombre de u n campo de tipo numrico. 23 - Funciones de fechas y horas

Oracle dispone de varias funciones que operan con tipos de datos "date". Estas s on algunas: - add_months(f,n): agrega a una fecha, un nmero de meses. Si el segundo argumento es positivo, se le suma a la fecha enviada tal cantidad de meses; si es negativ o, se le resta a la fecha enviada tal cantidad de meses. Ejemplo: select add_months('10/06/2007',5) from dual; --retorna "10/11/07" select add_months('10/06/2007',-5) from dual; --retorna "10/01/07" select add_months('30/01/2007',1) from dual;-- retorna "25/02/07" ya que es el l timo da de ese mes. - last_day(f): retorna el ultimo da de mes de la fecha enviada como argumento. Ej

emplo: select last_day('10/02/2007') from dual;-- "28/02/07" select last_day('10/08/2007') from dual;-- "31/08/07" - months_between(f1,f2): retorna el numero de meses entre las fechas enviadas co mo argumento. Ejemplo: select months_between('19/05/2003','21/06/05') from dual;-- retorna - next_day(fecha,dia): retorna una fecha correspondiente al primer da especificad o en "dia" luego de la fecha especificada. En el siguiente ejemplo se busca el l unes siguiente a la fecha especificada: select next_day('10/08/2007','LUNES') from dual; - current_date: retorna la fecha actual. Ejemplo: select current_date from dual; - current_timestamp: retorna la fecha actual select current_timestamp from dual; Retorna: 10/08/07 09:59:44,109000000 AMERICA/BUENOS_AIRES - sysdate: retorna la fecha y hora actuales en el servidor de Oracle. -systimestamp: retorna fecha y hora actuales. select systimestamp from dual; Retorna 10/08/07 10:33:48,984000000 -03:00 - to_date: convierte una cadena a tipo de dato "date". Ejemplo: select to_date ('05-SEP-2007 10:00 AM','DD-MON-YYYY HH:MI AM') from dual; Retorna 05/09/07 - to_char: convierte una fecha a cadena de caracteres. Ejemplo: select to_char('10/10/2007')from dual; - extract(parte,fecha): retorna la parte (especificada por el primer argumento) de una fecha. Puede extraer el ao (year), mes (month), da (day), hora (hour), minu to (minute), segundo (second), etc. Ejemplo: select extract(month from sysdate) from dual; retorna el nmero mes de la fecha actual. En Oracle: Los operadores aritmticos "+" (ms) y "-" (menos) pueden emplearse con f echas. Por ejemplos: select sysdate-3: Retorna 3 das antes de la fecha actual. select to_date('15/12/2007')-5 from dual; Retorna 10/12/07 Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo date. 24 - Ordenar registros (order by)

Podemos ordenar el resultado de un "select" para que los registros se muestren o

rdenados por algn campo, para ello usamos la clusula "order by". La sintaxis bsica es la siguiente: select *from NOMBRETABLA order by CAMPO; Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el ttul o: select *from libros order by titulo; Aparecen los registros ordenados alfabticamente por el campo especificado. Tambin podemos colocar el nmero de orden del campo por el que queremos que se orde ne 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; Si colocamos un nmero mayor a la cantidad de campos de la lista de seleccin, apare ce un mensaje de error y la sentencia no se ejecuta. Por defecto, si no aclaramos en la sentencia, los ordena de manera ascendente (d e menor a mayor). Podemos ordenarlos de mayor a menor, para ello agregamos la pa labra clave "desc": select *libros order by editorial desc; Tambin podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial" : select *from libros order by titulo,editorial; Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sen tido ascendente y "editorial" en sentido descendente: select *from libros order by titulo asc, editorial desc; Debe aclararse al lado de cada campo, pues estas palabras claves afectan al camp o inmediatamente anterior. Es posible ordenar por un campo que no se lista en la seleccin incluso por column as calculados. Se puede emplear "order by" con campos de tipo caracter, numrico y date. 25 - Operadores lgicos (and - or - not)

Hasta el momento, hemos aprendido a establecer una condicin con "where" utilizand o operadores relacionales. Podemos establecer ms de una condicin con la clusula "wh ere", para ello aprenderemos los operadores lgicos. Son los siguientes: - and, significa "y", - or, significa "y/o", - not, significa "no", invierte el resultado

- (), parntesis Los operadores lgicos se usan para combinar condiciones. Si queremos recuperar todos los libros cuyo autor sea igual a "Borges" y cuyo pr ecio no supere los 20 pesos, necesitamos 2 condiciones: select *from libros where (autor='Borges') and (precio<=20); Los registros recuperados en una sentencia que une dos condiciones con el operad or "and", cumplen con las 2 condiciones. Queremos ver los libros cuyo autor sea "Borges" y/o cuya editorial sea "Planeta" : select *from libros where autor='Borges' or editorial='Planeta'; En la sentencia anterior usamos el operador "or"; indicamos que recupere los lib ros 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 l a primera condicin, con la segunda condicin y con ambas condiciones. Los registros recuperados con una sentencia que une dos condiciones con el opera dor "or", cumplen una de las condiciones o ambas. Queremos recuperar los libros que NO cumplan la condicin dada, por ejemplo, aquel los cuya editorial NO sea "Planeta": select *from libros where not editorial='Planeta'; El operador "not" invierte el resultado de la condicin a la cual antecede. 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 (combinam os "and", "or") permite establecer el orden de prioridad de la evaluacin; adems pe rmite diferenciar las expresiones ms claramente. Por ejemplo, las siguientes expresiones devuelven un resultado diferente: select *from libros where (autor='Borges') or (editorial='Paidos' and precio<20); select *from libros where (autor='Borges' or editorial='Paidos') and (precio<20); Si bien los parntesis no son obligatorios en todos los casos, se recomienda utili zarlos para evitar confusiones. El orden de prioridad de los operadores lgicos es el siguiente: "not" se aplica a ntes 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 igua l nivel de precedencia es indefinido, por ello se recomienda usar los parntesis.

Entonces, para establecer ms de una condicin en un "where" es necesario emplear op eradores lgicos. "and" significa "y", indica que se cumplan ambas condiciones; "o r" significa "y/o", indica que se cumpla una u otra condicin (o ambas); "not" sig nifica "no.", indica que no se cumpla la condicin especificada. 26 - Otros operadores relacionales (between)

Hemos visto los operadores relacionales: = (igual), <> (distinto), > (mayor), < (menor), >= (mayor o igual), <= (menor o igual), is null/is not null (si un valo r 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 i gual a 20 y menor o igual a 40, usamos 2 condiciones unidas por el operador lgico "and": select *from libros where precio>=20 and precio<=40; Podemos usar "between" y as simplificar la consulta: select *from libros where precio between 20 and 40; Averiguamos si el valor de un campo dado (precio) est entre los valores mnimo y mxi mo especificados (20 y 40 respectivamente). "between" significa "entre". Trabaja con intervalo de valores. Este operador no tiene en cuenta los valores "null". Si agregamos el operador "not" antes de "between" el resultado se invierte, es d ecir, se recuperan los registros que estn fuera del intervalo especificado. Por e jemplo, recuperamos los libros cuyo precio NO se encuentre entre 20 y 30, es dec ir, los menores a 20 y mayores a 30: select *from libros where precio not between 20 and 30; Podemos especificar un intervalo de valores de tipo fecha con "between": select *from libros where edicion between '01/05/2000' and '01/05/2007'; Entonces, empleamos el operador "between" para reducir las condiciones "where". 27 - Otros operadores relacionales (in) 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: select *from libros where autor='Borges' or autor='Paenza'; Podemos usar "in" y simplificar la consulta:

select *from libros where autor in('Borges','Paenza'); Para recuperar los libros cuyo autor no sea 'Paenza' ni 'Borges' usbamos: select *from libros where autor<>'Borges' and autor<>'Paenza'; Tambin podemos usar "in" anteponiendo "not": select *from libros where autor not in ('Borges','Paenza'); Empleando "in" averiguamos si el valor del campo est incluido en la lista de valo res 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. 28 - Bsqueda de patrones (like - not like)

Existe un operador relacional que se usa para realizar comparaciones exclusivame nte de cadenas, "like" y "not like". Hemos realizado consultas utilizando operadores relacionales para comparar caden as. Por ejemplo, sabemos recuperar los libros cuyo autor sea igual a la cadena " Borges": select *from libros where autor='Borges'; El operador igual ("=") nos permite comparar cadenas de caracteres, pero al real izar la comparacin, busca coincidencias de cadenas completas, realiza una bsqueda exacta. Imaginemos que tenemos registrados estos 2 libros: "El Aleph", "Borges"; "Antologia poetica", "J.L. Borges"; Si queremos recuperar todos los libros de "Borges" y especificamos la siguiente condicin: select *from libros where autor='Borges'; 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) co mparan cadenas de caracteres completas. Para comparar porciones de cadenas utili zamos los operadores "like" y "not like". Entonces, podemos comparar trozos de cadenas de caracteres para realizar consult as. Para recuperar todos los registros cuyo autor contenga la cadena "Borges" de bemos tipear: select *from libros where autor like "%Borges%"; El smbolo "%" (porcentaje) reemplaza cualquier cantidad de caracteres (incluyendo ningn caracter). Es un caracter comodn. "like" y "not like" son operadores de com paracin que sealan igualdad o diferencia.

Para seleccionar todos los libros que comiencen con "M": select *from libros where titulo like 'M%'; 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. Para seleccionar todos los libros que NO comiencen con "M": select *from libros where titulo not like 'M%'; As como "%" reemplaza cualquier cantidad de caracteres, el guin bajo "_" reemplaza un caracter, es otro caracter comodn. Por ejemplo, queremos ver los libros de "L ewis Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", entonces t ipeamos esta condicin: select *from libros where autor like "%Carrol_"; "like" se emplea con tipos de datos caracter y date. Si empleamos "like" con tip os de datos que no son caracteres, Oracle convierte (si es posible) el tipo de d ato a caracter. Por ejemplo, queremos buscar todos los libros cuyo precio se enc uentre entre 10.00 y 19.99: select titulo,precio from libros where precio like '1_,%'; Queremos los libros que NO incluyen centavos en sus precios: select titulo,precio from libros where precio not like '%,%'; Los valores nulos no se incluyen en las bsquedas con "like" y "not like". 29 - Contar registros (count) Existen en Oracle romedios, obtener de grupo y operan uales y devuelven funciones que nos permiten contar registros, calcular sumas, p valores mximos y mnimos. Estas funciones se denominan funciones sobre un conjunto de valores (registros), no con datos individ 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 consult a 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 lo s que tienen valor "null") mientras que "count(precio)" retorna la cantidad de r

egistros 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. 30 - Funciones de grupo (count - max - min - sum - avg)

Hemos visto que Oracle dispone de funciones que nos permiten contar registros, c alcular sumas, promedios, obtener valores mximos y mnimos, las funciones de grupo. Las funciones de grupo operan sobre un conjunto de valores (registros) y retorn an un solo valor. Ya hemos aprendido una de ellas, "count()", veamos otras. 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 d el "where" (excepto "count" que en tal caso retorna cero). El tipo de dato del campo determina las funciones que se pueden emplear con ella s. Las relaciones entre las funciones de agrupamiento y los tipos de datos es la si guiente: - count: se puede emplear con cualquier tipo de dato. - min y max: con cualquier tipo de dato. - sum y avg: slo en campos de tipo numrico. La funcin "sum()" retorna la suma de los valores que contiene el campo especifica do. Si queremos saber la cantidad total de libros que tenemos disponibles para l a 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 q ueremos 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. Tratamiento de los valores nulos: 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 "preci o", 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 l os campos; "count(*)" cuenta todos los registros, incluidos los que contienen "null". 31 - Agrupar registros (group by)

Hemos aprendido que las funciones de grupo permiten realizar varios clculos opera ndo con conjuntos de registros. Las funciones de grupo solas producen un valor de resumen para todos los registr os 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 detall adas. Queremos saber la cantidad de libros de cada editorial, podemos tipear la siguie nte sentencia: select count(*) from libros where editorial='Planeta'; y repetirla con cada valor de "editorial": select count(*) from libros where editorial='Emece'; select count(*) from libros where editorial='Paidos'; ... Pero hay otra manera, utilizando la clusula "group by": select editorial, count(*) from libros group by editorial; La instruccin anterior solicita que muestre el nombre de la editorial y cuente la cantidad agrupando los registros por el campo "editorial". Como resultado apare cen los nombres de las editoriales y la cantidad de registros para cada valor de l campo. Los valores nulos se procesan como otro grupo. Entonces, para saber la cantidad de libros que tenemos de cada editorial, utiliz amos 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 de l campo a recuperar; la sintaxis bsica es la siguiente: select CAMPO, FUNCIONDEAGREGADO from NOMBRETABLA group by CAMPO; Tambin se puede agrupar por ms de un campo, en tal caso, luego del "group by" se l istan los campos, separados por comas. Todos los campos que se especifican en la clusula "group by" deben estar en la lista de seleccin. select CAMPO1, CAMPO2, FUNCIONDEAGREGADO

from NOMBRETABLA group by CAMPO1,CAMPO2; 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): select editorial, count(precio) from libros group by editorial; Como resultado aparecen los nombres de las editoriales y la cantidad de registro s de cada una, sin contar los que tienen precio nulo. Recuerde la diferencia de los valores que retorna la funcin "count()" cuando envi amos como argumento un asterisco o el nombre de un campo: en el primer caso cuen ta todos los registros incluyendo los que tienen valor nulo, en el segundo, los registros en los cuales el campo especificado es no nulo. Para conocer el total de libros agrupados por editorial: select editorial, sum(cantidad) from libros group by editorial; 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: select editorial, avg(precio) from libros group by editorial; Es posible limitar la consulta con "where". Si incluye una clusula "where", slo se agrupan los registros que cumplen las condi ciones. Vamos a contar y agrupar por editorial considerando solamente los libros cuyo pr ecio sea menor a 30 pesos: select editorial, count(*) from libros where precio<30 group by editorial; Note que las editoriales que no tienen libros que cumplan la condicin, no aparece n en la salida. Entonces, usamos "group by" para organizar registros en grupos y obtener un resu men de dichos grupos. Oracle produce una columna de valores por cada grupo, devo lviendo filas por cada grupo especificado. 32 - Seleccionar grupos (Having)

As como la clusula "where" permite seleccionar (o rechazar) registros individuales ; la clusula "having" permite seleccionar (o rechazar) un grupo de registros.

Si queremos saber la cantidad de libros agrupados por editorial usamos la siguie nte instruccin ya aprendida: select editorial, count(*) from libros group by editorial; Si queremos saber la cantidad de libros agrupados por editorial pero considerand o slo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos l a siguiente instruccin: select editorial, count(*) from libros group by editorial having count(*)>2; Se utiliza "having", seguido de la condicin de bsqueda, para seleccionar ciertas f ilas retornadas por la clusula "group by". Veamos otros ejemplos. Queremos el promedio de los precios agrupados por editori al, pero solamente de aquellos grupos cuyo promedio supere los 25 pesos: select editorial, avg(precio) from libros group by editorial having avg(precio)>25; En algunos casos es posible confundir las clusulas "where" y "having". Queremos c ontar los registros agrupados por editorial sin tener en cuenta a la editorial " Planeta". Analicemos las siguientes sentencias: select editorial, count(*) from libros where editorial<>'Planeta' group by editorial; select editorial, count(*) from libros group by editorial having editorial<>'Planeta'; Ambas devuelven el mismo resultado, pero son diferentes. La primera, selecciona todos los registros rechazando los de editorial "Planeta" y luego los agrupa par a contarlos. La segunda, selecciona todos los registros, los agrupa para contarl os y finalmente rechaza fila con la cuenta correspondiente a la editorial "Plane ta". No debemos confundir la clusula "where" con la clusula "having"; la primera establ ece condiciones para la seleccin de registros de un "select"; la segunda establec e condiciones para la seleccin de registros de una salida "group by". Veamos otros ejemplos combinando "where" y "having". Queremos la cantidad de lib ros, sin considerar los que tienen precio nulo, agrupados por editorial, sin con siderar la editorial "Planeta": select editorial, count(*) from libros where precio is not null group by editorial having editorial<>'Planeta'; Aqu, selecciona los registros rechazando los que no cumplan con la condicin dada e n "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 clu sula "where". Por ejemplo queremos el promedio de los precios agrupados por edit orial, de aquellas editoriales que tienen ms de 2 libros:

select editorial, avg(precio) from libros group by editorial having count(*) > 2; En una clusula "having" puede haber varias condiciones. Cuando utilice varias con diciones, tiene que combinarlas con operadores lgicos (and, or, not). Podemos encontrar el mayor valor de los libros agrupados y ordenados por editori al y seleccionar las filas que tengan un valor menor a 100 y mayor a 30: select editorial, max(precio) as mayor from libros group by editorial having min(precio)<100 and min(precio)>30 order by editorial; Entonces, usamos la clausula "having" para restringir las filas que devuelve una salida "group by". Va siempre despus de la clusula "group by" y antes de la clusul a "order by" si la hubiere. 33 - Registros duplicados (Distinct)

Con la clusula "distinct" se especifica que los registros con ciertos datos dupli cados sean obviadas en el resultado. Por ejemplo, queremos conocer todos los aut ores de los cuales tenemos libros, si utilizamos esta sentencia: select autor from libros; Aparecen repetidos. Para obtener la lista de autores sin repeticin usamos: select distinct autor from libros; Tambin podemos tipear: select autor from libros group by autor; Note que en los tres casos anteriores aparece "null" como un valor para "autor" S i slo queremos la lista de autores conocidos, es decir, no queremos incluir "null " en la lista, podemos utilizar la sentencia siguiente: select distinct autor from libros where autor is not null; Para contar los distintos autores, sin considerar el valor "null" usamos: select count(distinct autor) from libros; Note que si contamos los autores sin "distinct", no incluir los valores "null" pe ro si los repetidos: select count(autor) from libros; Esta sentencia cuenta los registros que tienen autor. Podemos combinarla con "where". Por ejemplo, queremos conocer los distintos auto res de la editorial "Planeta": select distinct autor from libros where editorial='Planeta'; Tambin puede utilizarse con "group by" para contar los diferentes autores por edi torial:

select editorial, count(distinct autor) from libros group by editorial; La clusula "distinct" afecta a todos los campos presentados. Para mostrar los ttul os y editoriales de los libros sin repetir ttulos ni editoriales, usamos: select distinct titulo,editorial from libros order by titulo; Note que los registros no estn duplicados, aparecen ttulos iguales pero con editor ial diferente, cada registro es diferente. Entonces, "distinct" elimina registros duplicados. 34 - Clave primaria compuesta

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 re piten 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: - patente char(6) not null, - tipo char (1), 'a'= auto, 'm'=moto, - horallegada date, - horasalida date, Necesitamos definir una clave primaria para una tabla con los datos descriptos a rriba. 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 camp os. Definimos una clave compuesta cuando ningn campo por si solo cumple con la condic in para ser clave. En este ejemplo, un auto puede ingresar varias veces en un da a la playa, pero si empre ser a distinta hora. Usamos 2 campos como clave, la patente junto con la hora de llegada, as identific amos unvocamente cada registro. Para establecer ms de un campo como clave primaria usamos la siguiente sintaxis: create table vehiculos( patente char(6) not null, tipo char(1),--'a'=auto, 'm'=moto horallegada date, horasalida date, primary key(patente,horallegada) );

Nombramos los campos que formarn parte de la clave separados por comas. Al ingresar los registros, Oracle controla que los valores para los campos estab lecidos como clave primaria no estn repetidos en la tabla; si estuviesen repetido s, 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: select uc.table_name, column_name, position from user_cons_columns ucc join user_constraints uc on ucc.constraint_name=uc.constraint_name where uc.constraint_type='P' and uc.table_name='VEHICULOS'; Entonces, si un solo campo no identifica unvocamente un registro podemos definir una clave primaria compuesta, es decir formada por ms de un campo. 35 - Secuencias (create sequence - currval - nextval - drop sequence)

Hemos aprendido que existen varios objetos de base de datos, hasta ahora hemos v isto TABLAS y algunas FUNCIONES predefinidas. Otro objeto de base de datos es la secuencia. Una secuencia (sequence) se emplea para generar valores enteros secuenciales nico s y asignrselos a campos numricos; se utilizan generalmente para las claves primar ias 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: create sequence NOMBRESECUENCIA start with VALORENTERO increment by VALORENTERO maxvalue VALORENTERO minvalue VALORENTERO cycle | nocycle; - La clusula "start with" indica el valor desde el cual comenzar la generacin de nme ros secuenciales. Si no se especifica, se inicia con el valor que indique "minva lue". - La clusula "increment by" especifica el incremento, es decir, la diferencia ent re los nmeros de la secuencia; debe ser un valor numrico entero positivo o negativ o diferente de 0. Si no se indica, por defecto es 1. - "maxvalue" define el valor mximo para la secuencia. Si se omite, por defecto es 99999999999999999999999999. - "minvalue" establece el valor mnimo de la secuencia. Si se omite ser 1. - La clusula e "maxvalue") es decir, la secuencia se "cycle" indica que, cuando la secuencia llegue a mximo valor (valor d se reinicie, comenzando con el mnimo valor ("minvalue") nuevamente, secuencia vuelve a utilizar los nmeros. Si se omite, por defecto la crea "nocycle".

Si no se especifica ninguna clusula, excepto el nombre de la secuencia, por defec to, comenzar en 1, se incrementar en 1, el mnimo valor ser 1, el mximo ser 99999999999

9999999999999999 y "nocycle". En el siguiente ejemplo creamos una secuencia llamada "sec_codigolibros", establ eciendo que comience en 1, sus valores estn entre 1 y 99999 y se incrementen en 1 , por defecto, ser "nocycle": create sequence sec_codigolibros start with 1 increment by 1 maxvalue 99999 minvalue 1; Si bien, las secuencias son independientes de las tablas, se utilizarn generalmen te para una tabla especfica, por lo tanto, es conveniente darle un nombre que ref erencie a la misma. Otro ejemplo: create sequence sec_numerosocios increment by 5 cycle; La secuencia anterior, "sec_numerosocios", incrementa sus valores en 5 y al lleg ar al mximo valor recomenzar la secuencia desde el valor mnimo; no se especifican l as otras clusulas, por lo tanto, por defecto, el valor mnimo es 1, el mximo 9999999 99999999999999999999 y el valor inicial es 1. Dijimos que las secuencias son tablas; por lo tanto se accede a ellas mediante c onsultas, empleando "select". La diferencia es que utilizamos pseudocolumnas par a 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 "currva l" y "nextval". Primero debe inicializarse la secuencia con "nextval". La primera vez que se ref erencia "nextval" retorna el valor de inicio de la secuencia; las siguientes vec es, incrementa la secuencia y nos retorna el nuevo valor: NOMBRESECUENCIA.NEXTVAL; se coloca el nombre de la secuencia seguido de un punto y la pseudocolumna "next val" (que es una forma abreviada de "next value", siguiente valor). Para recuperar el valor actual de una secuencia usamos: NOMBRESECUENCIA.CURRVAL; es decir, el nombre de la secuencia, un punto y la pseudocolumna "currval" (que es una forma abreviada de "current value", valor actual). Los valores retornados por "currval" y "nextval" pueden usarse en sentencias "in sert" y "update". Veamos un ejemplo completo: Creamos una secuencia para el cdigo de la tabla "libros", especificando el valor mximo, el incremento y que no sea circular: create sequence sec_codigolibros maxvalue 999999 increment by 1 nocycle;

Luego inicializamos la secuencia select sec_codigolibros.nextval from dual; Recuerde que la primera vez que se referencie la secuencia debe emplearse "nextv al" para inicializarla. Ingresamos un registro en "libros", almacenando en el campo "codigo" el valor ac tual de la secuencia: insert into libros values (sec_codigolibros.currval,'El aleph', 'Borges','Emece'); Ingresamos otro registro en "libros", almacenando en el campo "codigo" el valor siguiente de la secuencia: insert into libros values (sec_codigolibros.nextval,'Matematica estas ahi', 'Paenza','Nuevo siglo'); Para ver todas las secuencias de la base de datos actual realizamos la siguiente consulta: select *from all_sequences; Nos muestra el propietario de la secuencia, el nombre de la misma, los valores mn imo y mximo, el valor de incremento y si es circular o no, entre otros datos que no analizaremos por el momento. Tambin podemos ver todos los objetos de la base de datos actual tipeando; select *from all_objects; 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 "SEQUEN CE". Podemos consultar "all_objects" especificando que nos muestre el nombre de todas las secuencias: select object_name from all_objects where object_type='SEQUENCE'; Para eliminar una secuencia empleamos "drop sequence". Sintaxis: drop sequence NOMBRESECUENCIA; Si la secuencia no existe aparecer un mensaje indicando tal situacin. En el siguiente ejemplo se elimina la secuencia "sec_codigolibros": drop sequence sec_codigolibros; 36 - Alterar secuencia (alter sequence) Es posible modificar una secuencia, su valor de incremento, los valores mnimo y mx imo y el atributo "cycle" (el valor de inicio no puede modificarse); para ello e mpleamos la sentencia "alter sequence". Sintaxis: alter sequence NOMBRESECUENCIA ATRIBUTOSAMODIFICAR; Definimos una secuencia denominada "sec_codigolibros" con los siguientes atribut os: create sequence sec_codigolibros start with 1 increment by 1 maxvalue 999 minvalue 1

nocycle; Para modificar el mximo valor a 99999 y el incremento a 2, tipeamos: alter sequence sec_codigolibros increment by 2 maxvalue 99999; Los valores de incremento y mnimo han sido modificados, los dems atributos no espe cificados en la sentencia "alter sequence" se mantienen. 37 - Integridad de datos Es importante, al disear una base de datos y las tablas que contiene, tener en cu enta la integridad de los datos, esto significa que la informacin almacenada en l as tablas debe ser vlida, coherente y exacta. Hasta el momento, hemos controlado y restringido la entrada de valores a un camp o mediante el tipo de dato que le definimos (cadena, numricos, etc.), la aceptacin o no de valores nulos, el valor por defecto. Tambin hemos asegurado que cada reg istro de una tabla sea nico definiendo una clave primaria y empleando secuencias. 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 mi smas. Comenzamos por las restricciones. Las restricciones (constraints) son un mtodo para mantener la integridad de los d atos, asegurando que los valores ingresados sean vlidos y que las relaciones entr e las tablas se mantenga. Las restricciones pueden establecerse a nivel de campo o de tabla. Pueden definirse al crear la tabla ("create table") o agregarse a una tabla exis tente (empleando "alter table") y se pueden aplicar a un campo o a varios. Tambin es posible habilitarlas y deshabilitarlas. Oracle ofrece varios tipos de restricciones: - not null: a nivel de campo. - primary key: a nivel de tabla. Es un campo o varios que identifican cada regis tro 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 cam po especifico. - unique: a nivel de tabla. 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_o bjects", "all_constraints" y "all_cons_columns". El catlogo "all_constraints" retorna varias columnas, entre ellas: OWNER (propiet ario), CONSTRAINT_NAME (nombre de la restriccin), CONSTRAINT_TYPE (tipo de restri

ccin, si es primary key (P), foreign key (), unique (U), etc.), TABLE_NAME (nombr e de la tabla), SEARCH_CONDITION (en caso de ser Check u otra), DELETE_RULE (), STATUS (estado), DEFERRABLE (), DEFERRED (), VALIDATED (), GENERATED (), INDEX_O WNER (), INDEX_NAME (). El catlogo "all_cons_columnas" retorna las siguientes columnas: OWNER (propietari o), CONSTRAINT_NAME (nombre), TABLE_NAME (nombre de la tabla), COLUMN_NAME (camp o), POSITION (posicin). 38 - Restriccin primary key

La restriccin "primary key" asegura que los valores sean nicos para cada registro. Anteriormente, para establecer una clave primaria para una tabla emplebamos la si guiente sintaxis al crear la tabla, por ejemplo: create table libros( codigo int not null, titulo varchar(30), autor varchar(30), editorial varchar(20), primary key(codigo) ); Cada vez que establecamos la clave primaria para la tabla, Oracle creaba automtica mente una restriccin "primary key" para dicha tabla. Dicha restriccin, a la cual n o 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 sintaxi s bsica siguiente: alter table NOMBRETABLA add constraint NOMBRECONSTRAINT primary key (CAMPO,...); En el siguiente ejemplo definimos una restriccin "primary key" para nuestra tabla "libros" para asegurarnos que cada libro tendr un cdigo diferente y nico: alter table libros add constraint PK_libros_codigo primary key(codigo); Con esta restriccin, si intentamos ingresar un registro con un valor para el camp o "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" seguiremo s el formato "PK_NOMBRETABLA_NOMBRECAMPO". Cuando agregamos una restriccin a una tabla que contiene informacin, Oracle contro la los datos existentes para confirmar que cumplen las exigencias de la restricc in, si no los cumple, la restriccin no se aplica y aparece un mensaje de error. Po r 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 establec e. Cuando establecamos una clave primaria al definir la tabla, automticamente Oracle redefina el campo como "not null"; lo mismo sucede al agregar una restriccin "prim ary key", los campos que se establecen como clave primaria se redefinen automtica mente "not null".

Se permite definir solamente una restriccin "primary key" por tabla, que asegura la unicidad de cada registro de una tabla. Si consultamos el catlogo "user_constraints", podemos ver las restricciones "prim ary key" (y todos los tipos de restricciones) de todas las tablas del usuario ac tual. El resultado es una tabla que nos informa el propietario de la restriccin ( OWNER), el nombre de la restriccin (CONSTRAINT_NAME), el tipo (CONSTRAINT_TYPE, s i es "primary key" muestra una "P"), el nombre de la tabla en la cual se aplica (TABLE_NAME), y otra informacin que no analizaremos por el momento. Tambin podemos consultar el catlogo "user_cons_columns"; nos mostrar el propietario de la restriccin (OWNER), el nombre de la restriccin (CONSTRAINT_NAME), la tabla a la cual se aplica (TABLE_NAME), el campo (COLUMN_NAME) y la posicin (POSITION). 39 - Restriccin unique Anteriormente aprendimos la restriccin "primary key", otra restriccin que asegura valores nicos para cada registro es "unique". La restriccin "unique" impide la duplicacin de claves alternas (no primarias), es decir, especifica que dos registros no puedan tener el mismo valor en un campo. Se permiten valores nulos. 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). La sintaxis general es la siguiente: alter table NOMBRETABLA add constraint NOMBRERESTRICCION unique (CAMPO); Ejemplo: alter table alumnos add constraint UQ_alumnos_documento unique (documento); En el ejemplo anterior se agrega una restriccin "unique" sobre el campo "document o" de la tabla "alumnos", esto asegura que no se pueda ingresar un documento si ya existe. Esta restriccin permite valores nulos, asi que si se ingresa el valor "null" para el campo "documento", se acepta. Por convencin, cuando demos el nombre a las restricciones "unique" seguiremos la misma estructura: "UQ_NOMBRETABLA_NOMBRECAMPO". Quiz parezca innecesario colocar el nombre de la ta bla, pero cuando empleemos varias tablas ver que es til identificar las restriccio nes por tipo, tabla y campo. 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 valor es nulos. Oracle controla la entrada de datos en inserciones y actualizaciones evitando qu

e se ingresen valores duplicados. Un campo que se estableci como clave primaria no puede definirse como clave nica; si una tabla tiene una clave primaria, puede tener una o varias claves nicas (apl icadas a otros campos que no sean clave primaria). Si consultamos el catlogo "user_constraints", podemos ver las restricciones "uniq ue" (y todos los tipos de restricciones) de todas las tablas del usuario actual. El resultado es una tabla que nos informa el propietario de la restriccin (OWNER ), el nombre de la restriccin (CONSTRAINT_NAME), el tipo (CONSTRAINT_TYPE, si es "unique" muestra una "U"), el nombre de la tabla en la cual se aplica (TABLE_NAM E), y otra informacin que no analizaremos por el momento. Tambin podemos consultar el catlogo "user_cons_columns"; nos mostrar el propietario de la restriccin (OWNER), el nombre de la restriccin (CONSTRAINT_NAME), la tabla a la cual se aplica (TABLE_NAME), el campo (COLUMN_NAME) y la posicin (POSITION). 40 - Restriccion check

La restriccin "check" especifica los valores que acepta un campo, evitando que se ingresen valores inapropiados. La sintaxis bsica es la siguiente: alter table NOMBRETABLA add constraint NOMBRECONSTRAINT check CONDICION; Trabajamos con la tabla "libros" de una librera que tiene los siguientes campos: codigo, titulo, autor, editorial, preciomin (que indica el precio para los minor istas) y preciomay (que indica el precio para los mayoristas). Los campos correspondientes a los precios (minorista y mayorista) se definen de tipo number(5,2), es decir, aceptan valores entre -999.99 y 999.99. Podemos cont rolar que no se ingresen valores negativos para dichos campos agregando una rest riccin "check": alter table libros add constraint CK_libros_precio_positivo check (preciomin>=0 and preciomay>=0); Este tipo de restriccin verifica los datos cada vez que se ejecuta una sentencia "insert" o "update", es decir, acta en inserciones y actualizaciones. Si la tabla contiene registros que no cumplen con la restriccin que se va a estab lecer, la restriccin no se puede establecer, hasta que todos los registros cumpla n con dicha restriccin. 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: alter table libros add constraint CK_libros_preciominmay check (preciomay<=preciomin); Por convencin, cuando demos el nombre a las restricciones "check" seguiremos la m isma 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 restr iccin, 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 val ores. 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 incl uido en la condicin de restriccin. Si intentamos establecer una restriccin "check" para un campo que entra en confli cto 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. En las condiciones de chequeo no es posible incluir funciones (como "sysdate"). Un campo con una restriccin "primary key" o "unique" puede tener una (o varias) r estricciones "check". En la condicin de una restriccin "check" se puede establecer que un campo no admit a valores nulos: alter table libros add constraint CK_libros_titulo check (titulo is not null); 41 - Restricciones: validacin y estados (validate - novalidate - enable - disable )

Sabemos que si agregamos una restriccin a una tabla que contiene datos, Oracle lo s controla para asegurarse que cumplen con la condicin de la restriccin, si algn re gistro no la cumple, la restriccin no se establecece. Es posible deshabilitar esta comprobacin estableciendo una restriccin sin comproba r los datos existentes en la tabla. Podemos hacerlo cuando agregamos la restriccin (de cualquier tipo) a una tabla pa ra que Oracle acepte los valores ya almacenados que infringen la restriccin. Para ello debemos incluir la opcin "novalidate" en la instruccin "alter table": alter table libros add constraint PK_libros_codigo primary key (codigo) novalidate; La restriccin no se aplica en los datos existentes, pero si intentamos ingresar u n 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: alter table libros add constraint PK_libros_codigo primary key (codigo) disable;

Entonces, para evitar la comprobacin de datos existentes y futuros al crear la re striccin, la sintaxis bsica es la siguiente: alter table TABLA add constraint NOMBRERESTRICCION TIPOdeRESTRICCION (CAMPO o CONDICION)--campo si es primary key o unique; condi cin si es check disable novalidate; Por defecto (si no especificamos) la opcin es "validate", es decir, controla los datos existentes y "enable", es decir, controla futuros ingresos y actualizacion es. Tambin es posible alterar la restriccin luego de haberla creado. Sintaxis: alter table NOMBRETABLA ESTADO VALIDACION constraint NOMBRERESTRICCION; En el ejemplo siguiente deshabilitamos la restriccin "PK_libros_codigo" para pode r ingresar un valor que infrija la restriccin: alter table libros disable validate constraint PK_libros_codigo; Para habilitar una restriccin deshabilitada se ejecuta la misma instruccin pero co n la clusula "enable": alter table libros enable validate constraint PK_libros_codigo; Para saber si una restriccin est habilitada o no, podemos consultar el catlogo "use r_constraints" y fijarnos lo que informa la columna "status". Los estados "validate" y "novalidate" son relativamente independientes de los es tados "enabled" y "disabled". Cuando habilitamos una restriccin "primary key" o "unique" con "enable", los dato s existentes DEBEN cumplir con la restriccin; aunque coloquemos "novalidate" junt o a "enable", Oracle no permite que se habilite la restricin y valida los datos e xistentes de todas maneras. No sucede lo mismo con una restriccin "check"; podemo s habilitar una restriccin de control con "enable" y "novalidate", Oracle habilit a la restriccin para futuros ingresos y actualizaciones y NO valida los datos exi stentes. Entonces, "enable" o "disable" activa o desactiva la restriccin para los nuevos d atos ("enable" es la opcin predeterminada si no se especifica); "validate" o "nov alidate" es la opcin para validar la restriccin en los datos existentes ("validate " es la predetermidada si se omite). Una restriccin puede estar en los siguientes estados: - validate y enabled: comprueba los valores existentes y los posteriores ingreso s y actualizaciones; - validate y disable: comprueba los valores existentes pero no las posteriores i nserciones y actualizaciones; - novalidate y enabled: no comprueba los datos existentes, pero si los posterior es ingresos y actualizaciones; - novalidate y disabled: no comprueba los valores existentes ni los posteriores

ingresos y actualizaciones. 42 - Restricciones: informacin (user_constraints - user_cons_columns) El catlogo "user_constraints" muestra la informacin referente a todas las restricc iones establecidas en las tablas del usuario actual, devuelve varias columnas, e xplicaremos algunas de ellas: - owner: propietario de la restriccin; - constraints_name: el nombre de la restriccin; - constraint_type: tipo de restriccin. Si es una restriccin de control muestra el caracter "C", si es "primary key" muestra "P", si es "unique" el caracter "U". - table_name: nombre de la tabla en la cual se estableci la restriccin; - search_condition: solamente es aplicable a restricciones de control; indica la condicin de chequeo a cumplirse. - status: indica si est habilitada (enabled) para futuras inserciones y actualiza ciones o deshabilitada (disabled) - validated: indica si valida los datos existentes en la tabla (validated) o no (no validate) El catlogo "user_cons_columns" muestra la informacin referente a todas las restric ciones establecidas en las tablas del usuario actual, devuelve las siguientes co lumnas: - owner: propietario d la restriccin; - constraints_name: el nombre de la restriccin; - table_name: nombre de la tabla en la cual se estableci; - column_name: muestra cada campo en el cual la restriccin fue aplicada. - position: solamente es aplicable a restricciones "primary key" y "unique"; ind ica el orden en que fueron definidos los campos que componen la clave (primaria o nica). 43 - Restricciones: eliminacin (alter table - drop constraint) Para eliminar una restriccin, la sintaxis bsica es la siguiente: alter table NOMBRETABLA drop constraint NOMBRERESTRICCION; Para eliminar la restriccin "PK_libros_codigo" de la tabla libros tipeamos: alter table libros drop constraint PK_LIBROS_CODIGO; Recuerde colocar el nombre de la restriccin en maysculas, sino Oracle no la recono cer. 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 modific arse, hay que eliminar la restriccin y volver a crearla; igualmente con las restr

icciones "primary key" y "unique", no pueden modificarse los campos. 44 - Indices. Otros objetos de base de datos son los ndices. 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 ind ice de una tabla desempea la misma funcin que el ndice de un libro: permite encontr ar datos rpidamente; en el caso de las tablas, localiza registros. Oracle accede a los datos de dos maneras: 1) recorriendo las tablas; comenzando el principio y extrayendo los registros qu e 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 pasra mos 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 (comparan do con un libro, diremos que es como leer el ndice y luego de encontrar el tema b uscado, ir directamente a la pgina indicada). Un ndice posibilita el acceso directo y rpido haciendo ms eficiente las bsquedas. Si n ndice, Oracle debe recorrer secuencialmente toda la tabla para encontrar un reg istro. Los ndices son estructuras asociadas a tablas, una tabla que almacena los campos indexados y se crean para acelerar las consultas. Entonces, el objetivo de un indice es acelerar la recuperacin de informacin. La in dexacin es una tcnica que optimiza el acceso a los datos, mejora el rendimiento ac elerando las consultas y otras operaciones. Es til cuando la tabla contiene miles de registros, cuando se realizan operaciones de ordenamiento y agrupamiento y c uando se combinan varias tablas (tema que veremos ms adelante). La desventaja es que consume espacio en el disco en disco y genera costo de mant enimiento (tiempo y recursos). Es importante identificar el o los campos por los que sera til crear un ndice, aque llos 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 consu ltas 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 automti camente crea un ndice sobre el campo (o los campos) de la restriccin y le da el mi smo nombre que la restriccin. En caso que la tabla ya tenga un ndice, Oracle lo us a, 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 a lmacena la direccin donde se encuentra el dato. Es el tipo predeterminado y el ms comn (el nico que estudiaremos).

45 - Indices (Crear - Informacin)

Dijimos que el objetivo de un indice es acelerar la recuperacin de informacin y qu e es til cuando la tabla contiene miles de registros, cuando se realizan operacio nes de ordenamiento y agrupamiento, etc. Es importante identificar el o los campos por los que sera til crear un ndice, aque llos 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 consu ltas o en tablas muy pequeas. Para crear ndices empleamos la instruccin "create index". La sintaxis bsica es la siguiente: create TIPOdeINDICE index NOMBREINDICE on NOMBRETABLA(CAMPOS); Los ndices pueden ser: no nicos (los valores pueden estar repetidos) o nicos (los v alores no pueden duplicarse). De modo predeterminado, si no se especifica el tip o de ndice, se crea uno no nico. En el siguiente ejemplo creamos un ndice nico sobre el campo "documento" de la tab la "empleados": create unique index I_empleados_documento on empleados(documento); Para identificar los ndices fcilmente, podemos agregar un prefijo al nombre del ndi ce, 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, Orac le no lo permite. Los campos de tipo "long" y "long raw" no pueden indexarse. Una tabla puede indexarse por un campo (o varios). Creamos un ndice compuesto para los campos "apellido" y "nombre": create index I_empleados_apellidonombre on empleado(apellido,nombre); Cuando creamos una restriccin "primary key" o "unique" sobre una tabla, Oracle au tomticamente crea un ndice sobre el campo (o los campos) de la restriccin y le da e l mismo nombre que la restriccin. En caso que la tabla ya tenga un ndice, Oracle l o 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 anali zaremos): 2) INDEX_NAME (nombre del ndice), INDEX_TYPE (tipo de ndice, nosotros crearemos el stardart normal), TABLE_NAME (nombre de la tabla), UNIQUENESS (si es nico o no). "user_ind_columns": nos muestra las siguientes columnas (entre otras que no a

nalizaremos): 3) INDEX_NAME (nombre del ndice), TABLE_NAME (nombre de la tabla), COLUMN_NAME (nombre del campo), COLUMN_POSITION (posicin del campo), "user_objects": en la columna "OBJECT_TYPE" muestra "index" si es un ndice.

4) "user_constraints": si la restriccin tiene un ndice asociado, aparece su nombre en la columna "INDEX_NAME". 46 - Indices (eliminar) Los ndices se eliminan con "drop index"; la siguiente es la sintaxis bsica: drop index NOMBREINDICE; Eliminamos el ndice "I_empleados_documento": drop index I_empleados_documento; Los ndices usados por las restricciones "primary key" y "unique" no pueden elimin arse con "drop index", se eliminan automticamente cuando quitamos la restriccin. Si eliminamos una tabla, todos los ndices asociados a ella se eliminan. 47 - Varias tablas (join) Hasta el momento hemos trabajado con una sola tabla, pero generalmente, se traba ja 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 regi strar. Por ejemplo, los datos de nuestra tabla "libros" podran separarse en 2 tablas, un a llamada "libros" y otra "editoriales" que guardar la informacin de las editorial es. En nuestra tabla "libros" haremos referencia a la editorial colocando un cdig o que la identifique. Veamos: create table libros( codigo number(4), titulo varchar2(40) not null, autor varchar2(30), codigoeditorial number(3) not null, precio number(5,2), primary key (codigo) ); create table editoriales( codigo number(3), nombre varchar2(20) not null, primary key(codigo) ); De esta manera, evitamos almacenar tantas veces los nombres de las editoriales e n la tabla "libros" y guardamos el nombre en la tabla "editoriales"; para indica r la editorial de cada libro agregamos un campo que hace referencia al cdigo de l a editorial en la tabla "libros" y en "editoriales". Al recuperar los datos de los libros con la siguiente instruccin: select* from libros;

vemos que en el campo "editorial" aparece el cdigo, pero no sabemos el nombre de la editorial. Para obtener los datos de cada libro, incluyendo el nombre de la e ditorial, necesitamos consultar ambas tablas, traer informacin de las dos. Cuando obtenemos informacin de ms de una tabla decimos que hacemos un "join" (comb inacin). Veamos un ejemplo: select *from libros join editoriales on libros.codigoeditorial=editoriales.codigo; Resumiendo: si distribuimos la informacin en varias tablas evitamos la redundanci a de datos y ocupamos menos espacio fsico en el disco. 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. Hay tres tipos de combinaciones. En los siguientes captulos explicamos cada una d e ellas. 48 - Combinacin interna (join) Un join es una operacin que relaciona dos o ms tablas para obtener un resultado qu e incluya datos (campos y registros) de ambas; las tablas participantes se combi nan segn los campos comunes a ambas tablas. Hay tres tipos de combinaciones: 1) combinaciones internas (inner join o join), 2) combinaciones externas y 3) combinaciones cruzadas. 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". S e emplea para obtener informacin de dos tablas y combinar dicha informacin en una salida. La sintaxis bsica es la siguiente: select CAMPOS from TABLA1 join TABLA2 on CONDICIONdeCOMBINACION; Ejemplo: select *from libros join editoriales on codigoeditorial=editoriales.codigo; Analicemos la consulta anterior. - especificamos los campos que aparecern en el resultado en la lista de seleccin; - indicamos el nombre de la tabla luego del "from" ("libros"); - combinamos esa tabla con "join" y el nombre de la otra tabla ("editoriales"); se especifica qu tablas se van a combinar y cmo; - cuando se combina informacin de varias tablas, es necesario especificar qu regis

tro de una tabla se combinar con qu registro de la otra tabla, con "on". Se debe e specificar la condicin para enlazarlas, es decir, el campo por el cual se combina rn, que tienen en comn. "on" hace coincidir registros de ambas tablas basndose en e l valor de tal campo, en el ejemplo, el campo "codigoeditorial" de "libros" y el campo "codigo" de "editoriales" son los que enlazarn ambas tablas. Se emplean ca mpos comunes, que deben tener tipos de datos iguales o similares. La condicion de combinacin, es decir, el o los campos por los que se van a combin ar (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 necesar io para evitar confusiones y ambiguedades al momento de referenciar un campo. En el ejemplo, si no especificamos "editoriales.codigo" y solamente tipeamos "codi go", Oracle no sabr si nos referimos al campo "codigo" de "libros" o de "editoria les" y mostrar un mensaje de error indicando que "codigo" es ambiguo. Entonces, si las tablas que combinamos tienen nombres de campos iguales, DEBE es pecificarse 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 con dicin referenciar a todos los campos clave que identifican al registro. Se puede incluir en la consulta join la clusula "where" para restringir los regis tros que retorna el resultado; tambin "order by", "distinct", etc.. Se emplea este tipo de combinacin para encontrar registros de la primera tabla qu e 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 . Para simplificar la sentencia podemos usar un alias para cada tabla: 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 simplif icacin y hace ms legible la consulta si es larga y compleja, pero en algunas consu ltas es absolutamente necesario. 49 - Combinacin externa izquierda (left join) Vimos que una combinacin interna (join) encuentra registros de la primera tabla q ue se correspondan con los registros de la segunda, es decir, que cumplan la con dicin del "on" y si un valor de la primera tabla no se encuentra en la segunda ta bla, el registro no aparece. Si queremos saber qu registros de una tabla NO encuentran correspondencia en la o tra, es decir, no existe valor coincidente en la segunda, necesitamos otro tipo de combinacin, "outer join" (combinacin externa). Las combinaciones externas combinan registros de dos tablas que cumplen la condi cin, ms los registros de la segunda tabla que no la cumplen; es decir, muestran to dos los registros de las tablas relacionadas, an cuando no haya valores coinciden tes entre ellas.

Este tipo de combinacin se emplea cuando se necesita una lista completa de los da tos de una de las tablas y la informacin que cumple con la condicin. Las combinaci ones 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 jo in" 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". En el siguiente ejemplo solicitamos el ttulo y nombre de la editorial de los libr os: 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 cua les no hay libros, es decir, cuyo cdigo de editorial no est presente en "libros" a parece en el resultado, pero con el valor "null" en el campo "titulo". Es importante la posicin en que se colocan las tablas en un "left join", la tabla de la izquierda es la que se usa para localizar registros en la tabla de la der echa. Entonces, un "left join" se usa para hacer coincidir registros en una tabla (izq uierda) con otra tabla (derecha); si un valor de la tabla de la izquierda no enc uentra 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 dere cha 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 sentenc ia 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 cuy o cdigo de editorial no est presente en "editoriales" aparecen en el resultado, pe ro con el valor "null" en el campo "nombre". Un "left join" puede tener clausula "where" que restringa el resultado de la con sulta considerando solamente los registros que encuentran coincidencia en la tab la 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; 50 - Combinacin externa derecha (right join)

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 u n valor de la tabla izquierda no se encuentra en la tabla derecha, el registro m uestra los campos correspondientes a la tabla de la derecha seteados a "null". Una combinacin externa derecha ("right outer join" o "right join") opera del mism o modo slo que la tabla derecha es la que localiza los registros en la tabla izqu ierda. En el siguiente ejemplo solicitamos el ttulo y nombre de la editorial de los libr os empleando un "right join": select titulo,nombre as editorial from libros l right join editoriales e on codigoeditorial = e.codigo; El resultado mostrar el ttulo y nombre de la editorial; las editoriales de las cua les no hay libros, es decir, cuyo cdigo de editorial no est presente en "libros" a parece 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 "ou ter join". En un "left join" la primera tabla (izquierda) es la que busca coinci dencias en la segunda tabla (derecha); en el "right join" la segunda tabla (dere cha) es la que busca coincidencias en la primera tabla (izquierda). En la siguiente consulta empleamos un "left join" para conseguir el mismo result ado 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 por que 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 l a tabla izquierda, se genera una fila extra (una por cada valor no encontrado) c on 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 l a consulta considerando solamente los registros que encuentran coincidencia en l a 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 enc uentran 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; 51 - Combinacin externa completa (full join) Vimos que un "left join" encuentra registros de la tabla izquierda que se corres pondan 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 correspondi entes 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 regis tros en la tabla izquierda. Una combinacin externa completa ("full outer join" o "full join") retorna todos l os 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 encuent ra correspondencia en la tabla izquierda, los campos de esta ltima aparecen conte niendo "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 "editoriale s" y las editoriales de las cuales no hay correspondencia en "libros". 52 - Combinaciones cruzadas (cross) Vimos que hay tres tipos de combinaciones: 1) combinaciones internas (join), 2) combinaciones externas (left, outer y full join) y 3) combinaciones cruzadas. Las combinaciones cruzadas (cross join) muestran todas las combinaciones de todo s los registros de las tablas combinadas. Para este tipo de join no se incluye u na condicin de enlace. Se genera el producto cartesiano en el que el nmero de fila s del resultado es igual al nmero de registros de la primera tabla multiplicado p or 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. La sintaxis bsica es sta: select CAMPOS from TABLA1 cross join TABLA2; Veamos un ejemplo. Un pequeo restaurante almacena los nombres y precios de sus co midas en una tabla llamada "comidas" y en una tabla denominada "postres" los mis

mos datos de sus postres. Si necesitamos conocer todas las combinaciones posibles para un men, cada comida con cada postre, empleamos un "cross join": select c.nombre as "plato principal", p.nombre as "postre" from comidas c cross join postres p; 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. Este tipo de join no es muy utilizado. 53 - Autocombinacin

Dijimos que es posible combinar una tabla consigo misma. Un pequeo restaurante tiene almacenadas sus comidas en una tabla llamada "comidas " que consta de los siguientes campos: - 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 u na sola tabla: select c1.nombre, c2.nombre, c1.precio+c2.precio as total from comidas c1 cross join comidas c2; En la consulta anterior aparecern filas duplicadas, para evitarlo debemos emplear un "where": select c1.nombre as "plato principal", c2.nombre as postre, c1.precio+c2.precio as total from comidas c1 cross join comidas c2 where c1.rubro='plato' and c2.rubro='postre'; 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 d ebemos utilizar 2 alias para la tabla. Para evitar que aparezcan filas duplicada s, debemos emplear un "where". Tambin se puede realizar una autocombinacin con "join": select c1.nombre as "plato principal", c2.nombre as postre, c1.precio+c2.precio as total from comidas c1 join comidas c2 on c1.codigo<>c2.codigo where c1.rubro='plato' and

c2.rubro='postre'; Para que no aparezcan filas duplicadas se agrega un "where". 54 - Combinaciones y funciones de agrupamiento Podemos usar "group by" y las funciones de agrupamiento con combinaciones de tab las. Para ver la cantidad de libros de cada editorial consultando la tabla "libros" y "editoriales", tipeamos: select nombre as editorial, count(*) as cantidad from editoriales e join libros l on codigoeditorial=e.codigo group by e.nombre; Las editoriales que no tienen libros no aparecen en la salida porque empleamos u n "join". Empleamos otra funcin de agrupamiento con "left join". Para conocer el mayor prec io de los libros de cada editorial usamos la funcin "max()", hacemos un "left joi n" y agrupamos por nombre de la editorial: select nombre as editorial, max(precio) as "mayor precio" from editoriales e left join libros l on codigoeditorial=e.codigo group by nombre; En la sentencia anterior, mostrar, para la editorial de la cual no haya libros, e l valor "null" en la columna calculada. 55 - Combinar ms de 2 tablas Podemos hacer un "join" con ms de dos 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 par a el enlace con la tabla "editoriales" enlazndolas por los campos correspondiente s. 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 e xiste en "editoriales", no aparecen porque realizamos una combinacin interna. Podemos combinar varios tipos de join en una misma sentencia: 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 libr os que encuentren o no coincidencia con "autores" ("right join") y a ese resulta do 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". 56 - Otros tipos de combinaciones Hemos aprendido que existen varios tipos de combinaciones en Oracle: 1) combinaciones internas (inner join o simplemente join), 2) combinaciones externas (left join, right join y full join) 3) combinaciones cruzadas (cross join). 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 resuel ven 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: select titulo,nombre as editorial from libros natural join editoriales; En el ejemplo anterior la tabla "libros" combina su campo "codigoeditorial" con el campo "codigoeditorial" de "editoriales". La clusula "on" no aparece, este "jo in" no necesita condicin de enlace porque Oracle busca los campos con nombres igu ales de ambas tablas (ambas tablas deben tener un nico campo con idntico nombre, s i tiene ms de un campo con igual nombre, Oracle no podr realizar el enlace y mostr ar un mensaje de error). 2) combinacin empleando la clusula "using": permite especificar el campo (o los ca mpos) por el cual se enlazarn las tablas; los campos de ambas tablas DEBEN tener

el mismo nombre y ser de tipos compatibles. Sintaxis: select CAMPOS from TABLA1 join TABLA2 using (CAMPOenCOMUN); Ejemplo: select titulo,nombre as editorial from libros join editoriales using (codigoeditorial); En el ejemplo anterior la tabla "libros" combina su campo "codigoeditorial" con el campo "codigoeditorial" de "editoriales". La clusula "on" no aparece, es reemp lazada por "using" seguido del nombre del campo en comn por el cual se enlazan. 3) os or La combinacin izquierda empleando "join" y el operador o modificador "(+)": Podem obtener el mismo resultado que un "left join" empleando "join" y el modificad "(+)", con lo cual se indica que se consideran los registros con valor nulo. sintaxis es la siguiente:

select CAMPOS from TABLA1 join TABLA2 on CAMPOTABLA1=CAMPOTABLA2(+); Es decir, se coloca el modificador "(+)" luego del campo de la tabla de la derec ha 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 "(+)": select titulo,nombre as editorial from libros l left join editoriales l on l.codigoeditorial = e.codigoeditorial; select titulo,nombre as editorial from libros l join editoriales e on l.codigoeditorial = e.codigoeditorial(+); Ambas mostrarn el ttulo y nombre de la editorial; los libros cuyo cdigo de editoria l no est presente en "editoriales" aparecern con el valor "null" en la columna "ed itorial". 4) combinacin derecha empleando "join" y el modificador "(+)": de modo similar al anterior, podemos obtener el mismo resultado que un "right join" empleando "joi n" y el modificador "(+)", con lo cual se indica que se consideren los registros con valor nulo. La sintaxis es la siguiente: select CAMPOS from TABLA1 join TABLA2 on CAMPOTABLA1(+)=CAMPOTABLA2; Entonces, se coloca el modificador "(+)" luego del campo de la tabla de la izqui erda 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 "(+)":

select titulo,nombre as editorial from editoriales e right join libros l on e.codigoeditorial = l.codigoeditorial; select titulo,nombre as editorial from editoriales e join libros l on e.codigoeditorial(+) = l.codigoeditorial; Ambas mostrarn el ttulo y nombre de la editorial; las editoriales que no encuentra n coincidencia en "libros", aparecen con el valor "null" en la columna "titulo". Si la condicin de combinacin es compuesta (ms de un campo), DEBE colocarse el modif icador "(+)" en todos los campos que forman parte del enlace. No se puede colocar el modificador en campos de distintas tablas. La siguiente c ombinacin producir un mensaje de error: select titulo,nombre as editorial from libros l join editoriales e on l.codigoeditorial(+)= e.codigoeditorial(+); 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 a jena. En el ejemplo de la librera en que utilizamos las tablas "libros" y "editoriales" con estos campos: libros: codigo (clave primaria), titulo, autor, codigoeditorial, precio y editoriales: codigo (clave primaria), nombre. el campo "codigoeditorial" de "libros" es una clave fornea, se emplea para enlaza r la tabla "libros" con "editoriales" y es clave primaria en "editoriales" con e l nombre "codigo". Las claves forneas y las claves primarias deben ser del mismo tipo para poder enl azarse. Si modificamos una, debemos modificar la otra para que los valores se co rrespondan. Cuando alteramos una tabla, debemos tener cuidado con las claves forneas. Si modi ficamos el tipo, longitud o atributos de una clave fornea, sta puede quedar inhabi litada 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 . 58 - Restricciones (foreign key) Hemos visto que una de las alternativas que Oracle ofrece para asegurar la integ ridad de datos es el uso de restricciones (constraints). Aprendimos que las rest ricciones se establecen en tablas y campos asegurando que los datos sean vlidos y que las relaciones entre las tablas se mantengan. Vimos tres tipos de restricciones:

primary key, unique y check. Ahora veremos "foreign key". Con la restriccin "foreign key" se define un campo (o varios) cuyos valores coinc iden 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 tab la o de otra. La integridad referencial asegura que se mantengan las referencias entre las cla ves 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, qu e no se pueda eliminar o modificar un cdigo de "editoriales" si existen libros co n dicho cdigo. La siguiente es la sintaxis parcial general para agregar una restriccin "foreign key": alter table NOMBRETABLA1 add constraint NOMBRERESTRICCION foreign key (CAMPOCLAVEFORANEA) references NOMBRETABLA2 (CAMPOCLAVEPRIMARIA); Analicmosla: - NOMBRETABLA1 referencia el nombre de la tabla a la cual le aplicamos la restri ccin, - NOMBRERESTRICCION es el nombre que le damos a la misma, - 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, - luego de "references" indicamos el nombre de la tabla referenciada y el campo que es clave primaria en la misma, a la cual hace referencia la clave fornea. El campo de la tabla referenciada debe tener definida una restriccin "primary key" o "unique"; si no la tiene, aparece un mensaje de error. Para agregar una restriccin "foreign key" al campo "codigoeditorial" de "libros", tipeamos: alter table libros add constraint FK_libros_codigoeditorial foreign key (codigoeditorial) references editoriales(codigo); 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 ejempl o, si intentamos agregar una restriccin "foreign key" a la tabla "libros" y exist e un libro con un valor de cdigo para editorial que no existe en la tabla "editor iales", la restriccin no se agrega. Acta en inserciones. Si intentamos ingresar un registro (un libro) con un valor d e clave fornea (codigoeditorial) que no existe en la tabla referenciada (editoria les), Oracle muestra un mensaje de error. Si al ingresar un registro (un libro), no colocamos el valor para el campo clave fornea (codigoeditorial), almacenar "nu ll", porque esta restriccin permite valores nulos (a menos que se haya especifica

do lo contrario al definir el campo). Acta en eliminaciones y actualizaciones. Si intentamos eliminar un registro o mod ificar un valor de clave primaria de una tabla si una clave fornea hace referenci a a dicho registro, Oracle no lo permite (excepto si se permite la accin en casca da, tema que veremos posteriormente). Por ejemplo, si intentamos eliminar una ed itorial a la que se hace referencia en "libros", aparece un mensaje de error. Esta restriccin (a diferencia de "primary key" y "unique") no crea ndice automticam ente. La cantidad y tipo de datos de los campos especificados luego de "foreign key" D EBEN coincidir con la cantidad y tipo de datos de los campos de la clusula "refer ences". Esta restriccin se puede definir dentro de la misma tabla (lo veremos ms adelante) o entre distintas tablas. Una tabla puede tener varias restricciones "foreign key". No se puede eliminar una tabla referenciada en una restriccin "foreign key", apar ece un mensaje de error. Una restriccion "foreign key" no puede modificarse, debe eliminarse (con "alter table" y "drop constraint") y volverse a crear. Las restricciones "foreign key" se eliminan automticamente al eliminar la tabla e n la que fueron definidas. Para ver informacin acerca de esta restriccin podemos consultar los diccionarios " user_constraints" y "user_cons_columns".

Вам также может понравиться