SQL Oracle Inicial

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 señalandolo 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),

description

Un texto para acercar al alumno a entender el lenguaje SQL dentro de un sistema de base de datos relacional de Oracle recomendado para versión 10

Transcript of SQL Oracle Inicial

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

/*bloquedecomentarios*/

/*se puede comentariar un parrafo entero señalandoloy usando la herramienta del menu View - Format - Un/comment selectiontambien 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 clientescreate table clientes (codigo integer, -- no existe la clausula auto incrementnombre 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 tablaselect * 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 tabladescribe clientes;-- muestra la descripción 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 ejecución por lo tanto agregamos la clausula if exists

-- insercion de registrosinsert into clientes (codigo,nombre,apellido,cuit,direccion) values (1,'juan','perez','xxxxx','peru 323');insert into clientes (codigo,nombre,apellido,cuit,direccion) values (2,'diego','torres','xxxxx','chile 320');insert into clientes (codigo,nombre,apellido,cuit,direccion) values (3,'laura','gomez','xxxxx','san juan 420');insert into clientes (codigo,nombre,apellido,cuit,direccion) values (4,'mario','lopez','xxxxx','lavalle 770');insert into clientes (codigo,nombre,apellido,cuit,direccion) 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 tabladelete 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 tamaño máximo -- el valor de size en BYTE o CHAR. El tamaño máximo es de 4000 bytes o -- caracteres, y la mínima es de 1 byte o un carácter. Se debe especificar -- el tamaño de para VARCHAR2.

-- NVARCHAR2(size)-- Cadena de caracteres Unicode de longitud variable con size como máximo tamaño-- de longitud. El número de bytes que pueden ser hasta dos veces el tamaño de -- codificación AL16UTF16 y tres veces el tamaño de la codificación UTF8. -- El tamaño máximo está determinado por la definición del juego de caracteres-- nacional, con un límite máximo de 4000 bytes. Se debe especificar el size -- de NVARCHAR2.

-- NUMBER [ (p [, s]) ]-- Número con p precisión (parte entera) y s escala (parte decimal). -- La precisión p puede variar de 1 a 38. La s escala puede variar desde -84-- hasta 127. Tanto la precisión y la escala se encuentran en dígitos decimales.-- Un valor numérico requiere 1 a 22 bytes.

-- FLOAT [(p)]--Un subtipo del tipo de datos NUMBER con precisión p. Un valor de coma flotante -- se representa internamente como un NUMBER. La precisión p puede variar desde -- 1 hasta 126 dígitos 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 válidas del 1 de enero de 4712 antes de Cristo a el 31-- de diciembre de 9999. El formato por defecto se determina explícitamente -- por el parámetro NLS_DATE_FORMAT o implícitamente por el parámetro -- NLS_TERRITORY. El tamaño es de 7 bytes. Este tipo de datos contiene los -- campos de fecha y hora AÑO, MES, día, hora, minuto y segundo. -- No tiene fracciones de segundo o de una zona horaria.

-- BINARY_FLOAT-- Número en coma flotante de 32 bits. Este tipo de datos requiere 4 bytes.

-- BINARY_DOUBLE-- Número en coma flotante de 64 bits. -- Este tipo de datos se requieren de 8 bytes.

-- TIMESTAMP [(fractional_seconds_precision)]-- Año, mes y día como valores de la fecha, así como la hora, -- minutos y segundos como valores de tiempo, donde fractional_seconds_precision-- es el número de dígitos 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 -- explícitamente por el parámetro NLS_TIMESTAMP_FORMAT o implícitamente por el -- parámetro NLS_TERRITORY. El tamaño es de 7 o 11 bytes, dependiendo de la -- precisión. Este tipo de datos contiene los campos datetime -- AÑO, 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 número de dígitos 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 -- explícitamente por el parámetro NLS_TIMESTAMP_FORMAT o implícitamente por el-- parámetro NLS_TERRITORY. El tamaño se fija en 13 bytes. Este tipo de datos-- contiene los campos datetime -- AÑO, MES, DIA, HORA, MINUTO, SEGUNDO, TIMEZONE_HOUR y TIMEZONE_MINUTE.-- Cuenta con las fracciones de segundo y una zona horaria explícita.

-- 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 sesión.

-- El formato por defecto se determina explícitamente por el parámetro -- NLS_TIMESTAMP_FORMAT o implícitamente por el parámetro NLS_TERRITORY. -- El tamaño es de 7 o 11 bytes, dependiendo de la precisión.

-- INTERVAL YEAR [(year_precision)] TO MONTH-- Almacena un período de tiempo en años y meses, donde year_precision es el -- número de dígitos en el campo datetime AÑO. Los valores aceptados son del-- 0 al 9. El valor predeterminado es 2. El tamaño se fija en 5 bytes.

-- INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)]-- Almacena un período de tiempo en días, horas, minutos y segundos, donde-- day_precision es el número máximo de dígitos en el campo datetime DÍA. -- Los valores aceptados son del 0 al 9. El valor predeterminado es 2.-- fractional_seconds_precision es el número de dígitos en la parte fraccionaria-- del campo SEGUNDO. Los valores aceptados son del 0 al 9.-- El valor por defecto es 6.-- El tamaño se fija en 11 bytes.

-- RAW(size)-- Datos binarios sin formato de longitud size.-- El tamaño máximo es de 2000 bytes. --Se debe especificar el tamaño 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 dirección ú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 dirección lógica de una fila de una tabla-- de índice organizado. El tamaño opcional es el tamaño de una columna de tipo-- UROWID de Oracle. El tamaño máximo y por defecto es de 4000 bytes.

-- CHAR [(size [BYTE | CHAR])]-- Cadena de caracteres de longitud fija de size bytes de tamaño o size de -- caracteres. El tamaño máximo es de 2000 bytes o caracteres, el tamaño-- predeterminado y mínimo es de 1 byte.

-- NCHAR[(size)]-- Cadena de caracteres de longitud fija de size caracteres de tamaño de largo.-- El número de bytes pueden ser hasta dos veces el tamaño de codificación -- AL16UTF16 y tres veces el tamaño de la codificación UTF8.-- El tamaño máximo está determinado por la definición del juego de caracteres-- nacional, con un límite máximo de 2000 bytes.-- El tamaño predeterminado y mínimo es de un carácter.

-- 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 carácter de base de datos establecida. El tamaño máximo-- es (4 gigabytes - 1) * (tamaño 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 carácter nacional. El tamaño máximo es (4 gigabytes - 1) * -- (tamaño del bloque de la base de datos). -- Guarda los datos nacionales sobre el conjunto de caracteres.

-- BLOB-- Un objeto de tipo LOB binario. El tamaño máximo es (4 gigabytes - 1) *-- (tamaño 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 tamaño máximo 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 actualselect 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);

-- errorinsert into a values(10);

select * from a;

create table xx( q1 date);

describe xx;

-- --------------- Formato FECHA-- --------------- --------------- 'DIA/MES/AÑO'-- -------------

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 horacreate 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 nullcreate 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 char y PK-- Numero integer y PK-- Fecha date-- Monto 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 integer y PK-- Nombre varchar (50)-- Precio double-- Stock 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 values (1,'destornillador',25,50);insert into articulos values (2,'pinza',35.50,22);insert into articulos values (3,'martillo',15,28);insert into articulos values (4,'maza',35,18);insert into articulos 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 actualinsert 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 estándar de facto de la inmensa mayoría de los SGBD comerciales.-- Y, aunque la diversidad de añadidos particulares que incluyen las distintas implementaciones-- comerciales del lenguaje es amplia, el soporte al estándar 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 camposselect * 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 Whereselect * from clientes where nombre = 'dario';

select * from clientes where nombre = 'Dario';select * from clientes where nombre = 'DARIO';select * from clientes where codigo = 3;select * from clientes where codigo > 3;select * from clientes where codigo >= 3;

-- Operadores AND ,ORselect * 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 nullinsert 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 clientes;select * from clientes where direccion ='';select * from clientes where direccion is null;select * from 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 correctoselect * 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 INselect * 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 clientes where nombre like '%mar%';select * from clientes where nombre like 'm%a';select * from clientes where nombre like 'm%';select * from clientes where nombre like 'm_r%';

-- Parametro ORDER BY ASC y DESC-- muy costoso en tiempo de ejecucionselect * from clientes order by nombre;select * from clientes order by nombre asc; -- no es obligatorio aclara el asc pero si el descselect * from clientes order by nombre desc;select * from clientes order by apellido desc,nombre asc;

-- Clausula Limit no existe en ORACLE-- se usa ROWNUMselect * from clientes where ROWNUM <=2;-- limita la cantidad de registros de salida

-- ------------- Ejercicio 2-- -----------

-- Llenar las tablas artículos 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 articulosselect * from articulos;

-- ------------- Ejercicio 3-- -----------

-- 1 - Basándose en la tabla artículos obtener los siguientes listados.

-- a- artículos con precio mayor a 100-- b- artículos con precio entre 20 y 40 (usar < y >)-- c- artículos con precio entre 40 y 60 (usar BETWEEN)-- d- artículos con precio = 20 y stock mayor a 30-- e- artículos con precio (12,20,30) no usar IN-- f- artículos con precio (12,20,30) usar el IN-- g- artículos que su precio no sea (12,20,30)

-- 2- Listar los artículos ordenados por precio de mayor a menor, y si hubiera precio iguales deben quedar ordenados por nombre.-- 3- Listar todos los artículos incluyendo una columna denominada precio con IVA, la cual deberá tener el monto con el iva del producto.-- 4- Listar todos los artículos 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 interés.

-- respuestas-- A - select * from articulos where precio > 100;-- B - select * from articulos where precio > 500 and precio < 1000;-- C - select * from articulos where precio between 500 and 1000;-- D -select * from articulos where precio = 1000 and stock > 3;-- E - select * from articulos where precio = 100 and precio = 500 and precio = 1000;-- F - select * from articulos where precio in (100,500,1000);-- G - select * from 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;-- Oselect codigo,nombre,precio, precio*1.21 as precio_con_IVA, stock from articulos;

-- nota: La segunda consulta resulta más larga, pero tiene la ventaja de que podemos elegir el orden de las columnas.

-- 4- select 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 enteraselect 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 validoinsert 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 restriccioninsert 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 recomendadoselect * 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-- -----------------------

-- ------------------------------------------------------------ Inserción 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 tablainsert 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 ingresarselect * 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;

-- --------------------------------------------------------- Inserción de registros sin usar la difenición 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 vaciaCREATE 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) values (1,'juan','perez','xxxxx','peru 323');insert into clientes (codigo,nombre,apellido,cuit,direccion) values (2,'diego','torres','xxxxx','chile 320');insert into clientes (codigo,nombre,apellido,cuit,direccion) values (3,'laura','gomez','xxxxx','san juan 420');insert into clientes (codigo,nombre,apellido,cuit,direccion) values (4,'mario','lopez','xxxxx','lavalle 770');insert into clientes (codigo,nombre,apellido,cuit,direccion) 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-- -----------

-- Basándose 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 artículos, realizar los siguientes puntos.-- 8- Aumentar un 20% los precios de los artículos con precio menor igual a 50.-- 9- Aumentar un 15% los precios de los artículos con precio mayor a 50.-- 10- Bajar un 5% los precios de los artículos con precio mayor a 200.-- 11- Eliminar los artículos 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 clientesdrop column edad;

-- agregar camposalter 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 camposalter 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 camposalter table clientes drop column edad;describe clientes;select * from clientes;

-- quito la clave primaria-- ahora si quito la clave primariaalter 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 primariaalter 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 Númericos-- ----------------------------

-- 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 obtención de información de una tabla se utilizan índices.-- El indice de una tabla desempeña la misma función que el índice de un libro: permite encontrar-- datos rápidamente; 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 algún campo de la tabla) -- y un puntero.-- Un índice posibilita el acceso directo y rápido haciendo más eficiente las búsquedas. Sin índice, -- se debe recorrer secuencialmente toda la tabla para encontrar un registro.-- El objetivo de un indice es acelerar la recuperación de información.-- La desventaja es que consume espacio en el disco.-- La indexación es una técnica 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 rápidamente.-- - 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 además no pueden ser nulos. MySQL le da el nombre "PRIMARY". Una tabla solamente puede-- tener una clave primaria.

-- 2) "index": crea un indice común, 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 sinónimo 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 más 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 comuncreate 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 multicolumnacreate 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 uniquecreate 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 indicesdrop 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,'Matemática 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 númerosselect 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 doblesselect 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 fechasselect max(fecha) as ultima_fecha from facturas where letra='b';

-- MIN con númerosselect min(monto) as minimo from facturas where letra='b';

-- MIN con fechasselect min(fecha) as primer_fecha from facturas where letra='b';

-- AVG Averageselect avg(monto) from facturas;select avg(monto) as promedio from facturas;select avg(monto) as promedio from facturas where letra='b';

-- SUMselect sum(monto) as suma from facturas where letra='a';

-- COUNTselect 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 agrupamosselect 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 facturación, count(*) as cantidad from facturas group by fecha;

-- SUBQUERIESselect 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 máximo.-- b. obtener el precio mínimo.

-- c. obtener el precio mínimo entre los años 2000 y 2008.-- d. obtener el precio promedio.-- e. obtener el precio promedio del año 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 año.-- i. obtener la cantidad de autos y el precio promedio en cada año.-- j. obtener la suma de precios y el promedio de precios según marca.-- k. informar los autos con el menor precio.-- l. informar los autos con el menor precio entre los años 2008 y 2010

-- 1-CREATE 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;

-- b-select min(precio) as minimo from autos;

-- c-select min(precio) as minimo from autos where precio between 2000 and 2008;

-- d-select avg(precio) as promedio from autos;

-- e-select avg(precio) as promedio from autos where anio=2006;

-- f-

select count(*) as cantidad from autos;

-- g-select count(*) as cantidad from autos where precio between 35000 and 40000;

-- h-select anio as año,count(*) as cantidad from autos group by anio;

-- i-select anio as año,count(*) as cantidad, avg(precio) as promedio from autos group by anio;

-- j-select marca, sum(precio) as suma, avg(precio) as promedio from autos group by marca;

-- k-select * from autos where precio=(select min(precio) from autos);

-- l-select * 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 FKalter table facturas add codigocliente integer;describe facturas;select * from facturas;

-- Agregamos valores a los registrosupdate facturas set codigocliente=2 where numero=1;update facturas set codigocliente=1 where numero=2;update facturas set codigocliente=1 where numero=3;update facturas set codigocliente=5 where numero=4;update facturas set codigocliente=2 where numero=5;

select * from facturas;

-- producto cartesiano-- muestra todos los elementos de la primer tabla con todos los elementos de la segundaselect * 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 tablasselect * 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 joinselect * from clientes c join facturas f on c.codigo=f.codigocliente;

-- muestra todos los elementos libres de la derechaselect * from clientes c left join facturas f on c.codigo=f.codigocliente;

-- muestra todos los elementos libres de la izquierdaselect * 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 facturasmodify codigocliente integer not null;

alter table facturasadd constraint FK_facturas_codcliforeign key (codigocliente)references clientes(codigo)on delete cascade;

-- delete puede ser cascade o set nulldescribe 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- Informar que clientes han comprado en el día de hoy.-- 2- Informar la suma de los montos de cada cliente.-- 3- Informar cual es el cliente que más ha comprado.-- 4- Informar la cantidad de facturas de cada cliente.-- 5- Informar quienes compraron el primer día de ventas.-- 6- Informar que compro el cliente Juan Perez.

-- 1-select 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 maximoselect 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);

-- 4-select c.codigo, count(*) as cantidad_facturas from clientes c, facturas f where c.codigo=f.codigocliente group by c.codigo;

-- 5-select distinct c.codigo, nombre, apellido from clientes c, facturas f where c.codigo=f.codigocliente and fecha=(select min(fecha) from facturas);

-- 6- select 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.codigowhere c.nombre='juan' and c.apellido='perez';

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

alter table detalles

add constraint FK_facturas_letra_numeroforeign 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 , 'Televisores' , 'TV LCD 19\" MODELO PFL3403' , 2199 , 40 , 'PHILIPS') ;insert into articulos2 values (2 , 'Televisores' , 'TV LCD22\" MODELO LN22A450' , 2399 , 30 , 'SAMSUNG') ;insert into articulos2 values (3 , 'Televisores' , 'TV LCD 32\" MODELO LC813H ' , 2999 , 25 , 'NOBLEX') ;insert into articulos2 values (4 , 'Televisores' , 'TV LCD 26\" MODELO 26LG30R' , 2999 , 25 , 'LG') ;insert into articulos2 values (5 , 'Televisores' , 'TV LCD 26\" MODELO CDH-L26S02' , 3099 , 20 , 'HITACHI') ;insert into articulos2 values (6 , 'Televisores' , 'TV LCD 32\" MODELO PL3219 ' , 3399 , 20 , 'PHILCO') ;insert into articulos2 values (7 , 'Computadoras' , 'CPU LE1250DVD2GB160VS' , 2199 , 15 , 'ADMIRAL') ;insert into articulos2 values (8 , 'Computadoras' , 'CPU A64X246DV2G160VBOF ' , 2499 , 8 , 'ADMIRAL') ;insert into articulos2 values (9 , 'Computadoras' , 'CPU E5200DVDR2GB320VB ' , 2699 , 5 , 'ADMIRAL') ;insert into articulos2 values (10 , 'Computadoras' , 'CPU SG3308LA ' , 3099 , 5 , 'COMPAQ PRESARIO') ;insert into articulos2 values (11 , 'Impresoras' , 'IMPRESORA T23 ' , 219 , 18 , 'EPSON') ;insert into articulos2 values (12 , 'Impresoras' , 'IMPRESORA DJ-6940 ' , 349 , 20 , 'HEWLETT PACKARD') ;insert into articulos2 values (13 , 'Impresoras' , 'IMPRESORA T33' , 399 , 12 , 'EPSON') ;insert into articulos2 values (14 , 'Impresoras' , 'IMPRESORA K5400 ' , 499 , 8 , 'HEWLETT PACKARD') ;insert into articulos2 values (15 , 'Home Theater' , 'HOME CINEMA SPH70 ' , 319 , 0 , 'PHILCO') ;insert into articulos2 values (16 , 'Home Theater' , 'HOME CINEMA AMX115 ' , 419 , 0 , 'NOBLEX') ;insert into articulos2 values (17 , 'Home Theater' , 'HOME CINEMA HT E 860 ' , 599 , 0 , 'X-VIEW') ;insert into articulos2 values (18 , 'Home Theater' , 'HOME CINEMA DC-T990 ' , 759 , 5 , 'SANYO') ;

insert into articulos2 values (19 , 'Home Theater' , 'HOME CINEMA HT-1105U' , 829 , 18 , 'NOBLEX') ;insert into articulos2 values (20 , 'Home Theater' , 'HOME CINEMA HT304SL-A2 ' , 949 , 6 , 'LG') ;insert into articulos2 values (21 , 'Home Theater' , 'HOME CINEMA HT-Z110 ' , 999 , 22 , 'SAMSUNG') ;insert into articulos2 values (22 , 'Home Theater' , 'HOME CINEMA HTS3011/55' , 1099 , 18 , 'PHILIPS') ;insert into articulos2 values (23 , 'Home Theater' , 'HOME CINEMA HT503SH' , 1299 , 15 , 'LG') ;insert into articulos2 values (24 , 'Home Theater' , 'HOME CINEMA HT503SH-AM' , 1299 , 12 , 'LG') ;insert into articulos2 values (25 , 'Home Theater' , 'HOME CINEMA HT-IS10' , 1499 , 7 , 'SONY') ;insert into articulos2 values (26 , 'Home Theater' , 'HOME CINEMA HTS3365/55' , 1599 , 5 , 'PHILIPS') ;insert into articulos2 values (27 , 'Radio' , 'RADIO PORT RP 299 ' , 49 , 5 , 'NOBLEX') ;insert into articulos2 values (28 , 'Radio' , 'RADIO DX-365' , 79 , 15 , 'KEN BROWN') ;insert into articulos2 values (29 , 'Radio' , 'RADIO ICF-S10MK2/SCE' , 79 , 15 , 'SONY') ;insert into articulos2 values (30 , 'Radio' , 'RADIO ICF-18 ' , 99 , 15 , 'SONY') ;insert into articulos2 values (31 , 'Radio' , 'RADIO ICF-303/304 AM-FM ' , 129 , 8 , 'SONY') ;insert into articulos2 values (32 , 'Radio' , 'RADIO SRF-59/SC E ' , 129 , 10 , 'SONY') ;insert into articulos2 values (33 , 'Notebooks' , 'NOTEBOOK C2D2VB250WC14' , 3699 , 12 , 'ADMIRAL') ;insert into articulos2 values (34 , 'Notebooks' , 'NOTEBOOK CQ40-300' , 2999 , 9 , 'COMPAQ PRESARIO') ;insert into articulos2 values (35 , 'Notebooks' , 'NOTEBOOK DV2-1010' , 3999 , 7 , 'HEWLETT PACKARD') ;insert into articulos2 values (36 , 'Notebooks' , 'NOTEBOOK DV4-1212' , 4199 , 9 , 'HEWLETT PACKARD') ;insert into articulos2 values (37 , 'Notebooks' , 'NOTEBOOK DV4-1212' , 4199 , 10 , 'HEWLETT PACKARD') ;insert into articulos2 values (38 , 'Telefonos' , 'TELEFONO DECT1221S INALAMBRICO' , 169 , 15 , 'PHILIPS') ;insert into articulos2 values (39 , 'Telefonos' , 'TELEFONO CD1401B INALAMBRICO' , 169 , 8 , 'PHILIPS') ;insert into articulos2 values (40 , 'Telefonos' , 'TELEFONO CD2401S INALAMBRICO' , 239 , 8 , 'PHILIPS') ;insert into articulos2 values (41 , 'Telefonos' , 'TELEFONO CD1302S INALAMBRICO' , 249 , 8 , 'PHILIPS') ;insert into articulos2 values (42 , 'Telefonos' , 'TELEFONO SANYO HNS-3300 ' , 69 , 10 , 'SANYO') ;insert into articulos2 values (43 , 'Lavarropas' , 'LAVARROPA GAFA 7000 DIG PROGR 7KG' , 1679 , 7 , 'GAFA') ;insert into articulos2 values (44 , 'Lavarropas' , 'LAVARROPA GAFA 7500 T750 7 , 1839' , 4 , 'GAFA') ;insert into articulos2 values (45 , 'Lavarropas' , 'LAVARROPA GAFA ACQ7500 GRAFT750 7' , 1939 , 12 , 'GAFA') ;insert into articulos2 values (46 , 'Lavarropas' , 'LAVARROPA LG WF-T1202TP 12KG C/S' , 2449 , 10 , 'LG') ;insert into articulos2 values (47 , 'Lavarropas' , 'LAVARROPA LG WF-T1205TP 12K TITANIUM' , 2499 , 10 , 'LG') ;

insert into articulos2 values (48 , 'Camaras digitales' , 'CAMARA DIGITAL KODAK C813' , 549 , 10 , 'KODAK') ;insert into articulos2 values (49 , 'Camaras digitales' , 'CAMARA DIGITAL VPCS-870EX ' , 579 , 15 , 'SANYO') ;insert into articulos2 values (50 , 'Camaras digitales' , 'CAMARA DIGITAL C913' , 599 , 15 , 'KODAK') ;insert into articulos2 values (51 , 'Camaras digitales' , 'CAMARA DIGITAL 760+KIT' , 649 , 15 , 'SAMSUNG') ;insert into articulos2 values (52 , 'Camaras digitales' , 'CAMARA DIGITAL ES10' , 749 , 20 , 'SAMSUNG') ;insert into articulos2 values (53 , 'Camaras digitales' , 'CAMARA DIGITAL ES15 ' , 799 , 40 , 'SAMSUNG') ;insert into articulos2 values (54 , 'Video camaras' , 'CAMARA VIDEO DCR-DVD650' , 2749 , 15 , 'SONY') ;insert into articulos2 values (55 , 'Video camaras' , 'CAMARA VIDEO DCR-DVD810 ' , 2999 , 10 , 'SONY') ;insert into articulos2 values (56 , 'Estufas' , 'CALEFACTOR TB 2400 GN' , 459 , 12 , 'SIGMA') ;insert into articulos2 values (57 , 'Estufas' , 'CALEFACTOR TB 3000 GN' , 699 , 12 , 'SIGMA') ;insert into articulos2 values (58 , 'Estufas' , 'CALEFACTOR TB 5000 GN' , 1999 , 15 , 'SIGMA') ;insert into articulos2 values (59 , 'Aire acondicionado' , 'AIRE ACONDICIONADOR SP TS-C096EMAO 2200FS' , 1999 , 15 , 'LG') ;insert into articulos2 values (60 , 'Aire acondicionado' , 'AIRE ACONDICIONADOR SP TS-C096EMAO 2200FS ' , 1999 , 10 , 'LG') ;insert into articulos2 values (61 , 'Aire acondicionado' , 'AIRE ACONDICIONADOR SP TS-C126EMAO 3000FS' , 2249 , 10 , 'LG') ;insert into articulos2 values (62 , 'Aire acondicionado' , 'AIRE ACONDICIONADOR SP TS-C1865DLO 4500FS' , 3049 , 20 , 'LG') ;insert into articulos2 values (63 , 'Aire acondicionado' , 'AIRE ACONDICIONADOR SP LS-C1863RMO 4500FS' , 3349 , 20 , 'LG') ;insert into articulos2 values (64 , 'Aire acondicionado' , 'AIRE ACONDICIONADOR SP WSX09CG5R 2500WFS' , 1599 , 15 , 'WESTINGHOUSE') ;

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

select descripcion, count(*) as cantidad_de_items,sum(stock) cantidad_de_unidades-- ,sum(precio)*stock as suma_importe_totalfrom 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 TABLASselect 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 Tablasselect * from user_tables;

-- Funciones Stringselect 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;-- 2select 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 -1select sign(120) from dual;--retorna 1

select trunc(1234.5678,2) from dual;--retorna 1234.56select trunc(1234.5678,-2) from dual;--retorna 1200select trunc(1234.5678,-1) from dual;--retorna 1230select trunc(1234.5678) from dual;--retorna 1234

select sqrt(9) from dual;--retorna 3

-- Funciones de Fecha y Horaselect 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.

-- devuelve el ultimo dia del messelect 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;