View
66
Download
0
Category
Preview:
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
Citation preview
-- ---------------------------- 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;
-- 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;
Recommended