Sunteți pe pagina 1din 100

TUTORIAL DE BASE DE DATOS EN ORACLE:

Versión Oracle 10g XE (Express Edition para Windows)

FUENTE: http://www.oracleya.com.ar/index.php?inicio=0
Orden Detalle Problema
Problema
del Concepto del a
resuelto
concepto concepto resolver
1 Instalación de Oracle.
Crear tablas (create table - describe - all_tables - drop
2
table)
3 Ingresar registros (insert into- select)

4 Tipos de datos

5 Recuperar algunos campos (select)

6 Recuperar algunos registros (where)

7 Operadores relacionales

8 Borrar registros (delete)

9 Actualizar registros (update)

10 Comentarios

11 Valores nulos (null)

12 Operadores relacionales (is null)

13 Clave primaria (primary key)

14 Vaciar la tabla (truncate table)

15 Tipos de datos alfanuméricos

16 Tipos de datos numéricos

17 Ingresar algunos campos

18 Valores por defecto (default)


Operadores aritméticos y de concatenación (columnas
19
calculadas)
20 Alias (encabezados de columnas)

21 Funciones string

22 Funciones matemáticas.

23 Funciones de fechas y horas

Página 1 de 100
24 Ordenar registros (order by)

25 Operadores lógicos (and - or - not)

26 Otros operadores relacionales (between)

27 Otros operadores relacionales (in)

28 Búsqueda de patrones (like - not like)

29 Contar registros (count)

30 Funciones de grupo (count - max - min - sum - avg)

31 Agrupar registros (group by)

32 Seleccionar grupos (Having)

33 Registros duplicados (Distinct)

34 Clave primaria compuesta


Secuencias (create sequence - currval - nextval - drop
35
sequence)
36 Alterar secuencia (alter sequence)

37 Integridad de datos

38 Restricción primary key

39 Restricción unique

40 Restriccion check
Restricciones: validación y estados (validate - novalidate
41
- enable - disable)
Restricciones: información (user_constraints -
42
user_cons_columns)
43 Restricciones: eliminación (alter table - drop constraint)

44 Indices.

45 Indices (Crear - Información)

46 Indices (eliminar)

47 Varias tablas (join)

48 Combinación interna (join)

49 Combinación externa izquierda (left join)

50 Combinación externa derecha (right join)

51 Combinación externa completa (full join)

52 Combinaciones cruzadas (cross)

Página 2 de 100
53 Autocombinación

54 Combinaciones y funciones de agrupamiento

55 Combinar más de 2 tablas

56 Otros tipos de combinaciones

57 Clave foránea

58 Restricciones (foreign key)

59 Restricciones foreign key en la misma tabla

60 Restricciones foreign key (eliminación)

61 Restricciones foreign key deshabilitar y validar

62 Restricciones foreign key (acciones)

63 Información de user_constraints

64 Restricciones al crear la tabla

65 Unión

66 Intersección

67 Minus

68 Agregar campos (alter table- add)

69 Modificar campos (alter table- modify)

70 Eliminar campos (alter table- drop)

71 Agregar campos y restricciones (alter table)

72 Subconsultas

73 Subconsultas como expresion

74 Subconsultas con in

75 Subconsultas any- some- all

76 Subconsultas correlacionadas

77 Exists y No Exists

78 Subconsulta simil autocombinacion

79 Subconsulta con update y delete

80 Subconsulta e insert

81 Crear tabla a partir de otra (create table- select)

Página 3 de 100
82 Vistas (create view)

83 Vistas (información)

84 Vistas eliminar (drop view)

85 Vistas (modificar datos a través de ella)

86 Vistas (with read only)

87 Vistas modificar (create or replace view)

88 Vistas (with check option)

89 Vistas (otras consideraciones)

90 Vistas materializadas (materialized view)

91 Procedimientos almacenados

92 Procedimientos Almacenados (crear- ejecutar)

93 Procedimientos Almacenados (eliminar)

94 Procedimientos almacenados (parámetros de entrada)

95 Procedimientos almacenados (variables)

96 Procedimientos Almacenados (informacion)

97 Funciones

98 Control de flujo (if)

99 Control de flujo (case)

100 Control de flujo (loop)

101 Control de flujo (for)

102 Control de flujo (while loop)

103 Disparador (trigger)

104 Disparador (información)

105 Disparador de inserción a nivel de sentencia


Disparador de insercion a nivel de fila (insert trigger for
106
each row)
107 Disparador de borrado (nivel de sentencia y de fila)
Disparador de actualizacion a nivel de sentencia (update
108
trigger)
Disparador de actualización a nivel de fila (update
109
trigger)
Disparador de actualización - lista de campos (update
110
trigger)
Página 4 de 100
111 Disparador de múltiples eventos

112 Disparador (old y new)

113 Disparador condiciones (when)

114 Disparador de actualizacion - campos (updating)

115 Disparadores (habilitar y deshabilitar)

116 Disparador (eliminar)

117 Errores definidos por el usuario

118 Seguridad y acceso a Oracle

119 Usuarios (crear)

120 Permiso de conexión

121 Privilegios del sistema (conceder)

122 Privilegios del sistema (with admin option)


1 - Instalación de Oracle.
Para este curso utilizaremos la versión Oracle 10g XE (Express Edition para Windows) Para descargar
el mismo debemos ingresar al sitio de Oracle:

1. Oracle 10g XE
2. Para permitir descargarlo del sitio seleccionamos con el mouse el control Radio "Accept
License Agreement".
3. Luego seleccionamos la versión "Oracle Database 10g Express Edition (Universal)"
(OracleXEUniv.exe (216,933,372 bytes))
4. El sitio de Oracle requiere que nos registremos. Debemos seleccionar "sign up now" 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.
5. El paso siguiente es instalar el gestor de base de datos propiamente dicho. Ejecutamos el
archivo que acabamos de descargar: OracleXEUniv.exe
Debemos ir presionando el botón "siguiente" en el asistente de instalación, salvo cuando nos
pide ingresar la contraseña 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 aplicación que instalaremos será el "Oracle SQL Developer". Es un entorno visual que nos
permite comunicar con nuestro gestor de base de datos Oracle. Desde este entorno aprenderemos a
administrar una base de datos Oracle.

1. Debemos ingresar a la siguiente página para descargar el Oracle SQL Developer


2. Aceptamos la licencia y seleccionamos "Oracle SQL Developer for Windows (JDK1.5.0_06 is
bundled in this zip)
3. Luego de descargar el archivo procedemos a descomprimir el archivo zip en una carpeta (este
programa no requiere instalación)
4. En la carpeta donde descomprimimos debemos ejecutar el archivo sqldeveloper.exe

Página 5 de 100
2 - Crear tablas (create table - describe - all_tables - drop table)
Existen varios objetos de base de datos: tablas, constraints (restricciones), vistas, secuencias, índices,
agrupamientos (clusters), disparadores (triggers), instantaneas (snapshots), procedimientos, funciones,
paquetes, sinónimos, usuarios, perfiles, privilegios, roles, etc.

Los primeros objetos que veremos son tablas.

Una base de datos almacena su información en tablas, que es la unidad básica de almacenamiento.
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 intersección de una columna con una fila, contiene un
dato específico, 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 información que almacenará.
Cada campo (columna) también 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 específica; 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 almacenarán
cada uno de ellos, es decir, su estructura.

La sintaxis básica 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 accederemos a ella.
Creamos una tabla llamada "usuarios" y entre paréntesis 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 último.

Cuando se crea una tabla debemos indicar su nombre y definir al menos un campo con su tipo de dato.
En esta tabla "usuarios" definimos 2 campos:

- 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 cada usuario.

Página 6 de 100
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 nombres de directorios, el
primero debe ser un caracter alfabético y no puede contener espacios. La longitud máxima es de 30
caracteres.

Si intentamos crear una tabla con un nombre ya existente (existe otra tabla con ese nombre), mostrará
un mensaje indicando que a tal nombre ya lo está utilizando otro objeto y la sentencia no se ejecutará.

Para ver la estructura de una tabla usamos el comando "describe" junto al nombre de la tabla:

describe usuarios;

Aparece la siguiente información:

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 eliminar:

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 indicando tal situación y la
sentencia no se ejecuta.

Problema:

Para probar todos los ejercicios resueltos y propuestos debemos ingresar al sqldeveloper.exe y luego
en el entorno crear una nueva conexión:

1. Elegimos File -> New y seleccionamos "New Connection" y presionamos el botón "Aceptar".
2. Ingresamos los campos Connection Name (por ejemplo ingresamos "prueba"), en el campo
Username ingresamos el usuario SYSTEM y por último en el campo Password ingresamos la
clave que creamos al instalar Oracle.
3. Luego en la ventana que aparece el mansaje "Enter SQL Statement" debemos tipear los
comandos SQL y mediante el primer botón "triangulo verde" ejecutaremos el comando SQL
donde se encuentra el cursos (también podemos ejecutar todos los comando SQL mediante el
segundo botón.

Veamos las tablas existentes:

select *from all_tables;

Aparece una tabla que nos muestra todas las tablas; la columna "TABLE_NAME" contiene el nombre
de cada tabla.

Página 7 de 100
Vamos a crear una tabla denominada "usuarios". En primer lugar vamos a eliminar la tabla "usuarios"
porque si ya existe no podremos crear otra con el mismo nombre.

drop table usuarios;

Si la tabla no existe aparecerá un mensaje indicando tal situación.

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 información:

Name Null Type


-------------------------------
NOMBRE VARCHAR2(30)
CLAVE VARCHAR2(10)

Nos informa que la tabla "usuarios" tiene 2 campos, el campo "nombre" de tipo "varchar2" de 30
caracteres de longitud y el campo "clave", de tipo "varchar2" de 10 caracteres de longitud. La columna
"Null" aparece vacía y la explicaremos más adelante.

Intentemos crear una tabla con el mismo nombre, mostrará un mensaje indicando que ya hay un objeto
llamado "usuarios" y la sentencia no se ejecutará:

create table usuarios (


nombre varchar(30),
clave varchar(10)
);

Eliminemos la tabla:

drop table usuarios;

Verifiquemos si se ha eliminado:

select *from all_tables;


Página 8 de 100
no debe aparecer la tabla "usuarios".

Primer problema:

Necesita almacenar los datos de amigos en una tabla. Los datos que guardará serán: apellido, nombre,
domicilio y teléfono.

1- Elimine la tabla "agenda"


Si no existe, un mensaje indicará tal situación.

2- Intente crear una tabla llamada "*agenda"

create table *agenda(


apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);
aparece un mensaje de error indicando que usamos un caracter inválido ("*") para el nombre de la
tabla.

3- Cree una tabla llamada "agenda", debe tener los siguientes campos: apellido, varchar2(30); nombre,
varchar2(20); domicilio, varchar2 (30) y telefono, varchar2(11)
Un mensaje indica que la tabla ha sido creada exitosamente.

4- Intente crearla nuevamente.


Aparece mensaje de error indicando que el nombre ya lo tiene otro objeto.

5- Visualice las tablas existentes (all_tables)


La tabla "agenda" aparece en la lista.

6- Visualice la estructura de la tabla "agenda" (describe)


Aparece la siguiente tabla:

Name Null Type


-----------------------
APELLIDO VARCHAR2(30)
NOMBRE VARCHAR2(20)
DOMICILIO VARCHAR2(30)
TELEFONO VARCHAR2(11)

Ver solución

drop table agenda;

create table *agenda(


apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);

create table agenda(


apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);
Página 9 de 100
create table agenda(
apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);

select *from all_tables;

describe agenda;

Segundo problema:

Necesita almacenar información referente a los libros de su biblioteca personal. Los datos que
guardará serán: título del libro, nombre del autor y nombre de la editorial.

1- Elimine la tabla "libros"


Si no existe, un mensaje indica tal situación.

2- Verifique que la tabla "libros" no existe (all_tables)


No aparece en la lista.

3- Cree una tabla llamada "libros". Debe definirse con los siguientes campos: titulo, varchar2(20);
autor, varchar2(30) y editorial, varchar2(15)

4- Intente crearla nuevamente:


Aparece mensaje de error indicando que existe un objeto con el nombre "libros".

5- Visualice las tablas existentes

6- Visualice la estructura de la tabla "libros":


Aparece "libros" en la lista.

7- Elimine la tabla

8- Intente eliminar la tabla


Un mensaje indica que no existe.

Ver solución

drop table libros;

select *from all_tables;

create table libros(


titulo varchar2(20),
autor varchar2(30),
editorial varchar2(15)
);

create table libros(


titulo varchar2(20),
autor varchar2(30),
editorial varchar2(15)
);

select *from all_tables;

Página 10 de 100
describe libros;

drop table libros;

drop table libros;

3 - Ingresar registros (insert into- select)

Un registro es una fila de la tabla que contiene los datos propiamente dichos. Cada registro tiene un
dato por cada columna (campo). Nuestra tabla "usuarios" consta de 2 campos, "nombre" y "clave".

Al ingresar los datos de cada registro debe tenerse en cuenta la cantidad y el orden de los campos.

La sintaxis básica 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
paréntesis y separados por comas y luego de la cláusula "values" colocamos los valores para cada
campo, también entre paréntesis 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 inserción aparece un mensaje indicando la cantidad de registros ingresados.

Note que los datos ingresados, como corresponden a cadenas de caracteres se colocan 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 indicamos que muestre todos
los campos de la tabla "usuarios".

Aparece la tabla, sus campos y registros ingresados; si no tiene registros, aparecerían solamente los
campos y la tabla vacía).

Es importante ingresar los valores en el mismo orden en que se nombran los campos: En el siguiente
ejemplo se lista primero el campo "clave" y luego el campo "nombre" por eso, los valores también 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 campos, no aparece un
mensaje de error y los datos se guardan de modo incorrecto.

Página 11 de 100
En el siguiente ejemplo se colocan los valores en distinto orden en que se nombran los campos, el
valor de la clave (la cadena "Boca") se guardará en el campo "nombre" y el valor del nombre (la
cadena "Luis") en el campo "clave":

insert into usuarios (nombre,clave)


values ('Boca','Luis');

Problema:

Vemos si la tabla "usuarios" existe:

select *from all_tables;

Si existe la eliminamos:

drop table usuarios;

Creamos una nueva tabla denominada "usuarios" con los siguientes campos:

create table usuarios(


nombre varchar2(30),
clave varchar2(10)
);

Veamos si tiene registros:

select *from usuarios;

No tiene, la tabla aparece vacía, solamente vemos las columnas que muestran los nombres de sus
campos.

Agregamos un registro a la tabla:

insert into usuarios (nombre, clave)


values ('Mariano','payaso');

Un mensaje indica que se ingreso una fila.

Veamos nuevamente los registros de la tabla "usuarios":

select *from usuarios;

Aparece la siguiente tabla:

NOMBRE CLAVE
-------------
Mariano payaso

La tabla contiene un solo registro, el ingresado recientemente.

Ingresamos otro registro, esta vez cambiamos el orden de los campos:

insert into usuarios (clave, nombre)


values ('River','Juan');

Página 12 de 100
Ingresamos los datos en un orden distinto al orden en que se nombran los campos, no aparece un
mensaje de error y los datos se guardan de modo incorrecto:

insert into usuarios (nombre,clave)


values ('Boca','Luis');

Veamos cómo se almacenaron los datos:

select *from usuarios;

Aparece la siguiente tabla:

NOMBRE CLAVE
-------------
Mariano payaso
Juan River
Boca Luis

La tabla tiene 3 registros. Note que la clave "Boca" se guardó en el campo "nombre" y el nombre de
usuario "Luis" en el campo "clave".

Primer problema:

Trabaje con la tabla "agenda" que almacena información de sus amigos.

1- Elimine la tabla "agenda"

2- Cree una tabla llamada "agenda". Debe tener los siguientes campos: apellido (cadena de 30),
nombre (cadena de 20), domicilio (cadena de 30) y telefono (cadena de 11)

3- Visualice las tablas existentes para verificar la creación de "agenda" (all_tables)

4- Visualice la estructura de la tabla "agenda" (describe)

5- Ingrese los siguientes registros:

insert into agenda (apellido, nombre, domicilio, telefono)


values ('Moreno','Alberto','Colon 123','4234567');
insert into agenda (apellido,nombre, domicilio, telefono)
values ('Torres','Juan','Avellaneda 135','4458787');

6- Seleccione todos los registros de la tabla.

7- Elimine la tabla "agenda"

8- Intente eliminar la tabla nuevamente (aparece un mensaje de error)

Ver solución

drop table agenda;

create table agenda(


apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);
Página 13 de 100
select *from all_tables;

describe agenda;

insert into agenda (apellido, nombre, domicilio, telefono)


values ('Moreno','Alberto','Colon 123','4234567');
insert into agenda (apellido,nombre, domicilio, telefono)
values ('Torres','Juan','Avellaneda 135','4458787');

select *from agenda;

drop table agenda;

drop table agenda;

Segundo problema:

Trabaje con la tabla "libros" que almacena los datos de los libros de su propia biblioteca.

1- Elimine la tabla "libros"

2- Cree una tabla llamada "libros". Debe definirse con los siguientes campos: titulo (cadena de 20),
autor (cadena de 30) y editorial (cadena de 15)

3- Visualice las tablas existentes.

4- Visualice la estructura de la tabla "libros"

Muestra los campos y los tipos de datos de la tabla "libros".

5- Ingrese los siguientes registros:

insert into libros (titulo,autor,editorial)


values ('El aleph','Borges','Planeta');
insert into libros (titulo,autor,editorial)
values ('Martin Fierro','Jose Hernandez','Emece');
insert into libros (titulo,autor,editorial)
values ('Aprenda PHP','Mario Molina','Emece');

6- Muestre todos los registros (select) de "libros"

Ver solución

drop table libros;

create table libros(


titulo varchar2(30),
autor varchar2(30),
editorial varchar2(15)
);

select *from all_tables;

describe libros;

insert into libros (titulo,autor,editorial)


values ('El aleph','Borges','Planeta');
insert into libros (titulo,autor,editorial)
values ('Martin Fierro','Jose Hernandez','Emece');
Página 14 de 100
insert into libros (titulo,autor,editorial)
values ('Aprenda PHP','Mario Molina','Emece');

select *from libros;

4 - Tipos de datos

Ya explicamos que al crear una tabla debemos resolver qué campos (columnas) tendrá y que tipo de
datos almacenará cada uno de ellos, es decir, su estructura.

El tipo de dato especifica el tipo de información que puede guardar un campo: caracteres, números,
etc.

Estos son algunos tipos de datos básicos de Oracle (posteriormente veremos otros y con más detalle):

 - varchar2: se emplea para almacenar cadenas de caracteres. Una cadena es una secuencia de
caracteres. Se coloca entre comillas simples; ejemplo: 'Hola', 'Juan Perez', 'Colon 123'. Este
tipo de dato definen una cadena de longitud variable en la cual determinamos el máximo de
caracteres entre paréntesis. Puede guardar hasta xxx caracteres. Por ejemplo, para almacenar
cadenas de hasta 30 caracteres, definimos un campo de tipo varchar2 (30), es decir, entre
paréntesis, junto al nombre del campo colocamos la longitud.
Si intentamos almacenar una cadena de caracteres de mayor longitud que la definida, la cadena
no se carga, aparece un mensaje indicando tal situación y la sentencia 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 demasiado grande para la
columna.
 - number(p,s): se usa para guardar valores numéricos con decimales, de 1.0 x10-120 a 9.9...(38
posiciones). Definimos campos de este tipo cuando queremos almacenar valores numéricos con
los cuales luego realizaremos operaciones matemáticas, por ejemplo, cantidades, precios, etc.
Puede contener números enteros o decimales, positivos o negativos. El parámetro "p" indica la
precisión, es decir, el número de dígitos en total (contando los decimales) que contendrá el
número como máximo. El parámetro "s" especifica la escala, es decir, el máximo de dígitos
decimales. Por ejemplo, un campo definido "number(5,2)" puede contener cualquier número
entre 0.00 y 999.99 (positivo o negativo).
Para especificar número enteros, podemos omitir el parámetro "s" o colocar el valor 0 como
parámetro "s". Se utiliza como separador el punto (.).
Si intentamos almacenar un valor mayor fuera del rango permitido al definirlo, tal valor no se
carga, aparece un mensaje indicando tal situación y la sentencia no se ejecuta.
Por ejemplo, si definimos un campo de tipo number(4,2) e intentamos guardar el valor 123.45,
aparece un mensaje indicando que el valor es demasiado grande para la columna. Si
ingresamos un valor con más decimales que los definidos, el valor se carga pero con la
cantidad de decimales permitidos, los dígitos sobrantes se omiten.

Antes de crear una tabla debemos pensar en sus campos y optar por el tipo de dato adecuado para cada
uno de ellos.
Por ejemplo, si en un campo almacenaremos números telefónicos o un números de documento, usamos
"varchar2", no "number" porque si bien son dígitos, con ellos no realizamos operaciones matemáticas.
Si en un campo guardaremos apellidos, y suponemos que ningún apellido superará los 20 caracteres,
definimos el campo "varchar2(20)". Si en un campo almacenaremos precios con dos decimales que no
superarán los 999.99 pesos definimos un campo de tipo "number(5,2)", es decir, 5 dígitos en total, con
2 decimales. Si en un campo almacenaremos valores enteros de no más de 3 dígitos, definimos un
campo de tipo "number(3,0)".

Problema:
Página 15 de 100
Eliminamos la tabla "libros":

drop table libros;

Vamos a crear una tabla llamada "libros" para almacenar información de los libros de una librería.
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 numérico con 2 decimales y que no superará el valor 9999.99 y
-cantidad: valor numérico entero que no superará el valor 999.

Al crear la tabla, entonces, elegimos el tipo de dato más 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 información:

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 numéricos 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

Página 16 de 100
Veamos lo que sucede si intentamos ingresar para el campo "titulo" una cadena de más de 20
caracteres:

insert into libros (titulo,autor,editorial,precio,cantidad)


values ('Alicia en el pais de las maravillas','Lewis
Carroll','Atlantida',10,200);

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 de 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 registro no fue ingresado.

Veamos qué sucede si intentamos ingresar en el campo "precio" un valor con más decimales 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 cómo se almacenó:

select *from libros;

Oracle omitió el último dígito decimal porque el campo sólo admitía 2 decimales.

Primer problema:

Un videoclub que alquila películas en video almacena la información de sus películas en una tabla
llamada "peliculas"; para cada película necesita los siguientes datos:

-nombre, cadena de caracteres de 20 de longitud,


-actor, cadena de caracteres de 20 de longitud,
-duración, valor numérico entero que no supera los 3 dígitos.
-cantidad de copias: valor entero de un sólo dígito (no tienen más de 9 copias de
cada película).

1- Elimine la tabla "peliculas" si ya existe.

2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo.


Note que los campos "duracion" y "cantidad", que almacenarán valores sin decimales, fueron definidos
de maneras diferentes, en el primero especificamos el valor 0 como cantidad de decimales, en el
segundo no especificamos cantidad de decimales, es decir, por defecto, asume el valor 0.
Página 17 de 100
3- Vea la estructura de la tabla.

4- Ingrese los siguientes registros:

insert into peliculas (nombre, actor, duracion, cantidad)


values ('Mision imposible','Tom Cruise',128,3);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',130,2);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Mujer bonita','Julia Roberts',118,3);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',110,2);

5- Muestre todos los registros (4 registros)

6- Intente ingresar una película con valor de cantidad fuera del rango permitido:

insert into peliculas (nombre, actor, duracion, cantidad)


values ('Mujer bonita','Richard Gere',1200,10);
Mensaje de error.

7- Ingrese un valor con decimales en un nuevo registro, en el campo "duracion":

insert into peliculas (nombre, actor, duracion, cantidad)


values ('Mujer bonita','Richard Gere',120.20,4);

8- Muestre todos los registros para ver cómo se almacenó el último registro ingresado.

9- Intente ingresar un nombre de película que supere los 20 caracteres.

Ver solución

drop table peliculas;

create table peliculas(


nombre varchar2(20),
actor varchar2(20),
duracion number(3,0),
cantidad number(1)
);

describe peliculas;

insert into peliculas (nombre, actor, duracion, cantidad)


values ('Mision imposible','Tom Cruise',128,3);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',130,2);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Mujer bonita','Julia Roberts',118,3);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',110,2);

select *from peliculas;

insert into peliculas (nombre, actor, duracion, cantidad)


values ('Mujer bonita','Richard Gere',1200,10);

insert into peliculas (nombre, actor, duracion, cantidad)


values ('Mujer bonita','Richard Gere',120.20,4);

select *from peliculas:


Página 18 de 100
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Alicia en el pais de las maravillas','Animados',90,3);

Segundo problema:

Una empresa almacena los datos de sus empleados en una tabla "empleados" que guarda los siguientes
datos: nombre, documento, sexo, domicilio, sueldobasico.

1- Elimine la tabla si existe.

2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:

create table empleados(


nombre varchar2(20),
documento varchar2(8),
sexo varchar2(1),
domicilio varchar2(30),
sueldobasico number(6,2)
);

3- Verifique que la tabla existe consultando "all_tables"

4- Vea la estructura de la tabla (5 campos)

5- Ingrese algunos registros:

insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)


values ('Juan Perez','22333444','m','Sarmiento 123',500);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Ana Acosta','24555666','f','Colon 134',650);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Bartolome Barrios','27888999','m','Urquiza 479',800);

6- Seleccione todos los registros (3 registros)

7- Intente ingresar un registro con el valor "masculino" en el campo "sexo"


Un mensaje indica que el campo está definido para almacenar 1 solo caracter como máximo y está
intentando ingresar 9 caracteres.

8- Intente ingresar un valor fuera de rango, en un nuevo registro, para el campo "sueldobasico"
Mensaje de error.

9- Elimine la tabla

Ver solución

drop table empleados;

create table empleados(


nombre varchar2(20),
documento varchar2(8),
sexo varchar2(1),
domicilio varchar2(30),
sueldobasico number(6,2)
);

select *from all_tables;


Página 19 de 100
describe empleados;

insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)


values ('Juan Perez','22333444','m','Sarmiento 123',500);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Ana Acosta','24555666','f','Colon 134',650);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Bartolome Barrios','27888999','m','Urquiza 479',800);

select *from empleados;

insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)


values ('Carlos Caseres','33556688','masculino','Colon 235',900);

insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)


values ('Carlos Caseres','33556688','m','Colon 235',10000.5);

drop table empleados;

5 - Recuperar algunos campos (select)

Hemos aprendido cómo ver todos los registros de una tabla, empleando la instrucción "select".
La sintaxis básica 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, separándolos por comas:

select titulo,autor from libros;

La lista de campos luego del "select" selecciona los datos correspondientes a los campos nombrados.
En el ejemplo anterior seleccionamos los campos "titulo" y "autor" de la tabla "libros", mostrando
todos los registros.

Problema:

Trabajamos con la tabla "libros" que almacena los datos de los libros de una librería.
Eliminamos la tabla:

drop table libros;

Creamos la tabla:

create table libros(


titulo varchar2(40),
autor varchar2(30),
editorial varchar2(15),
precio number(6,2),
cantidad number(3,0)
);

Veamos la estructura de la tabla (5 campos):

describe libros;

Página 20 de 100
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 ('Alicia en el pais de las maravillas','Lewis
Carroll','Atlantida',10,200);
insert into libros (titulo,autor,editorial,precio,cantidad)
values ('Matematica estas ahi','Paenza','Siglo XXI',18.8,200);

Veamos todos los campos la tabla:

select *from libros;

Aparece la siguiente tabla:

TITULO AUTOR EDITORIAL PRECIO


CANTIDAD
----------------------------------------------------------------------------------
--------
El aleph Borges Emece 25.50 100
Alicia en el pais de las maravillas Lewis Carroll Atlantida 10 200
Matematica estas ahi Paenza Siglo XXI 18.8 200

Recuperamos solamente el título, autor y editorial de todos los libros especificando los nombres de los
campos separados por comas:

select titulo,autor,editorial from libros;

Aparece la siguiente tabla:

TITULO AUTOR EDITORIAL


-----------------------------------------------------------------
El aleph Borges Emece
Alicia en el pais de las maravillas Lewis Carroll Atlantida
Matematica estas ahi Paenza Siglo XXI

Con la siguiente sentencia seleccionamos los títulos y precios de todos los libros:

select titulo,precio from libros;

Aparece la siguiente tabla:

TITULO PRECIO
-----------------------------------------------
El aleph 25.50
Alicia en el pais de las maravillas 10
Matematica estas ahi 18.8

Para ver solamente la editorial y la cantidad de libros, tipeamos:

select editorial,cantidad from libros;

Aparece la siguiente tabla:

EDITORIAL CANTIDAD
-------------------------
Emece 100
Atlantida 200
Página 21 de 100
Siglo XXI 200

Note que en todos los casos recuperamos TODOS los registros, pero solamente ALGUNOS campos
que especificamos.

Primer problema:

Un videoclub que alquila películas en video almacena la información de sus películas en alquiler en
una tabla llamada "peliculas".

1- Elimine la tabla si existe.

2- Cree la tabla:

create table peliculas(


titulo varchar2(20),
actor varchar2(20),
duracion number(3),
cantidad number(1)
);

3- Vea la estructura de la tabla (4 campos)

4- Ingrese los siguientes registros:

insert into peliculas (titulo, actor, duracion, cantidad)


values ('Mision imposible','Tom Cruise',180,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',190,2);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mujer bonita','Julia Roberts',118,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',110,2);

5- Realice un "select" mostrando solamente el título y actor de todas las películas

6- Muestre el título y duración de todas las peliculas.

7- Muestre el título y la cantidad de copias.

Ver solución

drop table peliculas;

create table peliculas(


titulo varchar2(20),
actor varchar2(20),
duracion number(3),
cantidad number(1)
);

describe peliculas;

insert into peliculas (titulo, actor, duracion, cantidad)


values ('Mision imposible','Tom Cruise',180,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',190,2);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mujer bonita','Julia Roberts',118,3);
Página 22 de 100
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',110,2);

select titulo,actor from peliculas;

select titulo,duracion from peliculas;

select titulo,cantidad from peliculas;


Segundo problema:

Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".

1- Elimine la tabla si ya existe.

2- Cree la tabla:

create table empleados(


nombre varchar2(20),
documento varchar2(8),
sexo varchar2(1),
domicilio varchar2(30),
sueldobasico number(6,2)
);

3- Vea la estructura de la tabla (5 campos)

4- Ingrese algunos registros:

insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)


values ('Juan Juarez','22333444','m','Sarmiento 123',500);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Ana Acosta','27888999','f','Colon 134',700);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Carlos Caseres','31222333','m','Urquiza 479',850);

5- Muestre todos los datos de los empleados.

6- Muestre el nombre, documento y domicilio de los empleados.

7- Realice un "select" mostrando el documento, sexo y sueldo básico de todos los empleados.

Ver solución

drop table empleados;

create table empleados(


nombre varchar2(20),
documento varchar2(8),
sexo varchar2(1),
domicilio varchar2(30),
sueldobasico number(6,2)
);

describe empleados;

insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)


values ('Juan Juarez','22333444','m','Sarmiento 123',500);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Ana Acosta','27888999','f','Colon 134',700);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
Página 23 de 100
values ('Carlos Caseres','31222333','m','Urquiza 479',850);

select *from empleados;

select nombre,documento,domicilio
from empleados;

select documento,sexo,sueldobasico
from empleados;

6 - Recuperar algunos registros (where)

Hemos aprendido a seleccionar algunos campos de una tabla.

También es posible recuperar algunos registros.

Existe una cláusula, "where" con la cual podemos especificar condiciones para una consulta "select".
Es decir, podemos recuperar algunos registros, sólo los que cumplan con ciertas condiciones indicadas
con la cláusula "where". Por ejemplo, queremos ver el usuario cuyo nombre es "Marcelo", para ello
utilizamos "where" y luego de ella, la condición:

select nombre, clave


from usuarios
where nombre='Marcelo';

La sintaxis básica y general es la siguiente:

select NOMBRECAMPO1, ..., NOMBRECAMPOn


from NOMBRETABLA
where CONDICION;

Para las condiciones se utilizan operadores relacionales (tema que trataremos más adelante en detalle).
El signo igual(=) es un operador relacional. Para la siguiente selección de registros especificamos una
condición que solicita los usuarios cuya clave es igual a "River":

select nombre,clave
from usuarios
where clave='River';

Si ningún registro cumple la condición establecida con el "where", no aparecerá ningún registro.

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
cláusula "where":

select nombre
from usuarios
where clave='River';

En la consulta anterior solicitamos el nombre de todos los usuarios cuya clave sea igual a "River".

Problema:

Trabajamos con la tabla "usuarios" que consta de 2 campos: nombre de usuario y clave.
Eliminamos la tabla si ya existe:

Página 24 de 100
drop table usuarios;

Creamos la tabla:

create table usuarios (


nombre varchar2(30),
clave varchar2(10)
);

Vemos la estructura de la tabla:

describe usuarios;

Ingresamos algunos registros:

insert into usuarios (nombre, clave)


values ('Marcelo','Boca');
insert into usuarios (nombre, clave)
values ('JuanPerez','Juancito');
insert into usuarios (nombre, clave)
values ('Susana','River');
insert into usuarios (nombre, clave)
values ('Luis','River');

Realizamos una consulta especificando una condición, queremos ver toda la información del usuario
cuyo nombre es "Marcelo":

select *from usuarios


where nombre='Leonardo';

Nos muestra todos los campos del registro en el cual el campo "nombre" es igual a "Marcelo".

Queremos ver el nombre de los usuarios cuya clave es "River":

select nombre from usuarios


where clave='River';

Nos muestra 2 usuarios.

Realizamos un "select" de los nombres de los usuarios cuya clave es "Santi":

select nombre from usuarios


where clave='Santi';

No se muestra ningún registro ya que ninguno cumple la condición.

Primer problema:

Trabaje con la tabla "agenda" en la que registra los datos de sus amigos.

1- Elimine "agenda"

2- Cree la tabla, con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20), domicilio
(cadena de 30) y telefono (cadena de 11):

create table agenda(


apellido varchar2(30),
Página 25 de 100
nombre varchar2(30),
domicilio varchar2(30),
telefono varchar2(11)
);

3- Visualice la estructura de la tabla "agenda" (4 campos)

4- Ingrese los siguientes registros ("insert into"):

insert into agenda(apellido,nombre,domicilio,telefono) values


('Acosta', 'Ana', 'Colon 123', '4234567');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Bustamante', 'Betina', 'Avellaneda 135', '4458787');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez', 'Hector', 'Salta 545', '4887788');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez', 'Luis', 'Urquiza 333', '4545454');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez', 'Marisa', 'Urquiza 333', '4545454');

5- Seleccione todos los registros de la tabla (5 registros)

6- Seleccione el registro cuyo nombre sea "Marisa" (1 registro)

7- Seleccione los nombres y domicilios de quienes tengan apellido igual a "Lopez" (3 registros)

8- Seleccione los nombres y domicilios de quienes tengan apellido igual a "lopez" (en minúsculas)

No aparece ningún registro, ya que la cadena "Lopez" noe s igual a la cadena "lopez".

9- Muestre el nombre de quienes tengan el teléfono "4545454" (2 registros)

Ver solución

drop table agenda;

create table agenda(


apellido varchar2(30),
nombre varchar2(30),
domicilio varchar2(30),
telefono varchar2(11)
);

describe agenda;

insert into agenda(apellido,nombre,domicilio,telefono) values


('Acosta', 'Ana', 'Colon 123', '4234567');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Bustamante', 'Betina', 'Avellaneda 135', '4458787');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez', 'Hector', 'Salta 545', '4887788');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez', 'Luis', 'Urquiza 333', '4545454');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez', 'Marisa', 'Urquiza 333', '4545454');

select *from agenda;

select *from agenda


where nombre='Marisa';

Página 26 de 100
select nombre,domicilio from agenda
where apellido='Lopez';

select nombre,domicilio from agenda


where apellido='lopez';

select nombre from agenda


where telefono='4545454';

Segundo problema:

Un comercio que vende artículos de computación registra los datos de sus artículos en una tabla
llamada "articulos".

1- Elimine la tabla si existe.

2- Cree la tabla "articulos" con la siguiente estructura:

create table articulos(


codigo number(5),
nombre varchar2(20),
descripcion varchar2(30),
precio number(7,2)
);

3- Vea la estructura de la tabla:

describe articulos;

4- Ingrese algunos registros:

insert into articulos (codigo, nombre, descripcion, precio)


values (1,'impresora','Epson Stylus C45',400.80);
insert into articulos (codigo, nombre, descripcion, precio)
values (2,'impresora','Epson Stylus C85',500);
insert into articulos (codigo, nombre, descripcion, precio)
values (3,'monitor','Samsung 14',800);
insert into articulos (codigo, nombre, descripcion, precio)
values (4,'teclado','ingles Biswal',100);
insert into articulos (codigo, nombre, descripcion, precio)
values (5,'teclado','español Biswal',90);

5- Seleccione todos los datos de los registros cuyo nombre sea "impresora" (2 registros)

6- Muestre sólo el código, descripción y precio de los teclados (2 registros)

Ver solución

drop table articulos;

create table articulos(


codigo number(5),
nombre varchar2(20),
descripcion varchar2(30),
precio number(7,2)
);

describe articulos;

Página 27 de 100
insert into articulos (codigo, nombre, descripcion, precio)
values (1,'impresora','Epson Stylus C45',400.80);
insert into articulos (codigo, nombre, descripcion, precio)
values (2,'impresora','Epson Stylus C85',500);
insert into articulos (codigo, nombre, descripcion, precio)
values (3,'monitor','Samsung 14',800);
insert into articulos (codigo, nombre, descripcion, precio)
values (4,'teclado','ingles Biswal',100);
insert into articulos (codigo, nombre, descripcion, precio)
values (5,'teclado','español Biswal',90);

select *from articulos


where nombre='impresora';

select codigo,descripcion,precio from articulos


where nombre='teclado';

7 - Operadores relacionales

Los operadores son símbolos que permiten realizar operaciones matemáticas, concatenar cadenas,
hacer comparaciones.

Oracle reconoce de 4 tipos de operadores:

1) relacionales (o de comparación)
2) aritméticos
3) de concatenación
4) lógicos

Por ahora veremos solamente los primeros.

Los operadores relacionales (o de comparación) nos permiten comparar dos expresiones, 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 compare 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 ello usamos la condición:

select * from libros


where autor<>'Borges';

Página 28 de 100
Podemos comparar valores numéricos. Por ejemplo, queremos mostrar los títulos y precios 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 comprobar si un
campo cumple con una condición.

No son los únicos, existen otros que veremos mas adelante.

Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla "libros":

drop table libros;

La creamos con la siguiente estructura:

create table libros(


titulo varchar2(30),
autor varchar2(30),
editorial varchar2(15),
precio number(5,2)
);

Agregamos registros a la tabla:

insert into libros (titulo,autor,editorial,precio)


values ('El aleph','Borges','Emece',24.50);
insert into libros (titulo,autor,editorial,precio)
values ('Martin Fierro','Jose Hernandez','Emece',16.00);
insert into libros (titulo,autor,editorial,precio)
values ('Aprenda PHP','Mario Molina','Emece',35.40);
insert into libros (titulo,autor,editorial,precio)
values ('Cervantes y el quijote','Borges','Paidos',50.90);

Seleccionamos los registros cuyo autor sea diferente de 'Borges':

select *from libros


where autor<>'Borges';

Seleccionamos los registros cuyo precio supere los 20 pesos, sólo el título y precio:

select titulo,precio
from libros
where precio>20;

Página 29 de 100
Note que el valor con el cual comparamos el campo "precio", como es numérico, no se coloca entre
comillas. Los libros cuyo precio es menor a 20 pesos no aparecen en la selección.

Recuperamos aquellos libros cuyo precio es menor o igual a 30:

select *from libros


where precio<=30;

Primer problema:

Un comercio que vende artículos de computación registra los datos de sus artículos en una tabla con
ese nombre.

1- Elimine "articulos"

2- Cree la tabla, con la siguiente estructura:

create table articulos(


codigo number(5),
nombre varchar2(20),
descripcion varchar2(30),
precio number(6,2),
cantidad number(3)
);

3- Vea la estructura de la tabla.

4- Ingrese algunos registros:

insert into articulos (codigo, nombre, descripcion, precio,cantidad)


values (1,'impresora','Epson Stylus C45',400.80,20);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (2,'impresora','Epson Stylus C85',500,30);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (3,'monitor','Samsung 14',800,10);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (4,'teclado','ingles Biswal',100,50);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (5,'teclado','español Biswal',90,50);

5- Seleccione los datos de las impresoras (2 registros)

6- Seleccione los artículos cuyo precio sea mayor o igual a 400 (3 registros)

7- Seleccione el código y nombre de los artículos cuya cantidad sea menor a 30 (2 registros)

8- Selecciones el nombre y descripción de los artículos que NO cuesten $100 (4 registros)

Ver solución

drop table articulos;

create table articulos(


codigo number(5),
nombre varchar2(20),
descripcion varchar2(30),
precio number(6,2),
cantidad number(3)

Página 30 de 100
);

describe articulos;

insert into articulos (codigo, nombre, descripcion, precio,cantidad)


values (1,'impresora','Epson Stylus C45',400.80,20);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (2,'impresora','Epson Stylus C85',500,30);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (3,'monitor','Samsung 14',800,10);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (4,'teclado','ingles Biswal',100,50);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (5,'teclado','español Biswal',90,50);

select *from articulos


where nombre='impresora';

select *from articulos


where precio>=400;

select codigo,nombre
from articulos
where cantidad<30;

select nombre, descripcion


from articulos
where precio<>100;

Segundo problema:

Un video club que alquila películas en video almacena la información de sus películas en alquiler en
una tabla denominada "peliculas".

1- Elimine la tabla.

drop table peliculas;

2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:

create table peliculas(


titulo varchar2(20),
actor varchar2(20),
duracion number(3),
cantidad number(1)
);

3- Ingrese los siguientes registros:

insert into peliculas (titulo, actor, duracion, cantidad)


values ('Mision imposible','Tom Cruise',120,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',180,4);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mujer bonita','Julia R.',90,1);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',80,2);

4- Seleccione las películas cuya duración no supere los 90 minutos (2 registros)

5- Seleccione el título de todas las películas en las que el actor NO sea "Tom Cruise" (2 registros)
Página 31 de 100
6- Muestre todos los campos, excepto "duracion", de todas las películas de las que haya más de 2
copias (2 registros)

Ver solución

drop table peliculas;

create table peliculas(


titulo varchar2(20),
actor varchar2(20),
duracion number(3),
cantidad number(1)
);

insert into peliculas (titulo, actor, duracion, cantidad)


values ('Mision imposible','Tom Cruise',120,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',180,4);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mujer bonita','Julia R.',90,1);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',80,2);

select *from peliculas


where duracion<=90;

select *from peliculas


where actor<>'Tom Cruise';

select titulo,actor,cantidad
from peliculas
where cantidad >2;

8 - Borrar registros (delete)


Para eliminar los registros de una tabla usamos el comando "delete".

Sintaxis básica:

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 eliminan 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 indicar cuál o cuáles;
para ello utilizamos el comando "delete" junto con la clausula "where" con la cual establecemos la
condición que deben cumplir los registros a borrar.

Por ejemplo, queremos eliminar aquel registro cuyo nombre de usuario es "Marcelo":

delete from usuarios


where nombre='Marcelo';

Página 32 de 100
Si solicitamos el borrado de un registro que no existe, es decir, ningún registro cumple con la
condición especificada, aparecerá un mensaje indicando que ningún registro fue eliminado, pues no
encontró registros con ese dato.

Tenga en cuenta que si no colocamos una condición, se eliminan todos los registros de la tabla
especificada.

Problema:

Trabajamos con la tabla "usuarios".


Eliminamos la tabla "usuarios":

drop table usuarios;

La creamos con la siguiente estructura:

create table usuarios(


nombre varchar2(30),
clave varchar2(10)
);

Agregamos registros a la tabla:

insert into usuarios (nombre,clave)


values ('Marcelo','River');
insert into usuarios (nombre,clave)
values ('Susana','chapita');
insert into usuarios (nombre,clave)
values ('CarlosFuentes','Boca');
insert into usuarios (nombre,clave)
values ('FedericoLopez','Boca');

Seleccionamos todos los registros:

select *from usuarios;

Vamos a eliminar el registro cuyo nombre de usuario es "Marcelo":

delete from usuarios


where nombre='Marcelo';

aparece un mensaje indicando que se ha borrado 1 fila.

Intentamos eliminarlo nuevamente:

delete from usuarios


where nombre='Marcelo';

Como ningún registro cumple con la condición especificada (nombre igual a Marcelo), aparecerá un
mensaje indicando que ningún registro fue borrado.

Eliminamos todos los registros cuya clave es 'Boca':

delete from usuarios


where clave='Boca';

Página 33 de 100
Aparece un mensaje indicando que 2 registros fueron eliminados, es decir, se eliminaron los 2 registros
cuyas claves eran igual a "River".

Eliminemos todos los registros:

delete from usuarios;

Veamos el contenido de la tabla:

select * from usuarios;

No hay registros.

Primer problema:

Trabaje con la tabla "agenda" que registra la información referente a sus amigos.

1- Elimine la tabla.

2- Cree la tabla con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20), domicilio
(cadena de 30) y telefono (cadena de 11):

create table agenda(


apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);

3- Ingrese los siguientes registros (insert into):

insert into agenda(apellido,nombre,domicilio,telefono) values


('Alvarez','Alberto','Colon 123','4234567');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Juarez','Juan','Avellaneda 135','4458787');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez','Maria','Urquiza 333','4545454');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez','Jose','Urquiza 333','4545454');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Salas','Susana','Gral. Paz 1234','4123456');

4- Elimine el registro cuyo nombre sea "Juan" (1 registro)

5- Elimine los registros cuyo número telefónico sea igual a "4545454" (2 registros)

6- Elimine todos los registros (2 registros)

Ver solución

drop table agenda;

create table agenda(


apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);
Página 34 de 100
insert into agenda(apellido,nombre,domicilio,telefono) values
('Alvarez','Alberto','Colon 123','4234567');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Juarez','Juan','Avellaneda 135','4458787');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez','Maria','Urquiza 333','4545454');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Lopez','Jose','Urquiza 333','4545454');
insert into agenda(apellido,nombre,domicilio,telefono) values
('Salas','Susana','Gral. Paz 1234','4123456');

delete from agenda


where nombre='Juan';

delete from agenda


where telefono='4545454';

delete from agenda;

Segundo problema:

Un comercio que vende artículos de computación registra los datos de sus artículos en una tabla con
ese nombre.

1- Elimine "articulos"

2- Cree la tabla, con la siguiente estructura:

create table articulos(


codigo number(4,0),
nombre varchar2(20),
descripcion varchar2(30),
precio number(7,2),
cantidad number(3)
);

3- Vea la estructura de la tabla.

4- Ingrese algunos registros:

insert into articulos (codigo, nombre, descripcion, precio,cantidad)


values (1,'impresora','Epson Stylus C45',400.80,20);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (2,'impresora','Epson Stylus C85',500,30);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (3,'monitor','Samsung 14',800,10);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (4,'teclado','ingles Biswal',100,50);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (5,'teclado','español Biswal',90,50);

5- Elimine los artículos cuyo precio sea mayor o igual a 500 (2 registros)

7- Elimine todas las impresoras (1 registro)

8- Elimine todos los artículos cuyo código sea diferente a 4 (1 registro)

Ver solución

Página 35 de 100
drop table articulos;

create table articulos(


codigo number(4,0),
nombre varchar2(20),
descripcion varchar2(30),
precio number(7,2),
cantidad number(3)
);

describe libros;

insert into articulos (codigo, nombre, descripcion, precio,cantidad)


values (1,'impresora','Epson Stylus C45',400.80,20);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (2,'impresora','Epson Stylus C85',500,30);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (3,'monitor','Samsung 14',800,10);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (4,'teclado','ingles Biswal',100,50);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (5,'teclado','español Biswal',90,50);

delete from articulos


where precio>=500;

delete from articulos


where nombre='impresora';

delete from articulos


where codigo<>4;

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 básica:

update NOMBRETABLA set CAMPO=NUEVOVALOR;

Utilizamos "update" junto al nombre de la tabla y "set" junto con el campo a modificar 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 selección con
"where".

Por ejemplo, queremos cambiar el valor correspondiente a la clave de nuestro usuario llamado
"Federicolopez", queremos como nueva clave "Boca", necesitamos una condición "where" que afecte
solamente a este registro:

Página 36 de 100
update usuarios set clave='Boca'
where nombre='Federicolopez';

Si Oracle no encuentra registros que cumplan con la condición del "where", un mensaje indica que
ningún registro fue modificado.

Las condiciones no son obligatorias, pero si omitimos la cláusula "where", la actualización afectará a
todos los registros.

También podemos actualizar varios campos en una sola instrucción:

update usuarios set nombre='Marceloduarte', clave='Marce'


where nombre='Marcelo';

Para ello colocamos "update", el nombre de la tabla, "set" junto al nombre del campo y el nuevo valor
y separado por coma, el otro nombre del campo con su nuevo valor.

Problema:

Trabajamos con la tabla "usuarios".


Eliminamos la tabla:

drop table usuarios;

Creamos la tabla:

create table usuarios(


nombre varchar2(20),
clave varchar2(10)
);

Ingresamos algunos registros:

insert into usuarios (nombre,clave)


values ('Marcelo','River');
insert into usuarios (nombre,clave)
values ('Susana','chapita');
insert into usuarios (nombre,clave)
values ('Carlosfuentes','Boca');
insert into usuarios (nombre,clave)
values ('Federicolopez','Boca');

Cambiaremos los valores de todas las claves, por la cadena "RealMadrid":

update usuarios set clave='RealMadrid';

Un mensaje indica que se actualizaron 4 registros.

El cambio afectó a todos los registros, veámoslo:

select *from usuarios;

Necesitamos cambiar el valor de la clave del usuario llamado "Federicolopez" por "Boca":

update usuarios set clave='Boca'


where nombre='Federicolopez';

Página 37 de 100
Verifiquemos que la actualización se realizó:

select *from usuarios;

Vimos que si Oracle no encuentra registros que cumplan con la condición del "where", un mensaje
indica que ningún registro se modifica:

update usuarios set clave='payaso'


where nombre='JuanaJuarez';

Para actualizar varios campos en una sola instrucción empleamos:

update usuarios set nombre='Marceloduarte', clave='Marce'


where nombre='Marcelo';

Verifiquemos que la actualización se realizó:

select *from usuarios;

Primer problema:

Trabaje con la tabla "agenda" que almacena los datos de sus amigos.

1- Elimine la tabla y créela con la siguiente estructura:

drop table agenda;

create table agenda(


apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);

3- Ingrese los siguientes registros:

insert into agenda (apellido,nombre,domicilio,telefono)


values ('Acosta','Alberto','Colon 123','4234567');
insert into agenda (apellido,nombre,domicilio,telefono)
values ('Juarez','Juan','Avellaneda 135','4458787');
insert into agenda (apellido,nombre,domicilio,telefono)
values ('Lopez','Maria','Urquiza 333','4545454');
insert into agenda (apellido,nombre,domicilio,telefono)
values ('Lopez','Jose','Urquiza 333','4545454');
insert into agenda (apellido,nombre,domicilio,telefono)
values ('Suarez','Susana','Gral. Paz 1234','4123456');

4- Modifique el registro cuyo nombre sea "Juan" por "Juan Jose" (1 registro actualizado)

5- Actualice los registros cuyo número telefónico sea igual a "4545454" por "4445566" (2 registros)

6- Actualice los registros que tengan en el campo "nombre" el valor "Juan" por "Juan Jose" (ningún
registro afectado porque ninguno cumple con la condición del "where")

Ver solución

drop table agenda;

Página 38 de 100
create table agenda(
apellido varchar2(30),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2(11)
);

insert into agenda (apellido,nombre,domicilio,telefono)


values ('Acosta','Alberto','Colon 123','4234567');
insert into agenda (apellido,nombre,domicilio,telefono)
values ('Juarez','Juan','Avellaneda 135','4458787');
insert into agenda (apellido,nombre,domicilio,telefono)
values ('Lopez','Maria','Urquiza 333','4545454');
insert into agenda (apellido,nombre,domicilio,telefono)
values ('Lopez','Jose','Urquiza 333','4545454');
insert into agenda (apellido,nombre,domicilio,telefono)
values ('Suarez','Susana','Gral. Paz 1234','4123456');

update agenda set nombre='Juan Jose'


where nombre='Juan';

update agenda set telefono='4445566'


where telefono='4545454';

update agenda set nombre='Juan Jose'


where nombre='Juan';

Segundo problema:

Trabaje con la tabla "libros" de una librería.

1- Elimine la tabla y créela con los siguientes campos: titulo (cadena de 30 caracteres de longitud),
autor (cadena de 20), editorial (cadena de 15) y precio (entero no mayor a 999.99):

drop table libros;

create table libros (


titulo varchar2(30),
autor varchar2(20),
editorial varchar2(15),
precio number(5,2)
);

3- Ingrese los siguientes registros:

insert into libros (titulo, autor, editorial, precio)


values ('El aleph','Borges','Emece',25.00);
insert into libros (titulo, autor, editorial, precio)
values ('Martin Fierro','Jose Hernandez','Planeta',35.50);
insert into libros (titulo, autor, editorial, precio)
values ('Aprenda PHP','Mario Molina','Emece',45.50);
insert into libros (titulo, autor, editorial, precio)
values ('Cervantes y el quijote','Borges','Emece',25);
insert into libros (titulo, autor, editorial, precio)
values ('Matematica estas ahi','Paenza','Siglo XXI',15);

4- Muestre todos los registros (5 registros)

5- Modifique los registros cuyo autor sea igual a "Paenza", por "Adrian Paenza" (1 registro)

Página 39 de 100
6- Nuevamente, modifique los registros cuyo autor sea igual a "Paenza", por "Adrian Paenza" (ningún
registro afectado porque ninguno cumple la condición)

7- Actualice el precio del libro de "Mario Molina" a 27 pesos (1 registro)

8- Actualice el valor del campo "editorial" por "Emece S.A.", para todos los registros cuya editorial
sea igual a "Emece" (3 registros)

Ver solución

drop table libros;

create table libros (


titulo varchar2(30),
autor varchar2(20),
editorial varchar2(15),
precio number(5,2)
);

insert into libros (titulo, autor, editorial, precio)


values ('El aleph','Borges','Emece',25.00);
insert into libros (titulo, autor, editorial, precio)
values ('Martin Fierro','Jose Hernandez','Planeta',35.50);
insert into libros (titulo, autor, editorial, precio)
values ('Aprenda PHP','Mario Molina','Emece',45.50);
insert into libros (titulo, autor, editorial, precio)
values ('Cervantes y el quijote','Borges','Emece',25);
insert into libros (titulo, autor, editorial, precio)
values ('Matematica estas ahi','Paenza','Siglo XXI',15);

select *from libros;

update libros set autor='Adrian Paenza'


where autor='Paenza';

update libros set autor='Adrian Paenza'


where autor='Paenza';

update libros set precio=27


where autor='Mario Molina';

update libros set editorial='Emece S.A.'


where editorial='Emece';

10 - Comentarios
Para aclarar algunas instrucciones, en ocasiones, necesitamos agregar comentarios.

Es posible ingresar comentarios en la línea de comandos, es decir, un texto que no se ejecuta; para ello
se emplean dos guiones (--):

select *from libros;--mostramos los registros de libros

en la línea anterior, todo lo que está luego de los guiones (hacia la derecha) no se ejecuta.

Para agregar varias líneas de comentarios, se coloca una barra seguida de un asterisco (/*) al comienzo
del bloque de comentario y al finalizarlo, un asterisco seguido de una barra (*/)

select titulo, autor


/*mostramos títulos y
Página 40 de 100
nombres de los autores*/
from libros;

todo lo que está entre los símbolos "/*" y "*/" no se ejecuta.

11 - Valores nulos (null)


"null' significa "dato desconocido" o "valor inexistente".

A veces, puede desconocerse o no existir el dato correspondiente a algún 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 contraposición, tenemos campos que no pueden estar vacíos jamás.

Veamos un ejemplo. Tenemos nuestra tabla "libros". El campo "titulo" no debería estar vacío nunca,
igualmente el campo "autor". Para ello, al crear la tabla, debemos 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
definición del campo.

En el ejemplo anterior, los campos "editorial" y "precio" si admiten valores nulos.

Cuando colocamos "null" estamos diciendo que admite valores nulos (caso del campo "editorial"); por
defecto, es decir, si no lo aclaramos, los campos permiten valores nulos (caso del campo "precio").

Cualquier campo, de cualquier tipo de dato permite ser definido para aceptar o no valores nulos. Un
valor "null" NO es lo mismo que un valor 0 (cero) o una cadena de espacios en blanco (" ").

Si ingresamos los datos de un libro, para el cual aún 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 comillas.

Entonces, si un campo acepta valores nulos, podemos ingresar "null" cuando no conocemos el valor.

También podemos colocar "null" en el campo "editorial" si desconocemos el nombre de 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);

Página 41 de 100
Una cadena vacía es interpretada por Oracle como valor nulo; por lo tanto, si ingresamos una cadena
vacía, se almacena el valor "null".

Si intentamos ingresar el valor "null" (o una cadena vacía) en campos que no admiten valores nulos
(como "titulo" o "autor"), Oracle no lo permite, muestra un mensaje y la inserción 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", aparece "NOT NULL"
si el campo no admite valores nulos y no aparece en caso que si los permita.

Para recuperar los registros que contengan el valor "null" en algún campo, no podemos utilizar los
operadores relacionales vistos anteriormente: = (igual) y <> (distinto); debemos utilizar los operadores
"is null" (es igual a null) y "is not null" (no es null).

Los valores nulos no se muestran, aparece el campo vacío.

Entonces, para que un campo no permita valores nulos debemos especificarlo luego de definir el
campo, agregando "not null". Por defecto, los campos permiten valores nulos, pero podemos
especificarlo igualmente agregando "null".

Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla "libros":

drop table libros;

Creamos la tabla especificando que los campos "titulo" y "autor" no admitan valores nulos:

create table libros(


titulo varchar2(30) not null,
autor varchar2(30) not null,
editorial varchar2(15) null,
precio number(5,2)
);

Los campos "editorial" y "precio" si permiten valores nulos; el primero, porque lo especificamos
colocando "null" en la definición del campo, el segundo lo asume por defecto.

Agregamos un registro a la tabla con valor nulo para el campo "precio":

insert into libros (titulo,autor,editorial,precio)


values('El aleph','Borges','Emece',null);

Veamos cómo se almacenó el registro:

select *from libros;

No aparece ningún valor en la columna "precio".

Ingresamos otro registro, con valor nulo para el campo "editorial", campo que admite valores "null":
Página 42 de 100
insert into libros (titulo,autor,editorial,precio)
values('Alicia en el pais','Lewis Carroll',null,0);

Veamos cómo se almacenó el registro:

select *from libros;

No aparece ningún valor en la columna "editorial".

Ingresamos otro registro, con valor nulo para los dos campos que lo admiten:

insert into libros (titulo,autor,editorial,precio)


values('Aprenda PHP','Mario Molina',null,null);

Veamos cómo se almacenó el registro:

select *from libros;

No aparece ningún valor en ambas columnas.

Veamos lo que sucede si intentamos ingresar el valor "null" en campos que no lo admiten, como
"titulo":

insert into libros (titulo,autor,editorial,precio)


values(null,'Borges','Siglo XXI',25);

aparece un mensaje indicando que no se puede realizar una inserción "null" y la sentencia no se
ejecuta.

Para ver cuáles campos admiten valores nulos y cuáles no, vemos la estructura de la tabla:

describe libros;

nos muestra, en la columna "Null", que los campos "titulo" y "autor" están definidos "not null", es
decir, no permiten valores nulos, los otros dos campos si los admiten.

Dijimos que la cadena vacía es interpretada como valor "null". Vamos a ingresar un registro con
cadena vacía para el campo "editorial":

insert into libros (titulo,autor,editorial,precio)


values('Uno','Richard Bach','',18.50);

Veamos cómo se almacenó el registro:

select *from libros;

No aparece ningún valor en la columna "editorial" del libro "Uno", almacenó "null".

Intentamos ingresar una cadena vacía en el campo "titulo":

insert into libros (titulo,autor,editorial,precio)


values('','Richard Bach','Planeta',22);

Mensaje de error indicando que el campo no admite valores nulos.

Página 43 de 100
Dijimos que una cadena de espacios NO es igual a una cadena vacía o valor "null". Vamos a ingresar
un registro y en el campo "editorial" guardaremos una cadena de 3 espacios:

insert into libros (titulo,autor,editorial,precio)


values('Don quijote','Cervantes',' ',20);

Veamos cómo se almacenó el registro:

select *from libros;

Se muestra la cadena de espacios.

Recuperamos los registros que contengan en el campo "editorial" una cadena de 3 espacios:

select *from libros where editorial=' ';

Primer problema:

Una farmacia guarda información referente a sus medicamentos en una tabla llamada "medicamentos".

1- Elimine la tabla y créela con la siguiente estructura:

drop table medicamentos;


create table medicamentos(
codigo number(5) not null,
nombre varchar2(20) not null,
laboratorio varchar2(20),
precio number(5,2),
cantidad number(3,0) not null
);

3- Visualice la estructura de la tabla "medicamentos"


note que los campos "codigo", "nombre" y "cantidad", en la columna "Null" muestra "NOT NULL".

4- Ingrese algunos registros con valores "null" para los campos que lo admitan:

insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)


values(1,'Sertal gotas',null,null,100);
insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)
values(2,'Sertal compuesto',null,8.90,150);
insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)
values(3,'Buscapina','Roche',null,200);

5- Vea todos los registros.

6- Ingrese un registro con valor "0" para el precio y cadena vacía para el laboratorio.

7- Intente ingresar un registro con cadena vacía para el nombre (mensaje de error)

8- Intente ingresar un registro con valor nulo para un campo que no lo admite (aparece un mensaje de
error)

9- Ingrese un registro con una cadena de 1 espacio para el laboratorio.

10- Recupere los registros cuyo laboratorio contenga 1 espacio (1 registro)

Página 44 de 100
11- Recupere los registros cuyo laboratorio sea distinto de ' '(cadena de 1 espacio) (1 registro)

Ver solución

drop table medicamentos;


create table medicamentos(
codigo number(5) not null,
nombre varchar2(20) not null,
laboratorio varchar2(20),
precio number(5,2),
cantidad number(3,0) not null
);

describe medicamentos;

insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)


values(1,'Sertal gotas',null,null,100);
insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)
values(2,'Sertal compuesto',null,8.90,150);
insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)
values(3,'Buscapina','Roche',null,200);

select *from medicamentos;

insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad)


values(4,'Bayaspirina','',0,150);

insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)


values(0,'','Bayer',15.60,200);

insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)


values(null,'Amoxidal jarabe','Bayer',25,120);

insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad)


values(5,'Geniol',' ',0.5,200);

select *from medicamentos where laboratorio=' ';

select *from medicamentos where laboratorio<>' ';

Segundo problema:

Trabaje con la tabla que almacena los datos sobre películas, llamada "peliculas".

1- Elimine la tabla:

2- Créela con la siguiente estructura:

create table peliculas(


codigo number(4) not null,
titulo varchar2(40) not null,
actor varchar2(20),
duracion number(3)
);

3- Visualice la estructura de la tabla.


note que el campo "codigo" y "titulo", en la columna "Null" muestran "NOT NULL".

4- Ingrese los siguientes registros:

insert into peliculas (codigo,titulo,actor,duracion)


Página 45 de 100
values(1,'Mision imposible','Tom Cruise',120);
insert into peliculas (codigo,titulo,actor,duracion)
values(2,'Harry Potter y la piedra filosofal',null,180);
insert into peliculas (codigo,titulo,actor,duracion)
values(3,'Harry Potter y la camara secreta','Daniel R.',null);
insert into peliculas (codigo,titulo,actor,duracion)
values(0,'Mision imposible 2','',150);
insert into peliculas (codigo,titulo,actor,duracion)
values(4,'Titanic','L. Di Caprio',220);
insert into peliculas (codigo,titulo,actor,duracion)
values(5,'Mujer bonita','R. Gere-J. Roberts',0);

5- Recupere todos los registros para ver cómo Oracle los almacenó.

6- Intente ingresar un registro con valor nulo para campos que no lo admiten (aparece un mensaje de
error)

7- Muestre todos los registros.

8- Actualice la película en cuyo campo "duracion" hay 0 por "null" (1 registro)

9- Recupere todos los registros.

Ver solución

drop table peliculas;

create table peliculas(


codigo number(4) not null,
titulo varchar2(40) not null,
actor varchar2(20),
duracion number(3)
);

describe peliculas;

insert into peliculas (codigo,titulo,actor,duracion)


values(1,'Mision imposible','Tom Cruise',120);
insert into peliculas (codigo,titulo,actor,duracion)
values(2,'Harry Potter y la piedra filosofal',null,180);
insert into peliculas (codigo,titulo,actor,duracion)
values(3,'Harry Potter y la camara secreta','Daniel R.',null);
insert into peliculas (codigo,titulo,actor,duracion)
values(0,'Mision imposible 2','',150);
insert into peliculas (codigo,titulo,actor,duracion)
values(4,'Titanic','L. Di Caprio',220);
insert into peliculas (codigo,titulo,actor,duracion)
values(5,'Mujer bonita','R. Gere-J. Roberts',0);

select *from peliculas;

insert into peliculas (codigo,titulo,actor,duracion)


values(null,'Mujer bonita','R. Gere-J. Roberts',190);

select *from peliculas;

update peliculas set duracion=null where duracion=0;

select *from peliculas;

12 - Operadores relacionales (is null)


Página 46 de 100
Para recuperar los registros que contengan el valor "null" en algún campo, no podemos utilizar los
operadores relacionales vistos anteriormente: = (igual) y <> (distinto); debemos utilizar los operadores
"is null" (es igual a null) y "is not null" (no es null).

Con la siguiente sentencia recuperamos los libros que contienen valor nulo en el campo "editorial":

select *from libros


where editorial is null;

Recuerde que los valores nulos no se muestran, aparece el campo vacío.

Las siguientes sentencias tendrán 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 "null" (desconocido); con
la segunda, los libros cuya editorial guarda una cadena de 3 espacios en blanco.

Para obtener los registros que no contienen "null", se puede emplear "is not null", esto mostrará los
registros con valores conocidos.

Para ver los libros que NO tienen valor "null" en el campo "precio" tipeamos:

select *from libros where precio is not null;

Problema:

Trabajamos con la tabla "libros" de una librería.


Eliminamos la tabla y la creamos:

drop table libros;

create table libros(


codigo number(4) not null,
titulo varchar2(40) not null,
autor varchar2(20),
editorial varchar2(20),
precio number(6,2)
);

Ingresamos algunos registros:

insert into libros


values(1,'El aleph','Borges','Emece',15.90);
insert into libros
values(2,'Cervantes y el quijote','Borges','Paidos',null);
insert into libros
values(3,'Alicia en el pais de las maravillas','Lewis Carroll',null,19.90);
insert into libros
values(4,'Martin Fierro','Jose Hernandez','Emece',25.90);
insert into libros (codigo,titulo,autor,precio)
values(5,'Antología poética','Borges',25.50);
insert into libros (codigo,titulo,autor)
values(6,'Java en 10 minutos','Mario Molina');
insert into libros (codigo,titulo,autor)
values(7,'Martin Fierro','Jose Hernandez');
insert into libros (codigo,titulo,autor)
values(8,'Aprenda PHP',null);
Página 47 de 100
Recuperamos los registros en los cuales esté almacenado el valor "null" en el campo "editorial":

select *from libros


where editorial is null;

Seleccionamos los libros que no contiene "null" en "autor":

select *from libros


where editorial is not null;

Dijimos que una cadena de espacios NO es igual a una cadena vacía o valor "null". Vamos a ingresar
un registro y en el campo "editorial" guardaremos una cadena de 3 espacios:

insert into libros (codigo,titulo,autor,editorial,precio)


values(9,'Don quijote','Cervantes',' ',20);

Veamos cómo se almacenó el registro:

select *from libros;

Se muestra la cadena de espacios.

Recuperamos los registros que contengan el valor "null" en el campo "editorial" y luego aquellos que
tengan una cadena de 3 espacios:

select *from libros where editorial is null;


select *from libros where editorial=' ';

Con la primera sentencia veremos los libros cuya editorial es igual a "null" (desconocido); con la
segunda, los libros cuya editorial almacena una cadena de espacios.

Primer problema:

Una farmacia guarda información referente a sus medicamentos en una tabla llamada "medicamentos".

1- Elimine la tabla y créela con la siguiente estructura:

drop table medicamentos;


create table medicamentos(
codigo number(5) not null,
nombre varchar2(20) not null,
laboratorio varchar2(20),
precio number(5,2),
cantidad number(3,0) not null
);

3- Visualice la estructura de la tabla "medicamentos"

note que los campos "codigo", "nombre" y "cantidad", en la columna "Null" muestra "NOT NULL".

4- Ingrese algunos registros con valores "null" para los campos que lo admitan:

insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)


values(1,'Sertal gotas',null,null,100);
insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)
values(2,'Sertal compuesto',null,8.90,150);
insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)
Página 48 de 100
values(3,'Buscapina','Roche',null,200);

5- Vea todos los registros.

6- Ingrese un registro con valor "0" para el precio y cadena vacía para el laboratorio.

7- Intente ingresar un registro con cadena vacía para el nombre (mensaje de error)

8- Intente ingresar un registro con valor nulo para un campo que no lo admite (aparece un mensaje de
error)

9- Recupere los registros que contengan valor "null" en el campo "laboratorio" (3 registros)

10- Recupere los registros que contengan valor "null" en el campo "precio", luego los que tengan el
valor 0 en el mismo campo. Note que el resultado es distinto (2 y 1 registros respectivamente)

11- Recupere los registros cuyo laboratorio no contenga valor nulo (1 registro)

12- Recupere los registros cuyo precio sea distinto de 0, luego los que sean distintos de "null" (1 y 2
resgistros respectivamente)
Note que la salida de la primera sentencia no muestra los registros con valor 0 y tampoco los que
tienen valor nulo; el resultado de la segunda sentencia muestra los registros con valor para el campo
precio (incluso el valor 0).

13- Ingrese un registro con una cadena de 1 espacio para el laboratorio.

14- Recupere los registros cuyo laboratorio sea "null" y luego los que contengan 1 espacio (3 y 1
registros respectivamente)

Note que la salida de la primera sentencia no muestra los registros con valores para el campo
"laboratorio" (un caracter espacio es un valor); el resultado de la segunda sentencia muestra los
registros con el valor " " para el campo precio.

15- Recupere los registros cuyo laboratorio sea distinto de ' '(cadena de 1 espacio), luego los que sean
distintos de "null" (1 y 2 registros respectivamente)
Note que la salida de la primera sentencia no muestra los registros con valor ' ' y tampoco los que
tienen valor nulo; el resultado de la segunda sentencia muestra los registros con valor para el campo
laboratorio (incluso el valor ' ')

Ver solución

drop table medicamentos;


create table medicamentos(
codigo number(5) not null,
nombre varchar2(20) not null,
laboratorio varchar2(20),
precio number(5,2),
cantidad number(3,0) not null
);

describe medicamentos;

insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)


values(1,'Sertal gotas',null,null,100);
insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)
values(2,'Sertal compuesto',null,8.90,150);
Página 49 de 100
insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)
values(3,'Buscapina','Roche',null,200);

select *from medicamentos;

insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad)


values(4,'Bayaspirina','',0,150);

insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)


values(0,'','Bayer',15.60,200);

insert into medicamentos (codigo,nombre,laboratorio,precio,cantidad)


values(null,'Amoxidal jarabe','Bayer',25,120);

select *from medicamentos


where laboratorio is null;

select *from medicamentos where precio is null;


select *from medicamentos where precio=0;

select *from medicamentos where laboratorio is not null;

select *from medicamentos where precio<>0;


select *from medicamentos where precio is not null;

insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad)


values(5,'Geniol',' ',0.5,200);

select *from medicamentos where laboratorio is null;


select *from medicamentos where laboratorio=' ';

select *from medicamentos where laboratorio<>' ';


select *from medicamentos where laboratorio is not null;

Segundo problema:

Trabaje con la tabla que almacena los datos sobre películas, llamada "peliculas".

1- Elimine la tabla:

drop table peliculas;

2- Créela con la siguiente estructura:

create table peliculas(


codigo number(4) not null,
titulo varchar2(40) not null,
actor varchar2(20),
duracion number(3)
);

3- Visualice la estructura de la tabla. note que el campo "codigo" y "titulo", en la columna "Null"
muestran "NOT NULL".

4- Ingrese los siguientes registros:

insert into peliculas (codigo,titulo,actor,duracion)


values(1,'Mision imposible','Tom Cruise',120);
insert into peliculas (codigo,titulo,actor,duracion)
values(2,'Harry Potter y la piedra filosofal',null,180);
insert into peliculas (codigo,titulo,actor,duracion)
values(3,'Harry Potter y la camara secreta','Daniel R.',null);
Página 50 de 100
insert into peliculas (codigo,titulo,actor,duracion)
values(0,'Mision imposible 2','',150);
insert into peliculas (codigo,titulo,actor,duracion)
values(4,'Titanic','L. Di Caprio',220);
insert into peliculas (codigo,titulo,actor,duracion)
values(5,'Mujer bonita','R. Gere-J. Roberts',0);

5- Recupere todos los registros para ver cómo Oracle los almacenó.

6- Intente ingresar un registro con valor nulo para campos que no lo admiten (aparece un mensaje de
error)

7- Muestre los registros con valor nulo en el campo "actor" (2 registros)

8- Actualice los registros que tengan valor de duración desconocido (nulo) por "120" (1 registro
actualizado)

9- Coloque 'Desconocido' en el campo "actor" en los registros que tengan valor nulo en dicho campo
(2 registros)

10- Muestre todos los registros

11- Muestre todos los registros con valor nulo en el campo "actor" (ninguno)

12- Actualice la película en cuyo campo "duracion" hay 0 por "null" (1 registro)

13- Recupere todos los registros.

14- Borre todos los registros en los cuales haya un valor nulo en "duracion" (1 registro)

15- Verifique que se eliminó recuperando todos los registros.

Ver solución

drop table peliculas;

create table peliculas(


codigo number(4) not null,
titulo varchar2(40) not null,
actor varchar2(20),
duracion number(3)
);

describe peliculas;

insert into peliculas (codigo,titulo,actor,duracion)


values(1,'Mision imposible','Tom Cruise',120);
insert into peliculas (codigo,titulo,actor,duracion)
values(2,'Harry Potter y la piedra filosofal',null,180);
insert into peliculas (codigo,titulo,actor,duracion)
values(3,'Harry Potter y la camara secreta','Daniel R.',null);
insert into peliculas (codigo,titulo,actor,duracion)
values(0,'Mision imposible 2','',150);
insert into peliculas (codigo,titulo,actor,duracion)
values(4,'Titanic','L. Di Caprio',220);
insert into peliculas (codigo,titulo,actor,duracion)
values(5,'Mujer bonita','R. Gere-J. Roberts',0);

select *from peliculas;


Página 51 de 100
insert into peliculas (codigo,titulo,actor,duracion)
values(null,'Mujer bonita','R. Gere-J. Roberts',190);

select *from peliculas where actor is null;

update peliculas set duracion=120 where duracion is null;

update peliculas set actor='Desconocido'


where actor is null;

select *from peliculas;

select *from peliculas where actor is null;

update peliculas set duracion=null where duracion=0;

select *from peliculas;

delete from peliculas


where duracion is null;

select *from peliculas;

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 número de documento puede
establecerse como clave primaria, es un valor que no se repite; puede haber personas con igual apellido
y nombre, incluso el mismo domicilio (padre e hijo por ejemplo), pero su documento será siempre
distinto.

Si tenemos la tabla "usuarios", el nombre de cada usuario puede establecerse como clave primaria, es
un valor que no se repite; puede haber usuarios con igual clave, pero su nombre de usuario será
siempre diferente.

Podemos establecer que un campo sea clave primaria al momento de crear la tabla o luego que ha sido
creada. Vamos a aprender a establecerla al crear la tabla. No existe una única manera de hacerlo, por
ahora veremos la sintaxis más sencilla.

Tenemos nuestra tabla "usuarios" definida con 2 campos ("nombre" y "clave").

La sintaxis básica y general es la siguiente:

create table NOMBRETABLA(


CAMPO TIPO,
...,
CAMPO TIPO,
PRIMARY KEY (CAMPO)
);

Lo que hacemos agregar, luego de la definición de cada campo, "primary key" y entre paréntesis, el
nombre del campo que será clave primaria.

En el siguiente ejemplo definimos una clave primaria, para nuestra tabla "usuarios" para asegurarnos
que cada usuario tendrá un nombre diferente y único:

Página 52 de 100
create table usuarios(
nombre varchar2(20),
clave varchar2(10),
primary key(nombre)
);

Una tabla sólo puede tener una clave primaria. Cualquier campo (de cualquier tipo) puede ser clave
primaria, debe cumplir como requisito, que sus valores no se repitan ni sean nulos. Por ello, al definir
un campo como clave primaria, automáticamente Oracle lo convierte a "not null".

Luego de haber establecido un campo como clave primaria, al ingresar los registros, Oracle controla
que los valores para el campo establecido como clave primaria no estén repetidos en la tabla; si
estuviesen repetidos, muestra un mensaje y la inserción no se realiza. Es decir, si en nuestra tabla
"usuarios" ya existe un usuario con nombre "juanperez" e intentamos ingresar un nuevo usuario con
nombre "juanperez", aparece un mensaje y la instrucción "insert" no se ejecuta.

Igualmente, si realizamos una actualización, Oracle controla que los valores para el campo establecido
como clave primaria no estén repetidos en la tabla, si lo estuviese, aparece un mensaje indicando que
se viola la clave primaria y la actualización 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, sólo la ejecutaremos; si la consulta retorna una
tabla vacía, significa que la tabla especificada no tiene clave primaria. El nombre de la tabla DEBE ir
en mayúsculas, sino Oracle no la encontrará.

Problema:

Trabajamos con la tabla "usuarios".

Eliminamos la tabla:

drop table usuarios;

Creamos la tabla definiendo el campo "nombre" como clave primaria:

create table usuarios(


nombre varchar2(20),
clave varchar2(10),
primary key (nombre)
);

Al campo "nombre" no lo definimos "not null", pero al establecerse como clave primaria, Oracle lo
convierte en "not null", veamos que en la columna "NULL" aparece "NOT NULL":

describe usuarios;

Ingresamos algunos registros:

insert into usuarios (nombre, clave)

Página 53 de 100
values ('juanperez','Boca');
insert into usuarios (nombre, clave)
values ('raulgarcia','River');

Recordemos que cuando un campo es clave primaria, sus valores no se repiten. Intentamos ingresar un
valor de clave primaria existente:

insert into usuarios (nombre, clave)


values ('juanperez','payaso');

aparece un mensaje de error y la sentencia no se ejecuta.

Cuando un campo es clave primaria, sus valores no pueden ser nulos. Intentamos ingresar el valor
"null" en el campo clave primaria:

insert into usuarios (nombre, clave)


values (null,'payaso');

aparece un mensaje de error y la sentencia no se ejecuta.

Si realizamos alguna actualización, Oracle controla que los valores para el campo establecido como
clave primaria no estén repetidos en la tabla. Intentemos actualizar el nombre de un usuario colocando
un nombre existente:

update usuarios set nombre='juanperez'


where nombre='raulgarcia';

aparece un mensaje indicando que se viola la clave primaria y la actualización no se realiza.

Corroboramos que la tabla "usuarios" tiene establecido el campo "nombre" como clave primaria
realizando la siguiente consulta (Recuerde colocar el nombre de la tabla en mayúsculas, sino Oracle
considerará que no existe la tabla):

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';

Aparece la siguiente tabla:

TABLE_NAME COLUMN_NAME
--------------------------------------------
USUARIOS NOMBRE

indicando que la tabla "usuarios" tiene establecido el campo "nombre" como clave primaria.

Primer problema:

Trabaje con la tabla "libros" de una librería.

1- Elimine la tabla:

drop table libros;

2- Créela con los siguientes campos, estableciendo como clave primaria el campo "codigo":
Página 54 de 100
create table libros(
codigo number(4) not null,
titulo varchar2(40) not null,
autor varchar2(20),
editorial varchar2(15),
primary key (codigo)
);

3- Ingrese los siguientes registros:

insert into libros (codigo,titulo,autor,editorial)


values (1,'El aleph','Borges','Emece');
insert into libros (codigo,titulo,autor,editorial)
values (2,'Martin Fierro','Jose Hernandez','Planeta');
insert into libros (codigo,titulo,autor,editorial)
values (3,'Aprenda PHP','Mario Molina','Nuevo Siglo');

4- Ingrese un registro con código repetido (aparece un mensaje de error)

5- Intente ingresar el valor "null" en el campo "codigo"

6- Intente actualizar el código del libro "Martin Fierro" a "1" (mensaje de error)

7- Actualice el código del libro "Martin Fierro" a "10"

8- Vea qué campo de la tabla "LIBROS" fue establecido como clave primaria

9- Vea qué campo de la tabla "libros" (en minúsculas) fue establecido como clave primaria

La tabla aparece vacía porque Oracle no encuentra la tabla "libros", ya que almacena los nombres de
las tablas con mayúsculas.

Ver solución

drop table libros;

create table libros(


codigo number(4) not null,
titulo varchar2(40) not null,
autor varchar2(20),
editorial varchar2(15),
primary key (codigo)
);

insert into libros (codigo,titulo,autor,editorial)


values (1,'El aleph','Borges','Emece');
insert into libros (codigo,titulo,autor,editorial)
values (2,'Martin Fierro','Jose Hernandez','Planeta');
insert into libros (codigo,titulo,autor,editorial)
values (3,'Aprenda PHP','Mario Molina','Nuevo Siglo');

insert into libros (codigo,titulo,autor,editorial)


values (2,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta');

insert into libros (codigo,titulo,autor,editorial)


values (null,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta');

update libros set codigo=1


where titulo='Martin Fierro';

Página 55 de 100
update libros set codigo=10
where titulo='Martin Fierro';

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='LIBROS';

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='libros';

Segundo problema:

Un instituto de enseñanza almacena los datos de sus estudiantes en una tabla llamada "alumnos".

1- Elimine la tabla "alumnos":

drop table alumnos;

2- Cree la tabla con la siguiente estructura intentando establecer 2 campos como clave primaria, el
campo "documento" y "legajo":

create table alumnos(


legajo varchar2(4) not null,
documento varchar2(8),
nombre varchar2(30),
domicilio varchar2(30),
primary key(codigo),
primary key(documento)
);

Un mensaje indica la tabla solamente puede tener UNA clave primaria.

3- Cree la tabla estableciendo como clave primaria el campo "documento":

create table alumnos(


legajo varchar2(4) not null,
documento varchar2(8),
nombre varchar2(30),
domicilio varchar2(30),
primary key(documento)
);

4- Verifique que el campo "documento" no admite valores nulos

5- Ingrese los siguientes registros:

insert into alumnos (legajo,documento,nombre,domicilio)


values('A233','22345345','Perez Mariana','Colon 234');
insert into alumnos (legajo,documento,nombre,domicilio)
values('A567','23545345','Morales Marcos','Avellaneda 348');

6- Intente ingresar un alumno con número de documento existente (no lo permite)

7- Intente ingresar un alumno con documento nulo (no lo permite)

Página 56 de 100
8- Vea el campo clave primaria de "ALUMNOS".

Ver solución

drop table alumnos;

create table alumnos(


legajo varchar2(4) not null,
documento varchar2(8),
nombre varchar2(30),
domicilio varchar2(30),
primary key(codigo),
primary key(documento)
);

create table alumnos(


legajo varchar2(4) not null,
documento varchar2(8),
nombre varchar2(30),
domicilio varchar2(30),
primary key(documento)
);

describe alumnos;

insert into alumnos (legajo,documento,nombre,domicilio)


values('A233','22345345','Perez Mariana','Colon 234');
insert into alumnos (legajo,documento,nombre,domicilio)
values('A567','23545345','Morales Marcos','Avellaneda 348');

insert into alumnos (legajo,documento,nombre,domicilio)


values('A642','23545345','Gonzalez Analia','Caseros 444');

insert into alumnos (legajo,documento,nombre,domicilio)


values('A685',null,'Miranda Carmen','Uspallata 999');

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='ALUMNOS';

14 - Vaciar la tabla (truncate table)


Aprendimos que para borrar todos los registro de una tabla se usa "delete" sin condición "where".
También podemos eliminar todos los registros de una tabla con "truncate table". Sintaxis:

truncate table NOMBRETABLA;

Por ejemplo, queremos vaciar la tabla "libros", usamos:

truncate table libros;

La sentencia "truncate table" vacía la tabla (elimina todos los registros) y conserva la estructura de la
tabla.

La diferencia con "drop table" es que esta sentencia elimina la tabla, no solamente los registros,
"truncate table" la vacía de registros.

Página 57 de 100
La diferencia con "delete" es la siguiente, al emplear "delete", Oracle guarda una copia de los registros
borrados y son recuperables, con "truncate table" no es posible la recuperación porque se libera todo el
espacio en disco ocupado por la tabla; por lo tanto, "truncate table" es más rápido que "delete" (se nota
cuando la cantidad de registros es muy grande).

Problema:

Trabajamos con la tabla "libros" que almacena los datos de los libros de una librería.

Eliminamos la tabla:

drop table libros;

Creamos la tabla:

create table libros(


codigo number(4),
titulo varchar2(30),
autor varchar2(20),
editorial varchar2(15),
precio number(5,2)
);

Agregamos algunos registros:

insert into libros (codigo,titulo,autor,editorial,precio)


values (1,'El aleph','Borges','Emece',25.60);
insert into libros (codigo,titulo,autor,editorial,precio)
values (2,'Uno','Richard Bach','Planeta',18);

Seleccionamos todos los registros:

select *from libros;

Truncamos la tabla:

truncate table libros;

Si consultamos la tabla, vemos que aún existe pero ya no tiene registros:

select *from libros;

Ingresamos nuevamente algunos registros:

insert into libros (codigo,titulo,autor,editorial,precio)


values (1,'El aleph','Borges','Emece',25.60);
insert into libros (codigo,titulo,autor,editorial,precio)
values (2,'Uno','Richard Bach','Planeta',18);

Eliminemos todos los registros con "delete":

delete from libros;

Si consultamos la tabla, vemos que aún existe pero ya no tiene registros:

select *from libros;

Página 58 de 100
Ingresamos nuevamente algunos registros:

insert into libros (codigo,titulo,autor,editorial,precio)


values (1,'El aleph','Borges','Emece',25.60);
insert into libros (codigo,titulo,autor,editorial,precio)
values (2,'Uno','Richard Bach','Planeta',18);

Eliminamos la tabla:

drop table libros;

Intentamos seleccionar todos los registros:

select *from libros;

Aparece un mensaje de error, la tabla no existe.

15 - Tipos de datos alfanuméricos


Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir los campos
y sus tipos más precisos, según el caso.

Para almacenar valores alfanuméricos (texto) usamos cadenas de caracteres.

Las cadenas se colocan entre comillas simples.

Podemos almacenar letras, símbolos y dígitos con los que no se realizan operaciones matemáticas, por
ejemplo, códigos de identificación, números de documentos, números telefónicos. Tenemos los
siguientes tipos:

1) char(x): define una cadena de caracteres de longitud fija determinada por el argumento "x". Si se
omite el argumento, por defecto coloca 1. "char" viene de character, que significa caracter en inglés.
Su rango es de 1 a 2000 caracteres.

Que sea una cadena de longitud fija significa que, si definimos un campo como "char(10)" y
almacenamos el valor "hola" (4 caracteres), Oracle rellenará las 6 posiciones restantes con espacios, es
decir, ocupará las 10 posiciones; por lo tanto, si la longitud es invariable, es conveniente utilizar el tipo
char; caso contrario, el tipo varchar2.
Si almacenamos "hola" en un campo definido "char(10)" Oracle almacenará "hola ".

2) varchar2(x): almacena cadenas de caracteres de longitud variable determinada por el argumento "x"
(obligatorio). Que sea una cadena de longitud variable significa que, si definimos un campo como
"varchar2(10)" y almacenamos el valor "hola" (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 almacenamiento 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 caracteres Unicode; su rango
va de 1 a 2000 caracteres porque se emplean 2 bytes por cada caracter.

5 y 6) varchar(x) y char2(x): disponibles en Oracle8.


Página 59 de 100
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 alfanuméricos.

En general se usarán los 2 primeros.

Si intentamos almacenar en un campo alfanumérico una cadena de caracteres de mayor longitud que la
definida, aparece un mensaje indicando que el valor es demasiado 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 numérico (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
hubiésemos tipeado '12345', igualmente, si ingresamos el valor 23.56, lo convierte a '23.56'. Si el valor
numérico, al ser convertido a cadena supera la longitud definida, aparece un mensaje de error y la
sentencia no se ejecuta.

Es importante elegir el tipo de dato adecuado según el caso.

Para almacenar cadenas que varían en su longitud, es decir, no todos los registros tendrán 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 varían en su longitud, es decir, todos los registros tendrán la misma
longitud en un campo determinado, se emplea "char".

Por ejemplo, definimos un campo "codigo" que constará de 5 caracteres, todos los registros tendrán un
código de 5 caracteres, ni más ni menos.

Para almacenar valores superiores a 4000 caracteres se debe emplear "long".

Problema:

Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de
las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos.

Eliminamos la tabla "visitantes":

drop table visitantes;

Creamos con la siguiente estructura:

create table visitantes(


nombre varchar2(30),
edad number(2),
sexo char(1),
domicilio varchar2(30),
ciudad varchar2(20),
telefono varchar2(11)
);

Página 60 de 100
Los campos "nombre", "domicilio" y "ciudad" almacenarán valores cuya longitud varía, por ello
elegimos el tipo "varchar2" y le damos a cada uno una longitud máxima estimando su tamaño. El
campo "sexo" se define de tipo "char", porque necesitamos solamente 1 caracter "f" o "m", que
siempre será fijo. El campo "telefono" también se define como varchar2 porque no todos los números
telefónicos tienen la misma longitud.

Ingresamos un registro:

insert into visitantes (nombre,edad,sexo,domicilio,ciudad,telefono)


values ('Ana Acosta',25,'f','Avellaneda 123','Cordoba','4223344');

Intentamos ingresar una cadena de mayor longitud que la definida en el campo "sexo":

insert into visitantes (nombre,edad,sexo,domicilio,ciudad,telefono)


values ('Betina Bustos',32,'fem','Bulnes 234','Cordoba','4515151');

aparece un mensaje de error y la sentencia no se ejecuta.

Ingresamos el mismo registro, esta vez con un sólo caracter para el campo "sexo":

insert into visitantes (nombre,edad,sexo,domicilio,ciudad,telefono)


values ('Betina Bustos',32,'f','Bulnes 234','Cordoba','4515151');

Ingresamos un número telefónico olvidando las comillas, es decir, como un valor numérico:

insert into visitantes (nombre,edad,sexo,domicilio,ciudad,telefono)


values ('Carlos Caseres',43,'m','Colon 345','Cordoba',03514555666);

lo convierte a cadena, veámoslo:

select *from visitantes;


Primer problema:

Una concesionaria de autos vende autos usados y almacena los datos de los autos en una tabla llamada
"autos".

1- Elimine la tabla "autos"

2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo, estableciendo el campo "patente"
como clave primaria:

create table autos(


patente char(6),
marca varchar2(20),
modelo char(4),
precio number(8,2),
primary key (patente)
);

Hemos definido el campo "patente" de tipo "char" y no "varchar2" porque la cadena de caracteres
siempre tendrá la misma longitud (6 caracteres). Lo mismo sucede con el campo "modelo", en el cual
almacenaremos el año, necesitamos 4 caracteres fijos.

3- Ingrese los siguientes registros:

insert into autos (patente,marca,modelo,precio)


Página 61 de 100
values('ABC123','Fiat 128','1970',15000);
insert into autos (patente,marca,modelo,precio)
values('BCD456','Renault 11','1990',40000);
insert into autos (patente,marca,modelo,precio)
values('CDE789','Peugeot 505','1990',80000);
insert into autos (patente,marca,modelo,precio)
values('DEF012','Renault Megane','1998',95000);

4- Ingrese un registro omitiendo las comillas en el valor de "modelo"


Oracle convierte el valor a cadena.

5- Vea cómo se almacenó.

6- Seleccione todos los autos modelo "1990"

7- Intente ingresar un registro con un valor de patente de 7 caracteres

8- Intente ingresar un registro con valor de patente repetida.

Ver solución

drop table autos;

create table autos(


patente char(6),
marca varchar2(20),
modelo char(4),
precio number(8,2),
primary key (patente)
);

insert into autos (patente,marca,modelo,precio)


values('ABC123','Fiat 128','1970',15000);
insert into autos (patente,marca,modelo,precio)
values('BCD456','Renault 11','1990',40000);
insert into autos (patente,marca,modelo,precio)
values('CDE789','Peugeot 505','1990',80000);
insert into autos (patente,marca,modelo,precio)
values('DEF012','Renault Megane','1998',95000);

insert into autos (patente,marca,modelo,precio)


values('HIJ678','Renault Clio',1990,70000);

select *from autos;

select *from autos


where modelo='1990';

insert into autos (patente,marca,modelo,precio)


values('FGH3457','Fiat 128','1975',20000);

insert into autos (patente,marca,modelo,precio)


values('HIJ678','Fiat 128','1975',20000);

Segundo problema:

Una empresa almacena los datos de sus clientes en una tabla llamada "clientes".

1- Elimine la tabla "clientes"

Página 62 de 100
2- Créela eligiendo el tipo de dato más adecuado para cada campo:

create table clientes(


documento char(8) not null,
apellido varchar2(20),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2 (11)
);

3- Analice la definición de los campos. Se utiliza char(8) para el documento porque siempre constará
de 8 caracteres. Para el número telefónico se usar "varchar2" y no un tipo numérico porque si bien es
un número, con él no se realizarán operaciones matemáticas.

4- Ingrese algunos registros:

insert into clientes (documento,apellido,nombre,domicilio,telefono)


values('22333444','Perez','Juan','Sarmiento 980','4223344');
insert into clientes (documento,apellido,nombre,domicilio,telefono)
values('23444555','Perez','Ana','Colon 234',null);
insert into clientes (documento,apellido,nombre,domicilio,telefono)
values('30444555','Garcia','Luciana','Caseros 634',null);

5- Intente ingresar un registro con más caracteres que los permitidos para el campo "telefono"

6- Intente ingresar un registro con más caracteres que los permitidos para el campo "documento"

7- Intente ingresar un registro omitiendo las comillas en el campo "apellido"

8- Seleccione todos los clientes de apellido "Perez" (2 registros)

Ver solución

drop table clientes;

create table clientes(


documento char(8) not null,
apellido varchar2(20),
nombre varchar2(20),
domicilio varchar2(30),
telefono varchar2 (11)
);

insert into clientes (documento,apellido,nombre,domicilio,telefono)


values('22333444','Perez','Juan','Sarmiento 980','4223344');
insert into clientes (documento,apellido,nombre,domicilio,telefono)
values('23444555','Perez','Ana','Colon 234',null);
insert into clientes (documento,apellido,nombre,domicilio,telefono)
values('30444555','Garcia','Luciana','Caseros 634',null);

insert into clientes (documento,apellido,nombre,domicilio,telefono)


values('24555666','Juarez','Ana','Urquiza 444','035145566778');

insert into clientes (documento,apellido,nombre,domicilio,telefono)


values('256667778','Garcia','Luis','Avellaneda 1454','4558877');

insert into clientes (documento,apellido,nombre,domicilio,telefono)


values('25666777',Garcia,'Luis','Avellaneda 1454','4558877');

select *from clientes


where apellido='Perez';
Página 63 de 100
16 - Tipos de datos numéricos
Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir los campos
y sus tipos más precisos, según el caso.

Los valores numéricos no se ingresan entre comillas. Se utiliza el punto como separador 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 negativos. Su rango va de 1.0
x 10-130 hasta 9.999...(38 nueves). Definimos campos de este tipo cuando queremos almacenar
valores numéricos con los cuales luego realizaremos operaciones matemáticas, por ejemplo,
cantidades, precios, etc.

El parámetro "t" indica el número total de dígitos (contando los decimales) que contendrá el número
como máximo (es la precisión). Su rango va de 1 a 38. El parámetro "d" indica el máximo de dígitos
decimales (escala). La escala puede ir de -84 a 127. Para definir número enteros, se puede omitir el
parámetro "d" o colocar un 0.

Un campo definido "number(5,2)" puede contener cualquier número entre -999.99 y 999.99.

Para especificar número enteros, podemos omitir el parámetro "d" o colocar el valor 0.
Si intentamos almacenar un valor mayor fuera del rango permitido al definirlo, tal valor no se carga,
aparece un mensaje indicando tal situación y la sentencia no se ejecuta.
Por ejemplo, si definimos un campo de tipo "number(4,2)" e intentamos guardar el valor 123.45,
aparece un mensaje indicando que el valor es demasiado grande para la columna. Si ingresamos un
valor con más decimales que los definidos, el valor se carga pero con la cantidad de decimales
permitidos, los dígitos sobrantes se omiten.

2) float (x): almacena un número en punto decimal. El parámetro indica la precisión binaria máxima;
con un rango de 1 a 126. Si se omite, por defecto es 126.

Para ambos tipos numéricos:

- si ingresamos un valor con más decimales que los permitidos, redondea al más cercano; por ejemplo,
si definimos "float(4,2)" e ingresamos el valor "12.686", guardará "12.69", redondeando hacia arriba;
si ingresamos el valor "12.682", guardará "12.67", redondeando hacia abajo.

- si intentamos ingresar un valor fuera de rango, no lo acepta.

- si ingresamos una cadena, Oracle intenta convertirla a valor numérico, si dicha cadena consta
solamente de dígitos, la conversión se realiza, luego verifica si está dentro del rango, si es así, la
ingresa, sino, muestra un mensaje de error y no ejecuta la sentencia. Si la cadena contiene caracteres
que Oracle no puede convertir a valor numérico, 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 numérico 12.22 y la ingresa; si intentamos ingresar la cadena '1234.56', la convierte al valor
numérico 1234.56, pero como el máximo valor permitido es 999.99, muestra un mensaje indicando
que está fuera de rango. Si intentamos ingresar el valor '12y.25', Oracle no puede realizar la conversión
y muestra un mensaje de error.

Problema:
Página 64 de 100
Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla:

drop table libros;

Creamos la tabla con la siguiente estructura:

create table libros(


codigo number(5) not null,
titulo varchar2(40) not null,
autor varchar2(30),
editorial varchar2(15),
precio number(6,2),
cantidad number(4)
);

Note que definimos el campo "codigo" de tipo "number(5)", esto es porque estimamos que no
tendremos más de 99999 libros, y no colocamos decimales porque necesitamos números enteros.
Como en el campo "precio" no almacenaremos valores mayores a 9999.99, definimos el campo de tipo
"number(6,2)".

El tipo "float" no es adecuado para representar precios porque no es exacto.

Como los valores para el campo "cantidad" no superarán los 9999, definimos el campo de tipo
"number(4)", no colocamos decimales porque necesitamos valores enteros.

Analicemos la inserción de datos numéricos.

Intentemos ingresar un valor para "cantidad" fuera del rango definido:

insert into libros (codigo,titulo,autor,editorial,precio,cantidad)


values(1,'El aleph','Borges','Emece',25.60,50000);

aparece un mensaje de error y la inserción no se ejecuta.

Ingresamos un valor para "cantidad" con decimales:

insert into libros (codigo,titulo,autor,editorial,precio,cantidad)


values(1,'El aleph','Borges','Emece',25.60,100.2);

Lo acepta, veamos qué se almacenó:

select *from libros;

Truncó el valor.

Ingresamos un precio con 3 decimales:

insert into libros (codigo,titulo,autor,editorial,precio,cantidad)


values(2,'Don quijote','Cervantes','Emece',25.123,100);

Lo acepta, veamos qué se almacenó:

select *from libros;

Página 65 de 100
Truncó el valor.

Intentamos ingresar un código con comillas (una cadena):

insert into libros (codigo,titulo,autor,editorial,precio,cantidad)


values(4,'Uno','Richard Bach','Planeta','50',100);

Oracle lo convierte a número.

Intentamos ingresar una cadena que Oracle no pueda convertir a valor numérico en el campo "precio":

insert into libros (codigo,titulo,autor,editorial,precio,cantidad)


values(5,'Alicia en el pais...','Lewis Carroll','Planeta','50.30',200);

Error.

Primer problema:

Un banco tiene registrados las cuentas corrientes de sus clientes en una tabla llamada "cuentas".
La tabla contiene estos datos:

Número de Cuenta Documento Nombre Saldo


______________________________________________________________
1234 25666777 Pedro Perez 500000.60
2234 27888999 Juan Lopez -250000
3344 27888999 Juan Lopez 4000.50
3346 32111222 Susana Molina 1000

1- Elimine la tabla "cuentas":

drop table cuentas;

2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar los datos descriptos arriba:

- Número de cuenta: entero hasta 9999, no nulo, no puede haber valores repetidos, clave primaria;

- Documento del propietario de la cuenta: cadena de caracteres de 8 de longitud (siempre 8), no nulo;

- Nombre del propietario de la cuenta: cadena de caracteres de 30 de longitud,

- Saldo de la cuenta: valores que no superan 999999.99

create table cuentas(


numero number(4) not null,
documento char(8),
nombre varchar2(30),
saldo number(8,2),
primary key (numero)
);

3- Ingrese los siguientes registros:

insert into cuentas(numero,documento,nombre,saldo)


values('1234','25666777','Pedro Perez',500000.60);
insert into cuentas(numero,documento,nombre,saldo)
values('2234','27888999','Juan Lopez',-250000);
insert into cuentas(numero,documento,nombre,saldo)
Página 66 de 100
values('3344','27888999','Juan Lopez',4000.50);
insert into cuentas(numero,documento,nombre,saldo)
values('3346','32111222','Susana Molina',1000);

Note que hay dos cuentas, con distinto número de cuenta, de la misma persona.

4- Seleccione todos los registros cuyo saldo sea mayor a "4000" (2 registros)

5- Muestre el número de cuenta y saldo de todas las cuentas cuyo propietario sea "Juan Lopez" (2
registros)

6- Muestre las cuentas con saldo negativo (1 registro)

7- Muestre todas las cuentas cuyo número es igual o mayor a "3000" (2 registros)

Ver solución

drop table cuentas;

create table cuentas(


numero number(4) not null,
documento char(8),
nombre varchar2(30),
saldo number(8,2),
primary key (numero)
);

insert into cuentas(numero,documento,nombre,saldo)


values('1234','25666777','Pedro Perez',500000.60);
insert into cuentas(numero,documento,nombre,saldo)
values('2234','27888999','Juan Lopez',-250000);
insert into cuentas(numero,documento,nombre,saldo)
values('3344','27888999','Juan Lopez',4000.50);
insert into cuentas(numero,documento,nombre,saldo)
values('3346','32111222','Susana Molina',1000);

select *from cuentas


where saldo<4000;

select numero,saldo from cuentas


where nombre='Juan Lopez';

select *from cuentas


where saldo<0;

select *from cuentas


where numero>=3000;

Segundo problema:

Una empresa almacena los datos de sus empleados en una tabla "empleados" que guarda los siguientes
datos: nombre, documento, sexo, domicilio, sueldobasico.

1- Elimine la tabla:

drop table empleados;

2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:

create table empleados(


Página 67 de 100
nombre varchar2(30),
documento char(8),
sexo char(1),
domicilio varchar2(30),
sueldobasico numberl(7,2),--máximo estimado 99999.99
cantidadhijos number(2)--no superará los 99
);

3- Ingrese algunos registros:

insert into empleados


(nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos)
values ('Juan Perez','22333444','m','Sarmiento 123',500,2);
insert into empleados
(nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos)
values ('Ana Acosta','24555666','f','Colon 134',850,0);
insert into empleados
(nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos)
values ('Bartolome Barrios','27888999','m','Urquiza 479',10000.80,4);

4- Ingrese un valor de "sueldobasico" con más decimales que los definidos (redondea los decimales al
valor más cercano 800.89)

5- Intente ingresar un sueldo que supere los 7 dígitos (no lo permite)

6- Muestre todos los empleados cuyo sueldo no supere los 900 pesos

7- Seleccione los nombres de los empleados que tengan hijos (3 registros)

Ver solución

drop table empleados;

create table empleados(


nombre varchar2(30),
documento char(8),
sexo char(1),
domicilio varchar2(30),
sueldobasico numberl(7,2),--máximo estimado 99999.99
cantidadhijos number(2)--no superará los 99
);

insert into empleados


(nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos)
values ('Juan Perez','22333444','m','Sarmiento 123',500,2);
insert into empleados
(nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos)
values ('Ana Acosta','24555666','f','Colon 134',850,0);
insert into empleados
(nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos)
values ('Bartolome Barrios','27888999','m','Urquiza 479',10000.80,4);

insert into empleados


(nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos)
values ('Susana Molina','29000555','f','Salta 876',800.888,3);

insert into empleados


(nombre,documento,sexo,domicilio,sueldobasico,cantidadhijos)
values ('Marta Juarez','32444555','f','Sucre 1086',5000000,2);

select *from empleados


where sueldobasico<=900;
Página 68 de 100
select *from empleados
where cantidadhijos>0;

17 - Ingresar algunos campos


Hemos aprendido a ingresar registros listando todos los campos y colocando valores para todos y cada
uno de ellos luego de "values".

Si ingresamos valores para todos los campos, podemos omitir la lista de nombres de los campos.
Por ejemplo, si tenemos creada la tabla "libros" con los campos "titulo", "autor" y "editorial", podemos
ingresar un registro de la siguiente manera:

insert into libros values ('Uno','Richard Bach','Planeta');

También es posible ingresar valores para algunos campos. Ingresamos valores solamente 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 explicitado un valor.

Al ingresar registros debemos tener en cuenta:

- la lista de campos debe coincidir en cantidad y tipo de valores con la lista de valores luego de
"values". Si se listan más (o menos) campos que los valores ingresados, aparece un mensaje de error y
la sentencia no se ejecuta.

- si ingresamos valores para todos los campos podemos obviar la lista de campos.

- podemos omitir valores para los campos que permitan valores nulos (se guardará "null"); si omitimos
el valor para un campo "not null", la sentencia no se ejecuta.

Problema:

Trabajamos con la tabla "libros" que almacena los datos de los libros de una librería.

Eliminamos la tabla:

drop table libros;

Creamos la tabla:

create table libros(


codigo number(5) not null,
titulo varchar2(40) not null,
autor varchar2(30),
editorial varchar2(15)
);

Si ingresamos valores para todos los campos, podemos omitir la lista de campos:

insert into libros


values (1,'Uno','Richard Bach','Planeta');

Página 69 de 100
Podemos ingresar valores para algunos de los campos:

insert into libros (codigo, titulo, autor)


values (2,'El aleph','Borges');

Veamos cómo Oracle almacenó los registros:

select *from libros;

En el campo "editorial", para el cual no ingresamos valor, se almacenó "null".

No podemos omitir el valor para un campo declarado "not null", como el campo "codigo":

insert into libros (titulo, autor,editorial)


values ('Alicia en el pais de las maravillas','Lewis Carroll','Planeta');

aparece un mensaje y la inserción no se realiza.

Veamos cómo Oracle almacenó los registros:

select *from libros;

Primer problema:

Un banco tiene registrados las cuentas corrientes de sus clientes en una tabla llamada "cuentas".

1- Elimine la tabla "cuentas":

drop table cuentas;

2- Cree la tabla :

create table cuentas(


numero number(10) not null,
documento char(8) not null,
nombre varchar2(30),
saldo number(9,2)
);

3- Ingrese un registro con valores para todos sus campos, omitiendo la lista de campos.

4- Ingrese un registro omitiendo algún campo que admita valores nulos.

5- Verifique que en tal campo se almacenó "null"

6- Intente ingresar un registro listando 3 campos y colocando 4 valores. Un mensaje indica que hay
demasiados valores.

7- Intente ingresar un registro listando 3 campos y colocando 2 valores. Un mensaje indica que no hay
suficientes valores.

8- Intente ingresar un registro sin valor para un campo definido "not null".

9- Vea los registros ingresados.

Página 70 de 100
Ver solución

drop table cuentas;

create table cuentas(


numero number(10) not null,
documento char(8) not null,
nombre varchar2(30),
saldo number(9,2)
);

insert into cuentas


values (12345,'30111111','Juan Perez',2500.50);

insert into cuentas (numero,documento,saldo)


values (23456,'28999777',-5500);

select *from cuentas;

insert into cuentas (numero,documento,nombre)


values (44444,'28999777','Luis Lopez',34000);

insert into cuentas (numero,documento,nombre)


values (44444,'28999777');

insert into cuentas (numero,nombre,saldo)


values (555,'Luis Lopez',34000);

select *from cuentas;

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 automáticamente "null". A este valor se le denomina 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 valores nulos, el valor
por defecto es "null". Para campos declarados "not null", no existe valor por defecto, a menos que se
declare explícitamente con la cláusula "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 "cantidad", 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 cláusula "default", ése será el valor
por defecto.
Página 71 de 100
La cláusula "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 cuáles son, podemos
realizar la siguiente consulta:

select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'libros';

Muestra una fila por cada campo, en la columna "data_default" aparece el valor por defecto (si lo
tiene), en la columna "nullable" aparece "N" si el campo no está definido "not null" y "Y" si admite
valores "null".

También 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 cláusula "default" permite especificar el valor por defecto de un campo. 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" tomarán los valores por defecto:

- si permite valores nulos y no tiene cláusula "default", almacenará "null";

- si tiene cláusula "default" (admita o no valores nulos), el valor definido como predeterminado;

- si está declarado explícitamente "not null" y no tiene valor "default", no hay valor por defecto, así
que causará un error y el "insert" no se ejecutará.

Un campo sólo puede tener un valor por defecto. Una tabla puede tener todos sus campos con valores
por defecto. Que un campo tenga valor por defecto no significa que no admita valores nulos, puede o
no admitirlos.

Un campo definido como clave primaria acepta un valor "default", pero no tiene sentido ya que el
valor por defecto solamente podrá ingresarse una vez; si intenta ingresarse cuando otro registro ya lo
tiene almacenado, aparecerá un mensaje de error indicando que se intenta duplicar la clave.

Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla:

drop table libros;

Creamos la tabla estableciendo valores por defecto para los campos "autor" y "cantidad":

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
);

Página 72 de 100
Ingresamos un registro omitiendo los valores para el campo "autor" y "cantidad":

insert into libros (titulo,editorial,precio)


values('Java en 10 minutos','Paidos',50.40);

Oracle ingresará el registro con el título, editorial y precio especificados, en "autor" colocará
"Desconocido" y en cantidad "0", veámoslo:

select *from libros;

Si ingresamos un registro sin valor para el campo "precio", que admite valores nulos, se ingresará
"null" en ese campo:

insert into libros (titulo,editorial)


values('Aprenda PHP','Siglo XXI');

Veamos cómo se almacenó el registro ingresado anteriormente:

select *from libros;

Veamos si los campos de la tabla "libros" tiene definidos valores por defecto y cuáles son:

select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'LIBROS';

Muestra la siguiente tabla:

COLUMN_NAME NULLABLE DATA_DEFAULT


---------------------------------------------
TITULO N
AUTOR N 'Desconocido'
EDITORIAL Y
PRECIO Y
CANTIDAD Y 0

Muestra una fila por cada campo, en la columna "data_default" aparece el valor por defecto (si lo
tiene), en la columna "nullable" aparece "N" si el campo no está definido "not null" y "Y" si permite
valores nulos.

Podemos emplear "default" para dar el valor por defecto a algunos campos al ingresar un registro:

insert into libros (titulo,autor,editorial,precio,cantidad)


values ('El gato con botas',default,default,default,default);

Veamos cómo se almacenó el registro:

select *from libros where titulo='El gato con botas';

Todos los campos, excepto "titulo" almacenaron su valor predeterminado.

Que un campo tenga valor por defecto no significa que no admita valores nulos, puede o no admitirlos.
Podemos ingresar el valor "null" en el campo "cantidad":

insert into libros (titulo,autor,cantidad)


values ('Alicia en el pais de las maravillas','Lewis Carroll',null);

Recuperamos el registro ingresado anteriormente:


Página 73 de 100
select *from libros where autor='Lewis Carroll';

En "cantidad" se almacenó "null".

Primer problema:

Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de
las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos.

1- Elimine la tabla "visitantes"

2- Cree la tabla con la siguiente estructura:

create table visitantes(


nombre varchar2(30),
edad number(2),
sexo char(1) default 'f',
domicilio varchar2(30),
ciudad varchar2(20) default 'Cordoba',
telefono varchar(11),
mail varchar(30) default 'no tiene',
montocompra number (6,2)
);

4- Analice la información que retorna la siguiente consulta:

select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'VISITANTES';

Todos los campos admiten valores nulos; hay 3 campos con valores predeterminados.

5- Ingrese algunos registros sin especificar valores para algunos campos para ver cómo opera la
cláusula "default":

insert into visitantes (domicilio,ciudad,telefono,mail,montocompra)


values ('Colon 123','Cordoba','4334455','juanlopez@hotmail.com',59.80);
insert into visitantes (nombre,edad,sexo,telefono,mail,montocompra)
values ('Marcos Torres',29,'m','4112233','marcostorres@hotmail.com',60);
insert into visitantes (nombre,edad,sexo,domicilio,ciudad)
values ('Susana Molina',43,'f','Bulnes 345','Carlos Paz');

6- Recupere todos los registros.

Los campos de aquellos registros para los cuales no se ingresó valor almacenaron el valor por defecto
("null" o el especificado con "default").

7- Use la palabra "default" para ingresar valores en un "insert"

8- Recupere el registro anteriormente ingresado.

Ver solución

drop table visitantes;

create table visitantes(


nombre varchar2(30),
edad number(2),

Página 74 de 100
sexo char(1) default 'f',
domicilio varchar2(30),
ciudad varchar2(20) default 'Cordoba',
telefono varchar(11),
mail varchar(30) default 'no tiene',
montocompra number (6,2)
);

select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'VISITANTES';

insert into visitantes (domicilio,ciudad,telefono,mail,montocompra)


values ('Colon 123','Cordoba','4334455','juanlopez@hotmail.com',59.80);
insert into visitantes (nombre,edad,sexo,telefono,mail,montocompra)
values ('Marcos Torres',29,'m','4112233','marcostorres@hotmail.com',60);
insert into visitantes (nombre,edad,sexo,domicilio,ciudad)
values ('Susana Molina',43,'f','Bulnes 345','Carlos Paz');

select *from visitantes;

insert into visitantes


values ('Marcela Morales',default,default,'Avellaneda
292',default,'4255232',default,default);

select *from visitantes where nombre='Marcela Morales';

Segundo problema:

Una pequeña biblioteca de barrio registra los préstamos de sus libros en una tabla llamada
"prestamos". En ella almacena la siguiente información: título del libro, documento de identidad del
socio a quien se le presta el libro, fecha de préstamo, fecha en que tiene que devolver el libro y si el
libro ha sido o no devuelto.

1- Elimine la tabla "prestamos"

2- Cree la tabla:

create table prestamos(


titulo varchar2(40) not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevolucion date,
devuelto char(1) default 'n'
);

3- Consulte "user_tab_columns" y analice la información.


Hay 3 campos que no admiten valores nulos y 1 solo campo con valor por defecto.

4- Ingrese algunos registros omitiendo el valor para los campos que lo admiten.

5- Seleccione todos los registros.

6- Ingrese un registro colocando "default" en los campos que lo admiten y vea cómo se almacenó.

7- Intente ingresar un registro colocando "default" como valor para un campo que no admita valores
nulos y no tenga definido un valor por defecto.

Ver solución
Página 75 de 100
drop table prestamos;

create table prestamos(


titulo varchar2(40) not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevolucion date,
devuelto char(1) default 'n'
);

select column_name,nullable,data_default
from user_tab_columns where TABLE_NAME = 'PRESTAMOS';

insert into prestamos (titulo,documento,fechaprestamo,fechadevolucion)


values ('Manual de 1 grado','23456789','15/12/2007','18/12/2007');
insert into prestamos (titulo,documento,fechaprestamo)
values ('Alicia en el pais de las maravillas','23456789','16/12/2007');

select *from prestamos;

insert into prestamos


values('Manual de historia','32555666','25/10/2007',default,default);

select *from prestamos;

insert into prestamos values('Manual de


aritmetica',default,'10/10/2007','12/10/2007','s');

19 - Operadores aritméticos y de
concatenación (columnas calculadas)
Aprendimos que los operadores son símbolos que permiten realizar distintos tipos de operaciones.
Dijimos que Oracle tiene 4 tipos de operadores: 1) relacionales o de comparación (los vimos), 2)
aritméticos, 3) de concatenación y 4) lógicos (lo veremos más adelante).

Los operadores aritméticos permiten realizar cálculos con valores numéricos.

Son: multiplicación (*), división (/), suma (+) y resta (-).

Es posible obtener salidas en las cuales una columna sea el resultado de un cálculo y no un campo de
una tabla.

Si queremos ver los títulos, precio y cantidad de cada libro escribimos la siguiente sentencia:

select titulo,precio,cantidad
from libros;

Si queremos saber el monto total en dinero de un título podemos multiplicar el precio por la cantidad
por cada título, pero también podemos hacer que Oracle realice el cálculo y lo incluya en una columna
extra en la salida:

select titulo, precio,cantidad,


precio*cantidad
from libros;

Página 76 de 100
Si queremos saber el precio de cada libro con un 10% de descuento podemos incluir en la sentencia los
siguientes cálculos:

select titulo,precio,
precio-(precio*0.1)
from libros;

También podemos actualizar los datos empleando operadores aritméticos:

update libros set precio=precio-(precio*0.1);

Para concatenar cadenas de caracteres existe el operador de concatenación ||.

Para concatenar el título y el autor de cada libro usamos el operador de concatenación ("||"):

select titulo||'-'||autor
from libros;

Note que concatenamos además un guión para separar los campos.

Oracle puede convertir automáticamente valores numéricos a cadenas para una concatenación; por
ejemplo, en el siguiente ejemplo mostramos el título y precio de cada libro concatenado con el
operador "||":

select titulo||' $'||precio


from libros;

Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla:

drop table libros;

Creamos la tabla:

create table libros(


codigo number(5),
titulo varchar2(40) not null,
autor varchar2(20) default 'Desconocido',
editorial varchar2(20),
precio number(6,2),
cantidad number(4) default 0,
primary key (codigo)
);

Ingresamos algunos registros:

insert into libros (codigo,titulo,autor,editorial,precio)


values(1,'El aleph','Borges','Emece',25);
insert into libros
values(2,'Java en 10 minutos','Mario Molina','Siglo XXI',50.40,100);
insert into libros (codigo,titulo,autor,editorial,precio,cantidad)
values(3,'Alicia en el pais de las maravillas','Lewis Carroll','Emece',15,50);

Queremos saber el monto total en dinero de cada libro:

Página 77 de 100
select titulo, precio,cantidad,
precio*cantidad
from libros;

Queremos saber el precio de cada libro con un 10% de descuento:

select titulo,precio,
precio-(precio*0.1)
from libros;

Actualizamos los precios con un 10% de descuento y vemos el resultado:

update libros set precio=precio-(precio*0.1);


select *from libros;

Queremos una columna con el título y autor de cada libro:

select titulo||'-'||autor
from libros;

Mostramos el título y precio de cada libro concatenados:

select titulo||' $'||precio


from libros;
Primer problema:

Un comercio que vende artículos de computación registra los datos de sus artículos en una tabla con
ese nombre.

1- Elimine la tabla:

drop table articulos;

2- Cree la tabla:

create table articulos(


codigo number(4),
nombre varchar2(20),
descripcion varchar2(30),
precio number(8,2),
cantidad number(3) default 0,
primary key (codigo)
);

3- Ingrese algunos registros:

insert into articulos


values (101,'impresora','Epson Stylus C45',400.80,20);
insert into articulos
values (203,'impresora','Epson Stylus C85',500,30);
insert into articulos
values (205,'monitor','Samsung 14',800,10);
insert into articulos
values (300,'teclado','ingles Biswal',100,50);

4- El comercio quiere aumentar los precios de todos sus artículos en un 15%. Actualice todos los
precios empleando operadores aritméticos.

Página 78 de 100
5- Vea el resultado.

6- Muestre todos los artículos, concatenando el nombre y la descripción de cada uno de ellos separados
por coma.

7- Reste a la cantidad de todas las impresoras, el valor 5, empleando el operador aritmético menos ("-")

8- Recupere todos los datos de las impresoras para verificar que la actualización se realizó.

9- Muestre todos los artículos concatenado los campos para que aparezcan de la siguiente manera
"Cod. 101: impresora Epson Stylus C45 $460,92 (15)"

Ver solución

drop table articulos;

create table articulos(


codigo number(4),
nombre varchar2(20),
descripcion varchar2(30),
precio number(8,2),
cantidad number(3) default 0,
primary key (codigo)
);

insert into articulos


values (101,'impresora','Epson Stylus C45',400.80,20);
insert into articulos
values (203,'impresora','Epson Stylus C85',500,30);
insert into articulos
values (205,'monitor','Samsung 14',800,10);
insert into articulos
values (300,'teclado','ingles Biswal',100,50);

update articulos set precio=precio+(precio*0.15);

select *from articulos;


select nombre||','||descripcion
from articulos;

update articulos set cantidad=cantidad-5


where nombre='impresora';

select *from articulos where nombre='impresora';

select 'Cod. '||codigo||': '||nombre||' '||descripcion||' $'||precio||'


('||cantidad||')';
from articulos;

20 - Alias (encabezados de columnas)


Una manera de hacer más comprensible el resultado de una consulta consiste en cambiar los
encabezados de las columnas. Por ejemplo, tenemos la tabla "libros" con un campo "cantidad" (entre
otros) en el cual se almacena la cantidad de libros en stock; queremos que al mostrar la información de
dicha tabla aparezca como encabezado del campo "cantidad" el texto "stock", para ello colocamos un
alias de la siguiente manera:

select titulo,

Página 79 de 100
cantidad as stock,
precio
from libros;

Para reemplazar el nombre de un campo del encabezado por otro, se coloca la palabra clave "as"
seguido del texto del encabezado.

Si el alias consta de una sola cadena las comillas no son necesarias, pero si contiene más de una
palabra, es necesario colocarla entre comillas dobles:

select titulo,
cantidad as "stock disponible",
precio
from libros;

También 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 expresión. En estos casos, son
opcionales, sirven para hacer más comprensible el resultado.

Problema:

Trabajamos con nuestra tabla "libros".

Eliminamos la tabla:

drop table libros;

Creamos la tabla:

create table libros(


titulo varchar2(40),
autor varchar2(30),
editorial varchar2(20),
precio number(5,2),
cantidad number(4)
);

Ingresamos algunos registros:

insert into libros


values('Uno','Richard Bach','Planeta',15,100);
insert into libros
values('El aleph','Borges','Emece',24,150);
insert into libros
values('Matematica estas ahi','Paenza','Nuevo siglo',12.5,200);

Mostramos la información con el encabezado "stock" para el campo "cantidad":

select titulo,
cantidad as stock,
Página 80 de 100
precio
from libros;

Mostramos la información con el encabezado "stock disponible" para el campo "cantidad",


necesitamos emplear comillas dobles:

select titulo,
cantidad as "stock disponible",
precio
from libros;

Recuperamos el título, autor, precio, descuento del 10% y precio final con descuento, empleando un
alias para las 2 últimas columnas:

select titulo,autor,precio,
precio*0.1 as descuento,
precio-(precio*0.1) as "precio final"
from libros;

La palabra clave "as" es opcional, podemos obviarla:

select titulo,precio,
precio-(precio*0.1) "precio con descuento"
from libros;
Primer problema:

Un comercio que vende artículos de computación registra los datos de sus artículos en una tabla con
ese nombre.

1- Elimine la tabla:

drop table articulos;

2- Cree la tabla:

create table articulos(


codigo number(4),
nombre varchar2(20),
descripcion varchar2(30),
precio number(8,2),
cantidad number(3) default 0,
primary key (codigo)
);

3- Ingrese algunos registros:

insert into articulos


values (101,'impresora','Epson Stylus C45',400.80,20);
insert into articulos
values (203,'impresora','Epson Stylus C85',500,30);
insert into articulos
values (205,'monitor','Samsung 14',800,10);
insert into articulos
values (300,'teclado','ingles Biswal',100,50);

4- El comercio hace un descuento del 15% en ventas mayoristas. Necesitamos recuperar el código,
nombre, decripción de todos los artículos con una columna extra que muestre el precio de cada artículo
para la venta mayorista con el siguiente encabezado "precio mayorista"
Página 81 de 100
5- Muestre los precios de todos los artículos, concatenando el nombre y la descripción con el
encabezado "artículo" (sin emplear "as" ni comillas)

6- Muestre todos los campos de los artículos y un campo extra, con el encabezado "monto total" en la
que calcule el monto total en dinero de cada artículo (precio por cantidad)

7- Muestre la descripción de todas las impresoras junto al precio con un 20% de recargo con un
encabezado que lo especifique.

Ver solución

drop table articulos;

create table articulos(


codigo number(4),
nombre varchar2(20),
descripcion varchar2(30),
precio number(8,2),
cantidad number(3) default 0,
primary key (codigo)
);

insert into articulos


values (101,'impresora','Epson Stylus C45',400.80,20);
insert into articulos
values (203,'impresora','Epson Stylus C85',500,30);
insert into articulos
values (205,'monitor','Samsung 14',800,10);
insert into articulos
values (300,'teclado','ingles Biswal',100,50);

select codigo, nombre, descripcion, precio-(precio*.15) as "precio mayorista"


from articulos;

select nombre||' '||descripcion artículo, precio


from articulos;

select codigo,nombre,descripcion, precio, cantidad,


precio*cantidad "Monto Total"
from articulos;

select descripcion, precio+(precio*.2) as recargado


from articulos;

21 - Funciones string
Las funciones de manejo de caracteres alfanuméricos aceptan argumentos de tipo caracter y retornan
caracteres o valores numéricos.

Las siguientes son algunas de las funciones que ofrece Oracle para trabajar con cadenas de caracteres:

- chr(x): retorna un caracter equivalente al código enviado como argumento "x". Ejemplo:

select chr(65) from dual;-- retorna 'A'.


select chr(100) from dual;-- retorna 'd'.

- concat(cadena1,cadena2): concatena dos cadenas de caracteres; es equivalente al operador ||.


Ejemplo:
Página 82 de 100
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 mayúscula. Ejemplo:

select initcap('buenas tardes alumno') from dual;--retorna 'Buenas Tardes


Alumno'.

- lower(cadena): retorna la cadena enviada como argumento en minúsculas. "lower" significa reducir
en inglés. Ejemplo:

select lower('Buenas tardes ALUMNO') from dual;--retorna "buenas tardes alumno".

- upper(cadena): retorna la cadena con todos los caracteres en mayúsculas. Ejemplo:

select upper('www.oracle.com') from dual;-- 'WWW.ORACLE.COM'

- lpad(cadena,longitud,cadenarelleno): retorna la cantidad de caracteres especificados por el argumento


"longitud", de la cadena enviada como primer argumento (comenzando desde el primer caracter); si
"longitud" es mayor que el tamaño de la cadena enviada, rellena los espacios restantes con la cadena
enviada como tercer argumento (en caso de omitir el tercer argumento rellena con espacios); el relleno
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 especificados por el argumento


"longitud", de la cadena enviada como primer argumento (comenzando desde el primer caracter); si
"longitud" es mayor que el tamaño de la cadena enviada, rellena los espacios restantes con la cadena
enviada como tercer argumento (en caso de omitir el tercer argumento rellena con espacios); el relleno
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 ningún
caracter
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 ningún caracter
select rtrim('la casa lila ') from dual; --'la casa lila'

- trim(cadena): retorna la cadena con los espacios de la izquierda y derecha eliminados. "Trim"
significa recortar. Ejemplo:

select trim(' oracle ') from dual;--'oracle'

Página 83 de 100
- 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 como primer argumento,


empezando desde la posición especificada por el segundo argumento y de tantos caracteres de longitud
como indica el tercer argumento. Ejemplo:

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. "lenght" significa longitud
en inglés. Ejemplo:

select length('www.oracle.com') from dual;-- devuelve 14.

- instr (cadena,subcadena): devuelve la posición de comienzo (de la primera ocurrencia) de la


subcadena especificada en la cadena enviada como primer argumento. Si 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 serie de acracteres. La
diferencia con "replace" es que aquella trabaja con cadenas de caracteres y reemplaza una cadena
completa por otra, en cambio "translate" trabaja con caracteres simples y reemplaza varios. En el
siguiente ejemplo se especifica que se reemplacen todos los caracteres "O" por el caracter "0", todos
los caracteres "S" por el caracter "5" y todos los caracteres "G" por "6":

select translate('JORGE LUIS BORGES','OSG','056') from dual;--'J0R6E LUI5 B0R6E5'

Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo caracter.

Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla:

drop table libros;

Creamos la tabla:

create table libros(


codigo number(5),
titulo varchar2(40) not null,
autor varchar2(20) default 'Desconocido',
editorial varchar2(20),
precio number(6,2),
cantidad number(3)
);

Ingresamos algunos registros:


Página 84 de 100
insert into libros
values(1,'El aleph','Borges','Emece',25,100);
insert into libros
values(2,'Java en 10 minutos','Mario Molina','Siglo XXI',50.40,100);
insert into libros
values(3,'Alicia en el pais de las maravillas','Lewis
Carroll','Emece',15.50,200);
insert into libros
values(4,'El pais de las hadas',default,'Emece',25.50,150);

Mostramos sólo los 12 primeros caracteres de los títulos de los libros y sus autores, empleando la
función "substr":

select substr(titulo,1,12) as titulo


from libros;

Mostramos sólo los 20 primeros caracteres de los títulos de los libros y rellenando los espacios
restantes con "*", empleando la función "rpad":

select rpad(titulo,20,'*') as titulo


from libros;

Mostramos los títulos de los libros empleando la función "initcap":

select initcap(titulo) as titulo


from libros;

Note que cada palabra comienza con mayúsculas.

Mostramos los títulos de los libros y sus autores en mayúsculas:

select titulo,upper(autor) as autor


from libros;

Concatenamos título y autor empleando "concat":

select concat(titulo, autor)


from libros;

Mostramos el título y el precio de todos los libros concatenando el signo "$" a los precios:

select titulo,concat('$ ',precio) as precio


from libros;

Recuperamos el título y editorial de "libros" reemplazando "Emece" por "Sudamericana":

select titulo,replace(editorial,'Emece','Sudamericana')
from libros;

Recuperamos el autor de todos los libros reemplazando las letras "abc" por "ABC" respectivamente
(empleando "translate"):

select translate(autor,'abc','ABC') from libros;

Note que cada caracter individual es reemplazado por el especificado.

Mostramos la posición de la primera ocurrencia de la cadena "pais" en los títulos de los libros:
Página 85 de 100
select instr(titulo,'pais') from libros;

Note que los títulos que no contienen la subcadena "pais" muestran el valor cero.

22 - Funciones matemáticas.
Las funciones matemáticas realizan operaciones con expresiones numéricas y retornan un resultado,
operan con tipos de datos numéricos.

Las funciones numéricas aceptan parámetros de entrada de tipo numérico y retornan valores
numéricos.

Oracle tiene algunas funciones para trabajar con números. 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 división 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 argumento, redondea
todos los decimales. Si el segundo argumento es positivo, el número de decimales es redondeado
según "d"; si es negativo, el número es redondeado desde la parte entera según 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 entero
(hacia la izquierda).
select round(123.456,-2) from dual;-- 100, redondea desde el segundo valor entero
(hacia la izquierda).
select round(123.456) from dual;-- 123.

Página 86 de 100
- sign(x): si el argumento es un valor positivo, retorna 1, si es negativo, devuelve -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 número a la cantidad de decimales especificada por el segundo argumento. Si se


omite el segundo argumento, se truncan todos los decimales. Si "d" es negativo, el número 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 trigonométricas que retornan radianes, calculan seno, coseno, inversas,
etc.: acos, asin, atan, atan2, cos, cosh, exp, ln, log, sin, sinh, tan, tanh. No las veremos en detalle.

Se pueden emplear las funciones matemáticas enviando como argumento el nombre de un campo de
tipo numérico.

Problema:

Una empresa almacena los datos de sus empleados en una tabla denominada "empleados".

Eliminamos la tabla:

drop table empleados;

Creamos la tabla:

create table empleados(


legajo number(5),
documento char(8) not null,
nombre varchar2(30) not null,
domicilio varchar2(30),
sueldo number(6,2),
hijos number(2),
primary key (legajo)
);

Ingresamos algunos registros:

insert into empleados


values(1,'22333444','Ana Acosta','Avellaneda 213',870.79,2);
insert into empleados
values(20,'27888999','Betina Bustos','Bulnes 345',950.85,1);
insert into empleados
values(31,'30111222','Carlos Caseres','Caseros 985',1190,0);
insert into empleados
values(39,'33444555','Daniel Duarte','Dominicana 345',1250.56,3);

Página 87 de 100
Vamos a mostrar los sueldos de los empleados redondeando el valor hacia abajo y luego hacia arriba
(empleamos "floor" y "ceil"):

select floor(sueldo) as "sueldo hacia abajo",


ceil(sueldo) as "sueldo hacia arriba"
from empleados;

Mostramos los nombre de cada empleado, su respectivo sueldo, y el sueldo redondeando el valor a
entero ("round") y truncado a entero ("trunc"):

select nombre, sueldo, round(sueldo) as "sueldo redondeado",


trunc(sueldo) as "sueldo truncado"
from empleados;

Note que los valores devueltos según la función empleada, son diferentes.

Mostramos el resultado de "2 elevado a la potencia 5" ("power"):

select power(2,5) from dual;

Retorna el valor 32.

Mostramos el resto de la división "1234 / 5" ("mod"):

select mod(1234,5) from dual;

Devuelve el valor 4.

Calculamos la raíz cuadrada de 81:

select sqrt(81) from dual;

Retorna 9.

23 - Funciones de fechas y horas


Oracle dispone de varias funciones que operan con tipos de datos "date". Estas son algunas:

- add_months(f,n): agrega a una fecha, un número de meses. Si el segundo argumento es positivo, se le


suma a la fecha enviada tal cantidad de meses; si es negativo, 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
último día de ese mes.

- last_day(f): retorna el ultimo día de mes de la fecha enviada como argumento. Ejemplo:

select last_day('10/02/2007') from dual;-- "28/02/07"


select last_day('10/08/2007') from dual;-- "31/08/07"

Página 88 de 100
- months_between(f1,f2): retorna el numero de meses entre las fechas enviadas como argumento.
Ejemplo:

select months_between('19/05/2003','21/06/05') from dual;-- retorna

- next_day(fecha,dia): retorna una fecha correspondiente al primer día especificado en "dia" luego de
la fecha especificada. En el siguiente ejemplo se busca el lunes 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 año (year), mes (month), día (day), hora (hour), minuto (minute), segundo (second), etc.
Ejemplo:

select extract(month from sysdate) from dual;

retorna el número mes de la fecha actual.

En Oracle: Los operadores aritméticos "+" (más) y "-" (menos) pueden emplearse con fechas. Por
ejemplos:

select sysdate-3:

Retorna 3 días antes de la fecha actual.

select to_date('15/12/2007')-5 from dual;

Página 89 de 100
Retorna 10/12/07

Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo date.

Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla:

drop table libros;

Creamos la tabla:

create table libros(


titulo varchar2(40) not null,
autor varchar2(20) default 'Desconocido',
editorial varchar2(20),
edicion date,
precio number(6,2)
);

Ingresamos algunos registros:

insert into libros values('El aleph','Borges','Emece','10/10/1980',25.33);


insert into libros values('Java en 10 minutos','Mario Molina','Siglo
XXI','05/05/2000',50.65);
insert into libros
values('Alicia en el pais de las maravillas','Lewis
Carroll','Emece','08/09/2000',19.95);
insert into libros values('Aprenda PHP','Mario Molina','Siglo
XXI','02/04/2000',45);

Mostramos el título del libro y el año de edición:

select titulo, extract (year from edicion) from libros;

Mostramos el título del libro y el mes de edición:

select titulo, extract (month from edicion) from libros;

Mostramos el título del libro y los años que tienen de editados:

select titulo, extract(year from sysdate)-extract(year from edicion) as "años de


editado"
from libros;

Mostramos los títulos de los libros que se editaron en el año 2000:

select titulo from libros


where extract(year from edicion)=2000;

Calcule 3 meses luego de la fecha actual empleando ""add_months":

select add_months(sysdate,3) from dual;

Muestre la fecha del primer martes desde la fecha actual:


Página 90 de 100
select next_day(sysdate,'martes') from dual;

Muestre la fecha que será 15 días después de "24/08/2007" empleando el operador "+":

select to_date('24/08/2007')+15 from dual;

Retorna 08/09/07.

Muestre la fecha que 20 días antes del "12/08/2007" empleando el operador "-":

select to_date('12/08/2007')-20 from dual;

Retorna 23/07/07.

24 - Ordenar registros (order by)


Podemos ordenar el resultado de un "select" para que los registros se muestren ordenados por algún
campo, para ello usamos la cláusula "order by".

La sintaxis básica es la siguiente:

select *from NOMBRETABLA


order by CAMPO;

Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el título:

select *from libros


order by titulo;

Aparecen los registros ordenados alfabéticamente por el campo especificado.

También podemos colocar el número de orden del campo por el que queremos que se ordene en lugar
de su nombre, es decir, referenciar a los campos por su posición en la lista de selección. Por ejemplo,
queremos el resultado del "select" ordenado por "precio":

select titulo,autor,precio
from libros order by 3;

Si colocamos un número mayor a la cantidad de campos de la lista de selección, aparece un mensaje de


error y la sentencia no se ejecuta.

Por defecto, si no aclaramos en la sentencia, los ordena de manera ascendente (de menor a mayor).
Podemos ordenarlos de mayor a menor, para ello agregamos la palabra clave "desc":

select *libros
order by editorial desc;

También podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial":

select *from libros


order by titulo,editorial;

Página 91 de 100
Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sentido 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 campo inmediatamente
anterior.

Es posible ordenar por un campo que no se lista en la selección incluso por columnas calculados.

Se puede emplear "order by" con campos de tipo caracter, numérico y date.

Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla y la creamos con la siguiente estructura:

drop table libros;

create table libros(


titulo varchar2(40) not null,
autor varchar2(20) default 'Desconocido',
editorial varchar2(20),
edicion date,
precio number(6,2)
);

Ingresamos algunos registros:

insert into libros values('El aleph','Borges','Emece','10/10/1980',25.33);


insert into libros values('Java en 10 minutos','Mario Molina','Siglo
XXI','05/12/2005',50.65);
insert into libros values('Alicia en el pais de las maravillas','Lewis
Carroll','Emece','29/11/2000',19.95);
insert into libros values('Alicia en el pais de las maravillas','Lewis
Carroll','Planeta','27/11/2004',15);

Recuperamos los registros ordenados por el título:

select *from libros


order by titulo;

Ordenamos los registros por el campo "precio", referenciando el campo por su posición en la lista de
selección:

select titulo,autor,precio
from libros order by 3;

Los ordenamos por "editorial", de mayor a menor empleando "desc":

select *from libros


order by editorial desc;

Ordenamos por dos campos:

Página 92 de 100
select *from libros
order by titulo,editorial;

Ordenamos en distintos sentidos:

select *from libros


order by titulo asc, editorial desc;

Podemos ordenar por un campo que no se lista en la selección:

select titulo, autor


from libros
order by precio;

Está permitido ordenar por valores calculados, lo hacemos:

select titulo, editorial,


precio+(precio*0.1) as "precio con descuento"
from libros
order by 3;

Ordenamos los libros por la fecha de edición:

select titulo, editorial, edicion


from libros
order by edicion;

Mostramos el título y año de edición de todos los libros, ordenados por año de edición:

select titulo, extract (year from edicion) as edicion


from libros
order by 2;
Primer problema:

En una página web se guardan los siguientes datos de las visitas: nombre, mail, pais y fecha.

1- Elimine la tabla "visitas" y créela con la siguiente estructura:

drop table visitas;


create table visitas (
nombre varchar2(30) default 'Anonimo',
mail varchar2(50),
pais varchar2(20),
fecha date
);

3- Ingrese algunos registros:

insert into visitas values ('Ana Maria


Lopez','AnaMaria@hotmail.com','Argentina','10/10/2006 10:10');
insert into visitas values ('Gustavo
Gonzalez','GustavoGGonzalez@hotmail.com','Chile','10/10/2006 21:30');
insert into visitas values
('Juancito','JuanJosePerez@hotmail.com','Argentina','11/10/2006 15:45');
insert into visitas values ('Fabiola
Martinez','MartinezFabiola@hotmail.com','Mexico','12/10/2006 08:15');
insert into visitas values ('Fabiola
Martinez','MartinezFabiola@hotmail.com','Mexico','12/09/2006 20:45');

Página 93 de 100
insert into visitas values
('Juancito','JuanJosePerez@hotmail.com','Argentina','12/09/2006 16:20');
insert into visitas values
('Juancito','JuanJosePerez@hotmail.com','Argentina','15/09/2006 16:25');

4- Ordene los registros por fecha, en orden descendente.

5- Muestre el nombre del usuario, pais y el mes, ordenado por pais (ascendente) y el mes
(descendente)

6- Muestre los mail, país, ordenado por país, de todos los que visitaron la página en octubre (4
registros)

Ver solución

drop table visitas;


create table visitas (
nombre varchar2(30) default 'Anonimo',
mail varchar2(50),
pais varchar2(20),
fecha date
);

insert into visitas values ('Ana Maria


Lopez','AnaMaria@hotmail.com','Argentina','10/10/2006 10:10');
insert into visitas values ('Gustavo
Gonzalez','GustavoGGonzalez@hotmail.com','Chile','10/10/2006 21:30');
insert into visitas values
('Juancito','JuanJosePerez@hotmail.com','Argentina','11/10/2006 15:45');
insert into visitas values ('Fabiola
Martinez','MartinezFabiola@hotmail.com','Mexico','12/10/2006 08:15');
insert into visitas values ('Fabiola
Martinez','MartinezFabiola@hotmail.com','Mexico','12/09/2006 20:45');
insert into visitas values
('Juancito','JuanJosePerez@hotmail.com','Argentina','12/09/2006 16:20');
insert into visitas values
('Juancito','JuanJosePerez@hotmail.com','Argentina','15/09/2006 16:25');

select *from visitas


order by fecha desc;

select nombre,pais,extract(month from fecha)


from visitas
order by 1,3 desc;

select mail, pais


from visitas
where extract(month from fecha)=10
order by 2;

25 - Operadores lógicos (and - or - not)


Hasta el momento, hemos aprendido a establecer una condición con "where" utilizando operadores
relacionales. Podemos establecer más de una condición con la cláusula "where", para ello
aprenderemos los operadores lógicos.

Son los siguientes:

- and, significa "y",


Página 94 de 100
- or, significa "y/o",
- not, significa "no", invierte el resultado
- (), paréntesis

Los operadores lógicos se usan para combinar condiciones.

Si queremos recuperar todos los libros cuyo autor sea igual a "Borges" y cuyo precio 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 operador "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 libros en los cuales el
valor del campo "autor" sea "Borges" y/o el valor del campo "editorial" sea "Planeta", es decir,
seleccionará los registros que cumplan con la primera condición, con la segunda condición y con
ambas condiciones.

Los registros recuperados con una sentencia que une dos condiciones con el operador "or", cumplen
una de las condiciones o ambas.

Queremos recuperar los libros que NO cumplan la condición dada, por ejemplo, aquellos cuya editorial
NO sea "Planeta":

select *from libros


where not editorial='Planeta';

El operador "not" invierte el resultado de la condición a la cual antecede.

Los registros recuperados en una sentencia en la cual aparece el operador "not", no cumplen con la
condición a la cual afecta el "NOT".

Los paréntesis se usan para encerrar condiciones, para que se evalúen como una sola expresión.

Cuando explicitamos varias condiciones con diferentes operadores lógicos (combinamos "and", "or")
permite establecer el orden de prioridad de la evaluación; además permite diferenciar las expresiones
más 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);

Página 95 de 100
Si bien los paréntesis no son obligatorios en todos los casos, se recomienda utilizarlos para evitar
confusiones.

El orden de prioridad de los operadores lógicos es el siguiente: "not" se aplica antes que "and" y "and"
antes que "or", si no se especifica un orden de evaluación mediante el uso de paréntesis. El orden en el
que se evalúan los operadores con igual nivel de precedencia es indefinido, por ello se recomienda usar
los paréntesis.

Entonces, para establecer más de una condición en un "where" es necesario emplear operadores
lógicos. "and" significa "y", indica que se cumplan ambas condiciones; "or" significa "y/o", indica que
se cumpla una u otra condición (o ambas); "not" significa "no.", indica que no se cumpla la condición
especificada.

Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla y la creamos:

drop table libros;

create table libros(


codigo number(5),
titulo varchar2(40) not null,
autor varchar2(20) default 'Desconocido',
editorial varchar2(20),
precio number(6,2)
);

Ingresamos algunos registros:

insert into libros


values(1,'El aleph','Borges','Emece',15.90);
insert into libros
values(2,'Antología poética','Borges','Planeta',39.50);
insert into libros
values(3,'Java en 10 minutos','Mario Molina','Planeta',50.50);
insert into libros
values(4,'Alicia en el pais de las maravillas','Lewis Carroll','Emece',19.90);
insert into libros
values(5,'Martin Fierro','Jose Hernandez','Emece',25.90);
insert into libros
values(6,'Martin Fierro','Jose Hernandez','Paidos',16.80);
insert into libros
values(7,'Aprenda PHP','Mario Molina','Emece',19.50);
insert into libros
values(8,'Cervantes y el quijote','Borges','Paidos',18.40);

Recuperamos los libros cuyo autor sea igual a "Borges" y cuyo precio no supere los 20 pesos:

select *from libros


where (autor='Borges') and
(precio<=20);

Aparecen 2 libros, los únicos que cumplen con ambas condiciones.

Seleccionamos los libros cuyo autor es "Borges" y/o cuya editorial es "Planeta":

Página 96 de 100
select *from libros
where autor='Borges' or
editorial='Planeta';

Note que aparecen todos los libros de "Borges" y todos los libros de "Planeta", algunos cumplen ambas
condiciones.

Recuperamos los libros cuya editorial NO es "Planeta":

select *from libros


where not editorial='Planeta';

Veamos un ejemplo de cómo el empleo de paréntesis permite a Oracle evaluar en forma diferente
ciertas consultas aparentemente iguales:

select *from libros


where (autor='Borges') or
(editorial='Paidos' and precio<20);

select *from libros


where (autor='Borges' or editorial='Paidos') and
(precio<20);

Note que el primer resultado retorna todos los libros de "Borges" (primera condición) y todos los libros
de "Paidos" con precio inferior a 20 (segunda condición) (registros 1,2,6 y 8); la segunda recupera
todos los libros de "Borges" o de "Paidos" (primera condición) cuyo precio sea inferior a 20 (segunda
condición) (registros 1,6 y 8).

Primer problema:

Trabaje con la tabla llamada "medicamentos" de una farmacia.

1- Elimine la tabla y créela con la siguiente estructura:

drop table medicamentos;


create table medicamentos(
codigo number(5),
nombre varchar2(20),
laboratorio varchar2(20),
precio number(5,2),
cantidad number(3),
primary key(codigo)
);

3- Ingrese algunos registros:

insert into medicamentos values(100,'Sertal','Roche',5.2,100);


insert into medicamentos values(102,'Buscapina','Roche',4.10,200);
insert into medicamentos values(205,'Amoxidal 500','Bayer',15.60,100);
insert into medicamentos values(230,'Paracetamol 500','Bago',1.90,200);
insert into medicamentos values(345,'Bayaspirina','Bayer',2.10,150);
insert into medicamentos values(347,'Amoxidal jarabe','Bayer',5.10,250);

4- Recupere los códigos y nombres de los medicamentos cuyo laboratorio sea "Roche' y cuyo precio
sea menor a 5 (1 registro cumple con ambas condiciones)

5- Recupere los medicamentos cuyo laboratorio sea "Roche" o cuyo precio sea menor a 5 (4 registros)

Página 97 de 100
6- Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer" y cuya cantidad sea=100. Luego
muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya cantidad NO sea=100

7- Recupere los nombres de los medicamentos cuyo precio esté entre 2 y 5 inclusive (2 registros)

8- Elimine todos los registros cuyo laboratorio sea igual a "Bayer" y su precio sea mayor a 10 (1
registro eliminado)

9- Cambie la cantidad por 200, de todos los medicamentos de "Roche" cuyo precio sea mayor a 5 (1
registro afectado)

10- Muestre todos los registros para verificar el cambio.

11- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea menor a 3 (3 registros
borrados)

Ver solución

drop table medicamentos;


create table medicamentos(
codigo number(5),
nombre varchar2(20),
laboratorio varchar2(20),
precio number(5,2),
cantidad number(3),
primary key(codigo)
);

insert into medicamentos values(100,'Sertal','Roche',5.2,100);


insert into medicamentos values(102,'Buscapina','Roche',4.10,200);
insert into medicamentos values(205,'Amoxidal 500','Bayer',15.60,100);
insert into medicamentos values(230,'Paracetamol 500','Bago',1.90,200);
insert into medicamentos values(345,'Bayaspirina','Bayer',2.10,150);
insert into medicamentos values(347,'Amoxidal jarabe','Bayer',5.10,250);

select codigo,nombre
from medicamentos
where laboratorio='Roche' and
precio<5;

select * from medicamentos


where laboratorio='Roche' or
precio<5;

select * from medicamentos


where laboratorio='Bayer' and
not cantidad=100;

select * from medicamentos


where not laboratorio='Bayer' and
cantidad=100;

select nombre from medicamentos


where precio>=2 and
precio <=5;

delete from medicamentos


where laboratorio='Bayer' and
precio>10;

update medicamentos set cantidad=200


Página 98 de 100
where laboratorio='Roche' and
precio>5;

select *from medicamentos;

delete from medicamentos


where laboratorio='Bayer' or
precio<3;
Segundo problema:

Trabajamos con la tabla "peliculas" de un video club que alquila películas en video.

1- Elimine la tabla y créela con la siguiente estructura:

drop table peliculas;

create table peliculas(


codigo number(4),
titulo varchar2(40) not null,
actor varchar2(20),
duracion number(3),
primary key (codigo)
);

3- Ingrese algunos registros:

insert into peliculas


values(1020,'Mision imposible','Tom Cruise',120);
insert into peliculas
values(1021,'Harry Potter y la piedra filosofal','Daniel R.',180);
insert into peliculas
values(1022,'Harry Potter y la camara secreta','Daniel R.',190);
insert into peliculas
values(1200,'Mision imposible 2','Tom Cruise',120);
insert into peliculas
values(1234,'Mujer bonita','Richard Gere',120);
insert into peliculas
values(900,'Tootsie','D. Hoffman',90);
insert into peliculas
values(1300,'Un oso rojo','Julio Chavez',100);
insert into peliculas
values(1301,'Elsa y Fred','China Zorrilla',110);

4- Recupere los registros cuyo actor sea "Tom Cruise" o "Richard Gere" (3 registros)

5- Recupere los registros cuyo actor sea "Tom Cruise" y duración menor a 100 (ninguno cumple
ambas condiciones)

6- Recupere los nombres de las películas cuya duración se encuentre entre 100 y 120 minutos(5
registros)

7- Cambie la duración a 200, de las películas cuyo actor sea "Daniel R." y cuya duración sea 180 (1
registro afectado)

8- Recupere todos los registros para verificar la actualización anterior

9- Borre todas las películas donde el actor NO sea "Tom Cruise" y cuya duración sea mayor o igual a
100 (2 registros eliminados)

Página 99 de 100
Ver solución

drop table peliculas;

create table peliculas(


codigo number(4),
titulo varchar2(40) not null,
actor varchar2(20),
duracion number(3),
primary key (codigo)
);

insert into peliculas


values(1020,'Mision imposible','Tom Cruise',120);
insert into peliculas
values(1021,'Harry Potter y la piedra filosofal','Daniel R.',180);
insert into peliculas
values(1022,'Harry Potter y la camara secreta','Daniel R.',190);
insert into peliculas
values(1200,'Mision imposible 2','Tom Cruise',120);
insert into peliculas
values(1234,'Mujer bonita','Richard Gere',120);
insert into peliculas
values(900,'Tootsie','D. Hoffman',90);
insert into peliculas
values(1300,'Un oso rojo','Julio Chavez',100);
insert into peliculas
values(1301,'Elsa y Fred','China Zorrilla',110);

select *from peliculas


where actor='Tom Cruise' or
actor='Richard Gere';

select *from peliculas


where actor='Tom Cruise' and
duracion<100;

select titulo from peliculas


where duracion>=100 and
duracion<=120;

update peliculas set duracion=200


where actor='Daniel R.' and
duracion=180;

select *from peliculas;

delete from peliculas


where not actor='Tom Cruise' and
duracion<=100;

Página 100 de 100

S-ar putea să vă placă și