You are on page 1of 64

TUTORIAL SQL

1.- INTRODUCCIN
2.- LENGUAJE DE MANIPULACIN DE DATOS(DML)
2.1 CONSULTAS, LA SENTENCIA SELECT
2.2 CONSULTAS SIMPLES
2.2.3
OPERADORES ARITMTICOS
2.2.4
OPERADORES DE CARACTERES
2.2.5
CONDICIONES DE BSQUEDA SIMPLE
2.2.6
CONDICIONES DE BSQUEDA COMPUESTA
2.2.7
FUNCIONES
2.2.7.1 FUNCIONES DE CADENA
2.2.7.2 FUNCIONES NUMRICAS
2.2.7.3 FUNCIONES DE FECHAS
2.2.7.4 FUNCIONES DE CONVERSIN
2.2.7.5 FUNCIONES DE GRUPO
2.2.7.6 FUNCIONES DE SISTEMA
2.3 CONSULTAS COMPUESTAS
2.3.1 EQUIJOIN,NON-EQUIJOIN, OUTER-JOIN, Y SELF-JOIN)
2.3.2 CLAUSULA UNION
2.3.3 SUBCONSULTAS
2.4.- INSERCIN, BORRADO Y ACTUALIZACION DE DATOS
3.- TIPOS DE DATOS
4.- LENGUAJE DE DEFINICION DE DATOS(DDL)
4.1 CREACION DE TABLAS
4.2 MODIFICACION DE TABLAS
4.3 INTEGRIDAD REFERENCIAL (RESTRICCIONES)
4.4 VISTAS, SECUENCIAS, SINONIMOS E NDICES
1.-INTRODUCCIN
SQL es el lenguaje de consulta universal para bases de datos.
Los mandatos de SQL se dividen en tres grandes grupos diferenciados, los cuales sern tratados por
separado y que unicamente se presentan aqui a modo introductorio.
DDL(Data Definition Language), es el encargado de la definicin de Bases de Datos, tablas,
vistas e ndices entre otros.
Son comandos propios de este lenguaje:
CREATE TABLE
CREATE INDEX

CREATE VIEW
CREATE SYNONYM
ALTER
DROP ...

DML(Data Manipulation Language), cuya misin es la manipulacin de datos. A travs de


l podemos seleccionar, insertar, eliminar y actualizar datos. Es la parte que ms
frecuentemente utilizaremos, y que con ella se construyen las consultas.
Son comandos propios de este lenguaje:
SELECT
UPDATE
INSERT
DELETE

DCL (Data Control Laguage), encargado de la seguridad de la base de datos, en todo lo


referente al control de accesos y privilegios entre los usuarios.
Son comandos propios de este lenguaje:
GRANT
REVOKE

TABLA, ESTRUCTURA DE ALMACENAMIENTO.


SELECT * FROM EMP;
EMPNO
ENAME
JOB
MGR HIREDATE
SAL
COMM
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369
7499
7521
7566
7654
7698
7782
7788
...

SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT

CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST

7902
7698
7698
7839
7698
7839
7839
7566

17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
01-MAY-81
09-JUN-81
19-APR-87

5000
7000
7000
5000
7000
7000
2450
5000

300
500
1400

20
30
30
20
30
30
10
20

SQL> DESC EMP


Name
Null?
Type
----------------------------------------- -------- ---------------------------EMPNO
NOT NULL NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)

2.- LENGUAJE DE MANIPULACIN DE DATOS(DML)


2.1 CONSULTAS, LA SENTENCIA SELECT
La sentencia SELECT consta de 6 clusulas, SELECT y FROM son necesarias las 4 restantes:
WHERE, GROUP BY, HAVING y ORDER BY son opocionales

UTILIZACIN DE FICHEROS
SQL*Plus considera dos tipos de ficheros: de spool y de comandos.
Un fichero de spool almacena los resultados de una consulta (o varias) en un fichero con la
extensin .lst (o lo manda a la impresora).
Los comandos asociados con los ficheros spool son
SPOOL fichero
Manda el resultado de las consultas al fichero.
SPOOL OUT
Manda el resultado de las consultas a la impresora.
SPOOL OFF
Cierra el fichero de spool.
EXIT
Al salir de SQL*Plus se cierran los ficheros de spool.
Los archivos de comandos almacenan comandos SQL y SQL*Plus para ser editado, almacenado
y/o ejecutado; y tienen por defecto la extensin .lst :
3. Para editarlo se puede utilizar el comando edit fichero.
4. Para ejecutarlo se utilizar el comando START fichero o @fichero
VARIABLES DE SESION
NLS_LANGUAGE=AMERICAN
NLS_TERRITORY=AMERICA
NLS_DATE_FORMAT=DD-MON-RR
NLS_DATE_LANGUAGE=AMERICAN
NLS_NUMERIC_CHARACTERS=".,"
NLS_SORT=BINARY

EJEMPLO DE CAMBIO
ALTER SESSION SET NLS_LANGUAGE = SPANISH

LA SENTENCIA SELECT
Su propsito es recuperar datos de una o varias tablas, vistas etc
LA CLAUSULA FROM ( de donde se extrae la informacin
3. seleccin de todas las columnas de una tabla { *}
4. seleccin de ciertas columnas
SQL> select ename from emp;
ENAME
---------SMITH

ALLEN
WARD
JONES
LA CLAUSULA WHERE Seleccin de ciertas filas (filtra la informacin)
SQL> select ename from emp where job = 'SALESMAN';
ENAME
---------ALLEN
WARD
MARTIN
TURNER

LA CLAUSULA ODER BY Determina el orden en el que se van a mostrar los resultados (ASC Y
DESC)
SQL> SELECT ENAME, DEPTNO FROM EMP
2 WHERE JOB = 'SALESMAN'
3 ORDER BY DEPTNO;
ENAME
DEPTNO
---------- --------ALLEN
30
WARD
30
MARTIN
30
TURNER
30

ALIAS DE NOMBRE DE TABLA


SQL> SELECT SAL, ENAME FROM SCOTT.EMP E WHERE E.SAL > 100;
SAL
--------800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300

ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

14 rows selected.

ALIAS DE COLUMNA
SELECT ENAME NOMBRE FROM EMP WHERE SAL < 9000

NOMBRE
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK

2.2 CONSULTAS SIMPLES

2.2.3 OPERADORES ARITMTICOS Se utilizan para manipular datos de forma individual y


devolver un valor
+,- SUMA Y RESTA
*,/, MULTIPLICAR Y DIVIDIR
SQL> SELECT SAL + COMM FROM EMP;
SAL+COMM
--------1900
1750
2650

2.2.4 OPERADORE DE CARACTERES Se utilizan para manipular cadenas de carcteres


|| CONCATENACION
SQL> SELECT 'ESTIMADO SEOR'
2 || ENAME FROM EMP;
'ESTIMADOSEOR'||ENAME
-----------------------ESTIMADO SEORSMITH
ESTIMADO SEORALLEN
ESTIMADO SEORWARD
ESTIMADO SEORJONES
ESTIMADO SEORMARTIN
ESTIMADO SEORBLAKE
ESTIMADO SEORCLARK
ESTIMADO SEORSCOTT
ESTIMADO SEORKING
ESTIMADO SEORTURNER
ESTIMADO SEORADAMS
ESTIMADO SEORJAMES
ESTIMADO SEORFORD
ESTIMADO SEORMILLER
NOTA. VER EJEMPLOS DE CONCATENACION

2.2.5 CONSULTA SIMPLES

Son las que solicitan datos de una nica tabla


LA SENTENCIA SELECT
La sentencia SELECT consta de 6 clusulas, SELECT y FROM son necesarias las 4 restantes:
WHERE, GROUP BY, HAVING y ORDER BY son opocionales
CONSULTAS SENCILLAS.
Solicitan columnas de datos de una nica tabla, los datos provienen directamente de la base de datos
SELECT COL1, COL2 FROM NOMBRE_TABLA;
SELECT * FROM NOMBRE_TABLA;

COLUMNAS CALCULDAS. A partir de los datos almacenados se pueden obtener datos


calculados a traves de expresiones aritmticas (sumas, restas, multiplicaciones y divisiones
SELECT COL1, COL2, (COL3 - COL4) FROM NOMBRE_DE_TABLA;
(COL3 + COL4)
(COL3 * COL4)
(COL3 / COL4)

Estas columnas deben ser de tipo nemrico


FILAS DUPLICADAS
SELECT DISTINCT COLn FRON NOMBRE_TABLA

LA CLUSULA WHERE.
Selecciona ciertas filas de la tabla
La clusula WHERE consta de la palabre WHERE seguida de una condcin de bsqueda que
especifica las filas a recuperar
SELECCIN DE UN NUMERO DETERMINADO DE FILAS(LA FUNCION TOP NO EXISTE EN ORACLE)
SQL> select * from emp where rownum < 7;

CONDICIONES DE BSQUEDA SIMPLE


test de comparacin : =, < >, < , < =, >, > =
test de rango: BETWEEN , NOT BETWEEN. Comprueba si un valor de dato se encuentra entre
dos valores especificados la sintaxis es la siguientes:
SELECT COL1, COL2 FROM NOMBRE DE TABLA
WHERE
expresin_de_test [NOT] BETWEEN expr-inf AND expr_sup

test de pertenecia IN: Examina si un valor de dato coincide con uno de una lista de valores

SELECT COLn FROM EMP WHERE expr_de_test_ [NOT] IN (____ , _____);

test de correspondencia LIKE Se utiliza para buscar cadenas de caracteres

test de valor nulo IS NULL , IS NOT NULL , halla todas las columnas que no tengan
valor asignado, o que si lo tengan (NOT)
2.2.6 CONDICIONES DE BSQUEDA COMPUESTAS

( AND, OR Y NOT)

Las condiciones de bsqueda simple , anteriormente explicadas se pueden combinar para formar
condiciones de bsqueda ms complejas (NOT AND)
SELECT ENAME, JOB
FROM EMP
WHERE COMM > 800 AND COMM < 5000;
SELECT ENAME, DEPTNO FROM EMP WHERE NOT (DEPTNO =20)

CONDICIONES DE BSQUEDA(resumen) Se utilizan en los predicados condicionales para


comparar una expresin con otra.
=, =, >, <, <=, >=, IN Y NOT IN, BETWEEN (NOT, AND), IS [NOT] NULL
Operador Operacin

Ejemplo

select * from emp


deptno = 100;
select * from emp
deotno!= 100;
select * from emp
deptno < 200;
select * from emp
deptno > 200;
select * from emp
deptno <= 200;
select * from emp
deptno >= 200;

Igualdad

!=, <>, ^= Desigualdad


<

Menor que

>

Mayor que

<=

Menor o igual que

>=

Mayor o igual que

where
where
where
where
where
where

Igual a cualquiera de los


miembros entre parntesis
Distinto a cualquiera de los
miembros entre parntesis

select * from emp where


deptno in (100, 300);

between

Contenido en el rango

select * from emp where empno


between 100 and 199;

not
between

Fuera del rango

select * from emp where empno


not between 100 and 199;

in
not in

select * from emp where


deptno not in (200);

.
EL OPERADOR LIKE Y NOT LIKE Se utiliza para buscar cadenas de caracteres que
contengan la porcin de la cadena indicada
SQL> SELECT ENAME, SAL FROM EMP
WHERE ENAME LIKE 'MARTI%'
ENAME
SAL
---------- --------MARTIN
1250

Tambin se puede utilizar el comodin _


SELECT ENAME, SAL FROM EMP
WHERE ENAME LIKE 'MAR___'

un guin por cada slaba

OPERADORES LGICOS (CONDICIONES DE BUSQUEDACONSULTAS


COMPUESTAS)
Se utilizan para combinar los resultados de dos condiciones de comparacin y producir un nico
resultado
NOT, AND Y OR
SELECT * FROM EMP
WHERE JOB IS NOT NULL
SELECT * FROM EMP WHERE JOB = 'CLERK' AND DEPTNO = 10;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ---------- --------- --------- -------- --------- --------- --------7934 MILLER
CLERK
7782 23/01/82
1300
10

2.2.7 FUNCIONES.
2.2.7.1.- FUNCIONES DE CADENA
La tabla DUAL se crea automticamente en Oracle y est accesible para todos los usuarios.
Esta tabla se utiliza cundo es necesario una operacin o acceso a una variable del sistema sin
acceder a los datos reales de la tablas
Devuelve la
cadena cad con
LOWER(cad) todas sus letras
convertidas a
minsculas.
Devuelve la
cadena cad con
UPPER(cad) todas sus letras
convertidas a
maysculas.
Devuelve cad
con el primer
INITCAP(cad)
caracter en
maysculas.

select
lower('MinUsCulAs')
from dual;

minusculas

select
upper('maYuSCulAs')
from dual;

MAYUSCULAS

select
initcap('isabel')
from dual;

Isabel

MAS FUNCIONES DE CADENA:


select lower(ename) from emp
SQL> SELECT CONCAT('PEPE ', 'LOPEZ') FROM DUAL;

CONCAT('PE
---------PEPE LOPEZ
SELECT CONCAT('hola ', ename) FROM emp
SQL> SELECT LTRIM('MARCELINO', 'MAR') FROM DUAL;
LTRIM(
-----CELINO
SELECT LTRIM(ename, 'SM') FROM emp

LTRIM(ENAM
---------ITH
ALLEN
SQL> SELECT RTRIM('MARCELINO', 'LINO') FROM DUAL
RTRIM
----MARCE
SQL> SELECT LPAD('HOLA PEPITO', 20, '#') FROM DUAL;
LPAD('HOLAPEPITO',20
-------------------#########HOLA PEPITO
SQL> SELECT LPAD(ENAME, 20, '#') FROM EMP;

LPAD(ENAME,20,'#')
-------------------###############SMITH
SQL>

SELECT

RPAD('HOLA PEPITO', 20, '#') FROM DUAL;

RPAD('HOLAPEPITO',20
-------------------HOLA PEPITO#########
SELECT RPAD(ENAME, 20, '#') FROM EMP
;

RPAD(ENAME,20,'#')
--------------------

SMITH###############
1* SELECT REPLACE(ENAME, 'SMITH', 'LUCAS') FROM EMP
SQL> /
REPLACE(ENAME,'SMITH','LUCAS')
-------------------------------------------------LUCAS
ALLEN
WARD
SELECT SUBSTR('MARCELINO', 2, 6) FROM DUAL
SQL> /
SUBSTR
-----ARCELI
SELECT SUBSTR(ENAME, 2, 5) FROM EMP
;
SUBST
----MITH
LLEN
SELECT INSTR('MARCELINO', 'M') FROM DUAL
SQL> /
INSTR('MARCELINO','M')
---------------------1
SELECT INSTR(ENAME, 'M'),ENAME
INSTR(ENAME,'M') ENAME

FROM EMP

---------------- ---------2 SMITH


0 ALLEN
0 WARD
0 JONES
1 MARTIN

INSTR: devuelve la posicin que ocupa dentro de la cadena el valor que se le


pase como parmetro (INSTR cadena, parmetro, n, m)
SELECT INSTR('CADENA','A',1,1) FROM DUAL
NSTR('CADENA','A',1,1)
---------------------2

SQL>SELECT INSTR('CADENA','A',1,2) FROM DUAL


NSTR('CADENA','A',1,2)
---------------------6
SQL> SELECT LENGTH('MARCELINO PAN Y VINO') FROM DUAL;
LENGTH('MARCELINOPANYVINO')
--------------------------20
SELECT LENGTH(ENAME) FROM EMP

LENGTH(ENAME)
------------5
5

DECODE( dentro de una expresin evala los valores de la lista y los cambia por el cdigo
correspondiente
SQL> SELECT ENAME, DECODE(DEPTNO,10,'ARQUITECTO', DEPTNO) DEPTNO
2 FROM EMP;
ENAME
DEPTNO
---------- ---------------------------------------SMITH
20
ALLEN
30
WARD
30
JONES
20
MARTIN
30
BLAKE
30
CLARK
ARQUITECTO
SCOTT
20
KING
ARQUITECTO
TURNER
30
ADAMS
20
JAMES
30
FORD
20
MILLER
ARQUITECTO
14 rows selected.

2.2.7.2 FUNCIONES NUMRICAS


Funcin GREATEST
Devuelve el mayor de una lista de expresiones.
GREATEST(exp1, exp2, ...)
Si ejecutamos:
SELECT GREATEST(1,3,6,89,56,3) FROM DUAL;

Devuelve:
89

SELECT GREATEST(sal,comm) FROM EMP


GREATEST(SAL,COMM)
------------------

1600
1250
En este caso slo devuelve los salarios porque son mayores que las comisiones.

Funcin ABS
Valor absoluto de un numero.
ABS(n)
Si ejecutamos:
SELECT ABS(-89) FROM DUAL;
Devuelve:
89
Funcion CEIL redondea al nivel superior
SQL> SELECT CEIL(15.6) FROM DUAL;
CEIL(15.6)
---------16

Funcion FLOOR redondea al nivel inferior


SQL> SELECT FLOOR(15.6) FROM DUAL;
FLOOR(15.6)
----------15
SQL> SELECT ROUND(12.45) FROM DUAL;
ROUND(12.45)
-----------12 ( REDONDEA)

Funcin ROUND
Redondea N hasta la posicin M a la derecha del punto decimal. Por defecto M es 0. Si M es
negativo redondea hacia la izquierda del punto decimal. Por supuesto, M debe ser entero.

ROUND(n [,m])
Si ejecutamos:
SELECT ROUND(45.1242,2) FROM DUAL;

Devuelve:
45.12
Si ejecutamos:
SELECT ROUND(45.8242) FROM DUAL;

Devuelve:
46
Si ejecutamos:
SELECT ROUND(-45.8242) FROM DUAL;

Devuelve:
-46
POWER
SINTAXIS: POWER(x, y)
PROPOSITO: Devuelve el nmero x elevado a la potencia de y.
(xy)
SQL> SELECT POWER(4,5) FROM DUAL;
POWER(4,5)
---------1024

SQRT
SINTAXIS: SQRT(x)
PROPOSITO: Devuelve la raz cuadrada de x.
SELECT SQRT(16) FROM DUAL
SQRT(16)
--------4
SQL> SELECT MOD(10,3) FROM DUAL;

MOD(10,3)
--------1 (DEVUELVE EL RESTO DE LA DIVISIN)

2.2.7.3 FUNCIONES DE FECHAS


Estableciendo el Formato de Fecha
SQL> alter session set nls_date_format='DD-Mon-YYYY HH24:MI:SS';
Session altered.

SQL> select current_date from dual;


CURRENT_DATE
-------------------26-Ene-2005 15:16:15
SQL> select current_timestamp from dual;
CURRENT_TIMESTAMP
--------------------------------------------------------------------------26/01/05 03:17:41,394000 PM -05:00

select sysdate as Hoy, extract(year from sysdate) as ANo from dual


HOY

ANO

--------- ---------02-JAN-11

2011

select sysdate as Hoy, extract(month from sysdate) as MES from dual


HOY

MES

--------- ---------02-JAN-11

select sysdate as Hoy, extract(day from sysdate) as dia from dual

HOY

DIA

--------- ---------02-JAN-11

SQL> SELECT EXTRACT(YEAR FROM HIREDATE) FROM EMP;

EXTRACT(YEARFROMHIREDATE)
------------------------1980
1981

ADD_MONTHS, LAST_DAY, NEXT_DAY, SYSDATE


Funcin

Cometido

Ejemplo

Resultado

Devuelve la
fecha y hora select sysdate from dual;
actuales.
Devuelve la
select
fecha d
add_months(sysdate,4) from
ADD_MONTHS(d,n)
incrementada dual;
en n meses.
Devuelve la
select last_day(sysdate)
fecha del
LAST_DAY(d)
ltimo da del from dual;
mes de d.
Devuelve la
diferencia en select
MONTHS_BETWEEN(d1,
meses entre months_between(sysdate,'01d2)
las fechas d1 JUN-97') from dual;
y d2.
Devuelve la
fecha del
primer da de select next_day(sysdate,
NEXT_DAY(d,cad)
'jueves') from dual
la semana
cad despus
de la fecha d.
SYSDATE

EJEMPLO . tiempo que lleva el empleado smith trabajando en la empresa


SELECT (SYSDATE - HIREDATE) / 360 FROM EMP WHERE ENAME='SMITH'
SQL> /
(SYSDATE-HIREDATE)/360
---------------------22,563004
SQL> SELECT ADD_MONTHS (SYSDATE,2) "DOS MESES" FROM DUAL;
DOS MESES
-------08/07/13
SQL> SELECT SYSDATE FROM DUAL;
SYSDATE
-------08/05/13
SELECT LOWER(ENAME) FROM EMP;

2.2.7.4 FUNCIONES DE CONVERSIN


FUNCION TO_NUMBER CONVIERTE CADENAS A NUMEROS
SQL> create table prueba32(num varchar2(10));
SQL> insert into prueba32 values('2222');

14-MAR-97

14-JUL-97

31-MAR-97

2.43409424

16-MAR-97

SQL> select to_number(num ,'9999') from prueba32;

TO_NUMBER(NUM,'9999')
--------------------2222

SQL> select to_number(num ,'9999') / 2 from prueba32;

TO_NUMBER(NUM,'9999')/2
----------------------1111
NOTA
Formatos mscara para nmeros
Indicando nueves en la mscara se indicar la precisin que queremos que tenga el nmero. Por ejemplo:
TO_CHAR(124,'99999') = __124
Indicando una S le decimos que nos muestre el signo:
TO_CHAR(124,'S9999')=_+124
Con la D, el `.' o `,' le indicamos donde ir el punto. Se pondr `.' o `,' segn que es lo que est definido en el sistema
como separador decimal.
TO_CHAR(1234.678,'9999.9')=1234.7
Con la G, la `,' o `.', segn lo que est especificado por el administrador en el sistema, pondremos los separadores de
los miles:
TO_CHAR(12345.678,'9G999D99') = 12.345,68 (En el caso de que est configurado el punto como separador de
miles y que la coma sea el separador de decimales.
Si ponemos E's pondr formato de potencias de 10
Si ponemos L nos pondr el smbolo de la moneda.

FUNCION TO_CHAR CONVIERTE FECHAS O NUMEROS A CADENAS


SQL> select to_char(hiredate, 'dd/mm/yyyy') from emp;

TO_CHAR(HI
---------17/12/1980
20/02/1981

select to_char(hiredate, 'ddmmyyyy') * 10 from emp

TO_CHAR(HIREDATE,'DDMMYYYY')*10
------------------------------171219800
200219810

SELECT TO_CHAR
(SYSDATE, ' "HOY ES" Day,dd "de" Month "de" yyyy')from dual

TO_CHAR(SYSDATE,'"HOYES"DAY,DD"DE"MONTH"DE
-----------------------------------------HOY ES Miercoles,07 de Septiembre de 2011

FUNCION TO_DATE CONVIERTE NUMEROS A FECHAS


SQL> SELECT to_date('070903', 'MMDDYY') FROM DUAL;

TO_DATE('
--------09-JUL-03

SQL> SELECT to_date('111111', 'MMDDYY') FROM DUAL;

TO_DATE('
--------11-NOV-11

EJEMPLO DE NANEJO DE TABLAS CON COLUMNAS DE TIPO DATE


CREATE TABLE ts_test (
x TIMESTAMP,
y TIMESTAMP(0),
z TIMESTAMP(9));

INSERT INTO ts_test


(x, y, z)
VALUES
(timestamp'2007-08-08 09:00:00.123456789',
timestamp'2007-08-08 09:00:00.123456789',
timestamp'2007-08-08 09:00:00.123456789');
SELECT EXTRACT(hour FROM

x) from ts_test

EXTRACT(HOURFROMX)
-----------------9

INSERTAR DATOS DE TIPO FECHA


1 .-VER EL FORMATO
SQL> select sysdate from dual;
SYSDATE
--------02-JAN-11
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(8888, 'MANUEL', 'CLERK', 7902, '17-DEC-90',3000 ,600 ,20)

insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values


(8889, 'MANUEL', 'CLERK', 7902, '17-DEC-2000',3000 ,600 ,20)

2.2.7.5 FUNCIONES DE GRUPO LA CLAUSULA GROUP BY


DISTINCT, MAX( ), MIN( ), SUM( ), CONUNT( ), COUNT(*) AVG( )
Las funciones de grupo devuelven un resultado basado en un grupo de filas, mas que sobre una fila
solamente. Estas funciones se pueden combinar con expresiones aritmticas Y se pueden
posteriormente agrupar con la clusula GROUP BY
SELECT COUNT (ENAME) "EMPLEADOS QUE GANAN MAS DE 800" FROM EMP
WHERE SAL > 800
SQL> /

EMPLEADOS QUE GANAN MAS DE 800


-----------------------------13
SQL> SELECT SUM(SAL) "SUMA" FROM EMP;
SUMA
--------29025
SQL> SELECT SUM(SAL * 12) "SUMA" FROM EMP;
_______________________________________________
SQL>

SELECT DEPTNO, MAX(SAL), MIN(SAL)

2 FROM EMP
3 WHERE JOB = 'CLERK'
4* GROUP BY DEPTNO
DEPTNO MAX(SAL) MIN(SAL)
-------- --------- --------10
1300
20
1100
30
950

1300
800
950

La clusula HAVING se utiliza con la clusula GROUP BY para filtrar la informacin. Su efecto
es parecido a la clusula WHERE
Consiteendo en la palabra HAVING seguida de una CONDICION DE BSQUEDA como en
WHERE
SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO HAVING MAX(SAL) > 3000
SQL> /
MAX(SAL)
--------5000
SELECT MAX(SAL),deptno FROM EMP GROUP BY DEPTNO HAVING MAX(SAL) > 30

MAX(SAL)

DEPTNO

---------- ---------2850

30

3000

20

5000

10

SELECT MAX(SAL) FROM EMP


2 WHERE JOB = 'SALESMAN'
3 GROUP BY DEPTNO
4* HAVING MAX(SAL) BETWEEN 800 AND 5000
MAX(SAL)
--------1600

SQL>
2
3
4
5

SELECT DEPTNO, MAX(SAL), MIN(SAL)


FROM EMP
WHERE JOB ='CLERK'
GROUP BY DEPTNO
HAVING MIN(SAL) < 1000;

DEPTNO

MAX(SAL)

MIN(SAL)

--------- --------- --------20


1100
800
30
950
950

2.2.7.6 FUNCIONES DE SYSTEMA


Funcion ROWNUM
Rownum es una pseudocolumna. Numera los registros de un conjunto de resultados. Al primer
registro que cumple el criterio de la clausula where en una sentencia select se le da rownum=1, y
cada uno de los siguientes registros se le incrementa en 1.
SQL> SELECT ROWNUM,ENAME FROM EMP;
ROWNUM ENAME
---------- ---------1 MANUEL
2 MANUEL
3 SMITH
.........
SQL> SELECT ROWNUM,ENAME FROM EMP WHERE SAL > 2000;
ROWNUM ENAME
---------- ---------1 MANUEL
2 MANUEL
3 JONES
4 BLAKE
SQL> SELECT ROWNUM,ENAME FROM EMP WHERE SAL < 2000;
ROWNUM ENAME
---------- ----------

1 SMITH
2 ALLEN
3 WARD
4 MARTIN

nota: En el ejemplo anterior el rownum 1 tine distinto nombre dependiendo del where
Funcin Rowid
Rowid es una pseudocolumna que identifica de manera nica una fila en una tabla, pero NO en
cualquier tabla.
SQL> select rowid from dept;

ROWID
-----------------AAAC8kAAEAAAAC/AAA
AAAC8kAAEAAAAC/AAB
AAAC8kAAEAAAAC/AAC
AAAC8kAAEAAAAC/AAD

2.3.-CONSULTAS COMPUESTAS
Un JOIN es una sentencia SELECT que combina filas de dos o ms tablas o vistas, cada fila
mostrada contiene datos de 2 o ms tablas. La clusula WHERE determina como se realiza la
combinacin.
Si la clusula WHERE es inexistente puede realizarse un producto cartesiano que combinar todas
las filas de todas las tablas.
2.3.1 JOIN DE TABLAS
1.-Equijoin (inner join)
Con esta operacin se calcula el producto cruzado de todos los registros; as cada registro en la tabla
A es combinado con cada registro de la tabla B; pero slo permanecen aquellos registros en la tabla
combinada que satisfacen las condiciones que se especifiquen. Este es el tipo de JOIN ms utilizado
por lo que es considerado el tipo de combinacin predeterminado.
Desde la versin 9i, Oracle incluy el estandar SQL 92 en sus sentencias SQL. A continuacin se
vern algunos ejemplos de dicha adicin y su correspondiente sintanxis tanto en el standar ISO
como en el SQL 92 includo.
Ejemplo de equijoin o inerjoin:
Estandar sql 92

SELECT ename, job, dname

FROM emp e INNER JOIN dept d ON e.deptno = d.deptno;

SELECT ename, job,d.deptno,e.deptno, dname


e.deptno = d.deptno

FROM emp e INNER JOIN dept d ON

SQL> /

ENAME

JOB

DEPTNO

DEPTNO DNAME

---------- --------- ---------- ---------- -------------CLARK

MANAGER

KING

PRESIDENT

MILLER

10

10 ACCOUNTING

CLERK

10

10 ACCOUNTING

10

10 ACCOUNTING

JONES

MANAGER

20

20 RESEARCH

FORD

ANALYST

20

20 RESEARCH

ADAMS

CLERK

20

20 RESEARCH

SMITH

CLERK

20

20 RESEARCH

PEDRO

ANALYST

20

20 RESEARCH

WARD

SALESMAN

30

30 SALES

TURNER
ALLEN

SALESMAN
SALESMAN

30

30

30 SALES

30 SALES

Estandar ISO
SQL> SELECT ename, job, dname
2 FROM emp e, dept d
3 WHERE e.deptno = d.deptno;

2.- Non-Equijoins
Ejemplo de Non-Equijoins
SELECT E.ENAME,E.SAL,S.GRADE FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL
AND S.HISAL

ENAME

SAL

GRADE

---------- ---------- ---------SMITH

800

JAMES

950

ADAMS

1100

3.- Natural (Natural join)


Es una especializacin de la combinacin de equivalencia, anteriormente mencionada. En este caso
se comparan todas las columnas que tengan el mismo nombre en ambas tablas. La tabla resultante
contiene slo una columna por cada par de columnas con el mismo nombre.
SQL> create table empleados as select ename,job from emp;

Table created.

SQL> select * from emp natural join empleados;

ENAME

JOB

EMPNO

MGR HIREDATE

SAL

COMM

DEPTNO

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

SMITH

CLERK

7369

7902 17-DEC-80

800

20

ALLEN

SALESMAN

7499

7698 20-FEB-81

1600

300

30

WARD

SALESMAN

7521

7698 22-FEB-81

1250

500

30

Por ejemplo, si variamos los nombres de los empleados as:


update empleados set job='vendedor' where ename !='MANUEL'

14 filas actualizadas.
Al hacer la select as
select * from emp natural join empleados;

ninguna fila seleccionada


Porque no coincide ningn valor en las dos tablas

4.- Outer join: left y rigth


en los casos en que queramos que tambin aparezcan las filas que no tienen una fila coincidente en
la otra tabla, utilizaremos el RIGHT o LEFT JOIN.
Ejemplo de Rigth Outer Join
Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de la derecha
que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos de la tabla de la
izquierda con valores nulos.

SELECT ename, job, dname


FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno

ENAME

JOB

DNAME

---------- --------- -------------CLARK

MANAGER

ACCOUNTING

KING

PRESIDENT ACCOUNTING

MILLE

CLERK

ACCOUNTING

JONES

MANAGER

RESEARCH

FORD

ANALYST

RESEARCH

ADAMS

CLERK

RESEARCH

SMITH

CLERK

RESEARCH

PEDRO

ANALYST

RESEARCH

WARD

SALESMAN

SALES

TURNER

SALESMAN

SALES

ALLEN

SALESMAN

SALES

JAMES

CLERK

SALES

BLAKE

MANAGER

SALES

MARTIN

SALESMAN

SALES
OPERATIONS

O bien
SELECT ename, job, dname
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno
ENAME

JOB

DNAME

---------- --------- -------------CLARK

MANAGER

ACCOUNTING

KING

PRESIDENT ACCOUNTING

MILLE

CLERK

ACCOUNTING

JONES

MANAGER

RESEARCH

FORD

ANALYST

RESEARCH

ADAMS

CLERK

RESEARCH

SMITH

CLERK

RESEARCH

PEDRO

ANALYST

RESEARCH

WARD

SALESMAN

SALES

TURNE

SALESMAN

SALES

ALLEN

SALESMAN

SALES

JAMES

CLERK

SALES

BLAKE

MANAGER

SALES

MARTIN

SALESMAN

SALES
OPERATIONS

Ejemplo de left Outer Join


SQL> SELECT ename, job, dname
2 FROM emp e LEFT OUTER JOIN dept d
3 ON e.deptno = d.deptno;
ENAME

JOB

DNAME

MILLER
KING
CLARK
FORD
ADAMS
SCOTT
JONES
SMITH
JAMES
TURNER
BLAKE
MARTIN
WARD
ALLEN
GOMEZ

CLERK
PRESIDENT
MANAGER
ANALYST
CLERK
ANALYST
MANAGER
CLERK
CLERK
SALESMAN
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN

ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES

o bien:
SELECT ename, job, dname
FROM emp e, dept d
WHERE e.deptno = d.deptno(+);

Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de la izquierda que
no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos de la tabla de la
derecha con valores nulos.

5.- combinacin completa (FULL OUTER JOIN)


Esta operacin presenta los resultados de tabla izquierda y tabla derecha aunque no tengan
correspondencia en la otra tabla. La tabla combinada contendr, entonces, todos los registros de
ambas tablas y presentar valores nulos NULLs para registros sin pareja.
SELECT ename, job, dname FROM emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno
ENAME

JOB

DNAME

---------- --------- -------------SMITH

CLERK

RESEARCH

ALLEN

SALESMAN

SALES

WARD

SALESMAN

SALES

JONES

MANAGER

RESEARCH

MARTIN

SALESMAN

SALES

BLAKE

MANAGER

SALES

CLARK

MANAGER

ACCOUNTING

PEDRO

ANALYST

RESEARCH

KING

PRESIDENT ACCOUNTING

TURNER

SALESMAN

SALES

ADAMS

CLERK

RESEARCH

JAMES

CLERK

SALES

FORD

ANALYST

RESEARCH

MILLER

CLERK

ACCOUNTING
OPERATIONS

15 rows selected.
SELECT e.ename, d.job FROM emp e FULL OUTER JOIN empleados d
ON e.job = d.job

ENAME

JOB

---------- --------vendedor
vendedor
vendedor

vendedor
vendedor
vendedor
vendedor
vendedor
vendedor
vendedor
vendedor
vendedor
vendedor
vendedor
CLARK
BLAKE
JONES
KING
MILLER
JAMES
ADAMS
SMITH
FORD
PEDRO
TURNER
MARTIN
WARD
SELECT e.ename,d.ename,e.job, d.job FROM emp e FULL OUTER JOIN empleados d
ON e.job = d.job

ENAME

ENAME

JOB JOB

---------- ---------- --------- --------SMITH

vendedor

ALLEN

vendedor

WARD

vendedor

JONES

vendedor

MARTIN

vendedor

BLAKE

vendedor

CLARK

vendedor

PEDRO

vendedor

KING

vendedor

TURNER

vendedor

ADAMS

vendedor

JAMES

vendedor

FORD

vendedor

MILLER

vendedor

CLARK

MANAGER

BLAKE

MANAGER

JONES

MANAGER

KING

PRESIDENT

MILLER

CLERK

JAMES

CLERK

ADAMS

CLERK

SMITH

CLERK

FORD

ANALYST

PEDRO

ANALYST

TURNER

SALESMAN

MARTIN

SALESMAN

WARD

SALESMAN

ALLEN

SALESMAN

28 filas seleccionadas.

AUTOCOMBINACIN (SELF JOIN)


La autocombinacin se utiliza para unir una tabla consigo misma, comparando valores de dos
columnas con el mismo tipo de datos. La sintaxis en la siguiente:
SELECT alias1.columna, alias2.columna, ...
FROM tabla1 as alias1, tabla2 as alias2

WHERE alias1.columna = alias2.columna


AND otras condiciones
SELECT A.ENAME AS JEFE, B.ENAME
FROM EMP A, EMP B WHERE
A.EMPNO=B.MGR AND A.ENAME='KING'
Jefe Ename
KING JONES
KING BLAKE
KING CLARK

Con esta consulta podemos saber los empleados que tienen por manager a KING.
2.3.2 CLUSULA UNION

Mezcla los resultados de dos o ms consultas individuales en una nica tabla resultado, eliminando
las filas duplicadas, si existieran.

SELECT columna1, columna2,....


FROM nombre-tabla1,...
WHERE condicin1
UNION [ALL]
SELECT columna1, columna2,...
FROM nombre-tabla2,...
WHERE condicin2

Oracle realiza primero cada una de las SELECTs escritas, generando una tabla resultado por cada
una de las consultas. Luego, une las dos tablas en una.

Las columnas de la tabla resultado poseen los nombres de las columnas de la primera sentencia
SELECT que se ejecute.
ALL

Si se especifica ALL, el resultado de la consulta no elimina las filas duplicadas, si existieran.

Comando SELECT {UNIN | UNION ALL | INTERSECT | MINUS} comando SELECT

clave:

UNIN Combina las filas nicas devuelto por dos sentencias SELECT

UNION ALL Combina las filas devueltas por dos instrucciones SELECT (incluyendo todos
los duplicados)

INTERSECT - Muesstra slo las filas que se encuentran en ambos estados * SELECT *

MIUNUS Retorna de las filas que estn en el primer SELECT, pero no en la segunda
ejemplos:
SQL> select deptno from dept;

DEPTNO
---------10
20
30
40
60
61
77

7 rows selected.

SQL> select deptno from emp union select deptno from dept;

DEPTNO

---------10
20
30
40
60
61
77

7 rows selected.

select deptno from emp union all select deptno from dept

DEPTNO
---------20
30
30
20
30
30
10
20
10
30
20

DEPTNO
---------30
20
10

10
20
30
40
60
61
77

21 rows selected.

select deptno from emp

minus

select deptno from dept

no rows selected
select deptno from dept minus select deptno from emp

DEPTNO
---------40
60
61
77

select deptno from emp

DEPTNO
---------10
20
30

intersect select deptno from dept

2.3.3.- SUBCONSULTAS
Una subconsulta es una modalidad de select que aparece dentro de otra sentencia sql
Una subconsulta es una consulta que aprece dentro de la clusula WHERE o HAVING de otra
sentencia SQL. Ejemp:
El planteamiento es el siguiente:
Queremos saber el nombre del empleado y el nmero de departamento de aquellos cuyo salario sea
mayor de la media
Select ename, deptno from emp
Where sal > ???
O lo que es lo mismo..
SELECT ENAME, DEPTNO FROM EMP
WHERE SAL >(
SELECT AVG(SAL) FROM EMP)
ENAME
DEPTNO
---------- --------JONES
20
BLAKE
30
CLARK
10
SCOTT
20
KING
10
FORD
20

6 rows selected.
Conocer que empleados ganan menos que cualquier empleado del departamento 30
SELECT ENAME
FROM EMP
WHERE SAL < (SELECT MIN(SAL)
FROM EMP
WHERE DEPTNO = 30)
ENAME
---------SMITH

Para saber el nombre y el salario del jefe de SMITH:


SQL> SELECT ENAME, SAL FROM EMP WHERE EMPNO=(SELECT MGR FROM EMP WHERE
ENAME='SMITH');
ENAME
SAL
---------- --------FORD
3000

La subconsulta est siempre encerrada entre parntesis, su formato es idncico al que tienen en una
sentencia SELECT
Una subconsulta no puede incluir las clusulas ORDER BY ni UNION
Las subconsultas suelen ser utilizadas principalmente en la clusula WHERE de una sentencia SQL
formando parte siempre de una condicin de besqueda

Condiciones de bsqueda de las subconsultas


Test de comparacin(=, <>, <, <=, >, >= )
Test de pertenecia (IN) Es una forma modificada del test de pertenencia a conjunto simple ,
compara un nico valor de datos ejemp:
Queremos saber el nombre del empleado, y el departamento de aquellos cuyo salario esta dentro del
salario mximo de los que trabajan como salesman(vendedores)
SELECT ENAME, DEPTNO FROM EMP
WHERE SAL IN (SELECT MAX(SAL) FROM EMP
WHERE JOB = 'SALESMAN');
ENAME
DEPTNO
---------- --------ALLEN
30

COMPARACIN [ANY | ALL | SOME] (INSTRUCCIN SQL)


comparacin
Es una expresin y un operador de comparacin que compara la expresin con el resultado de la
subconsulta.
expresin
Es una expresin por la que se busca el conjunto resultante de la subconsulta.
instruccin sql
Es una instruccin SELECT, que sigue el mismo formato y reglas que cualquier otra instruccin
SELECT. Debe ir entre parntesis.
Se puede utilizar el predicado ANY o SOME, los cuales son sinnimos, para recuperar registros de
la consulta principal, que satisfagan la comparacin con cualquier otro registro recuperado en la
subconsulta. El ejemplo siguiente devuelve todos los productos cuyo precio unitario es mayor que
el de cualquier producto vendido con un descuento igual o mayor al 25 por ciento.:
SELECT * FROM Productos WHERE PrecioUnidad > ANY
(SELECT PrecioUnidad FROM DetallePedido WHERE Descuento >= 0 .25);

El predicado ALL se utiliza para recuperar nicamente aquellos registros de la consulta principal

que satisfacen la comparacin con todos los registros recuperados en la subconsulta. Si se cambia
ANY por ALL en el ejemplo anterior, la consulta devolver nicamente aquellos productos cuyo
precio unitario sea mayor que el de todos los productos vendidos con un descuento igual o mayor al
25 por ciento. Esto es mucho ms restrictivo.
Any Compara un valor con cada valor devuelto por una subconsulta retornando cierto si
uno cualquiera de ellos cumple la condicin. Any debe ir precedido de =, <>, <, >, >= o >=.
= Any es equivalente a In.
SQL> select ename from emp where sal > ANY

(SELECT SAL FROM EMP WHERE DEPTNO = 10);

ENAME

----------

KING

FORD

PEDRO

JONES

BLAKE

CLARK

ALLEN

TURNER

All Compara un valor con cada valor devuelto por una subconsulta retornando cierto si
todos ellos cumplen la condicin. All debe ir precedido de =, <>, <, >, >= o >=.
select ename from emp where sal > ALL

(SELECT SAL FROM EMP WHERE DEPTNO = 10)

ninguna fila seleccionada

Cuando la condicin de filtro incluye ANY o SOME, el campo debe cumplir la condicin de
comparacin en al menos uno de los valores generados por la subconsulta.
Cuando la condicin de filtro incluye ALL, el campo debe cumplir la condicin de comparacin
para todos los valores generados por la subconsulta antes de que se incluya el registro en el
resultado de la consulta.
select ename from emp where sal > ANY (SELECT HISAL FROM SALGRADE)
ENAME
---------KING
FORD
PEDRO
JONES
BLAKE
CLARK
ALLEN
TURNER
MILLER
WARD
MARTIN

11 rows selected.
select ename from emp where sal < ANY (SELECT HISAL FROM SALGRADE)
ENAME
---------SMITH
JAMES
ADAMS
WARD
MARTIN
MILLER
TURNER
ALLEN
CLARK
BLAKE
JONES
PEDRO
FORD
KING
14 rows selected.
select ename from emp where sal < ALL
ENAME
---------SMITH
ADAMS
JAMES

comprobando los resultados:


SQL> SELECT HISAL FROM SALGRADE;
HISAL
----------

(SELECT HISAL FROM SALGRADE)

1200
1400
2000
3000
9999

SELECT SAL FROM EMP WHERE ENAME IN ('SMITH','ADAMS','JAMES')


SAL
---------800
1100
950

2.4.- INSERCIN, BORRADO Y ACTUALIZACION DE DATOS


Una vez que tenemos definida la estructura de una tabla se pueden insertan los datos, modificarlos o
borrarlos de la tabla.
INSERCIN, SENTENCIA INSERT
El comando que permite insertar filas en las tablas es el siguiente.
INSERT INTO tabla [({columna,}*)] VALUES ({expresin,}+);

Los valores de tipo caracter y fecha deben ir encerrados entre comillas simples, ('').
SQL> INSERT INTO DEPT2 (DEPTNO,LOC,DNAME) VALUES (50, 'FINANZAS', 'MADRID',);

Si vamos a insertar en todas las columnas de la tabla, no hace falta especificarlas:


INSERT INTO DEPT VALUES (50, 'FINANZAS', 'MADRID')

SQL> 1 row created.

Si por el contrario solo vamos a insertar en alguna de sus columnas debemos especificar en cuales:

SQL> INSERT INTO DEPT(DNAME, DEPTNO)


2 VALUES ('CONTAB', 60);
1 row created.
ACTUALIZACIN, LA SENTENCIA UPDATE
El propsito de la sentencia UPDATE es cambiar los valores existentes en una tabla o vista.
Sintaxis:
SQL> UPDATE emp SET comm
WHERE job = TRAINE

= NULL

Aumentar el sueldo en $2000 y cambiar de categora y departamento al empleado PEPE PEREZ.


UPDATE EMP SET JOB='MANAGER', SAL=SAL + 2000, DEPTNO=20
WHERE ENAME='SCOTT'

Utilizacin de una subconsulta en UPDATE . Actualizar solo los ampledados que trabajem en el
departamento 20 o 30 (DALLAS Y MADRID) estos empleados tendrn el mismo nmero de
departamento que los que trabajen en BOSTON:
Pone a SMITH en el departamento de SALES:
UPDATE emp
SET deptno =
(SELECT deptno
FROM dept
WHERE loc = 'BOSTON')
WHERE deptno = 20 OR DEPTNO=50
UPDATE EMP SET DEPTNO =(
SELECT DEPTNO FROM DEPT WHERE LOC = 'SALES') WHERE ENAME ='SMITH';

BORRADO, LA SENTENCIA DELETE


El propsito de esta sentencia, es borrar filas de una tabla o vista. Ms adelante hablaremos de los
comandos DROP Y TRUNCATE
Para eliminar todas las filas de la tabla emp
SQL> DELETE

FROM

emp

Eliminar de la tabla emp a aquellos vendedores cuyo trabajo sea SALESMAN y que su comisin
sea inferior a 100$:
SQL> DELETE

FROM

emp WHERE job = SALESMAN AND comm < 100;

SENTENCIAS TRANSACIONALES
COMMIT
ROLLBACK

SAVEPOINT
COMMIT. Valida las transacciones pendientes de la actual transaccin , hacindolas visibles para
los dems usuarios.
ROLLBACK. Deshace todos los cambios pendientes de transaccin actual.
Sintaxis ROLLBACK TO SAVE POINT X donde X es smbolo que hallamos puesto al punto de
salvaguarda
SAVEPOINT. Los puntos de salvaguarda son marcas que va poniendo el usuario durante la
transaccin. Estas marcas permiten deshacer los cambios por partes en vez de deshacer toda la
transaccin. Sintaxis SAVEPOINT <punto de salvaguarda>
Ejemplo
Tras actualizar el salario de los empleados BLAKE y CLARK, comprobamos que el salario total
de la compaa excede de 20000$, lo cual no es posible, as que se deshacen las ltima operaciones de actualizacin (en este caso, slo una), para reintroducir el salario de CLARK:
UPDATE emp SET sal = 2000 WHERE
SAVEPOINT blake_sal ;
UPDATE emp SET sal = 1500 WHERE
SAVEPOINT clark_sal ;
SELECT SUM(sal) FROM emp ;
ROLLBACK TO SAVEPOINT blake_sal
UPDATE emp SET sal = 1300 WHERE
COMMIT ;

ename = 'BLAKE' ;
ename = 'CLARK' ;
;
ename = 'CLARK' ;

A la hora de hacer un ROLLBACK o un COMMIT se podr hacer hasta cierto punto con la sintaxis:
COMMIT TO nombre_de_punto;
ROLLBACK TO nombre_de_punto;

Si nuestro nmero de sentencias es tan grande que el RBS se llena, Oracle har un ROLLBACK,
por lo que perderemos
todos los datos. As que es recomendable hacer COMMIT cada vez que el estado de la base de datos
sea consistente.

Al hacer ROLLBACK sin parmetros o el COMMIT, se eliminan todos los puntos de salvaguarda
3.-TIPOS DE DATOS (DATATYPES)
Tipos de datos (datatypes)
Para obtener la definicin de datos de una tabla podemos ejecutar:

SELECT

COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE

FROM COLS
WHERE TABLE_NAME = 'EMPLEADOS';

En la definicin de las columnas de las tablas podemos usar los siguientes tipos de datos:
CHAR(n)

Cadena de caracteres de longitud fija, tiene un tamao n bytes.


Si no se especifica n la ORACLE le da un tamao de 255 bytes.
El tamao mximo en BD es 2000 bytes y el mnimo 1 byte.
El tamao mximo en PL/SQL es 32767 bytes y el minimo 1 byte.
CHARACTER es sinonimo de CHAR. Ver NCHAR.
VARCHAR2(n)

Cadena de caracteres de longitud variable, tiene un tamao mximo de n bytes.


Es obligatorio especificar el tamao.
El tamao mximo en BD es 4000 bytes y el mnimo 1 byte.
El tamao mximo en PL/SQL es 32767 bytes y el minimo 1 byte.
STRING y VARCHAR son sinonimos de VARCHAR2. Ver NVARCHAR2.
Usando VARCHAR2 en lugar de CHAR ahorramos espacio de almamcenamiento.

Un char(10) almacenar

'PEPE

'

Un varchar2(10) almacenar 'PEPE'

En contra tiene que si se escriben muchas veces hay que hacer un mayor esfuerzo de matenimiento
del sistema para mantener la eficiencia (compactar).
NUMBER(p,s)

Nmero de p digitos de los cuales s son decimales.

No es obligatorio especificar el tamao.


El tamao de p va de 1 a 38 y el s desde -84 a 127.
El tamao en PL/SQL 1E-130 .. 10E125.
Sinonimos:

* numeros de coma fija: DEC,DECIMAL,NUMERIC


* enteros:INTEGER (sinonimo de NUMBER(38)),INT,SMALLINT
* coma flotante:DOUBLE PRECISION FLOAT REAL.
* Ver tambien: PLS_INTEGER, BINARY_INTEGER
El valor 7,456,123.89 se almacenar como:
NUMBER(9)

7456124

NUMBER(9,1)

7456123.9

NUMBER(*,1)

7456123.9

NUMBER(9,2)

7456123.89

NUMBER(6)

[error]

NUMBER(7,-2)

7456100

NUMBER

7456123.89

FLOAT

7456123.89

FLOAT(12)

7456000.0

DATE
Fecha vlida.
Desde el 1 de enero del 4712 AC hasta el 31 de diciembre del 9999 DC. (en Oracle7 = 4712 DC)
LONG
Cadena de caracteres de longitud variable. Es una versin ms grande de VARCHAR2.

El tamao mximo en BD es 2 Gigabytes.


CLOB
Cadena de caracteres de longitud variable. Es una versin ms grande de VARCHAR2.
El tamao mximo en BD es 4 Gigabytes. Ver NCLOB.
Es recomendable usar CLOB o BLOB en lugar de LONG.
BLOB
Objeto binario de longitud variable. Es una versin ms grande de RAW.
El tamao mximo en BD es 4 Gigabytes.
BFILE
Puntero a un fichero en disco.
El tamao mximo en BD es 4 Gigabytes.
TIMESTAMP (f)
El timestamp es un fecha que contiene un granularidad superior al tipo DATE, eso significa que
contiene fracciones de segundo.
Con f definimos el numero de digitos que queremos en la fraccin de segundo. Asi, f puedes valer
desde 0 hasta 9, el valor por defecto es 6.
SELECT SYSTIMESTAMP FROM DUAL;

Podemos usar WITH {LOCAL} TIMEZONE para grabar con el desplazamiento de hora local.
INTERVAL YEAR (y) TO MONTH
Periodo de tiempo definido en aos y meses donde y es el nmero de digitos del ao. Puede valer de
0 a 9. (por defecto = 2)
INTERVAL DAY (d) TO SECOND (f)
Es un periodo de tiempo definido en dias, horas, minutos y segundos. d es el mximo numero de
digitos en el dia f es el mximo numero de digitos en el campo de segundos. d va de 0 a 9. (por
defecto = 2) fva de 0 a 9. (por defecto = 6)

ROWID
Cadena hexadecimal que representa de forma nica una fila en una tabla (pero no unica en cualquier
tabla). Ver funcin ROWID.
UROWID
Cadena hexadecimal que representa de forma nica una fila ORDENADA en una tabla (pero no
unica en cualquier tabla). Ver funcin ROWID.
RAW(n)
Objeto binario de longitud variable.
Es obligatorio especificar el tamao.
El tamao mximo en BD es 2000 bytes y el mnimo 1 byte.
El tamao mximo en PL/SQL es 32767 bytes y el minimo 1 byte.
LONG RAW
Objeto binario de longitud variable.
El tamao mximo en BD es 2 Gigabytes.
El tamao mximo en PL/SQL es 32767 bytes y el minimo 1 byte.
4. LENGUAJE DE DEFINICION DE DATOS (DDL)
4.1 CREACIN DE TABLAS
La primera fase de cualquier base de datos comienza siempre con sentencias DDL, ya que antes de
poder almacenar informacin debemos definir los objetos bsicos donde agrupar la informacin.
Los objetos bsicos con que trabaja SQL son las tablas. Una tabla es un conjunto de celdas
agrupadas en filas y columnas donde se almacenan elementos de informacin.
Para ver todas las tablas que tenemos cada usuario tenemos que ver las filas que tiene la
tabla cat, que es el tabla del esquema de usuario de cada uno.
SELECT * FROM TAB;

Antes de llevar a cabo la creacin de una tabla conviene planificar:


5. nombre de la tabla,
6. nombre de cada columna,
7. tipo y tamao de los datos almacenados en cada columna,

8. informacin adicional, restricciones, etc.


Hay que tener en cuenta tambin ciertas restricciones en la formacin de los nombres de las tablas:
longitud mxima de 30 caracteres, no puede haber nombres de tabla duplicados, deben comenzar
con un carcter alfabtico, permitir caracteres alfanumricos y el guin bajo '_', y Oracle no
distingue entre maysculas y minsculas.
La sintaxis del comando que permite crear un tabla es la siguiente:
CREATE TABLE [esquema.]tabla ({columna tipoColumna [NOT NULL],}+,
{CONSTRAINT nombreRestriccin
{UNIQUE ([column,]+)|
DEFAULT expresion|
CHECK (condicion)|
PRIMARY KEY ([column,]+)|
FOREIGN KEY (column) REFERENCES tabla(columna)},}*)

Del examen de la sintaxis de la sentencia Create Table se pueden concluir que necesitamos
conocer los distintos tipos de columna y las distintas restricciones que se pueden imponer al
contenido de las columnas. Vayamos por partes.
TIPOS DE COLUMNAS
Existen varios tipos de datos en SQL. De esta manera, cada columna puede albergar una
informacin de naturaleza distinta. Los tipos de datos ms comunes y sus caractersticas se resumen
en la siguiente tabla.
Tipo de Dato
Descripcin
VARCHAR2(tama Almacena datos de tipo carcter alfanumrico de longitud
o)
variable, con un tamao mximo de 2.000.
CHAR(tamao) Almacena datos de tipo carcter alfanumrico de longitud
fija, con un tamao mximo de 255.
Almacena datos de tipo carcter alfanumrico de longitud
LONG
variable con un tamao mximo de hasta 2 Gb.
Almacena datos numricos de dig dgitos, de los cuales
NUMBER(dec)
dec son decimales. El tamao mximo es de 38 dgitos.
Almacena fechas desde el 1-Ene-4712 AC hasta el 31-DicDATE
4712 DC.
Almacena datos de longitud variable, con un tamao
RAW(tamao)
mximo de 255 bytes. (imgenes,sonido)
Almacena datos de longitud variable, con un tamao
LONG RAW
mximo de 2 Gb. (imgenes,sonido)
La vista USER_TABLES

contiene informacin sobre las tablas de usuario

4.2 MODIFICACIN DE COLUMNAS


Despus de crear una tabla, a veces nos encontramos con que se necesita aadir una columna
adicional o modificar la definicin de una columna existente. Esta operacin se puede realizar con

el comando ALTER TABLE.


ALTER TABLE tabla {ADD | MODIFY} ({columna tipoColumna [NOT NULL],}+);

Hay que tener en cuenta varios puntos:

No es posible disminuir el tamao de un columna.


En las modificaciones, los tipos anterior y nuevo deben ser compatibles, o la tabla debe estar
vaca.
La opcin ADD ... NOT NULL slo ser posible si la tabla est vaca.
La opcin MODIFY ... NOT NULL slo podr realizarse cuando la tabla no contenga
ninguna fila con valor nulo en la columna en cuestin.

Por ejemplo la sentencia siguiente aade la fecha de nacimiento a la tabla de empleados.


SQL> alter table emp add (fecha_nac date not null);

Tambin se puede querer modificar una tabla aadiendo o eliminando restricciones. En este caso el
comando a utilizar ser
ALTER TABLE tabla {ADD | DROP} CONSTRAINT restriccin;
EJEMPLOS:
SQL> CREATE TABLE PRUEBA (NOMBRE VARCHAR2(8));

SQL> ALTER TABLE PRUEBA ADD CONSTRAINT NOM_PK PRIMARY KEY (NOMBRE);

Table altered.
SQL> ALTER TABLE PRUEBA MODIFY (NOMBRE VARCHAR2(9));

Table altered.
SQL> ALTER TABLE PRUEBA ADD FECHA_NAC DATE;

Table altered.

SQL> ALTER TABLE PRUEBA DISABLE CONSTRAINT NOM_PK;

Table altered.

SQL> ALTER TABLE PRUEBA ENABLE CONSTRAINT NOM_PK;

Table altered.

SQL> ALTER TABLE PRUEBA DROP CONSTRAINT NOM_PK;

Table altered.
SQL> ALTER TABLE PRUEBA DROP COLUMN FECHA_NAC;

Table altered.

SQL> ALTER TABLE PRUEBA DROP COLUMN NOMBRE;


ALTER TABLE PRUEBA DROP COLUMN NOMBRE
*
ERROR at line 1:
ORA-12983: cannot drop all columns in a table

SQL> DROP TABLE PRUEBA PURGE;

Table dropped.

4.3 INTEGRIDAD REFERENCIAL(RESTRICCIONES


RESTRICCIONES
Las restricciones de los datos se imponen para asegurarnos que los datos cumplen con una serie de
condiciones predefinidas para cada tabla. Estas restricciones ayudan a conseguir la integridad de
referencia: todas las referencias dentro de una BD son vlidas y todas las restricciones se han
cumplido.
La definicin de restricciones al crear las tablas permite establecer reglas de validacin de datos, as
como los controles necesarios para mantener la integridad referencial entre tablas a travs de las
columnas claves.
Las restricciones se van a definir acompaadas por un nombre, lo que permitir activarlas o
desactivarlas segn sea el caso; o tambin mezcladas en la definiciones de las columnas de la tabla.

A continuacin vamos a describir cada una de las restricciones mencionadas.


NOT NULL
Establece la obligatoriedad de que esta columna tenga un valor no nulo. Se debe
especificar junto a la columna a la que afecta. Los valores nulos no ocupan espacio, y son
distintos a 0 y al espacio en blanco.
UNIQUE
Evita valores repetidos en una columna, admitiendo valores nulos. Oracle crea un ndice
automticamente cuando se habilita esta restriccin y lo borra al deshabilitarse.
DEFAULT
Establece un valor por defecto para esa columna, si no se le asigna ninguno.
CREATE TABLE PRUEBA(NOMBRE VARCHAR2(8) DEFAULT 'PEPE', DNI NUMBER(8))

CHECK
Comprueba que se cumpla una condicin determinada al rellenar esa columna.
PRIMARY KEY
Establece el conjunto de columnas que forman la clave primaria de esa tabla. Se comporta
como nica y obligatoria sin necesidad de explicitarlo. Slo puede existir una clave
primaria por tabla. Puede ser referenciada como clave ajena por otras tablas. Crea un ndice
automticamente cuando se habilita o se crea esta restriccin. En Oracle, los ndices son
construidos sobre rboles B+.
FOREIGN KEY
Establece que el contenido de esta columna ser uno de los valores contenidos en una columna
de otra tabla AJENA. Esta columna marcada como clave ajena puede ser NULL. No hay lmite en
el nmero de claves ajenas. La clave ajena
puede ser otra columna de la misma tabla. Se puede forzar que cuando una fila de la tabla
maestra sea borrada, todas las filas de la tabla detalle cuya clave ajena coincida con la clave
borrada se borren tambin. Esto se consigue aadiendo la coletilla ON DELETE
CASCADE en la definicin de la clave ajena.
ON DELETE CASCADE (cuando se borra una fila padre se eliminan todos los hijos de forma automtica)
ON DELETE SET NULL Cuando los datos a los que hace referencia en la clave principal se eliminan , todas las filas
de la tabla secundaria que dependen de los valores de clave primaria se establecen en null.
ON DELETE NO ACTION (que es el valor predeterminado) impide la eliminacin de uno de los padres cuando hay
hijos (sera buena disposicin para la vida real)

ejemplos
create table departamentos (
cod_dep number(3),
nombre varchar2(15) not null,
loc varchar2(10),
constraint dep_pk primary key (cod_dep),
constraint dep_loc check (loc in ('madrid', 'barcelona', 'valencia'))

Table created.

SQL> insert into departamentos values (1,'ventas','madrid');


1 row created.
insert into departamentos values(2,'rrhh','zamora')

ORA-02290: check constraint (PEDRO.DEP_LOC) violated


create table empleados (
cod_emp number(3),
nombre varchar2(10) not null,
oficio varchar2(11),
jefe number(3),
fecha_alta date,
salario number(10),
comision number(10),
cod_dep number(3),
constraint emp_pk primary key (cod_emp),
constraint emp_fk foreign key (cod_dep) references departamentos(cod_dep)
on delete cascade,
constraint emp_ck check (salario > 10))
/

SQL> insert into empleados values(11,'fernandez','cajero',1,'21-DEC2000',3000,500,1);


1 row created.
insert into empleados values(12,'lopez','vendedor',1,'21-DEC-2000',3000,500,2)
*
ERROR at line 1:
ORA-02291: integrity constraint (PEDRO.EMP_FK) violated - parent key not found
insert into empleados values(12,'lopez','vendedor',1,'21-DEC-2000',8,500,1)
*

ERROR at line 1:
ORA-02290: check constraint (PEDRO.EMP_CK) violated
insert into empleados values(11,'lopez','vendedor',1,'21-DEC-2000',3000,500,1)
*
ERROR at line 1:
ORA-00001: unique constraint (PEDRO.EMP_PK) violated

INTEGRIDAD REFERENCIAL
Estableciendo estas restricciones entre claves ajenas y primarias logramos:
1- Evitar borrados, inserciones o actualizaciones no deseados
2- Propagar Modificaciones. Lo contrario a lo anterior. Se pueden definir acciones de borrado en
cascada. Por ejemplo, si se borra una cabecera de factura que se borren las correspondientes lineas
COMO DEFINIR UNA RESTRICCION
1.- EN LINEA
Las restriccin va a continuacin del nombre de la columna el tipo de dato y la precisin , en este
caso no es obligarorio darles un nombre con la palabra clave CONSTRAINT, pero se generar
uno por defecto
CREATE TABLE FACTURAS (
Numero_factura NUMBER(6) [CONSTRAINT nombre_dela_constraint] PRIMARY KEY

NOTA: no es necesario aunque si aconsejable poner nombre a las constraints, si no oracle le pone
un nombre ale
2 .-NO EN LINEA
Las restricciones van antes o depus de empezar a definir las columnas
CREATE TABLE FACTURAS (
numero_factura NUMBER (6),
Columna N tipo_de_dato (precisin),
Definicin del resto de las columnas ..........,
CONSTRAINT cp_numero_factura
PRIMARY KEY (numero_factura)

Ejemplos
CREATE TABLE provincia(
codprov NUMBER(2) PRIMARY KEY,

nomprov CHAR(20) UNIQUE NOT NULL);


CREATE TABLE alumno(
num NUMBER(4),
nombre CHAR(10) NOT NULL,
apellidos CHAR(20) NOT NULL,
edad NUMBER(2) CHECK (edad>16),
codprov NUMBER(2),
nota NUMBER(4,2) CHECK (nota >=0 AND nota <= 10),
PRIMARY KEY (num),
FOREIGN KEY (codprov) REFERENCES provincia);

Por defecto una restriccin est activa tras su definicin. Las restricciones con nombre pueden
activarse o desactivarse a voluntad mediante la clausula ENABLE CONSTRAINT o DISABLE
CONSTRAINT.
GESTION DE RESTRICCIONES
La informacin acerca de las restricciones se encuentra en las siguientes vistas del diccionario de
datos:
USER_CONSTRAINTS
USER_CONS_COLUMNS

Para cambiar las restricciones y la clave primaria de una tabla debemos usar ALTER TABLE.Crear
una clave primaria (primary key):
ALTER TABLE T_PEDIDOS ADD CONSTRAINT PK_PEDIDOS
PRIMARY KEY (numpedido,lineapedido);

Crear una clave externa, para integridad referencial (foreign key):


ALTER TABLE T_PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLIENTES
FOREIGN KEY (codcliente) REFERENCES T_CLIENTES (codcliente));

Crear un control de valores (check constraint):


ALTER TABLE T_PEDIDOS ADD CONSTRAINT CK_ESTADO
CHECK (estado IN (1,2,3));

Crear una restriccin UNIQUE:


ALTER TABLE T_PEDIDOS ADD CONSTRAINT UK_ESTADO
UNIQUE (correosid);

Normalmente una restriccin de este tipo se implementa mediante un indice unico.

Borrar una restriccin:


ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;

Deshabilitar una restriccin:


ALTER TABLE T_PEDIDOS DISABLE CONSTRAINT CON1_PEDIDOS;

habilitar una restriccin:

ALTER TABLE T_PEDIDOS ENABLE CONSTRAINT CON1_PEDIDOS;

LA SINTAXIS ALTER TABLE PARA RESTRICCIONES ES:


ALTER TABLE [esquema.]tabla
constraint_clause,...
[ENABLE enable_clause | DISABLE disable_clause]
[{ENABLE|DISABLE} TABLE LOCK]
[{ENABLE|DISABLE} ALL TRIGGERS];

donde constraint_clause puede ser alguna de las siguientes entradas:


ADD out_of_line_constraint(s)
ADD out_of_line_referential_constraint

DROP PRIMARY KEY [CASCADE] [{KEEP|DROP} INDEX]


DROP UNIQUE (column,...) [{KEEP|DROP} INDEX]
DROP CONSTRAINT constraint [CASCADE]
MODIFY CONSTRAINT constraint constrnt_state
MODIFY PRIMARY KEY constrnt_state
MODIFY UNIQUE (column,...) constrnt_state
RENAME CONSTRAINT constraint TO new_name

donde a su vez constrnt_state puede ser:


[[NOT] DEFERRABLE] [INITIALLY {IMMEDIATE|DEFERRED}]
[RELY | NORELY] [USING INDEX using_index_clause]
[ENABLE|DISABLE] [VALIDATE|NOVALIDATE]
[EXCEPTIONS INTO [schema.]table]

Borrar una restriccin:


ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;

4.4 VISTAS, INDICES Y SECUENCIAS


VISTAS
Las vistas constituyen un poderoso mecanismo del modelo relacional de datos en lo referente a la
interaccin entre el usuario o las aplicaciones y el esquema relacional o conjunto fsico de tablas.
Las vistas posibilitan el nombrar de diferentes formas a los mismos datos, constituyendo una
especie de tablas virtuales o ventanas a travs de las cuales ver los datos realmente almacenados en
las tablas. Las ventajas fundamentales que conlleva la utilizacin de vistas son las siguientes:
1.-Privacidad y seguridad: no todos los usuarios pueden ver o conocer la totalidad del esquema
relacional.
2.- Permiten limitar las posibles operaciones (consultas) que se puedan realizar sobre los datos.

SINTAXIS:
CREATE VIEW nombre_vista AS expresin_de_consulta;

Las vistas se eliminan (tan solo su definicin, no las tablas sobre las que se construye) mediante la
sentencia:
DROP VIEW NOMBRE_VISTA:

ejemplo de creacin simple:


SQL> create view vista2 as select ename,sal from emp;
View created.

ejemplo algo mas complejo


create view
deptno

vista_emp (uno,dos) as

select deptno, max(sal) from emp group by

View created.

SQL> desc vista_emp


Name
Null?
Type
----------------------------------------- -------- ---------------------------UNO
NUMBER(2)
DOS
NUMBER

SQL> select * from vista_emp;


UNO
DOS

---------- ---------30
2850
20
3000
10
5000

Esta vista muestra el salario mximo agrupado por departamento.


A modo de ejemplo definiremos varias vistas sobre una tabla ALUMNO con los atributos num, edad
y nota.
CREATE TABLE alumno(
num NUMBER(2) PRIMARY KEY,
edad NUMBER(2),
nota NUMBER (4,2));
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO

alumno
alumno
alumno
alumno

VALUES(5,20,5.0);
VALUES(7,20,8.9);
VALUES(9,23,2.3);
VALUES (1,21,5.0);

CREATE VIEW total_edad(edad,numero_alumnos)


AS SELECT edad, COUNT(*) FROM alumno GROUP BY edad;
CREATE VIEW total_nota(nota,numero_alumnos)
AS SELECT nota, COUNT(*) FROM alumno GROUP BY nota;
SQL> SELECT * FROM total_edad;

EDAD NUMERO_ALUMNOS
---------- -------------20

21

23

SQL> SELECT * FROM total_nota;

NOTA NUMERO_ALUMNOS
---------- -------------2.3

8.9

Un usuario puede otorgar permisos de consulta a otros usuarios sobre las vistas que hubiera creado.
As se consigue que los usuarios que reciben el permiso tengan limitado su acceso a las tablas del
primer usuario a la realizacin de un determinado nmero de consultas sin conocer realmente a las
tablas que afectan ni los atributos concretos consultados. De manera similar tambin pueden
definirse sinnimos relativos a vistas.

INFORMACIN SOBRE LAS VISTAS EN EL DICCIONARIO


USER_VIEWS
SQL> SELECT * FROM CAT;
TABLE_NAME
TABLE_TYPE
------------------------------ ----------DEPT
TABLE
EMP
TABLE
BONUS
TABLE
SALGRADE
TABLE
DEPARTAMENTOS
TABLE
EMPLEADOS
TABLE
ALUMNO
TABLE
TOTAL_EDAD
VIEW
TOTAL_NOTA
VIEW
VISTA_EMP
VIEW
VISTA2
VIEW

SINNIMOS
create

synonym empleados2 for emp

;
Sinonimo creado.

SQL> grant select on empleados2 to pedro;

SQL> select * from user_synonyms

SYNONYM_NAME

TABLE_OWNER

EMPLEADOS2

SCOTT

TABLE_NAME

SQL> drop synonym empleados2;

Sinonimo borrado.

EMP

DB_LINK

Para realizar una identificacin completa de un objeto de BD (como una tabla o una vista) en una
BD distribuida, es necesario especificar el nombre de la mquina host, el nombre del servidor, el
propietario del objeto y el nombre del objeto. En funcin de la ubicacin del objeto, sern
necesarios entre uno y cuatro de estos parmetros. Para ocultar este proceso al usuario, los
desarrolladores pueden crear sinnimos que apunten al objeto adecuado; de este modo, los usuarios
slo necesitan saber el nombre del sinnimo.
SINNIMOS PBLICOS
CREATE [PUBLIC] SYNONYM [usuario.]sinonimo FOR [usuario.]tabla

Por definicin, el acceso al sinnimo es solo para el creador del sinnimo. Con PUBLIC puede
hacerse accesible a todos los usuarios.
Ejemplo:
queremos crear un sinnimo de la tabla emp de scott para que tengan acceso todos los usuarios de la
base de datos orac5
SQL> connect system/manager@orac5
Connected.
create public synonym empleados for scott.emp;
Synonym created.
SQL> connect / as sysdba
Connected.
SQL> create public synonym empleados2 for scott.emp;
Synonym created.
SQL> select * from empleados2;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------DEPTN
7369 SMITH
CLERK
7902 17-DEC-80
5000
20

ejemplo de secuencia de utilizacin.


SQL> conn pedro/oracle
Connected.
SQL> ed
Wrote file afiedt.buf
1* select * from empleados2
SQL> /
select * from empleados2
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> conn / as sysdba
Connected.
SQL> grant select any table to pedro;
Grant succeeded.

SQL> conn pedro/oracle


Connected.

SQL> select * from empleados2;


EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- --------- ---------- --------- ---------- ---------DEPTNO
---------7369 SMITH
CLERK
7902 17-DEC-80
5000

COMM----------

INFORMACIN DE LOS SINNIMOS EN EL DICCIONARIO


user_synonyms
dba_synonyms

SELECT * FROM dba_synonyms WHERE SYNONYM_NAME ='EMPLEADOS'

OWNER

SYNONYM_NAME

PUBLIC EMPLEADOS

TABLE_OWNER

SCOTT

TABLE_NAME

DB_LINK

EMP

BORRADO DE SINNIMOS:
drop public synonym empleados2;

NDICES EN ORACLE
SINTAXIS
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name
ON [esquema.]table_name [tbl_alias]
(col [ASC | DESC]) index_clause index_attribs

TIPOS DE NICES
INDICES B-TREE
El indice B-Tree es el tipo de indice mas comun en una base de datos Oracle. Es el indice default, es
decir que si uno crea un indice sin especificar el tipo, Oracle lo creara de tipo B-Tree.
La estructura de un indice B-Tree tiene la forma de un arbol invertido. Las estructuras superiores se
llaman ramas y la estructura inferior constituyen las hojas. Generalmente los indices B-Tree tienen
uno o mas niveles de ramas. Cada rama de un nivel contiene informacion sobre otras ramas del

nivel inmediatamente inferior. En el grafico podemos apreciar que la rama superior esta etiquetada
con el nombre Ingrid. En el siguiente nivel las ramas estan divididas en las alfabeticamente
menores a la izquierda y las mayores a la derecha. Por cada entrada en la tabla, el indice B-Tree
registra una entrada en el indice. Cuando se ejecuta una sentencia, Oracle va recorriendo el indice
desde la parte superior hasta encontrar el valor buscado. Una vez encontrado el valor buscado de
acuerdo con lo requerido por la sentencia SQL, Oracle se dirigira a los datos de la tabla utilizando el
rowid especificado en las hojas.
Los indices no solo constituyen un metodo para acelerar la busqueda de datos. Tambien pueden ser
utilizados para forzar la unicidad de las columnas. Cuando se crea una clave primaria sobre una
tabla, Oracle crea un indice unico en forma automatica para garantizar la unicidad de los valores.

Existen
tres
tipos
de
ndice
b-

tree(arbol invertido): no nicos, nicos y compuestos


La sintaxis bsica es la siguiente:
create TIPOdeINDICE index NOMBREINDICE
on NOMBRETABLA(CAMPOS);

ejemplo de ndice no nico


CREATE INDEX IND_NOM_EMPLEADO ON EMPLEADOS (NOMBRE_EMPLEADO)

ejemplo de ndice unico


CREATE UNIQUE

INDEX IND_NOM_EMPLEADO ON EMPLEADOS (NOMBRE_EMPLEADO)

ejemplo de ndice compuesto


CREATE INDEX NOM_IND ON EMPLEADOS (EMPNO,ENAME)

INDICES BITMAP
Los indices B-Tree almacenan rowids en las hojas del arbol. Estos indices pueden llegar a utilizar
grandes cantidades de espacio de almacenamiento. A diferencia de los indices B-Tree, los indices de
tipo Bitmap utilizan una fraccion de espacio mucho menor representando los rowids como valores
binarios (on/off).

Los indices Bitmap son aconsejables en situaciones en que los diferentes valores que puede tomar la
columna son relativamente pocos. Ejemplos: sexo, estado civil, etc. Cuantos menos valores
posibles, mejor. A medida que crece la cantidad de valores posibles, aumentara el tamao del indice.
Curiosamente este es el articulo mas leido de SqlEficiente. Evidentemente hay poca informacion en
espaol acerca de los indices bitmap. Por dicho motivo, estare agregando algunos apendices al
proyecto, referidos a los indices bitmap. Los links a dichos apendices se iran agregando a este
articulo a medida que los vaya publicando.
El proposito de todo indice es proveer punteros a las filas de una tabla que tienen un valor
determinado. En un indice B-tree, este objetivo se logra almacenando una lista de rowids de las filas
de la tabla con el valor clave. Oracle almacena cada valor clave en forma repetida para cada fila. En
un indice bitmap, en vez de una lista de rowids, Oracle crea un mapa de bits para cada valor clave
del indice.
Cada bit del mapa corresponde a un rowid posible. Si el bit esta en 1, significa que el rowid
contiene dicho valor clave. Una funcion interna de Oracle convierte la posicion del bit en el rowid
conrrespondiente, de modo tal que los indices bitmap ofrecen la misma funcionalidad que los
indices B-tree, a pesar de la diferente representacion interna. Si la cantidad de valores diferentes del
indice es chica, entonces el indice bitmap sera muy eficiente en cuanto al uso de espacio fisico.
Supongamos que tenemos la siguiente tabla de clientes:
CLIENTE
101
102
103
104
105
106

APELLIDO
PEREZ
GARCIA
LOPEZ
SAN MARTIN
BROWN
CANEPA

REGION
NORTE
CENTRO
SUR
SUR
CENTRO
CENTRO

La columna region tiene baja cardinalidad, ya que los valores posibles son muy pocos (NORTE,
CENTRO, SUR). Hay solamente tres valores posibles para la region por lo tanto un indice bitmap
seria apropiado para esta columna. Sin embargo, no es recomendable un indice bitmap para la
columna CLIENTE o APELLIDO, dada su alta cardinalidad. Para estos casos un indice B-tree
proveera una representacion y acceso mas eficiente.
La siguiente seria la representacion del indice bitmap para la columna REGION. El indice tiene tres
mapas de bits, uno para cada region.
NORTE
1
0
0
0
0
0

CENTRO
0
1
0
0
1
1

SUR
0
0
1
1
0
0

Cada entrada o bit en el indice bitmap se corresponde a una sola fila en la tabla de clientes. El valor
del bit dependera del valor correspondiente de la fila en la tabla. Por ejemplo, para la region
NORTE el mapa de bits tiene un 1 en la primer posicion. Eso es porque la primer fila de la tabla de
clientes tiene el valor NORTE en la columna REGION. Luego, el mapa de bits tiene todos ceros,
indicando que el resto de las filas de la tabla no tiene clientes en la region NORTE.
Una sentencia SQL sobre esta tabla y con el indice bitmap, ser resolveria de la siguiente manera.
select count(*) from CLIENTES
where REGION in ('NORTE','SUR');

Un indice bitmap puede resolver esta sentencia con gran eficiencia contando la cantidad de unos
existentes en el mapa de bits resultante como se muestra en la siguiente figura:
NORTE
1
0
0
0
0
0

CENTRO
0
1
0
0
1
1

SUR
0
0
1
1
0
0

(NORTE O SUR)
1
0
1
1
0
0

La columna NORTE O SUR es el mapa de bits resultante utilizado para acceder a la tabla.
Adicionalmente y a diferencia de los indices B-tree, los indices bitmap pueden incluir filas con
valore NULL dentro de la estructura del indice. En cuanto a las tablas particionadas, los indices
bitmap se pueden utilizar solo si son locales a la particion. Los indices bitmap globales no son
soportados para tablas particionadas.
create bitmap index ind_region on clientes (region);

NDICES DE CALVE REVERSA


Si bien los indices B-Tree constituyen el metodo de indexacion mas comun en una base de datos
Oracle, tiene sus desventajas. A veces puede ocurrir que un indice comienza a desbalancearse
porque la mayoria de los valores caen del lado derecho o izuquierdo creando una estructura
desbalanceada. Esta estructura desbalanceada obliga a Oracle a crear excesivos niveles de
ramas provocando altas cantidades de operaciones de entrada salida para llegar a las hojas. El
resultado final es una baja performance. Hay dos soluciones a este problema. El primer metodo es
reconstruir el indice. El segundo metodo es utilizar indices reversos. Los indices reversos revierten
el orden de los valores almacenados en el indice. Por ejemplo, si el valor de la columna es 1234,
en el indice se almacenara el valor 4321. Esto provocara una distribucion mas pareja de los
valores en el indice y, por ende, habra menos niveles de ramas y operaciones de entrada salida.
SINTAXIS
CREATEINDEXrix_index_demo_person_id
ONindex_demo(person_id)
PCTFREE0
TABLESPACEuwdata
REVERSE;

Para revertir un ndice ya creado:


alter index indexname rebuild reverse;
alter index indexname rebuild noreverse;

INDICES BASADOS EN FUNCIONES


Los indices basados en funciones permiten basar el indice en el resultado de una funcion SQL.
Como Oracle permite crear funciones propias, los indices basados en funciones combinados con

funciones creadas por un usuario, pueden transformarse en una herramienta muy poderosa.
Para utilizar los ndices basados en funciones es necesario activar los siquientes parmetros:
alter session set query_rewrite_enabled = true;
alter session set query_rewrite_integrity = trusted;

CREATE INDEX idx_case_ins ON my_table(UPPER(empname));


SELECT * FROM my_table WHERE UPPER(empname) = 'KARL';

ejemplo prctico
Tenemos una tabla que almacena los nombres en minsculas, pero en la aplicacin que accede a la
tabla se piden estos datos en mayscula.
SQL> select nombre from empleados;
NOMBRE
---------fernandez

En este caso es recomenadable utilizar un ndice basado en la funcin upper , de lo contrario


oracle no utilizaraun ndice creado en esa columna
create index empl_ename on empleados(upper(nombre))
Index created.
SQL> select upper(nombre) from empleados;
UPPER(NOMB
---------FERNANDEZ

Para un consulta de este tipo:


SQL> SELECT NOMBRE FROM EMPLEADOS WHERE SUBSTR(NOMBRE,1,1) = 'f';
NOMBRE
---------fernandez

ENAME
----------

SMITH

podemos crear un ndice como este


SQL> CREATE INDEX IND_NOM ON EMPLEADOS (SUBSTR(NOMBRE,1,1));
Index created.
SELECT ename FROM EMPLEADOS WHERE SUBSTR(ENAME,1,1) = 'S'
SQL> /

nota: aunque la columna ename est indexada, oracle no utilizar el ndice a menos que dicho
ndice este basado en la funcin que se aplica en la query
Tambin se puden crear ndices basados en funciones de clculo:
select nombre from empleados where (salario + comision) < 10000;

Se podra crear este ndice basado en la funcin de suma:


SQL> create index ind_sal_com on empleados (salario + comision);

ALTERACIN Y BORRADO DE NDICES


ALTER INDEX INDEXNAME REBUILD REVERSE;
ALTER INDEX INDEXNAME REBUILD NOREVERSE;
ALTER INDEX INDEX_NAME
RENAME TO NEW_INDEX_NAME;
ALTER INDEX INDEX_NAME
REBUILD COMPUTE STATISTICS;
ALTER INDEX INDEX_NAME
REBUILD TABLESPACE USERS
ANALYZE INDEX src_idx COMPUTE STATISTICS;

DROP INDEX INDEX_NAME;

INFORMACIN SOBRE NDICES EN EL DICCIONARIO


Para obtener informacin sobre los ndices podemos consultar varios diccionarios.
1) "user_indexes": nos muestra las siguientes columnas (entre otras que no analizaremos):
-

INDEX_NAME
INDEX_TYPE
TABLE_NAME
UNIQUENESS

(nombre del ndice),


(tipo de ndice, nosotros crearemos el stardart normal),
(nombre de la tabla),
(si es nico o no).

2) "user_ind_columns": nos muestra las siguientes columnas (entre otras que no analizaremos):
-

INDEX_NAME (nombre del ndice),


TABLE_NAME (nombre de la tabla),
COLUMN_NAME (nombre del campo),
COLUMN_POSITION (posicin del campo),

3) "user_objects": en la columna "OBJECT_TYPE" muestra "index" si es un ndice.


4) "user_constraints": si la restriccin tiene un ndice asociado, aparece su nombre en la columna
"INDEX_NAME".
Para ampliar informacion sobre ndices:
http://psoug.org/reference/indexes.html

SECUENCIAS: CODIFICACIN NUMRICA


La codificacin numrica del cliente se puede realizar con una secuencia que automticamente genera
los nmeros enteros en orden ascendente, no siendo necesario recordar cul fue el ltimo nmero
asignado ; esto evita la duplicidad de cdigos.
La secuencia es un objeto que genera valores enteros nicos y se emplean para crear claves primarias
numricas, con el uso del siguiente mandato:
SQL> CREATE SEQUENCE COD_CLIENTE INCREMENT BY 1;
Sequence created.

ejemplo de aplicacin;
SQL> create table prueba (id number, nombre varchar2(8));
Table created.
SQL> INSERT INTO PRUEBA VALUES(COD_CLIENTE.NEXTVAL, 'PEPE');
1 row created.
SQL> INSERT INTO PRUEBA VALUES(COD_CLIENTE.NEXTVAL, 'JUAN');
1 row created.
SQL> SELECT * FROM PRUEBA;
ID NOMBRE
---------- -------1 PEPE

2 JUAN
SQL> SELECT user,sysdate,cod_cliente.currval FROM DUAL;
USER
SYSDATE
CURRVAL
------------------------------ --------- ---------PEDRO
04-JAN-11
2
SQL> create table prueba2 (id number, nombre varchar2(8));
Table created.
SQL> INSERT INTO PRUEBA VALUES(COD_CLIENTE.NEXTVAL, 'JUAN');
1 row created.
SQL> ed
Wrote file afiedt.buf
1* INSERT INTO PRUEBA2 VALUES(COD_CLIENTE.NEXTVAL, 'JUAN')
SQL> /
1 row created.
SQL> select * from prueba2;
ID NOMBRE
---------- -------4 JUAN
SQL>

SELECT * FROM PRUEBA;

ID NOMBRE
---------- -------1 PEPE
2 JUAN
3 JUAN
SQL> SELECT user,sysdate,cod_cliente.currval FROM DUAL;
USER
SYSDATE
CURRVAL
------------------------------ --------- ---------PEDRO

04-JAN-11

You might also like