You are on page 1of 15

Funciones (Built-In Functions)

Las funciones son parte intrnseca de cualquier comando SQL. Aqu se muestra una lista de las
funciones ms comunes.

ADD_MONTHS

CHARTOROWID

CONVERT

Tipo

Sintaxis

Retorna

Number

ABS(n)

Valor absoluto de n.

Date

ADD_MONTHS(a,b)

Suma a la fecha a, b meses (b


puede ser negativo).

Character

ASCII(c)

Representacin decimal de c.

Group

AVG(DISTINCT|ALL n)

Promedio del valor de n. ALL es el


valor por defecto default.

Number

CEIL(n)

Menor entero mayor o igual a n.

Conversin

CHARTOROWID(c)

Convierte un carcter a un tipo de


datos rowid.

Character

CHR(n)

Representacin carcter del valor


decimal n.

Character

CONCAT(1,2)

Carcter 1 concatenado con el 2.

Conversion

CONVERT(a, dest_c [,source_c])

Convierte
una
caracteres a de un
caracteres a otro.

hilera
conjunto

de
de

Number

COS(n)

Coseno de n.

Number

COSH(n)

Coseno hiperblico de n.

Group

COUNT(DISTINCT|ALL e)

Nmero de registros en una


consulta. ALL es el default y e puede
ser representado como * para
indicar todas las columnas.

Number

EXP(n)

e elevado a la ensima potencia.

Number

FLOOR(n)

Mayor entero menor o igual a n.

GREATEST

Other

GREATEST(e [,e]...)

El mayor elemento de una lista de


expresiones e.

HEXTORAW

Conversin

HEXTORAW(c)

Convierte
de
una
hexadecimal a un raw.

Character

INITCAP(c)

c con la primer letra de cada palabra


en mayscula.

Character

INSTR(1, 2 [, n [, m]])

Busca 1 con n caracteres para la


emsima ocurrencia de 2 y retorna
la posicin de la ocurrencia.

Character

INSTRB(1,2[,n[,m]])

Igual a INSTR, solo que los


parmetros n y m se esperan en
trminos de bytes.

Date

LAST_DAY(a)

Ultimo da del mes que contiene a.

Other

LEAST(e [,e]...)

El

LAST_DAY

menor

de

una

carcter

lista

de

expresiones e.

LENGTHB

Character

LENGTH(c)

Nmero de caracteres en c. Si c es
un tipo de datos de largo fijo, todos
los blancos son incluidos.

Character

LENGTHB(c)

Igual que LENGTH excepto que en


bytes.

Number

LN(n)

Logaritmo natural de n, donde n > 0.

Number

LOG(b,n)

Logaritmo en base b de n.

Character

LOWER(c)

c con todas
minsculas..

LPAD(1,n [,2])

La hilera 1 rellena a la izquierda


hasta completar el largo n. Si el
carcter 2 es indicado se usa como
patrn de relleno y sino se utilizan
blancos.

Character

LTRIM(c [,set])

Remueve caracteres a la izquierda


de c. Si el conjunto s es definido,
remueve los caracteres iniciales
hasta que no aparezca el conjunto
set.

Other

MAX(DISTINCT|ALL e)

Mximo de una expresin e.. ALL es


el default.

Other

MIN(DISTINCT|ALL e)

Mnimo de una expresin e. ALL es


el default.

Character

las

letras

en

Number

MOD(r,n)

Residuo de dividir r por n..

MONTHS_BETWEEN

Date

MONTHS_BETWEEN(a,b)

Nmero de meses entre dos fechas


a y b..

NEW_TIME

Date

NEW_TIME(a, z1, z2)

Da y hora en la zona z2, cuando la


fecha y hora de z1 es a.

NEXT_DAY

Date

NEXT_DAY(a, c)

Primer da de la semana identificada


por c que est despus de c.

Character

NLSSORT((c [,parm])

Hilera de bytes para ordenar c.

NLS_INITCAP

Character

NLS_INITCAP(c [,parm])

c con la primer letra de cada palabra


en mayscula.

NLS_LOWER

Character

NLS_LOWER(c [,parm])

c con todas las letras en minscula

NLS_UPPER

Character

NLS_UPPER(c [,parm])

c con todas las letras en mayscula.

Other

NVL(e1, e2)

Si e1 es nulo, retorna e2. Si e1 no


es nulo retorna e1.

Number

POWER(m,n)

m elevado a la ensima potencia

Conversin

RAWTOHEX(raw)

Convierte un valor raw


equivalente hexadecimal.

Character

REPLACE(c, s1 [, r2])

Remplaza cada ocurrencia de la


hilera s1 en c con r2. Si r2 se omite
las ocurrencias de r1 son borradas.

RAWTOHEX

su

ROWIDTOCHAR

SOUNDEX

SUBSTRB

Date

ROUND(n [,f])

Redondea la fecha al formato del


modelo f. Si f es omitido, n ser
retornado para el da ms cercano.

Number

ROUND(n[,m])

n redondeado a m. Si m est, es
redondeado a m lugares.

Conversion

ROWIDTOCHAR(rowid)

Convierte de rowid a varchar2.

Character

RPAD(1, n [, 2])

1 rellenado a la derecha con largo n


y con la hilera 2.

Character

RTRIM(c [, s])

c con los caracteres removidos al


final de la hilera.

Number

SIGN(n)

-1 if n < 0, 0 if n = 0, 1 if n > 0.

Number

SIN(n)

Seno de n

Number

SINH(n)

Seno hiperblico de n.

Character

SOUNDEX(c)

Una hilera con la representacin


fontica de c.

Character

SUBSTR(c, m [,n])

Una porcin de c, iniciando en el


carcter m por n caracteres. Si m es
negativo se cuentan los espacios a
partir del final. Si n es omitido, son
retornados todos los caracteres
hasta el final de c.

Character

SUBSTRB(c, m [,n])

Igual que SUBSTR excepto que m y


n son nmero de bytes.

Number

SQRT(n)

Raz cuadrada de n.

Group

STDDEV(DISTINCT|ALL n)

Desviacin estndar de n.

Group

SUM(DISTINCT|ALL n)

Suma de nmeros n.

Date

SYSDATE

Fecha y hora actual.

Number

TAN(n)

Tangente de n.

Number

TANH(n)

Tangente hiperblica de n.

TO_CHAR

Conversion

TO_CHAR(d [,f [,parm])

Convierte la fecha d a carcter con


el formato f y el nls_date_language
para parm.

TO_CHAR

Conversion

TO_CHAR(n [,f [,parm])

Convierte un nmero n a varchar2,


segn formato de parm.

Conversion

TO_DATE(c [, f [, parm])

Convierte un varchar2 c a un tipo


fecha, con el formato f y
nls_date_formate parm.

TO_MULTI_BYTE

Conversion

TO_MULTI_BYTE(c)

Convierte c a su equivalente en
multibyte.

TO_NUMBER

Conversion

TO_NUMBER(c [,f [, parm]])

Convierte el carcter c a un nmero,


utilizando el formato f y el
nls_number_format parm.

TO_SINGLE_BYTE

Conversion

TO_SINGLE_BYTE(c)

Convierte el carcter multibyte c a

su equivalente en byte simple.

TRANSLATE

VARIANCE

Character

TRANSLATE(c, f, t)

c con cada ocurrencia en f con cada


correspondiente carcter en t.

Date

TRUNC(c [,f])

c con la porcin de hora truncada al


formato f.

Number

TRUNC(n[,m])

n truncado a emsimo decimal.. Si


m es omitido, se toma 0.

Other

UID

Un entero que en forma nica


identifica al usuario.

Other

USER

Usuario actual como varchar2.

Character

UPPER(c)

c con las letras en mayscula.

Group

VARIANCE(DISTINCT|ALL n)

Varianza de n.

Other

VSIZE(e)

Nmero de bytes que necesita la


representacin interna de e.

Algunos ejemplos utilizando funciones.

SELECT SUBSTR(address,1,20),
city
FROM customer
WHERE address IS NOT NULL
AND UPPER(city) = 'ROCHESTER'
Vase que UPPER hacer que al convertir a mayscula el nombre de la ciudad, har que si
'Rochester' aparece se convierta para luego compararse con 'ROCHESTER', de tal forma que sean

iguales.

SELECT dept_no, SUM(emp_salary), AVG(emp_salary)


FROM emp
WHERE dept_no = dept_no
GROUP BY dept_no;
Aqu se puede ver el uso del SUM y AVG. Vase que cuando se utilizan otras columnas (sin uso de
funciones resumen) se debe hacer el GROUP BY por estas columnas.

El comando DECODE
Este es uno de los comandos ms importantes. El DECODE tiene la siguiente sintaxis:

DECODE(val, exp1, exp2, exp3, exp4, ..., def);


DECODE primero evala el valor o expresin val, y compara con exp1. Si val es igual exp1, la
expresin exp2 es retornada. Si val no es igual a exp1, la expresin exp3 ser evaluada y retorna
la expresinexp4 si val es igual a exp3. Este proceso contina hasta que todas las expresiones
hayan sido evaluadas. Si no hay coincidencias, el valor por defecto def ser retornado.

Es importante siempre agregar un valor por defecto.

SELECT e.ename,
e.job,
DECODE(e.job, 'President', '******', e.sal)
FROM emp e
WHERE e.empno IN (SELECT NVL(z.mgr, e.empno)
FROM emp z);
En esta consulta todos los nombres de los jefes sern obtenidos junto con su salario. Cuando la fila
del presidente es obtenida se presentar '******' en lugar de su salario.

Vase que con la funcin NVL para evaluar el manager_id. En este caso solo el presidente tiene el
manager_id nulo y por tanto no ser obtenido sin el NVL.

Aunque sal es de distinto tipo de '******', no da error pues Oracle hacer la conversin automtica de

sal a carcter.

SELECT e.ename,
e.job,
e.sal
FROM emp e
WHERE DECODE(USER,'PRES',e.empno, UPPER(e.ename),e.empno, 0) = e.empno;
En este caso, si el usuario es el presidente todos los empleados sern obtenidos, con los dems
empleados solo se obtiene el correspondiente salario.

SELECT e.ename,
e.job
DECODE(USER,'ADMIN', DECODE(e.job, 'PRESIDENT', '*****', e.sal),
'PRES', e.sal, '******')
FROM emp e
WHERE e.empno in (SELECT NVL(z.mgr, e.empno)
FROM emp z);
Ac se utiliza un DECODE anidado dentro de otro. Si el usuario Oracle es 'ADMIN' se muestra el
salario de todos excepto del presidente, si el usuario es el presidente presenta todos los salarios y
para cualquier otro solo asteriscos.

SELECT d.dname,
e.job,
e.ename
FROM emp e,
dept d
WHERE d.deptno = e.deptno
ORDER BY DECODE(e.job,'PRESIDENT', 0,
DECODE(d.dname,'SALES', 1, 'ADMIN', 2, 3)),
e.ename;
En este caso se utiliza el ORDER BY para ordenar segn el job, pero se ajusta para que aparezca
primero el presidente luego los vendedores, administradores y todos los dems. Luego del decode
son ordenados por el ename.

http://alejandria.nidaval.com/scripts/Editorial.dll?SE=2_1_0_T4_A454_205

SELECT nombres, LEVEL


FROM persona
START WITH nombres='Juan Carlos'
CONNECT BY PRIOR idPersona = hijode;
Retornar el nombre de todas las personas y el id del respectivo padre; empezando por el nombre Juan
Carlos. La Pseudocoluma LEVEL indica el nivel en el que se encuentra el registro, tras haber construido el
arbol. START WITH indica el registro raiz; es decir, donde empieza el arbol. CONNECT BY PRIOR indica las
columnas en las cuales existe la relacin padre-hijo
Salida:

Si se desea recuperar la descendencia a partir de Felipe, la consulta sera:

Obsrvese que en la anterior consulta el valor de LEVEL para Felipe es igual a 1, ya en el rbol que
construye esta consulta, el nodo Felipe se encuentra en el primer nivel.
Si por el contrario, se desean conocer los padres de felipe, la consulta sera:

Obsverse en el anterior ejemplo, que el recorrido se hizo de abajo hacia arriba (en el rbol). El orden de las
columnas en la clausula CONNECT BY PRIOR, especifica el orden del recorrido. En el primer ejemplo se
tena:CONNECT BY PRIOR idPersona=hijoDe y se tuvo el recorrido del arbol de arriba a abajo. En el ultimo
ejemplo se tuvo CONNECT BY PRIOR hijoDe =idPersona, y el recorrido fue de abajo hacia arriba.

De igual manera, desde la versin 9i, fue incluida la funcin SYS_CONNECT_BY_PATH(), que concatena los
valores de las ramas del arbol en el recorrido.
El siguiente es un ejemplo de su utilizacin:

Es muy fcil entonces hacer consultas jerrquicas con la utilizacin de la clusula STARA WITH y CONNECT
BY y la funcin SYS_CONNECT_BY_PATH.

http://mioracle.blogspot.mx/2008/03/consultas-jerarquicas.html

Tcnicas de optimizacin de SQL Tuning / SQL:


1) La consulta SQL se vuelve ms rpido si utiliza los nombres de las columnas reales en instruccin
SELECT en lugar de que '*'.
Por ejemplo: Escribe la consulta como

SELECT id, first_name, last_name, age, subject FROM student_details;


En lugar de:

SELECT * FROM student_details;

2) Clusula HAVING se utiliza para filtrar las filas despus de que se han seleccionado todas las filas. Es
como un filtro. No utilice la clusula para ningn otro propsito HAVING.
Por ejemplo: Escribe la consulta como

SELECT subject, count(subject)


FROM student_details
WHERE subject != 'Science'
AND subject != 'Maths'
GROUP BY subject;
En lugar de:

SELECT subject, count(subject)


FROM student_details
GROUP BY subject
HAVING subject!= 'Vancouver' AND subject!= 'Toronto';

3) A veces es posible que tenga ms de un subconsultas en la consulta principal. Trate de minimizar el


nmero de bloque subconsulta en su consulta.
Por ejemplo: Escribe la consulta como

SELECT name
FROM employee
WHERE (salary, age ) = (SELECT MAX (salary), MAX (age)
FROM employee_details)
AND dept = 'Electronics';
En lugar de:

SELECT name
FROM employee
WHERE salary = (SELECT MAX(salary) FROM employee_details)
AND age = (SELECT MAX(age) FROM employee_details)
AND emp_dept = 'Electronics';

4) Uso del operador EXISTS, IN y uniones de tablas apropiadamente en su consulta.


a) Generalmente en cuenta el rendimiento ms lento.

b) IN es eficiente cuando la mayor parte de los criterios de filtro se encuentra en la sub-consulta.


c) Existe es eficiente cuando la mayor parte de los criterios de filtro est en la consulta principal.
Por ejemplo: Escribe la consulta como

Select * from product p


where EXISTS (select * from order_items o
where o.product_id = p.product_id)
En lugar de:

Select * from product p


where product_id IN
(select product_id from order_items

5) USE existe en lugar de DISTINCT cuando se utiliza une que implica mesas tienen relacin uno-a-muchos.
Por ejemplo: Escribe la consulta como

SELECT d.dept_id, d.dept


FROM dept d
WHERE EXISTS ( SELECT 'X' FROM employee e WHERE e.dept = d.dept);
En lugar de:

SELECT DISTINCT d.dept_id, d.dept


FROM dept d,employee e
WHERE e.dept = e.dept;

6) Trate de utilizar UNION ALL en lugar de UNION.


Por ejemplo: Escribe la consulta como

SELECT id, first_name


FROM student_details_class10
UNION ALL
SELECT id, first_name
FROM sports_team;
En lugar de:

SELECT id, first_name, subject


FROM student_details_class10
UNION
SELECT id, first_name
FROM sports_team;

7) Tenga cuidado al utilizar las condiciones de la clusula WHERE.


Por ejemplo: Escribe la consulta como

SELECT id, first_name, age FROM student_details WHERE age > 10;
En lugar de:

SELECT id, first_name, age FROM student_details WHERE age != 10;

Escribe la consulta como

SELECT id, first_name, age


FROM student_details
WHERE first_name LIKE 'Chan%';
En lugar de:

SELECT id, first_name, age


FROM student_details
WHERE SUBSTR(first_name,1,3) = 'Cha';
Escribe la consulta como

SELECT id, first_name, age


FROM student_details
WHERE first_name LIKE NVL ( :name, '%');
En lugar de:

SELECT id, first_name, age


FROM student_details
WHERE first_name = NVL ( :name, first_name);
Escribe la consulta como

SELECT product_id, product_name


FROM product
WHERE unit_price BETWEEN MAX(unit_price) and MIN(unit_price)
En lugar de:

SELECT product_id, product_name


FROM product
WHERE unit_price >= MAX(unit_price)
and unit_price <= MIN(unit_price)
Escribe la consulta como

SELECT id, name, salary


FROM employee
WHERE dept = 'Electronics'
AND location = 'Bangalore';
En lugar de:

SELECT id, name, salary


FROM employee
WHERE dept || location= 'ElectronicsBangalore';
Utilice la expresin no la columna en un lado de la consulta, ya que ser procesada antes.
Escribe la consulta como

SELECT id, name, salary


FROM employee
WHERE salary < 25000;
En lugar de:

SELECT id, name, salary


FROM employee
WHERE salary + 10000 < 35000;
Escribe la consulta como

SELECT id, first_name, age


FROM student_details
WHERE age > 10;
En lugar de:

SELECT id, first_name, age


FROM student_details
WHERE age NOT = 10;
8) Utilice DECODE para evitar el escaneo de mismas filas o unirse a la misma mesa de manera repetitiva.
DECODE tambin se puede hacer utilizado en lugar de GROUP BY u ORDER BY.
Por ejemplo: Escribe la consulta como

SELECT id FROM employee


WHERE name LIKE 'Ramesh%'
and location = 'Bangalore';
En lugar de:

SELECT DECODE(location,'Bangalore',id,NULL) id FROM employee


WHERE name LIKE 'Ramesh%';
9) Para almacenar objetos binarios grandes, el primer lugar en el sistema de archivos y agregar la ruta del
archivo en la base de datos.
10) Para escribir consultas que proporcionan un rendimiento eficiente sigue las reglas generales estndar
SQL.
a) Caso de uso nico para todos los verbos de SQL
b) Comience todos los verbos de SQL en una nueva lnea
c) Separar todas las palabras con un solo espacio
d) Verbos de alineacin derecha o izquierda en el verbo inicial SQL