SQL Oracle Inicial
SQL Oracle Inicial
-- --------------------------- PARTE 1
-- comentarios
-- no es necesario un espacio despues del --- pero mantenemos el espacio por compatibilidad
-- # el # no hace comentarios
-- El editor SLQ DEVELOPER no se le encuentra un comentariador automatico
/*
bloque
de
comentarios
*/
/*
se puede comentariar un parrafo entero sealandolo
y usando la herramienta del menu View - Format - Un/comment selection
tambien hay en el menu format una utilidad para cambiar a minusculas o mayusculas
*/
-- iniciando un script en ORACLE SQL DEVELOPER
-- ------------------------------ trabajar en una base de datos
-- ------------------------------ Lo sisguientes comandos de MySQL no existen en oracle
-- show databases;
-- drop database if exists cursomysql;
-- create database cursomysql;
-- use cursomysql;
-- show tables;
-- el ; es el terminador de instrucciones
-- ---------------------------------------------------- En oracle no existe el objeto BD
-- se comparte un espacio de tablas llamado tablespace
-- ---------------------------------------------------- ------------------------------- Como crear una tabla en ORACLE
-- ------------------------------- creamos la tabla clientes
create table clientes (
codigo integer,
-- no existe la clausula auto increment
nombre varchar(20) not null,
apellido varchar(20) not null,
cuit char(13),
direccion varchar(50),
edad int,
comentarios varchar(140),
primary key (codigo)
);
-- no existe la clausula auto increment
-- no existe la clausula default
-- Oracle maneja esto a traves de un objeto llamado secuencias
-- los objetos creados diferecian mayuscula de minusculas
-- Los objetos en oracle son CASE SENSITIVE
-- Para ejecutar en el cliente web express usamos el boton run
-- o el atajo de teclado control enter
-- comprobamos la existencia de la tabla
select * from user_tables;
select * from user_objects where object_type = 'TABLE';
-- como no existe el comando show,
-- debo consultar catalogos de objetos de ORACLE
-- describo la tabla
describe clientes;
-- muestra la descripcin de campos de la tabla
-- Observar que los integer son tipo number y tienen longitud 38
-- los varchar, son varchar2()
-- los tipo de datos int integer y varchar no estan definidos en oracle
-- pero son tomados y traducidos para mantener compatibilidad
select * from clientes;
-- muestra los registro de la tabla
-- drop table clientes;
-- borramos la tabla clientes
-- no cuento con la clausula IF EXITS
-- drop table if exists clientes;
-- borramos la tabla clientes si existe
-- borrar un objeto inexistente causa un error de ejecucin por lo tanto agregamos la clausula if exists
-- insercion de registros
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
insert into clientes (codigo,nombre,apellido,cuit,direccion)
-- NUMBER [ (p [, s]) ]
-- Nmero con p precisin (parte entera) y s escala (parte decimal).
-- La precisin p puede variar de 1 a 38. La s escala puede variar desde -84
-- hasta 127. Tanto la precisin y la escala se encuentran en dgitos decimales.
-- Un valor numrico requiere 1 a 22 bytes.
-- FLOAT [(p)]
--Un subtipo del tipo de datos NUMBER con precisin p. Un valor de coma flotante
-- se representa internamente como un NUMBER. La precisin p puede variar desde
-- 1 hasta 126 dgitos binarios. Un valor flotante requiere 1 a 22 bytes.
-- LONG
-- Tipo de datos de caracteres de longitud variable de hasta 2 gigabytes,
-- o 231 -1 bytes.
-- Permanece para compatibilidad con versiones anteriores de Oracle.
-- DATE
-- Intervalo de fechas vlidas del 1 de enero de 4712 antes de Cristo a el 31
-- de diciembre de 9999. El formato por defecto se determina explcitamente
-- por el parmetro NLS_DATE_FORMAT o implcitamente por el parmetro
-- NLS_TERRITORY. El tamao es de 7 bytes. Este tipo de datos contiene los
-- campos de fecha y hora AO, MES, da, hora, minuto y segundo.
-- No tiene fracciones de segundo o de una zona horaria.
-- BINARY_FLOAT
-- Nmero en coma flotante de 32 bits. Este tipo de datos requiere 4 bytes.
-- BINARY_DOUBLE
-- Nmero en coma flotante de 64 bits.
-- Este tipo de datos se requieren de 8 bytes.
-- TIMESTAMP [(fractional_seconds_precision)]
-- Ao, mes y da como valores de la fecha, as como la hora,
-- minutos y segundos como valores de tiempo, donde fractional_seconds_precision
-- es el nmero de dgitos en la parte fraccionaria del segundo del campo
-- datetime. Los valores aceptados de fractional_seconds_precision son del
-- 0 al 9. El valor por defecto es 6. El formato por defecto se determina
-- explcitamente por el parmetro NLS_TIMESTAMP_FORMAT o implcitamente por el
-- parmetro NLS_TERRITORY. El tamao es de 7 o 11 bytes, dependiendo de la
-- precisin. Este tipo de datos contiene los campos datetime
-- AO, MES, DIA, HORA, MINUTO y SEGUNDO.
-- Contiene las fracciones de segundo, pero no tiene una zona horaria.
-- RAW(size)
-- Datos binarios sin formato de longitud size.
-- El tamao mximo es de 2000 bytes.
--Se debe especificar el tamao de un valor RAW.
-- LONG RAW
-- Datos binarios de tipo RAW de longitud variable hasta 2 gigabytes.
-- ROWID
-- Cadena en base 64 que representa la direccin nica de una fila en la tabla.
-- Este tipo de datos es principalmente para los valores devueltos por la pseudo
-- columna ROWID.
-- UROWID [(size)]
-- Cadena en base 64 que representa la direccin lgica de una fila de una tabla
-- de ndice organizado. El tamao opcional es el tamao de una columna de tipo
-- UROWID de Oracle. El tamao mximo y por defecto es de 4000 bytes.
-- CHAR [(size [BYTE | CHAR])]
-- Cadena de caracteres de longitud fija de size bytes de tamao o size de
-- caracteres. El tamao mximo es de 2000 bytes o caracteres, el tamao
-- predeterminado y mnimo es de 1 byte.
-- NCHAR[(size)]
-- Cadena de caracteres de longitud fija de size caracteres de tamao de largo.
-- El nmero de bytes pueden ser hasta dos veces el tamao de codificacin
-- AL16UTF16 y tres veces el tamao de la codificacin UTF8.
-- El tamao mximo est determinado por la definicin del juego de caracteres
-- nacional, con un lmite mximo de 2000 bytes.
-- El tamao predeterminado y mnimo es de un carcter.
-- CLOB
-- Un objeto de tipo LOB que contiene caracteres de un byte o multibyte.
-- Son compatibles tanto de ancho fijo y conjuntos de ancho variable de
-- caracteres, con el carcter de base de datos establecida. El tamao mximo
-- es (4 gigabytes - 1) * (tamao del bloque de la base de datos).
-- NCLOB
-- Un objeto de tipo LOB que contiene caracteres Unicode. Son compatible tanto
-- de ancho fijo y conjuntos de ancho variable de caracteres, con el conjunto
-- base de datos de carcter nacional. El tamao mximo es (4 gigabytes - 1) *
-- (tamao del bloque de la base de datos).
-- Guarda los datos nacionales sobre el conjunto de caracteres.
-- BLOB
-- Un objeto de tipo LOB binario. El tamao mximo es (4 gigabytes - 1) *
-- (tamao del bloque de la base de datos).
-- BFILE
-- Contiene un localizador a un archivo binario almacenado fuera de la base de
-- datos. Permite flujo de bytes de E/S para el acceso a LOB externos que
-- residen en el servidor de base de datos. El tamao mximo es de 4 gigabytes.
-- no es posible usar select sin hacer referencia a una tabla
-- la tabla dual es una tabla auxiliar vacia
select * from dual;
select 2+2 from dual;
-- devuelve la fecha actual
select current_date from dual;
-- no existe devuelve la hora actual
-- select current_time from dual;
-- devuelve fecha y hora actual
char y PK
integer y PK
date
double (decimal)
integer y PK
varchar (50)
double
integer
values (1,'destornillador',25,50);
values (2,'pinza',35.50,22);
values (3,'martillo',15,28);
values (4,'maza',35,18);
values (5,'valde',55,13);
-- PARTE 2
-- es necesario tener las tablas y registros definidos en la parte 1
select * from
select * from
select * from
select * from
select * from
clientes where
clientes where
clientes where
clientes where
clientes where
nombre = 'Dario';
nombre = 'DARIO';
codigo = 3;
codigo > 3;
codigo >= 3;
clientes;
clientes where direccion ='';
clientes where direccion is null;
clientes where direccion is not null;
-- Parametro IN NOT IN
select * from clientes where codigo in (2,4,6);
select * from clientes where codigo not in (2,4,6);
clientes where
clientes where
clientes where
clientes where
-- ------------ Ejercicio 2
-- ------------ Llenar las tablas artculos clientes y facturas con 10 registros cada una,
-- ejemplo:
insert into clientes (codigo,nombre,apellido,cuit,direccion) values (200,'jose','benuto','3647493','loria 940');
insert into facturas (letra,numero,fecha,monto) values ('a',1001,'25/10/2012',350);
insert into facturas (letra,numero,fecha,monto) values ('a',1002,current_date,540);
select * from facturas;
insert into articulos (codigo,nombre,precio,stock) values (110,'destornillador',30,100);
insert into articulos (codigo,nombre,precio,stock) values (111,'martillo',40*1.21,50);
-- en este ultimo ejemplo le calculamos el valor del iva al valor del articulos
select * from articulos;
-- ------------ Ejercicio 3
-- ------------ 1 - Basndose en la tabla artculos obtener los siguientes listados.
-2- Listar los artculos ordenados por precio de mayor a menor, y si hubiera precio iguales deben quedar
ordenados por nombre.
-3- Listar todos los artculos incluyendo una columna denominada precio con IVA, la cual deber tener el
monto con el iva del producto.
-4- Listar todos los artculos incluyendo una columna denominada cantidad de cuotas y otra valor de
cuota, la cantidad es fija y es 3, el valor de cuota corresponde a 1/3 del monto con un 5% de inters.
-- respuestas
-- A select * from
-- B select * from
-- C select * from
-- D select * from
-- E select * from
-- F select * from
-- G select * from
-- ---------- Consultas
-- --------select * from clientes where codigo=3;
-- no recomendado
select * from clientes where codigo='3';
select * from clientes where nombre='juan';
-- error
-- select * from clientes where nombre=juan;
-- Restriccion Unsigned
-- Agregar restriccion en campo edad
-- check (edad >=0);
-- PARTE 3
-- es necesario tener las tablas y registros definidos en las partes anteriores
-- ------------ Ejercicio 4
-- ------------ Basndose en la tabla clientes realizar los siguientes puntos.
-- 1- Insertar 5 clientes en la tabla clientes utilizando el insert into sin utilizar campos como parte de la sentencias,
es decir de la forma simplificada.
-- 2- Insertar 5 clientes en la tabla clientes utilizando los campos como parte de la sentencias, es decir de la forma
extendida. Completar solo los campos nombre, apellido y CUIT.
-- 3- Actualizar el nombre del cliente 1 a Jose.
-- 4- Actualizar el nombre apellido y cuit del cliente 3 a Pablo Fuentes 20-21053119-0.
-- 5- Actualizar todos los comentarios NULL a .
-- 6- Eliminar los clientes con apellido Perez.
-- 7- Eliminar los clientes con CUIT Terminan en 0.
-- Basando se en la tabla artculos, realizar los siguientes puntos.
-8- Aumentar un 20% los precios de los artculos con precio menor igual a 50.
-9- Aumentar un 15% los precios de los artculos con precio mayor a 50.
-10- Bajar un 5% los precios de los artculos con precio mayor a 200.
-11- Eliminar los artculos con stock menor a 0.
-- 1)
insert into clientes values (20,'Romeo','Lopez','34343434','Anchorena 950',30,'');
-- 2)
insert into clientes (codigo,nombre,apellido,cuit,direccion) values (31,'Florencia','Salinas','82828282','W.Morris
3420');
-- 3)
update clientes set nombre='Manuel' where codigo=1;
-- 4)
update clientes set nombre='Pablo', apellido='Fuentes', cuit='20-21053119-0' where codigo=2;
-- 5)
update clientes set comentarios='';
-- 6)
delete from clientes where apellido='perez';
-- 7)
delete from clientes where cuit like '%0';
-- 8)
update articulos set precio=precio * 1.20 where precio < 500;
-- 9)
update articulos set precio=precio * 1.15 where precio between 1000 and 2000;
-- 10)
update articulos set precio=precio *.90 where precio > 5000;
-- 11)
delete from articulos where stock =0;
describe clientes;
select * from clientes;
-- es posible listar una tabla a la cual le quitamos la PK
-- hay posibilidad de recorrido plano en MySQL
-- agregar clave primaria
alter table clientes
add primary key (codigo);
describe clientes;
select * from clientes;
-- renombrar tablas
-- NO HAY RENOMBRAR TABLAS
-- rename table clientes to auxiliar;
-- show tables;
-- rename table auxiliar to clientes , auxiliar2 to facturas;
-- show tables;
-- 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;
--
-- Todos los ndices pueden ser multicolumna, es decir, pueden estar formados por ms de 1 campo.
-- muestra los indices de una tabla
-- show index from clientes;
select * from user_indexes where table_name='CLIENTES';
select * from user_indexes where table_name='clientes';
-- la tabla ya tiene un indice del tipo primary key
-- indice comun
create table libros3 (
codigo int,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
primary key (codigo)
);
create index I_libros3_editorial
on libros3(editorial);
select * from user_indexes where table_name='LIBROS3';
describe libros3;
-- el comando describe no muestra info de los indices
-- indice comun multicolumna
create table libros4 (
codigo int,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
primary key (codigo)
);
create index I_libros4_tituloeditorial
on libros4(titulo,editorial);
select * from user_indexes where table_name='LIBROS4';
-- indice unique
create table libros5(
codigo int,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15)
);
create unique index I_libros5_codigo
on libros5(codigo);
create unique index I_libros5_tituloeditorial
on libros5(titulo,editorial);
select * from user_indexes where table_name='LIBROS5';
-- borrar indices
drop index I_LIBROS3_EDITORIAL;
select * from user_indexes where table_name='LIBROS3';
drop index i_libros4_tituloeditorial;
select * from user_indexes where table_name='LIBROS4';
-- Si inserto registros con codigo desordenado siendo codigo PK
-- al listarlo los veo desordenados (Diferente a MYSQL)
-- hay posibilidad de recorrido plano (Diferente a MYSQL)
select * from clientes;
insert into clientes values(25,'Jose','Paso','xxxxx','Larrea 324',25,null);
insert into clientes values(20,'Diego','Lorenzo','xxxxx','Laureles 623',26,null);
select * from clientes;
select * from user_indexes where table_name='CLIENTES';
alter table clientes drop primary key;
select * from clientes;
select * from user_indexes where table_name='CLIENTES';
alter table clientes add primary key (codigo);
select * from clientes;
select * from user_indexes where table_name='CLIENTES';
-- -----------EJERCICIO 5
-- ------------ 1. Crear la tabla 'autos' dentro de la base de datos 'intro' con el siguiente detalle:
-------
codigo INTEGER y PK
marca VARCHAR(255)
modelo VARCHAR(255)
color VARCHAR(255)
anio
INTEGER
precio DOUBLE
-- 2. Cargar la tabla con 15 autos (hacerlo con MySQL WorkBench o el INSERT INTO).
-- 3. Realizar las siguientes consultas:
-a. obtener el precio mximo.
-b. obtener el precio mnimo.
numero=1;
numero=2;
numero=3;
numero=4;
numero=5;
-- producto cartesiano
-- muestra todos los elementos de la primer tabla con todos los elementos de la segunda
select * from clientes, facturas;
select count(*) from clientes;
select count(*) from facturas;
select count(*) from clientes,facturas;
-- realizamos la consulta respetando la relacion entre las dos tablas
select * from clientes c, facturas f where c.codigo=f.codigocliente;
select count(*) from clientes c, facturas f where c.codigo=f.codigocliente;
select c.nombre, f.letra, f.numero, f.monto from clientes c, facturas f where c.codigo=f.codigocliente order by
c.nombre asc;
-- consulamos usando el comando join
select * from clientes c join facturas f on c.codigo=f.codigocliente;
-- muestra todos los elementos libres de la derecha
select * from clientes c left join facturas f on c.codigo=f.codigocliente;
-- muestra todos los elementos libres de la izquierda
select * from clientes c right join facturas f on c.codigo=f.codigocliente;
-- declaro la Foreign Key FK
select * from facturas;
delete from facturas where codigocliente is null;
alter table facturas
modify codigocliente integer not null;
-- ------------ Ejercicio 6
-- ------------ 1-- 2-- 3-- 4-- 5-- 6-
'Televisores' ,
2199
'Televisores' ,
2399
'Televisores' ,
2999
'Televisores' ,
2999
'Televisores' ,
'Televisores' ,
'Computadoras' ,
'CPU LE1250DVD2GB160VS' ,
'Computadoras' ,
'Computadoras' ,
2699
'Computadoras' ,
'Impresoras'
'Impresoras'
'Impresoras'
'IMPRESORA T33' ,
'Impresoras'
'Home Theater' ,
'Home Theater' ,
'Home Theater' ,
599
'Home Theater' ,
759
3099
,
,
3399
2199
399
,
499
,
,
15
2499
18
349
219
3099
,
,
20
12
319
419
,
0
'Home Theater' ,
'Home Theater' ,
'Home Theater'
'Home Theater' ,
'Home Theater' ,
'Home Theater' ,
'Home Theater' ,
1499
'Home Theater' ,
'Radio' ,
'Radio' ,
'RADIO DX-365' ,
15
'KEN
'Radio' ,
'RADIO ICF-S10MK2/SCE' ,
79
15
,
,
'Radio' ,
'Radio' ,
'Radio' ,
'Notebooks'
'NOTEBOOK C2D2VB250WC14'
'Notebooks'
'NOTEBOOK CQ40-300'
2999
'Notebooks'
'NOTEBOOK DV2-1010'
'Notebooks'
'NOTEBOOK DV4-1212'
'Notebooks'
'NOTEBOOK DV4-1212'
829
,
79
49
999
22
1099
15
1299
,
1299
,
1599
18
949
129
,
,
10
'SONY')
3699
3999
4199
4199
10
'Telefonos'
'Telefonos'
169
'Telefonos'
239
'Telefonos'
249
'Telefonos'
'Lavarropas'
'Lavarropas'
'Lavarropas'
'Lavarropas'
'Lavarropas'
69
,
,
1839' ,
,
,
'Camaras digitales'
'Camaras digitales'
'Camaras digitales'
599
'Camaras digitales'
'Camaras digitales'
749
'Camaras digitales'
799
'Video camaras' ,
2749
'Video camaras' ,
2999
,
649
'Estufas'
459
12
'Estufas'
699
12
'Estufas'
1999
15
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP TS15
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP TS10
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP TS10
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP TS20
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP LS20
,
'LG') ;
'Aire acondicionado' ,
'AIRE ACONDICIONADOR SP
,
15 ,
'WESTINGHOUSE') ;
-------------