You are on page 1of 44

-- --------------------------- Curso Oracle OPERACION

-- --------------------------- PARTE 1
-- comentarios
-- no es necesario un espacio despues del --- pero mantenemos el espacio por compatibilidad
-- # el # no hace comentarios
-- El editor SLQ DEVELOPER no se le encuentra un comentariador automatico
/*
bloque
de
comentarios
*/
/*
se puede comentariar un parrafo entero sealandolo
y usando la herramienta del menu View - Format - Un/comment selection
tambien hay en el menu format una utilidad para cambiar a minusculas o mayusculas
*/
-- iniciando un script en ORACLE SQL DEVELOPER
-- ------------------------------ trabajar en una base de datos
-- ------------------------------ Lo sisguientes comandos de MySQL no existen en oracle
-- show databases;
-- drop database if exists cursomysql;
-- create database cursomysql;
-- use cursomysql;
-- show tables;
-- el ; es el terminador de instrucciones
-- ---------------------------------------------------- En oracle no existe el objeto BD
-- se comparte un espacio de tablas llamado tablespace
-- ---------------------------------------------------- ------------------------------- Como crear una tabla en ORACLE
-- ------------------------------- creamos la tabla clientes
create table clientes (
codigo integer,
-- no existe la clausula auto increment
nombre varchar(20) not null,
apellido varchar(20) not null,
cuit char(13),

direccion varchar(50),
edad int,
comentarios varchar(140),
primary key (codigo)
);
-- no existe la clausula auto increment
-- no existe la clausula default
-- Oracle maneja esto a traves de un objeto llamado secuencias
-- los objetos creados diferecian mayuscula de minusculas
-- Los objetos en oracle son CASE SENSITIVE
-- Para ejecutar en el cliente web express usamos el boton run
-- o el atajo de teclado control enter
-- comprobamos la existencia de la tabla
select * from user_tables;
select * from user_objects where object_type = 'TABLE';
-- como no existe el comando show,
-- debo consultar catalogos de objetos de ORACLE
-- describo la tabla
describe clientes;
-- muestra la descripcin de campos de la tabla
-- Observar que los integer son tipo number y tienen longitud 38
-- los varchar, son varchar2()
-- los tipo de datos int integer y varchar no estan definidos en oracle
-- pero son tomados y traducidos para mantener compatibilidad
select * from clientes;
-- muestra los registro de la tabla
-- drop table clientes;
-- borramos la tabla clientes
-- no cuento con la clausula IF EXITS
-- drop table if exists clientes;
-- borramos la tabla clientes si existe
-- borrar un objeto inexistente causa un error de ejecucin por lo tanto agregamos la clausula if exists
-- insercion de registros
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)

values (1,'juan','perez','xxxxx','peru 323');


values (2,'diego','torres','xxxxx','chile 320');
values (3,'laura','gomez','xxxxx','san juan 420');
values (4,'mario','lopez','xxxxx','lavalle 770');
values (5,'dario','sanchez','xxxxx','mexico 150');

select * from clientes;


select * from CLIENTES;
-- muestra los registro de la tabla
-- en los nombres de objetos tablas se tolera la diferencia entre mayusculas
-- y minusculas

-- borro todos los registros de la tabla


delete from clientes;
-- No existe el comando truncate
-- truncate clientes;
insert into clientes (codigo,nombre,apellido,cuit,direccion) values (12,'mario','lopez','xxxxx','lavalle 770');
insert into clientes (codigo,nombre,apellido,cuit,direccion) values (10,'dario','sanchez','xxxxx','mexico 150');
select * from clientes;
-- muestra los registro de la tabla
-- los registros se muestran por orden de insercion
-- no ordenador por PK
-- -------------------- Tipo Dato en ORACLE
-- -------------------- VARCHAR2(size [BYTE | CHAR])
-- Cadena de caracteres de longitud variable que tiene como tamao mximo
-- el valor de size en BYTE o CHAR. El tamao mximo es de 4000 bytes o
-- caracteres, y la mnima es de 1 byte o un carcter. Se debe especificar
-- el tamao de para VARCHAR2.
-- NVARCHAR2(size)
-- Cadena de caracteres Unicode de longitud variable con size como mximo tamao
-- de longitud. El nmero de bytes que pueden ser hasta dos veces el tamao de
-- codificacin AL16UTF16 y tres veces el tamao de la codificacin UTF8.
-- El tamao mximo est determinado por la definicin del juego de caracteres
-- nacional, con un lmite mximo de 4000 bytes. Se debe especificar el size
-- de NVARCHAR2.

-- NUMBER [ (p [, s]) ]
-- Nmero con p precisin (parte entera) y s escala (parte decimal).
-- La precisin p puede variar de 1 a 38. La s escala puede variar desde -84
-- hasta 127. Tanto la precisin y la escala se encuentran en dgitos decimales.
-- Un valor numrico requiere 1 a 22 bytes.
-- FLOAT [(p)]
--Un subtipo del tipo de datos NUMBER con precisin p. Un valor de coma flotante
-- se representa internamente como un NUMBER. La precisin p puede variar desde
-- 1 hasta 126 dgitos binarios. Un valor flotante requiere 1 a 22 bytes.

-- LONG
-- Tipo de datos de caracteres de longitud variable de hasta 2 gigabytes,

-- o 231 -1 bytes.
-- Permanece para compatibilidad con versiones anteriores de Oracle.

-- DATE
-- Intervalo de fechas vlidas del 1 de enero de 4712 antes de Cristo a el 31
-- de diciembre de 9999. El formato por defecto se determina explcitamente
-- por el parmetro NLS_DATE_FORMAT o implcitamente por el parmetro
-- NLS_TERRITORY. El tamao es de 7 bytes. Este tipo de datos contiene los
-- campos de fecha y hora AO, MES, da, hora, minuto y segundo.
-- No tiene fracciones de segundo o de una zona horaria.
-- BINARY_FLOAT
-- Nmero en coma flotante de 32 bits. Este tipo de datos requiere 4 bytes.
-- BINARY_DOUBLE
-- Nmero en coma flotante de 64 bits.
-- Este tipo de datos se requieren de 8 bytes.
-- TIMESTAMP [(fractional_seconds_precision)]
-- Ao, mes y da como valores de la fecha, as como la hora,
-- minutos y segundos como valores de tiempo, donde fractional_seconds_precision
-- es el nmero de dgitos en la parte fraccionaria del segundo del campo
-- datetime. Los valores aceptados de fractional_seconds_precision son del
-- 0 al 9. El valor por defecto es 6. El formato por defecto se determina
-- explcitamente por el parmetro NLS_TIMESTAMP_FORMAT o implcitamente por el
-- parmetro NLS_TERRITORY. El tamao es de 7 o 11 bytes, dependiendo de la
-- precisin. Este tipo de datos contiene los campos datetime
-- AO, MES, DIA, HORA, MINUTO y SEGUNDO.
-- Contiene las fracciones de segundo, pero no tiene una zona horaria.

-- TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE


-- Todos los valores de TIMESTAMP, as como el valor de tiempo de desplazamiento
-- de la zona, donde fractional_seconds_precision es el nmero de dgitos en la
-- parte fraccionaria del segundo del campo datetime. Los valores aceptados son
-- del 0 al 9. El valor por defecto es 6. El formato por defecto se determina
-- explcitamente por el parmetro NLS_TIMESTAMP_FORMAT o implcitamente por el
-- parmetro NLS_TERRITORY. El tamao se fija en 13 bytes. Este tipo de datos
-- contiene los campos datetime
-- AO, MES, DIA, HORA, MINUTO, SEGUNDO, TIMEZONE_HOUR y TIMEZONE_MINUTE.
-- Cuenta con las fracciones de segundo y una zona horaria explcita.

-- TIMESTAMP [(fractional_seconds)] WITH LOCAL TIME ZONE


-- Todos los valores de TIMESTAMP WITH TIME ZONE,
-- con las siguientes excepciones:
-- Los datos se normalizan con la zona horaria de base de datos cuando se
-- almacenan en la base de datos.
-- Cuando se recuperan los datos, los usuarios ven los datos

-- en la zona de tiempo de la sesin.


-- El formato por defecto se determina explcitamente por el parmetro
-- NLS_TIMESTAMP_FORMAT o implcitamente por el parmetro NLS_TERRITORY.
-- El tamao es de 7 o 11 bytes, dependiendo de la precisin.

-- INTERVAL YEAR [(year_precision)] TO MONTH


-- Almacena un perodo de tiempo en aos y meses, donde year_precision es el
-- nmero de dgitos en el campo datetime AO. Los valores aceptados son del
-- 0 al 9. El valor predeterminado es 2. El tamao se fija en 5 bytes.

-- INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)]


-- Almacena un perodo de tiempo en das, horas, minutos y segundos, donde
-- day_precision es el nmero mximo de dgitos en el campo datetime DA.
-- Los valores aceptados son del 0 al 9. El valor predeterminado es 2.
-- fractional_seconds_precision es el nmero de dgitos en la parte fraccionaria
-- del campo SEGUNDO. Los valores aceptados son del 0 al 9.
-- El valor por defecto es 6.
-- El tamao se fija en 11 bytes.

-- RAW(size)
-- Datos binarios sin formato de longitud size.
-- El tamao mximo es de 2000 bytes.
--Se debe especificar el tamao de un valor RAW.

-- LONG RAW
-- Datos binarios de tipo RAW de longitud variable hasta 2 gigabytes.

-- ROWID
-- Cadena en base 64 que representa la direccin nica de una fila en la tabla.
-- Este tipo de datos es principalmente para los valores devueltos por la pseudo
-- columna ROWID.

-- UROWID [(size)]
-- Cadena en base 64 que representa la direccin lgica de una fila de una tabla
-- de ndice organizado. El tamao opcional es el tamao de una columna de tipo
-- UROWID de Oracle. El tamao mximo y por defecto es de 4000 bytes.
-- CHAR [(size [BYTE | CHAR])]
-- Cadena de caracteres de longitud fija de size bytes de tamao o size de
-- caracteres. El tamao mximo es de 2000 bytes o caracteres, el tamao
-- predeterminado y mnimo es de 1 byte.

-- NCHAR[(size)]
-- Cadena de caracteres de longitud fija de size caracteres de tamao de largo.
-- El nmero de bytes pueden ser hasta dos veces el tamao de codificacin
-- AL16UTF16 y tres veces el tamao de la codificacin UTF8.
-- El tamao mximo est determinado por la definicin del juego de caracteres
-- nacional, con un lmite mximo de 2000 bytes.
-- El tamao predeterminado y mnimo es de un carcter.

-- CLOB
-- Un objeto de tipo LOB que contiene caracteres de un byte o multibyte.
-- Son compatibles tanto de ancho fijo y conjuntos de ancho variable de
-- caracteres, con el carcter de base de datos establecida. El tamao mximo
-- es (4 gigabytes - 1) * (tamao del bloque de la base de datos).

-- NCLOB
-- Un objeto de tipo LOB que contiene caracteres Unicode. Son compatible tanto
-- de ancho fijo y conjuntos de ancho variable de caracteres, con el conjunto
-- base de datos de carcter nacional. El tamao mximo es (4 gigabytes - 1) *
-- (tamao del bloque de la base de datos).
-- Guarda los datos nacionales sobre el conjunto de caracteres.

-- BLOB
-- Un objeto de tipo LOB binario. El tamao mximo es (4 gigabytes - 1) *
-- (tamao del bloque de la base de datos).
-- BFILE
-- Contiene un localizador a un archivo binario almacenado fuera de la base de
-- datos. Permite flujo de bytes de E/S para el acceso a LOB externos que
-- residen en el servidor de base de datos. El tamao mximo es de 4 gigabytes.
-- no es posible usar select sin hacer referencia a una tabla
-- la tabla dual es una tabla auxiliar vacia
select * from dual;
select 2+2 from dual;
-- devuelve la fecha actual
select current_date from dual;
-- no existe devuelve la hora actual
-- select current_time from dual;
-- devuelve fecha y hora actual

select current_timestamp from dual;


select systimestamp from dual;
select sysdate from dual;
-- devuelve fecha
-- no existe un tipo de datos primitivo para los booleanos
-- CREATE TABLE a
-- ( q1 BOOLEAN
-- );
-- creamos un tipo de datos artificial e ineficiente
-- 0 significa false y cualquier cosas distinta de 0 es true
-- normalemte se usa 1 para true
create table a(
q number(1)
);
describe a;
insert into a values(0);
insert into a values(1);
insert into a values(9);
-- error
insert into a values(10);
select * from a;
create table xx(
q1 date
);
describe xx;

-- -------------- Formato FECHA


-- -------------- -------------- 'DIA/MES/AO'
-- ------------insert into xx values ('01/01/1000');
insert into xx values ('31/12/9999');
insert into xx values ('20/12/2012');
insert into xx values (current_date);
select * from xx;
select extract(month from systimestamp) from dual;
select extract(year from sysdate) from dual;
select extract(month from sysdate) from dual;
select extract(day from sysdate) from dual;

select extract(hour from systimestamp) from dual;


select extract(minute from systimestamp) from dual;
select extract(second from systimestamp) from dual;
-- emulacion del campo hora
create table cc(
hora number(2),
minutos number(2)
);
insert into cc values (extract(month from systimestamp),extract(minute from systimestamp));
select * from cc;
create table libros(
codigo int,
titulo varchar(20) not null,
autor varchar(30),
editorial varchar(15),
precio decimal(5,2),
cantidad integer,
primary key (codigo)
);
describe libros;
-- no existe la posibilidad de unsigned
-- no existe la clausula ZEROFILL
-- no existe la clausula auto_increment (existe el objeto secuencias)
-- el campo decimal se traduce a precio
-- int o integer se traducen a number

-- uso de la clausula default (no funciona)


-- y clausula not null
create table libros2(
codigo int,
titulo varchar(40) not null,
autor varchar(30) default 'desconocido',
editorial varchar(15),
precio decimal(5,2),
cantidad smallint,
primary key (codigo)
);
describe libros2;
-- no se informa la clausula default en el describe
-- error por que no inserto campos con clausula not null
-- insert into libros (codigo,autor) values (3,'Borges');
insert into libros (codigo,titulo) values (3,'Biblia');
select * from libros;
-- La clausula default no trabaja

-- --------------------- -------- Ejercicio 1


-- --------------------- 1- Crear la tabla Facturas dentro de la base de datos con el siguiente detalle:
-- Letra
-- Numero
-- Fecha
-- Monto

char y PK
integer y PK
date
double (decimal)

-- PK significa Primary Key


-- observar que se esta declarando una clave primaria compuesta
-- es decir (letra,codigo)
-- cada campo por si solo no es clave, ni tampoco identifica al registro
-- pero la suma de los dos forman la clave
create table facturas(
letra char(1),
numero integer,
fecha date,
monto number(6,2),
primary key (letra,numero)
);
-- 2- Crear la tabla Articulos dentro de la base de datos con el siguiente detalle:
-- Codigo
-- Nombre
-- Precio
-- Stock

integer y PK
varchar (50)
double
integer

create table articulos(


codigo integer,
nombre varchar(50),
precio decimal(5,2),
stock integer,
primary key (codigo)
);
select * from user_objects where object_type = 'TABLE';
describe facturas;
describe articulos;
-- 3- Cargar 5 registros en cada tabla
insert into articulos
insert into articulos
insert into articulos
insert into articulos
insert into articulos

values (1,'destornillador',25,50);
values (2,'pinza',35.50,22);
values (3,'martillo',15,28);
values (4,'maza',35,18);
values (5,'valde',55,13);

-- Las expresiones decimales se esxriben con . punto decimal no con coma

insert into facturas values ('a',0001,'18/10/2012',500);


insert into facturas values ('a',0002,'18/10/2012',2500);
insert into facturas values ('b',0003,'18/10/2012',320);
insert into facturas values ('b',0004,'18/10/2012',120);
insert into facturas values ('b',0005,'18/10/2012',560);
-- inserto un registro con la fecha actual
insert into facturas values ('c',0006,current_date,300);
select * from articulos;
select * from facturas;

-- PARTE 2
-- es necesario tener las tablas y registros definidos en la parte 1

-- ------------------------- Definiciones importantes


-- ------------------------- Significado de SQL
-- Structured Query Language
-- ANSI SQL
-- En la actualidad el SQL es el estndar de facto de la inmensa mayora de los SGBD comerciales.
-- Y, aunque la diversidad de aadidos particulares que incluyen las distintas implementaciones
-- comerciales del lenguaje es amplia, el soporte al estndar SQL-92 es general y muy amplio.
-- DDL (DATA DEFINITION LANGUAGE)
-- Create table
-- Alter table
-- Drop table
-- DML (DATA MANIPULATION LANGUAGE)
-- Select
-- Insert
-- Update
-- Delete
-- ------------------------------- Comando de recuperacion Select
-- -----------------------------select * from clientes;
-- Operadores Relacionales
-- = igual
-- != no igual
-- <> distinto
-- > mayor
-- < menor
-- >= mayor o igual
-- <= menor o igual
-- comodin * o lista de campos
select * from clientes;
select nombre,apellido from clientes;
select nombre from clientes;
select distinct nombre from clientes;
-- la clausula distinc omite los valores duplicados
-- Filtrado con Where
select * from clientes where nombre = 'dario';

select * from
select * from
select * from
select * from
select * from

clientes where
clientes where
clientes where
clientes where
clientes where

nombre = 'Dario';
nombre = 'DARIO';
codigo = 3;
codigo > 3;
codigo >= 3;

-- Operadores AND ,OR


select * from clientes where codigo < 3 or codigo >5;
select * from clientes where codigo >= 3 and codigo <=5;
select * from clientes where codigo <> 3;
-- Valores Null
-- insertamos registros para ver las consultas con valores null
insert into clientes (codigo,nombre,apellido,cuit,direccion) values (100,'maria','fernandez','xxxxx','');
insert into clientes (codigo,nombre,apellido,cuit,direccion) values (101,'gustavo','ramirez','xxxxx',null);
-- null significa desconocido y no debe interpretarse como vacio o 0
-- Los valores nulos no ocupan espacio, y son distintos a 0 y al espacio en blanco.
-- Hay que tener cuidado con los valores nulos en las operaciones, ya que 1 * NULL es igual a NULL.
select * from
select * from
select * from
select * from

clientes;
clientes where direccion ='';
clientes where direccion is null;
clientes where direccion is not null;

-- los valores null se consultan con is null o is not null


-- nunca consultamos como =null por que si bien ejecuta, pero no da el resultado correcto
select * from clientes where direccion =null;
-- Columnnas calculadas y Alias.
select 2 + 2 from dual;
select letra, numero, monto, monto*.21 from facturas;
select letra, numero, monto, monto*.21 as IVA from facturas;
-- Parametro Between y not between
insert into facturas values ('f',0006,current_date,300);
insert into facturas values ('f',0007,current_date,400);
select * from facturas;
select * from facturas where monto between 300 and 400;
select * from facturas where monto not between 300 and 400;
-- La sentencia between incluye lo extremos
-- posiblemente el concepto between "entre" tenga otra connotacion en ingles)
-- La sentencia not between no incluye los valores extremos

-- Parametro IN NOT IN
select * from clientes where codigo in (2,4,6);
select * from clientes where codigo not in (2,4,6);

-- Parametro like y operadores % y -- % significa nada o cualquier cosa


-- - significa un caracter cualquiera
select * from
select * from
select * from
select * from

clientes where
clientes where
clientes where
clientes where

nombre like '%mar%';


nombre like 'm%a';
nombre like 'm%';
nombre like 'm_r%';

-- Parametro ORDER BY ASC y DESC


-- muy costoso en tiempo de ejecucion
select * from clientes order by nombre;
select * from clientes order by nombre asc;
-- no es obligatorio aclara el asc pero si el desc
select * from clientes order by nombre desc;
select * from clientes order by apellido desc,nombre asc;
-- Clausula Limit no existe en ORACLE
-- se usa ROWNUM
select * from clientes where ROWNUM <=2;
-- limita la cantidad de registros de salida

-- ------------ Ejercicio 2
-- ------------ Llenar las tablas artculos clientes y facturas con 10 registros cada una,
-- ejemplo:
insert into clientes (codigo,nombre,apellido,cuit,direccion) values (200,'jose','benuto','3647493','loria 940');
insert into facturas (letra,numero,fecha,monto) values ('a',1001,'25/10/2012',350);
insert into facturas (letra,numero,fecha,monto) values ('a',1002,current_date,540);
select * from facturas;
insert into articulos (codigo,nombre,precio,stock) values (110,'destornillador',30,100);
insert into articulos (codigo,nombre,precio,stock) values (111,'martillo',40*1.21,50);
-- en este ultimo ejemplo le calculamos el valor del iva al valor del articulos
select * from articulos;

-- ------------ Ejercicio 3
-- ------------ 1 - Basndose en la tabla artculos obtener los siguientes listados.

-- a-- b-- c-- d-- e-- f-- g-

artculos con precio mayor a 100


artculos con precio entre 20 y 40 (usar < y >)
artculos con precio entre 40 y 60 (usar BETWEEN)
artculos con precio = 20 y stock mayor a 30
artculos con precio (12,20,30) no usar IN
artculos con precio (12,20,30) usar el IN
artculos que su precio no sea (12,20,30)

-2- Listar los artculos ordenados por precio de mayor a menor, y si hubiera precio iguales deben quedar
ordenados por nombre.
-3- Listar todos los artculos incluyendo una columna denominada precio con IVA, la cual deber tener el
monto con el iva del producto.
-4- Listar todos los artculos incluyendo una columna denominada cantidad de cuotas y otra valor de
cuota, la cantidad es fija y es 3, el valor de cuota corresponde a 1/3 del monto con un 5% de inters.
-- respuestas
-- A select * from
-- B select * from
-- C select * from
-- D select * from
-- E select * from
-- F select * from
-- G select * from

articulos where precio > 100;


articulos where precio > 500 and precio < 1000;
articulos where precio between 500 and 1000;
articulos where precio = 1000 and stock > 3;
articulos where precio = 100 and precio = 500 and precio = 1000;
articulos where precio in (100,500,1000);
articulos where precio not in (100,500,1000);

-- 2 select * from articulos order by precio desc, nombre asc;


-- 3 -- no valido para oracle
-- select * ,precio*1.21 as Precio_con_IVA from articulos;
-- O
select codigo,nombre,precio, precio*1.21 as precio_con_IVA, stock from articulos;
-- nota: La segunda consulta resulta ms larga, pero tiene la ventaja de que podemos elegir el orden de las
columnas.
-- 4select codigo,nombre,precio, 3 as cantidad_de_cuotas, precio/3*1.05 as valor_cuota, stock from articulos;

-- -------------------- Funcion de Redondeo


-- ------------------select 10/3 from dual;
select round(10/3) from dual;
select round(10/3,2) from dual;

-- select PI( ) from dual;


-- no definida la funcion
-- es posible definirla
select asin(1)*2 from dual;
select asin(1)*2 as PI from dual;
select round(asin(1)*2) from dual; -- devuelve la parte entera
select round(asin(1)*2,2) from dual; -- redondea con 2 decimales
select codigo,nombre,precio, 3 as cantidad_de_cuotas, round(precio/3*1.05,2) as valor_cuota, stock from articulos;

-- -------------- Anexo Parte 2


-- -------------- ------------------- Tipo de datos Enum (CHECK)
-- ------------------- no existe en oracle
create table postulantes(
numero int,
documento char(8),
nombre varchar(30),
estudios varchar(20) check (estudios in('ninguno','primario','secundario', 'terciario','universitario')),
primary key(numero)
);
describe postulantes;
-- no valido
insert into postulantes values(1,'22255265','Juana Pereyra',' noestudio');
insert into postulantes values(2,'22255265','Juana Pereyra','primario');
insert into postulantes values(3,'22255265','Juana Pereyra','secundario');
-- tambien viola la restriccion
insert into postulantes values(4,'22255265','Juana Pereyra','SECUNDARIO');
select * from postulantes;
select * from postulantes
where estudios='secundario';
select * from postulantes
where estudios='Secundario';
select * from postulantes
where estudios='universitario';

-- ---------- Consultas
-- --------select * from clientes where codigo=3;
-- no recomendado
select * from clientes where codigo='3';
select * from clientes where nombre='juan';
-- error
-- select * from clientes where nombre=juan;

-- Restriccion Unsigned
-- Agregar restriccion en campo edad
-- check (edad >=0);

-- PARTE 3
-- es necesario tener las tablas y registros definidos en las partes anteriores

-- ------------------------ Insercion de registros


-- ------------------------ ----------------------------------------------------------- Insercin de registros escribiendo la definicion de campos
-- ---------------------------------------------------------insert into clientes (codigo,nombre,apellido,direccion) values (300,'Andrea','Abate','Laprida 648');
insert into clientes (codigo,apellido,nombre) values (301,'Stuart','Jhon');
-- este modo tiene la ventaja de que no es necesario ingresar todos los campos
-- y no es necesario respetar el orden en que se encuentran en la tabla
insert into clientes (codig,nombre,direccion) values (302,'Francisco','Cerrito 256');
-- este registro produce una advertencia dado que no ingresamos el campo apellido vacio
-- pero igual se permitio el ingreso
-- insert into clientes (nombre,apellido) values ('Lorena',null);
-- este insert produce un error dado que no podemos poner null en el campo apellido
-- y no es posible de ingresar
select * from clientes;
-- En ORACLE los registros se ingresan y no hay un orden predeterminado para
-- mostrarlos en el select como en MySQL
insert into clientes (codigo,apellido,nombre) values (1301,'Stuart','Jhon');
select * from clientes;

-- -------------------------------------------------------- Insercin de registros sin usar la difenicin de campos


-- ------------------------------------------------------describe clientes;
insert into clientes values(1000,'Laura','Georgeff','56565','Berutti 2589','25','');
-- cuando ingreso registros en este modo, no ingreso la definicion de campos
-- pero se debe ingresar todos los valores de todos los campos en el orden en que estan en la tabla
-- no se pueden omitir campos y si algun campo es vacio debo colocarlo vacio, ej: campo comentarios
-- no puedo ingresar 2 veces el registro por que repito la clave primaria.
select * from clientes;
-- ------------------ Insert usando SET
-- ------------------ Yo no lo veo dentro del ANSI
-- No funciona en ORACLE
-- describe clientes;

-- insert into clientes set CODIGO=10, NOMBRE='abcde';


-- select * from clientes;
-- insert into clientes set nombre='Teresa', apellido='Jimenez';
-- select * from clientes;

-- cargar registros usando la clausula select


create table amigos(
nombre varchar(20),
apellido varchar(20)
);
insert into amigos (nombre,apellido) select nombre,apellido from clientes;
select * from amigos;
-- NO ES POSIBLE
-- crear una tabla a partir de informacion de otra
-- create table nombres
-- select distinct nombre as nombre from clientes;

-- --------------------------- - Tablas Temporales


-- --------------------------- Las tablas temporales se almacenan en disco
-- No se puede crear una tabla temporaria a con una consulta
-- Al reinicial la sesion la tabla temporaria aparece vacia
CREATE GLOBAL TEMPORARY TABLE TEMP_TABLA
(
NOMBRE VARCHAR2(50),
APELLIDO VARCHAR2(100)
);
select * from user_tables where table_name like 'T%';

-- insertar varios registros simultaneamente


-- describe amigos;
-- insert into amigos values ('Marina','Fernandez'),('Lujan','Tucci'),('Gabriel','Strauss');
-- select *from amigos;
-- insert into amigos (NOMBRE,APELLIDO) values ('Marina','Fernandez'),('Lujan','Tucci'),('Gabriel','Strauss');
-- select *from amigos;
select * from amigos;
INSERT ALL

INTO amigos (nombre,apellido) VALUES ('Marina','Fernandez')


INTO amigos (nombre,apellido) VALUES ('Lujan','Tucci')
INTO amigos (nombre,apellido) VALUES ('Gabriel','Strauss')
SELECT 1 FROM DUAL;
select * from amigos;
INSERT ALL
INTO amigos VALUES ('Marina','Fernandez')
INTO amigos VALUES ('Lujan','Tucci')
INTO amigos VALUES ('Gabriel','Strauss')
SELECT 1 FROM DUAL;
select * from amigos;

-- ------------------------- Error de clave duplicada


-- -----------------------insert into clientes (codigo,nombre,apellido,cuit,direccion) values (109,'jose','sanchez','xxxxx','chile 150');
-- insert into clientes (codigo,nombre,apellido,cuit,direccion) values (109,'carlos','flores','xxxxx','bolivar 150');
-- no se puede ingresar por que ya existe el codigo 109

-- ------------------------------ Borrar registros de una tabla


-- ----------------------------delete from clientes where codigo =5;
-- borra un unico registro
-- estos comandos pueden borrar mas de un registro
delete from clientes where nombre ='juan';
delete from clientes where codigo >13;
delete from clientes where codigo <=3;
select * from clientes;
delete from clientes;
-- CUIDADO BORRA TODOS LOS REGISTROS DE LA TABLA uno por uno

-- ---------------------------------------------------------------------------------- truncate clientes;


-- tambien vacia toda la tabla cliente, borrando todos los registros simultaneamente
-- no uno por uno como delete, por lo tanto es mas veloz
-- tambien reinicia las secuencia de los auto incrementables a cero.
-- ---------------------------------------------------------------------------------- ---------------------------------------------------------------------------------- Truncar una TABLA
-- existe truncate
-- truncate table clientes;
-- --------------------------------------------------------------------------------truncate table clientes;
select * from clientes;
-- si borramos registros aca tenemos algunos para poder continuar
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)

values (1,'juan','perez','xxxxx','peru 323');


values (2,'diego','torres','xxxxx','chile 320');
values (3,'laura','gomez','xxxxx','san juan 420');
values (4,'mario','lopez','xxxxx','lavalle 770');
values (5,'dario','sanchez','xxxxx','mexico 150');

select * from clientes;


-- --------------------------------------------- Actualizar valores de registros de una tabla
-- -------------------------------------------select * from clientes;
update clientes set nombre = 'mariana'
where nombre = 'mario';
select * from clientes;
update clientes set nombre = 'maria'
where codigo = 4;
select * from clientes;
update clientes set nombre = 'mariana';
-- CUIDADO CAMBIA TODOS LOS NOMBRES A MARIANA
update clientes set nombre='lorena', apellido='milone' where codigo = 4;
select * from clientes;
-- permite cambiar valores de varios campos, separados por coma

-- ------------ Ejercicio 4
-- ------------ Basndose en la tabla clientes realizar los siguientes puntos.
-- 1- Insertar 5 clientes en la tabla clientes utilizando el insert into sin utilizar campos como parte de la sentencias,
es decir de la forma simplificada.
-- 2- Insertar 5 clientes en la tabla clientes utilizando los campos como parte de la sentencias, es decir de la forma
extendida. Completar solo los campos nombre, apellido y CUIT.
-- 3- Actualizar el nombre del cliente 1 a Jose.
-- 4- Actualizar el nombre apellido y cuit del cliente 3 a Pablo Fuentes 20-21053119-0.
-- 5- Actualizar todos los comentarios NULL a .
-- 6- Eliminar los clientes con apellido Perez.
-- 7- Eliminar los clientes con CUIT Terminan en 0.
-- Basando se en la tabla artculos, realizar los siguientes puntos.
-8- Aumentar un 20% los precios de los artculos con precio menor igual a 50.
-9- Aumentar un 15% los precios de los artculos con precio mayor a 50.
-10- Bajar un 5% los precios de los artculos con precio mayor a 200.
-11- Eliminar los artculos con stock menor a 0.
-- 1)
insert into clientes values (20,'Romeo','Lopez','34343434','Anchorena 950',30,'');
-- 2)
insert into clientes (codigo,nombre,apellido,cuit,direccion) values (31,'Florencia','Salinas','82828282','W.Morris
3420');
-- 3)
update clientes set nombre='Manuel' where codigo=1;
-- 4)
update clientes set nombre='Pablo', apellido='Fuentes', cuit='20-21053119-0' where codigo=2;
-- 5)
update clientes set comentarios='';
-- 6)
delete from clientes where apellido='perez';
-- 7)
delete from clientes where cuit like '%0';
-- 8)
update articulos set precio=precio * 1.20 where precio < 500;
-- 9)
update articulos set precio=precio * 1.15 where precio between 1000 and 2000;
-- 10)
update articulos set precio=precio *.90 where precio > 5000;
-- 11)
delete from articulos where stock =0;

-- -------------------------------- Alter TABLE


-- modificar estructuras de tablas
-- ------------------------------alter table clientes
drop column edad;
-- agregar campos
alter table clientes
add edad smallint;
describe clientes;
select * from clientes;
update clientes set edad=25 where codigo =1;
update clientes set edad=36 where codigo =2;
select * from clientes;
-- modificar campos
alter table clientes
modify edad check (edad >=0);
update clientes set edad=36 where codigo =3;
-- viola la resctriccion
-- update clientes set edad=-10 where codigo =3;
describe clientes;
select * from clientes;
-- cambiar nombre a un campo
-- nop existe el change
-- alter table clientes
-- change edad antiguedad number(2) check (antiguedad >=0);
describe clientes;
select * from clientes;
-- borrar campos
alter table clientes
drop column edad;
describe clientes;
select * from clientes;

-- quito la clave primaria


-- ahora si quito la clave primaria
alter table clientes
drop primary key;

describe clientes;
select * from clientes;
-- es posible listar una tabla a la cual le quitamos la PK
-- hay posibilidad de recorrido plano en MySQL
-- agregar clave primaria
alter table clientes
add primary key (codigo);
describe clientes;
select * from clientes;

-- renombrar tablas
-- NO HAY RENOMBRAR TABLAS
-- rename table clientes to auxiliar;
-- show tables;
-- rename table auxiliar to clientes , auxiliar2 to facturas;
-- show tables;

-- -------------- Anexo Parte 3


-- -------------

-- ----------------------------- Comando Replace


-- ----------------------------- Funciona igual que INSERT, salvo que si el campo clave es existente reemplaza al registro
-- ESTE COMANDO NO FUNCION Y NO ESTA DEFINIDO EN EL ANSI SQL
-- select * from clientes;
-- replace into clientes (codigo,nombre,apellido) values (60,'Ana','Lorenzo');
-- Actua insertando registros
-- select * from clientes;
-- replace into clientes values (3,'Monica','Fernandez','4444','Pampa 543','');
-- Actua reemplazando el registro de codigo 1

-- ----------------------------- OVERFLOW de Campos Nmericos


-- ----------------------------- drop table xx;
create table xx(
a number(1)
);
-- insert into xx values (10);
insert into xx values (-9);
select * from xx;
-- update xx set a=a-1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
update xx set a=a+1;
select * from xx;
-- --------------------

-- restriccion unsigned
-- -------------------drop table xx;
create table xx(
a number(1) check (a>=0)
);
-- insert into xx values (10);
insert into xx values (9);
-- insert into xx values (-9);
select * from xx;

-- ------------------ manejo de indices


-- ----------------describe clientes;
select
*
from
clientes;
-- Para facilitar la obtencin de informacin de una tabla se utilizan ndices.
-- El indice de una tabla desempea la misma funcin que el ndice de un libro: permite encontrar
-datos rpidamente; en el caso de las tablas, localiza registros.
-- Una tabla se indexa por un campo (o varios).
-- El ndice es un tipo de archivo con 2 entradas: un dato (un valor de algn campo de la tabla)
-y un puntero.
-- Un ndice posibilita el acceso directo y rpido haciendo ms eficiente las bsquedas. Sin ndice,
-se debe recorrer secuencialmente toda la tabla para encontrar un registro.
-- El objetivo de un indice es acelerar la recuperacin de informacin.
-- La desventaja es que consume espacio en el disco.
-- La indexacin es una tcnica que optimiza el acceso a los datos, mejora el rendimiento acelerando
-las consultas y otras operaciones. Es til cuando la tabla contiene miles de registros.
-- Los ndices se usan para varias operaciones:
-- - para buscar registros rpidamente.
-- - para recuperar registros de otras tablas empleando "join".
-- Hay distintos tipos de ndices, a saber:
-- 1) "primary key": es el que definimos como clave primaria. Los valores indexados deben ser nicos
-y adems no pueden ser nulos. MySQL le da el nombre "PRIMARY". Una tabla solamente puede
-tener una clave primaria.
-- 2) "index": crea un indice comn, los valores no necesariamente son unicos y aceptan valores
-"null". Podemos darle un nombre, si no se lo damos, se coloca uno por defecto. "key"
-es sinnimo de "index". Puede haber varios por tabla.
-- 3) "unique": crea un indice para los cuales los valores deben ser nicos y diferentes,
-aparece un mensaje de error si intentamos agregar un registro con un valor ya existente.
-Permite valores nulos y pueden definirse varios por tabla. Podemos darle un nombre,

--

si no se lo damos, se coloca uno por defecto.

-- Todos los ndices pueden ser multicolumna, es decir, pueden estar formados por ms de 1 campo.
-- muestra los indices de una tabla
-- show index from clientes;
select * from user_indexes where table_name='CLIENTES';
select * from user_indexes where table_name='clientes';
-- la tabla ya tiene un indice del tipo primary key
-- indice comun
create table libros3 (
codigo int,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
primary key (codigo)
);
create index I_libros3_editorial
on libros3(editorial);
select * from user_indexes where table_name='LIBROS3';
describe libros3;
-- el comando describe no muestra info de los indices
-- indice comun multicolumna
create table libros4 (
codigo int,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
primary key (codigo)
);
create index I_libros4_tituloeditorial
on libros4(titulo,editorial);
select * from user_indexes where table_name='LIBROS4';

-- indice unique
create table libros5(
codigo int,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15)
);
create unique index I_libros5_codigo
on libros5(codigo);
create unique index I_libros5_tituloeditorial

on libros5(titulo,editorial);
select * from user_indexes where table_name='LIBROS5';
-- borrar indices
drop index I_LIBROS3_EDITORIAL;
select * from user_indexes where table_name='LIBROS3';
drop index i_libros4_tituloeditorial;
select * from user_indexes where table_name='LIBROS4';
-- Si inserto registros con codigo desordenado siendo codigo PK
-- al listarlo los veo desordenados (Diferente a MYSQL)
-- hay posibilidad de recorrido plano (Diferente a MYSQL)
select * from clientes;
insert into clientes values(25,'Jose','Paso','xxxxx','Larrea 324',25,null);
insert into clientes values(20,'Diego','Lorenzo','xxxxx','Laureles 623',26,null);
select * from clientes;
select * from user_indexes where table_name='CLIENTES';
alter table clientes drop primary key;
select * from clientes;
select * from user_indexes where table_name='CLIENTES';
alter table clientes add primary key (codigo);
select * from clientes;
select * from user_indexes where table_name='CLIENTES';

-- -------------------------- Estructuras de control if


-- -------------------------- ----------------------------------------------------------- no existe el IF dentro del select se usa solamente el CASE
-- ---------------------------------------------------------drop table libros;
create table libros(
codigo int,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(30),
precio decimal(5,2) check (precio >=0),
primary key (codigo)
);

insert into libros values


(1,'Alicia en el pais de las maravillas','Lewis Carroll','Paidos',50.5);
insert into libros values
(2,'Alicia a traves del espejo','Lewis Carroll','Emece',25);
insert into libros values
(3,'El aleph','Borges','Paidos',15);

insert into libros values


(4,'Matemtica estas ahi','Paenza','Paidos',10);
insert into libros values
(5,'Antologia','Borges','Paidos',null);
insert into libros values
(6,'El gato con botas','Paidos',null);
insert into libros values
(7,'Martin Fierro','Jose Hernandez','Emece',90);
select * from libros;
select titulo from libros
where precio<50;
select titulo from libros
where precio >=50;
select titulo, precio,
case when precio <= 50 then 'barato'
when precio > 50 then 'caro'
else 'No definido'
end as estado
from libros;
select autor, count(*)
from libros
group by autor;
select autor, count(*)
from libros
group by autor
having count(*)>1;

-- Estructura DECODE reemplaza al if pero es muy muy binaria


-- solo comparacion directa no permite mayor o menor
select autor,
decode (count(*),1,'1','mas de 1') as cantidad
from libros
group by autor;
select autor,
decode (count(*),1,'1','mas de 1') as cantidad
from libros
group by autor
order by cantidad;

-- -------------------------- funciones de agrupamiento


-- -------------------------- Las funciones de agrupamiento devuelven un solo registro como resultado
-- MAX con nmeros
select max(monto) from facturas;
select max(monto) as maximo from facturas;
select max(monto) as maximo from facturas where letra='b';
-- uso del alias comillas dobles
select max(monto) as valor_maximo from facturas;
select max(monto) as "valor maximo" from facturas;
-- select max (monto) from facturas;
-- no debe haber espacio entre la funcion y el primer parantesis
-- algunas funciones pueden ser aceptadas sin espacio,
-- pero el lenguaje de Oracle es sin el espacio
-- MAX con fechas
select max(fecha) as ultima_fecha from facturas where letra='b';
-- MIN con nmeros
select min(monto) as minimo from facturas where letra='b';
-- MIN con fechas
select min(fecha) as primer_fecha from facturas where letra='b';
-- AVG Average
select avg(monto) from facturas;
select avg(monto) as promedio from facturas;
select avg(monto) as promedio from facturas where letra='b';
-- SUM
select sum(monto) as suma from facturas where letra='a';
-- COUNT
select count(*) as suma from facturas where letra='a';
select count(*) from clientes;
select count(direccion) from clientes;
-- (cuenta todos los clientes cuya direccion no es nula)
insert into clientes (codigo,apellido,nombre,direccion) values (350,'Ana','Salone',null);

-- ----------------------- Agrupamiento en ORACLE

-- ----------------------- sin agrupacion consultariamos asi


-- select letra,count(*) as total, sum(monto) as facturacion from facturas where letra='a';
-- select letra,count(*) as total, sum(monto) as facturacion from facturas where letra='b';
-- select letra,count(*) as total, sum(monto) as facturacion from facturas where letra='c';
select 'letra A',count(*) as total, sum(monto) as facturacion from facturas where letra='a';
select 'letra B',count(*) as total, sum(monto) as facturacion from facturas where letra='b';
select 'letra C',count(*) as total, sum(monto) as facturacion from facturas where letra='c';
-- GROUP BY
-- devuelve un registro por cada valor del campo de agrupado
-- siempre debe ir como primer campo el campo por el cual agrupamos
select letra,count(*) as cantidad, sum(monto) as facturacion from facturas group by letra;
-- select letra,count(*) as cantidad, sum(monto) as facturacion from facturas group by letra having facturacion
>1000;
select letra,count(*) as cantidad, sum(monto) as facturacion from facturas group by letra having sum(monto)
>1000;
select fecha,sum(monto) as facturacin, count(*) as cantidad from facturas group by fecha;
-- SUBQUERIES
select max(monto) from facturas;
select * from facturas where monto=(select max(monto) from facturas);
select * from facturas where monto=(select min(monto) from facturas);
select * from facturas where fecha=(select min(fecha) from facturas);
select * from facturas where fecha=(select max(fecha) from facturas);
select * from facturas where fecha=current_date;
select letra,count(*) as cantidad, sum(monto) as facturacion from facturas group by letra;

-- -----------EJERCICIO 5
-- ------------ 1. Crear la tabla 'autos' dentro de la base de datos 'intro' con el siguiente detalle:
-------

codigo INTEGER y PK
marca VARCHAR(255)
modelo VARCHAR(255)
color VARCHAR(255)
anio
INTEGER
precio DOUBLE

-- 2. Cargar la tabla con 15 autos (hacerlo con MySQL WorkBench o el INSERT INTO).
-- 3. Realizar las siguientes consultas:
-a. obtener el precio mximo.
-b. obtener el precio mnimo.

-c. obtener el precio mnimo entre los aos 2000 y 2008.


-d. obtener el precio promedio.
-e. obtener el precio promedio del ao 2006.
-f. obtener la cantidad de autos.
-g. obtener la cantidad de autos que tienen un precio entre $35.000 y $40.000.
-h. obtener la cantidad de autos que hay en cada ao.
-i. obtener la cantidad de autos y el precio promedio en cada ao.
-j. obtener la suma de precios y el promedio de precios segn marca.
-- k. informar los autos con el menor precio.
-- l. informar los autos con el menor precio entre los aos 2008 y 2010
-- 1CREATE TABLE autos (
Codigo number(10),
Marca varchar(45) NOT NULL,
Modelo varchar(45) NOT NULL,
Color varchar(45) DEFAULT NULL,
Anio number(10) check (anio>=0) ,
precio number(10,2),
PRIMARY KEY (Codigo)
);
-- es coveniente omitir la ,
-- porque a futuro nuestra base puede estar en un servidor linux en ingles
-- 2 insert into autos values (1,'ford','ka','rojo',2008,30000);
insert into autos values (2,'renault','kangoo','verde',2009,55000);
insert into autos values (3,'fiat','uno','azul',2007,25000);
insert into autos values (4,'ford','fiesta','rojo',2010,40000);
insert into autos values (5,'ford','ka','negro',2008,30000);
insert into autos values (6,'ford','ecosport','rojo',2008,50000);
insert into autos values (7,'WV','polo','gris',2005,23000);
insert into autos values (8,'Chevrolet','corsa','rojo',2001,20000);
insert into autos values (9,'ford','ka','azul',2008,30000);
insert into autos values (10,'fiat','uno','blanco',2010,38000);
-- 3 -- a select max(precio) as maximo from autos;
-- bselect min(precio) as minimo from autos;
-- cselect min(precio) as minimo from autos where precio between 2000 and 2008;
-- dselect avg(precio) as promedio from autos;
-- eselect avg(precio) as promedio from autos where anio=2006;
-- f-

select count(*) as cantidad from autos;


-- gselect count(*) as cantidad from autos where precio between 35000 and 40000;
-- hselect anio as ao,count(*) as cantidad from autos group by anio;
-- iselect anio as ao,count(*) as cantidad, avg(precio) as promedio from autos group by anio;
-- jselect marca, sum(precio) as suma, avg(precio) as promedio from autos group by marca;
-- kselect * from autos where precio=(select min(precio) from autos);
-- lselect * from autos where precio=(select min(precio) from autos where anio between 2008 and 2010) and anio
between 2008 and 2010;

-- -------------------------------------------------------- RELACIONES ENTRE TABLAS, CLAVE FORANEA FOREIGN KEY(FK).


-- -------------------------------------------------------- -------------------------- - Clientes - Facturas -- -------------------------- - codigo PK - letra PK-- - nombre - numero PK-- - apellido --------- fecha -- - cuit
1
N
- monto -- - direccion - codigo -- - comentarios------------- --------------- en los diagramas de DER diagrama entidad relacion se representan las BD
-- en una BD relacional todas las tablas estan relacionadas entre si
-- Agregamos un campo que actue como FK
alter table facturas add codigocliente integer;
describe facturas;
select * from facturas;
-- Agregamos valores a los registros
update facturas set codigocliente=2 where
update facturas set codigocliente=1 where
update facturas set codigocliente=1 where
update facturas set codigocliente=5 where
update facturas set codigocliente=2 where
select * from facturas;

numero=1;
numero=2;
numero=3;
numero=4;
numero=5;

-- producto cartesiano
-- muestra todos los elementos de la primer tabla con todos los elementos de la segunda
select * from clientes, facturas;
select count(*) from clientes;
select count(*) from facturas;
select count(*) from clientes,facturas;
-- realizamos la consulta respetando la relacion entre las dos tablas
select * from clientes c, facturas f where c.codigo=f.codigocliente;
select count(*) from clientes c, facturas f where c.codigo=f.codigocliente;
select c.nombre, f.letra, f.numero, f.monto from clientes c, facturas f where c.codigo=f.codigocliente order by
c.nombre asc;
-- consulamos usando el comando join
select * from clientes c join facturas f on c.codigo=f.codigocliente;
-- muestra todos los elementos libres de la derecha
select * from clientes c left join facturas f on c.codigo=f.codigocliente;
-- muestra todos los elementos libres de la izquierda
select * from clientes c right join facturas f on c.codigo=f.codigocliente;
-- declaro la Foreign Key FK
select * from facturas;
delete from facturas where codigocliente is null;
alter table facturas
modify codigocliente integer not null;

alter table facturas


add constraint FK_facturas_codcli
foreign key (codigocliente)
references clientes(codigo)
on delete cascade;
-- delete puede ser cascade o set null
describe facturas;
-- cuando existe una restriccion FK no es posible ingresar un codigo de cliente inexistente
insert into facturas values ('a',1050,curdate(),250,1);
-- insert into facturas values ('b',1060,curdate(),250,250);
-- el segundo registro no es posible ingresarlo por que tiene un numero de cliente inexistente
select * from clientes;
-- si chequeamos la tabla cliente comprobamos que el cliente con codigo 259 no existe
show tables;
describe facturas;

-- ------------ Ejercicio 6
-- ------------ 1-- 2-- 3-- 4-- 5-- 6-

Informar que clientes han comprado en el da de hoy.


Informar la suma de los montos de cada cliente.
Informar cual es el cliente que ms ha comprado.
Informar la cantidad de facturas de cada cliente.
Informar quienes compraron el primer da de ventas.
Informar que compro el cliente Juan Perez.

-- 1select c.codigo, nombre, apellido from clientes c, facturas f


where c.codigo=f.codigocliente and fecha=current_date;
select distinct c.codigo, nombre, apellido from clientes c, facturas f
where c.codigo=f.codigocliente and fecha=current_date;
-- agregando la clausula distintc evitamos los valores duplicados
-- 2-- select c.codigo, nombre, apellido, sum(monto) as suma_total from clientes c, facturas f
-- where c.codigo=f.codigocliente group by c.codigo;
select codigo, sum(monto) as suma_total from clientes c, facturas f
where c.codigo=f.codigocliente group by c.codigo;
-- 3-- subconsulta para saber el maximo
select max(sum(monto)) as total from clientes c, facturas f where c.codigo=f.codigocliente group by c.codigo;
select c.codigo, sum(monto) as total from clientes c, facturas f
where c.codigo=f.codigocliente group by c.codigo having sum(monto)=1060;
select c.codigo, sum(monto) as total from clientes c, facturas f
where c.codigo=f.codigocliente group by c.codigo having sum(monto)= (select max(sum(monto)) as total from
clientes c, facturas f where c.codigo=f.codigocliente group by c.codigo);
-- 4select c.codigo, count(*) as cantidad_facturas from clientes c, facturas f
where c.codigo=f.codigocliente group by c.codigo;
-- 5select distinct c.codigo, nombre, apellido from clientes c, facturas f
where c.codigo=f.codigocliente and fecha=(select min(fecha) from facturas);
-- 6select c.codigo, nombre, apellido, letra, numero, fecha, monto
from clientes c, facturas f
where c.codigo=f.codigocliente;
select * from facturas;
select * from clientes;

-- ------------------------- Agrego la tabla detalles


-- -----------------------create table detalles(
letra char(1) not null,
numero int not null,
codigo int not null,
cantidad int check(cantidad>=0) not null,
primary key(letra,numero,codigo)
);
describe detalles;
select * from facturas;
select * from articulos;
-- ------------------------- inserto detalles de las facturas
-- -----------------------insert into detalles values('a',1,3,10);
insert into detalles values('a',1,1,3);
insert into detalles values('a',1,5,3);
insert into detalles values('a',2,3,10);
insert into detalles values('b',3,3,10);
select * from facturas,detalles,articulos; -- producto cartesiano
-- ------------------------- Consulta respetando las relaciones
-- -----------------------select * from facturas f,detalles d,articulos a where f.letra=d.letra
and f.numero=d.numero and d.codigo=a.codigo;
-- ------------------------- que compro Jean Perez
-- -----------------------select * from clientes c,facturas f,detalles d,articulos a
where c.codigo=f.codigocliente and f.letra=d.letra and f.numero=d.numero
and d.codigo=a.codigo and c.nombre='juan' and c.apellido='perez' ;
select * from clientes c join facturas f on c.codigo=f.codigocliente
join detalles d on f.letra=d.letra and f.numero=d.numero
join articulos a on d.codigo=a.codigo
where c.nombre='juan' and c.apellido='perez';

-- ------------------------- agrego restriccion de FK


-- -----------------------alter table detalles

add constraint FK_facturas_letra_numero


foreign key (letra,numero)
references facturas(letra,numero)
on delete cascade;

-- -------------------------- ------------------------- pruebo restriccion con registros validos y no validos


-- -------------------------- -----------------------insert into detalles values('a',1,4,10);
insert into detalles values('x',3,3,10);

-- -------------- Anexo Parte 4


-- -------------- --------------------- ejemplo con group by
-- -------------------CREATE TABLE articulos2 (
codigo number(10) check (codigo>=0) NOT NULL,
descripcion varchar(50) NOT NULL,
nombre varchar(45) NOT NULL,
precio number(10,2) check (precio>=0) NOT NULL,
stock number(10) check (stock>=0) NOT NULL,
marca varchar(45) NOT NULL
);
-- Es un buen Ejemplo usar Excel para pasar de formato multiple a simple
insert into articulos2 values (1
40
,
'PHILIPS')
;
insert into articulos2 values (2
30
,
'SAMSUNG')
;
insert into articulos2 values (3
25
,
'NOBLEX')
;
insert into articulos2 values (4
25
,
'LG') ;
insert into articulos2 values (5
20
,
'HITACHI')
;
insert into articulos2 values (6
20
,
'PHILCO')
;
insert into articulos2 values (7
,
'ADMIRAL')
;
insert into articulos2 values (8
8
,
'ADMIRAL')
;
insert into articulos2 values (9
5
,
'ADMIRAL')
;
insert into articulos2 values (10
'COMPAQ PRESARIO')
;
insert into articulos2 values (11
'EPSON')
;
insert into articulos2 values (12
'HEWLETT PACKARD')
;
insert into articulos2 values (13
'EPSON')
;
insert into articulos2 values (14
'HEWLETT PACKARD')
;
insert into articulos2 values (15
'PHILCO')
;
insert into articulos2 values (16
,
'NOBLEX')
;
insert into articulos2 values (17
'X-VIEW')
;
insert into articulos2 values (18
'SANYO')
;

'Televisores' ,

'TV LCD 19\" MODELO PFL3403'

2199

'Televisores' ,

'TV LCD22\" MODELO LN22A450'

2399

'Televisores' ,

'TV LCD 32\" MODELO LC813H '

2999

'Televisores' ,

'TV LCD 26\" MODELO 26LG30R'

2999

'Televisores' ,

'TV LCD 26\" MODELO CDH-L26S02' ,

'Televisores' ,

'TV LCD 32\" MODELO PL3219 '

'Computadoras' ,

'CPU LE1250DVD2GB160VS' ,

'Computadoras' ,

'CPU A64X246DV2G160VBOF '

'Computadoras' ,

'CPU E5200DVDR2GB320VB '

2699

'Computadoras' ,

'CPU SG3308LA ' ,

'Impresoras'

'IMPRESORA T23 '

'Impresoras'

'IMPRESORA DJ-6940 '

'Impresoras'

'IMPRESORA T33' ,

'Impresoras'

'IMPRESORA K5400 '

'Home Theater' ,

'HOME CINEMA SPH70 '

'Home Theater' ,

'HOME CINEMA AMX115 ' ,

'Home Theater' ,

'HOME CINEMA HT E 860 ' ,

599

'Home Theater' ,

'HOME CINEMA DC-T990 ' ,

759

3099
,
,

3399
2199

399

,
499
,

,
15

2499

18

349

219

3099

,
,

20

12

319

419

,
0

insert into articulos2 values (19


,
'NOBLEX')
;
insert into articulos2 values (20
6
,
'LG') ;
insert into articulos2 values (21
,
'SAMSUNG')
;
insert into articulos2 values (22
18
,
'PHILIPS')
;
insert into articulos2 values (23
,
'LG') ;
insert into articulos2 values (24
12
,
'LG') ;
insert into articulos2 values (25
'SONY') ;
insert into articulos2 values (26
5
,
'PHILIPS')
;
insert into articulos2 values (27
'NOBLEX')
;
insert into articulos2 values (28
BROWN') ;
insert into articulos2 values (29
'SONY') ;
insert into articulos2 values (30
insert into articulos2 values (31
'SONY') ;
insert into articulos2 values (32
;
insert into articulos2 values (33
12
,
'ADMIRAL')
;
insert into articulos2 values (34
'COMPAQ PRESARIO')
;
insert into articulos2 values (35
'HEWLETT PACKARD')
;
insert into articulos2 values (36
'HEWLETT PACKARD')
;
insert into articulos2 values (37
'HEWLETT PACKARD')
;
insert into articulos2 values (38
169 ,
15
,
'PHILIPS')
insert into articulos2 values (39
8
,
'PHILIPS')
;
insert into articulos2 values (40
8
,
'PHILIPS')
;
insert into articulos2 values (41
8
,
'PHILIPS')
;
insert into articulos2 values (42
10
,
'SANYO')
;
insert into articulos2 values (43
1679 ,
7
,
'GAFA') ;
insert into articulos2 values (44
4
,
'GAFA') ;
insert into articulos2 values (45
1939 ,
12
,
'GAFA') ;
insert into articulos2 values (46
2449 ,
10
,
'LG') ;
insert into articulos2 values (47
2499 ,
10
,
'LG') ;

'Home Theater' ,

'HOME CINEMA HT-1105U' ,

'Home Theater' ,

'HOME CINEMA HT304SL-A2 '

'Home Theater'

'Home Theater' ,

'HOME CINEMA HTS3011/55'

'Home Theater' ,

'HOME CINEMA HT503SH' ,

'Home Theater' ,

'HOME CINEMA HT503SH-AM'

'Home Theater' ,

'HOME CINEMA HT-IS10' ,

1499

'Home Theater' ,

'HOME CINEMA HTS3365/55'

'Radio' ,

'RADIO PORT RP 299 ' ,

'Radio' ,

'RADIO DX-365' ,

15

'KEN

'Radio' ,

'RADIO ICF-S10MK2/SCE' ,

79

15

,
,

'Radio' ,
'Radio' ,

'RADIO ICF-18 '


,
99
,
15
,
'SONY') ;
'RADIO ICF-303/304 AM-FM '
,
129 ,
8
,

'Radio' ,

'RADIO SRF-59/SC E '

'Notebooks'

'NOTEBOOK C2D2VB250WC14'

'Notebooks'

'NOTEBOOK CQ40-300'

2999

'Notebooks'

'NOTEBOOK DV2-1010'

'Notebooks'

'NOTEBOOK DV4-1212'

'Notebooks'

'NOTEBOOK DV4-1212'

829
,

'HOME CINEMA HT-Z110 ' ,

79

49

999

22

1099

15

1299
,

1299
,

1599

18

949

129

,
,

10

'SONY')

3699

3999

4199

4199

10

'Telefonos'

'TELEFONO DECT1221S INALAMBRICO'

'Telefonos'

'TELEFONO CD1401B INALAMBRICO' ,

169

'Telefonos'

'TELEFONO CD2401S INALAMBRICO' ,

239

'Telefonos'

'TELEFONO CD1302S INALAMBRICO' ,

249

'Telefonos'

'TELEFONO SANYO HNS-3300 '

'Lavarropas'

'LAVARROPA GAFA 7000 DIG PROGR 7KG'

'Lavarropas'

'LAVARROPA GAFA 7500 T750 7

'Lavarropas'

'LAVARROPA GAFA ACQ7500 GRAFT750 7'

'Lavarropas'

'LAVARROPA LG WF-T1202TP 12KG C/S'

'Lavarropas'

'LAVARROPA LG WF-T1205TP 12K TITANIUM' ,

69

,
,

1839' ,
,
,

insert into articulos2 values (48 ,


549 ,
10
,
'KODAK')
;
insert into articulos2 values (49 ,
579 ,
15
,
'SANYO')
;
insert into articulos2 values (50 ,
15
,
'KODAK')
;
insert into articulos2 values (51 ,
,
15
,
'SAMSUNG')
;
insert into articulos2 values (52 ,
20
,
'SAMSUNG')
;
insert into articulos2 values (53 ,
40
,
'SAMSUNG')
;
insert into articulos2 values (54 ,
15
,
'SONY') ;
insert into articulos2 values (55 ,
10
,
'SONY') ;
insert into articulos2 values (56 ,
'SIGMA')
;
insert into articulos2 values (57 ,
'SIGMA')
;
insert into articulos2 values (58 ,
'SIGMA')
;
insert into articulos2 values (59 ,
C096EMAO 2200FS' ,
1999 ,
insert into articulos2 values (60 ,
C096EMAO 2200FS ' ,
1999 ,
insert into articulos2 values (61 ,
C126EMAO 3000FS' ,
2249 ,
insert into articulos2 values (62 ,
C1865DLO 4500FS' ,
3049 ,
insert into articulos2 values (63 ,
C1863RMO 4500FS' ,
3349 ,
insert into articulos2 values (64 ,
WSX09CG5R 2500WFS'
,
1599

'Camaras digitales'

'CAMARA DIGITAL KODAK C813'

'Camaras digitales'

'CAMARA DIGITAL VPCS-870EX '

'Camaras digitales'

'CAMARA DIGITAL C913' ,

599

'Camaras digitales'

'CAMARA DIGITAL 760+KIT'

'Camaras digitales'

'CAMARA DIGITAL ES10' ,

749

'Camaras digitales'

'CAMARA DIGITAL ES15 ' ,

799

'Video camaras' ,

'CAMARA VIDEO DCR-DVD650'

2749

'Video camaras' ,

'CAMARA VIDEO DCR-DVD810 '

2999

,
649

'Estufas'

'CALEFACTOR TB 2400 GN' ,

459

12

'Estufas'

'CALEFACTOR TB 3000 GN' ,

699

12

'Estufas'

'CALEFACTOR TB 5000 GN' ,

1999

15

'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP TS15
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP TS10
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP TS10
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP TS20
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP LS20
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP
,
15 ,
'WESTINGHOUSE') ;

select marca, count(*) as cantidad_de_items,sum(stock) cantidad_de_unidades


--,sum(precio*stock) as suma_importe_total
from articulos2 group by marca;
select descripcion, count(*) as cantidad_de_items,sum(stock) cantidad_de_unidades
-- ,sum(precio)*stock as suma_importe_total
from articulos2 group by descripcion;

-- -------------------------------------- ejemplo con join de mas de dos tablas


-- -------------------------------------- ------------- ------------------- -------------- - libros - - prestamos
- - socios -- ------------- ------------------- -------------- - codigo PK - - documento PK - - documento -- - titulo - - codigolibro PK - - nombre -- - autor - - fechaprestamo - - domicilio -

-- ------------- - fechadevolucion --------------------

-------------

drop table libros;


create table libros(
codigo int,
titulo varchar(40) not null,
autor varchar(20),
primary key (codigo)
);
drop table socios;
create table socios(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key (documento)
);
drop table prestamos;
create table prestamos(
documento char(8) not null,
codigolibro int,
fechaprestamo date not null,
fechadevolucion date,
primary key (codigolibro,fechaprestamo)
);
insert into socios values('22333444','Juan Perez','Colon 345');
insert into socios values('23333444','Luis Lopez','Caseros 940');
insert into socios values('25333444','Ana Herrero','Sucre 120');
insert into libros values(1,'Manual de 2 grado','Molina Manuel');
insert into libros values(25,'Aprenda PHP','Oscar Mendez');
insert into libros values(42,'Martin Fierro','Jose Hernandez');
insert into prestamos values('22333444',1,'08-10-2006','08-12-2006');
insert into prestamos values('22333444',1,'09-10-2006',null);
insert into prestamos values('25333444',25,'10-10-2006','08-12-2006');
insert into prestamos values('25333444',42,'11-10-2006',null);
insert into prestamos values('25333444',25,'12-10-2006',null);
insert into prestamos values('30333444',42,'13-10-2006','18-10-2006');
insert into prestamos values('25333444',2,'18-10-2006','28-10-2006');
select * from prestamos;
-- EN ORACLE NO SE PUEDE USAR AS PARA EL ALIAS DE LAS TABLAS
select nombre,titulo,fechaprestamo
from prestamos p
join socios s
on s.documento=p.documento
join libros l
on codigolibro=codigo;
select nombre,titulo,fechaprestamo
from prestamos p

left join socios s


on p.documento=s.documento
left join libros l
on l.codigo=p.codigolibro;
select nombre,titulo,fechaprestamo
from prestamos p
left join socios s
on p.documento=s.documento
join libros l
on p.codigolibro=l.codigo;

-- -------------------------------- crear un punto de recuperacion


-- ------------------------------select * from clientes;
savepoint punto1;
delete from clientes where codigo=5;
select * from clientes;
rollback to savepoint punto1;
select * from clientes;

-- -------------------------- - Oracle Parte 5


-- -------------------------- Consulto Tablas
select * from user_tables;
-- Funciones String
select chr(65) from dual; -- retorna 'A'
select chr(100) from dual; -- retorna 'd'
select concat('Buenas',' tardes') from dual;--retorna 'Buenas tardes'.
select initcap('buenas tardes alumno') from dual;--retorna 'Buenas Tardes Alumno'.
select lower('Buenas tardes ALUMNO') from dual;--retorna "buenas tardes alumno".
select upper('www.oracle.com') from dual;-- 'WWW.ORACLE.COM'
select length('www.oracle.com') from dual;-- devuelve 14.
select instr('Jorge Luis Borges','or') from dual;-- 2
select instr('Jorge Luis Borges','ar') from dual;-- 0, no se encuentra
-- Funciones Matematicas
select abs(-20) from dual;--retorna 20.
select ceil(12.34) from dual;--retorna 13.
select floor(12.34) from dual; --12
select mod(10,3) from dual;--retorna 1.
select mod(10,2) from dual;--retorna 0.
select power(2,3) from dual;--retorna 8.
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.
select sign(-120) from dual;--retorna -1
select sign(120) from dual;--retorna 1
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
select sqrt(9) from dual;--retorna 3
-- Funciones de Fecha y Hora
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 da de ese mes.
-- devuelve el ultimo dia del mes
select last_day('10/02/2007') from dual;-- "28/02/07"
select last_day('10/08/2007') from dual;-- "31/08/07"
select months_between('19/05/2003','21/06/2005') from dual;-- retorna
select next_day('10/08/2007','LUNES') from dual;
select current_date from dual;
select sysdate from dual;
select current_timestamp from dual;
select systimestamp from dual;
select to_date ('05-SEP-2007 10:00 AM','DD-MON-YYYY HH:MI AM') from dual;
select extract(month from sysdate) from dual;
select sysdate-3 from dual;

You might also like