Alejandría - La Biblioteca¿Quieres un blog como este?. Date de alta aquí.
Volver a la portada
Portada
Lista completa del contenido
Búsqueda
Enviar un e-mail al buzón de sugerencias.
Consúltenos
 Portada 
 Filosofía / Ensayos 
 Aventuras 
 Ciencia Ficción 
 Técnicos 
 Infantil 
 Esotérico 
 Poesía 
 » Técnicos 
Anterior: Tipos de datos Volver al principal : SQL y PL/SQLSiguiente: DDL (Data Definition Language)

Escribiendo consultas

Para obtener datos se utiliza el comando SELECT. El formato es el siguiente:

SELECT [ALL|DISTINCT] [expre_colum1, expre_column2, ..., expre_columN | * ]
FROM [tabla1, tabla2, ..., tablaM]
[WHERE condición]
[GROUP BY col, col, ...]
[HAVING condición]
[ORDER BY col [DESC|ASC] [, col [DESC|ASC] ...]];

Donde expre_colum puede ser un a columna de tabla, una constante, una expresión aritmética, una función o varias funciones anidadas.

Es importante hacer notar que cada comando SQL finaliza con punto y coma(;). Cuando se escriben scripts, estos utilizarán un slash (/) al final del comando.

FROM

Especifica la tabla o lista de tablas de las que se recuperarán los datos. Por ejemplo para obtener los datos del nombre y departamento de los empleados de la empresa, se puede utilizar la siguiente consulta:

SELECT ename, deptno
FROM emp;

En el caso de que el usuario propietario de la tabla emp fuera distinto del usuario actual debe indicarse de forma prefija el esquema dueño, quedando de la siguiente forma:

SELECT ename, deptno
FROM dueño.emp;

Debe notarse que esto para efectos de un sistema no es conveniente, pues si fuese necesario mover tablas entre esquemas o bien utilizar las mismas aplicaciones en distintas bases de datos, deben actualizarse las aplicaciones, por esta razón es conveniente definir sinónimos para las tablas de tal forma que no haya que especificar el esquema dueño, salvo casos muy específicos.

WHERE

Este permite filtrar las filas seleccionadas, por medio de una condición, que define el criterio de selección. El formato de la condición es la mayoría de los casos: expresión operador expresión.

Las expresiones pueden ser constantes, operaciones aritméticas, valores nulos o el nombre de una columna. Mientras que los operadores de comparación son los siguientes:


 Operadores Comparación

 =, >, <, >=, <=, !=, <>

 IN, NOT IN, BETWEEN, NOT BETWEEN

 LIKE

 IS NULL, IS NOT NULL


Se pueden construir condiciones múltiples basados en los operadores lógicos AND, OR y NOT. También se pueden utilizar los paréntesis para establecer el orden de precedencia. Algunos ejemplos de cláusulas WHERE son:

WHERE job = 'SALESMAN'
WHERE sal >= 500
AND hiredate < TO_DATE ( '01-01-1990', 'DD-MM-YYYY' )
WHERE mgr IS NULL
  AND (
       ( sal > 500 ) OR
       ( job = 'SALESMAN' AND comm >= 20 )
     )
ORDER BY

Este especifica un criterio de clasificación del resultado de la consulta, ASC especifica orden ascendente (este es el valor por defecto) y DESC, descendente. Por ejemplo,

SELECT *
FROM dept
ORDER BY dname

Se pueden situar varios criterios, siendo la precedencia de izquierda a derecha.

ALL

Esta es la opción para recuperar todas las filas de la consulta, aunque se encuentre repetidas. Es la opción por defecto.

DISTINCT

Sólo recupera las filas que son distintas. Si se consultamos los departamentos de la tabla de empleados, el resultado serían los números de departamento de existentes:

SELECT deptno
FROM emp

En este caso aparecen todos los departamentos de los empleados, aunque el número de departamento se repita entre filas. Para eliminar los repetidos se puede hacer de la siguiente forma:

SELECT DISTINCT deptno
FROM emp

Alias para tablas

En la cláusula FROM pueden utilizarse alias para distinguir o abreviar el nombre de las tablas y así referenciar las columnas en las demás secciones del SELECT.

SELECT cust.name, cust.address, cust.city
FROM customer cust;

Este ejemplo presenta un uso sencillo y pareciera no ser importante, sin embargo su mayor uso se da cuando se necesitan diferenciar columnas con idénticos nombre, entre distintas tablas.
En el caso del WHERE se utiliza para crear el criterio de selección del grupo y hacer las uniones entre tablas.

SELECT DISTINCT city, state
FROM addresses
WHERE state IN ('CA','NY','CT')
  AND city IS NOT NULL;
Alias para columnas

Este se utiliza para la presentación de los encabezados en las consultas, de tal forma que no aparezca el nombre físico de la columna, sino el que nosotros deseemos. Por ejemplo:

SELECT d.dname "Nombre Departamento",
       d.deptno "Número Departamento"
FROM dept d
Operadores aritméticos

Estos son utilizados para formar expresiones con constantes, valores de columnas y funciones de valores de columnas. Estos son los conocidos: +, -, * y /.
Por ejemplo:

SELECT ename, sal, comm, sal + comm "sal total"
FROM emp
WHERE comm > 0
ORDER BY ename
Operadores de comparación y lógicos

A continuación se listan dichos operadores

 Operadores de Comparación

 Operador

 Función

 =

 Igual a

 >

 Mayor que

 >=

 Mayor o igual que

 <

 Menor que

 <=

 Menor o igual que

 != <>

 Distinto de



Operadores Lógicos
Operador Función
AND TRUE si ambas condiciones son TRUE
OR TRUE si una de ambas condiciones es TRUE
NOT TRUE si la condición es FALSE y FALSE si la condición es TRUE.
Operadores de comparación de hileras

Para comparar hileras podemos hacer uso del igual (=). Así podemos ubicar dentro de los empleados aquellos que sean jefes:

SELECT *
FROM emp
WHERE job = 'MANAGER'
Sin embargo, este operador no nos sirve si lo que deseamos es listar los empleados cuyo nombre inicie con la letra 'E', en cuyo caso podemos utilizar el operador LIKE, el cual permite incluir los siguientes caracteres especiales:

'%' Comodín: representa cualquier cadena de 0 o más caracteres.
'_' Marcador de posición: representa un carácter cualquiera.
Se pueden utilizar de la siguiente manera:

SELECT *
FROM emp
WHERE ename LIKE 'E%'
Comprobaciones con conjuntos

Tenemos, además de las operaciones binarias ya vistas, otras que comparar los datos contra una lista.
De esta forma el IN se puede utilizar para verificar si una expresión pertenece o no a un conjunto de valores. Su forma general es

expresión [NOT] IN (lista de valores separados por coma)

Ejemplos de utilización del IN pueden ser los siguientes:

SELECT *
FROM emp
WHERE deptno IN ( 10, 20 );
SELECT ename
FROM emp
WHERE job IN ( 'CLERK', 'SALESMAN' )

Otra opción puede ser el verificar si una expresión se encuentra o no en un rango específico, esto por medio del BETWEEN, cuyo formato es:

Expresión [NOT] BETWEEN valor_inicial AND valor_final

Ejemplo de su utilización:

SELECT ename, sal
FROM emp
WHERE sal BETWEEN 200 AND 500;

Nota: Puede observarse que ambas cláusulas pueden sustituirse por expresiones que utilicen el OR y AND. En caso del IN se crean n comparaciones de la expresión contra el conjunto de valores, unidas mediante ORs. Para el BETWEEN se pueden hacer dos comparaciones con el mayor-igual y menor-igual, y la expresión, estas unidas por un AND.

Agrupación de elemento GROUP BY y HAVING

Existen algunas funciones que permiten obtener resultados sobre un conjunto de datos, como puede ser el tener el total, promedio, máximo, etc., de una columna. Por ejemplo, podemos obtener el salario promedio de los empleados de la compañía:

SELECT AVG(sal)
FROM emp

A pesar de que aquí la totalidad de los empleados se manejan como un grupo, puede ser necesario trabajar sobre grupos más pequeños o determinados. Este podría ser el caso que querer tener el salario promedio por departamento:

SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno

Es importante hacer notar que en el group by deben de incorporarse aquellas columnas del select que no son funciones de agrupamiento o constantes.
El uso de having sirve para expresar condiciones sobre las agrupaciones, de tal forma que podemos escoger que grupos se despliegan. De esta forma podemos limitar la consulta ya vista solo para los departamentos que tengan más de 3 empleados:

SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno
HAVING COUNT(*) > 3

El having a pesar de funcionar de forma similar al where, solo puede referenciar columnas definas en el grupo o funciones de grupo.

Para conocer sus tablas y vistas

Es importante familiarizarse con el esquema de la base de datos, principalmente conocer las estructuras que nos permiten conocer la definición de nuestros esquemas.
Por ejemplo existen vistas que indican el nombre de las tablas, en este caso la vista dictionary nos muestra las tablas de la base de datos junto con sus comentarios.

SELECT table_name
FROM dictionary
ORDER BY table_name;
Otras tablas interesantes son all_tables, all_columns, all_views y all_constraints.

Para visualizar el nombre de las columnas que componen una tabla se utiliza la instrucción "DESC nombre_tabla". El DESC viene de DESCribe, en este caso la abreviación es la más utilizada.
Otra vista muy utilizada es el cat, que muestra los objetos como tablas, secuencias y vistas propios del usuario que está conectado.

Uniones entre tablas

Esta operación de combinar las tablas incluidas en la cláusula FROM, es en la mayoría de los casos sencilla, sin embargo el no hacerlo bien puede provocar problemas de rendimiento. Debe considerarse que en una unión (join) no deben de haber demasiadas tablas juntas, pues quizás implique un mal diseño y la denormalización sea una salida para mejorar el rendimiento.

SELECT d.dname,
       e.ename,
       e.hiredate
FROM emp e, dept d
WHERE d.deptno = e.deptno
ORDER BY d.dname,e.ename;

Ahora agregamos el nombre del jefe del empleado a la misma consulta.

SELECT d.dname,
       e.ename,
       e.hiredate,
       m.dname manager
FROM emp e, emp m, dept d
WHERE d.deptno = e.deptno
  AND m.empno = e.mgr
ORDER BY d.dname,e.ename;

En este caso para la salida se utilizó un alias para el nombre jefe "manager".

Recuerde no crear productos cartesianos

Recuerde que esto sucede cuando dos o más tablas incluidas en el FROM no tiene la estructura adecuada en la cláusula WHERE. Por ejemplo:

SELECT X.dname,
       Z.ename
FROM emp Z,
     dept X
ORDER BY X.dname, Z.ename;
En este caso si emp tiene 10 empleado y departamento 3 departamentos, la consulta retornará 30 filas. Esto es por cada nombre departamento se listan todos los empleados sin importar el departamento. Es entonces necesario para agregar la cláusula WHERE X.deptno = Z.deptno, para que el resultado sea el deseado, o sea 10 filas.

Outer Joins

Cuando se habla de utilizar outer join, quiere decir que se pueden seleccionar filas de una tabla aunque no existan correspondientes en la otra tabla. Para ello se utiliza el símbolo (+):

SELECT d.dname,
       e.ename
FROM emp e,
     dept d,
WHERE d.deptno(+) = e.deptno
ORDER BY d.dname,e.ename

En un caso hipotético, el presidente de la compañía nunca fue asignado a un departamento, por que nunca hubiese sido obtenido en las consultas anteriores, dado que el número de departamento está nulo. El outer join hace que todos los registros de la tabla de empleados sean obtenidos, por lo cual las columnas de la tabla de departamentos quedan vacías (en este caso el nombre del departamento).

Subconsultas (subqueries)

Las subconsultas o consultas anidadas (nested), son utilizadas partiendo de una liga con la consulta padre. Dependiendo como se cree la subconsulta, ella puede ser una vez para consulta padre o bien una vez para cada registro retornado por la consulta padre, en este caso esta es una consulta correlacionada.
Una consulta correlacionada se identifica fácilmente si ella contiene referencias a columnas de la consulta padre en la cláusula WHERE. Véase que las columnas de la subconsulta no pueden ser referenciadas por la consulta padre.

SELECT e.ename,
       e.job
FROM emp e
WHERE e.deptno IN (SELECT deptno
                   FROM dept
                   WHERE dname = 'ADMIN');

El anterior es un ejemplo de una consulta no correlacionada. En este caso se buscan los empleados que estén en departamento ADMIN. El uso del IN es para indicar si está contenido (puede combinarse con el NOT), y es utilizado cuando la subconsulta devuelve cero, uno o más registros. Si se utilizará el operador de igualdad (=), se asume que solo una fila es retornada. Si la subconsulta no devuelve ninguna columna o más de una se daría un error Oracle.
Además véase que consulta podría escribirse directamente con un join. Por lo que las subconsultas son utilizadas generalmente por criterios de rendimiento o porque los joins no dan la posibilidad de construir la consulta.

SELECT d.dname,
       e.ename,
       e.job
FROM emp e,
     dept d
WHERE e.deptno = d.deptno
  AND e.empno IN (SELECT repid
                 FROM customer
                 WHERE repid = e.empno)
ORDER BY d.dname, e.ename

En este caso solo los empleados que tengan al menos un cliente son tomados en cuenta. Véase que esta es una subconsulta correlacionada, pues referencia a una columna de la consulta padre dentro de ella.

SELECT d.dname,
       e.ename,
       e.job
FROM emp e,
     dept d
WHERE e.deptno = d.deptno
  AND NOT EXISTS (SELECT 'X'
                 FROM customer
                 WHERE city in ('ROCHESTER','NEW YORK')
                   AND repid = e.empno)
ORDER BY d.dname, e.job, e.ename;

En este caso se muestran todos los empleados y departamentos, excepto aquellos departamentos que tengan clientes que se ubiquen en 'ROCHESTER' y 'NEW YORK'. SELECT 'X' será retornado y para evaluado por el NOT EXISTS (cuando no encuentre filas en la subconsulta es falso y cuando encuentra al menos uno es verdadero).

Puede utilizar cualquier constante en lugar de la 'X' o bien un campo de las tablas de la subconsulta (es mejor la constante).

Funciones (Built-In Functions)

Las funciones son parte intrínseca de cualquier comando SQL. Aquí se muestra una lista de las funciones más comunes.

Nombre

Tipo

Sintaxis

Retorna

ABS

Number

ABS(n)

Valor absoluto de n.

ADD_MONTHS

Date

ADD_MONTHS(a,b)

Suma a la fecha a, b meses (b puede ser negativo).

ASCII

Character

ASCII(c)

Representación decimal de c.

AVG

Group

AVG(DISTINCT|ALL n)

Promedio del valor de n. ALL es el valor por defecto default.

CEIL

Number

CEIL(n)

Menor entero mayor o igual a n.

CHARTOROWID

Conversión

CHARTOROWID(c)

Convierte un carácter a un tipo de datos rowid.

CHR

Character

CHR(n)

Representación carácter del valor decimal n.

CONCAT

Character

CONCAT(1,2)

Carácter 1 concatenado con el 2.

CONVERT

Conversion

CONVERT(a, dest_c [,source_c])

Convierte una hilera de caracteres a de un conjunto de caracteres a otro.

COS

Number

COS(n)

Coseno de n.

COSH

Number

COSH(n)

Coseno hiperbólico de n.

COUNT

Group

COUNT(DISTINCT|ALL e)

Número de registros en una consulta. ALL es el default y e puede ser representado como * para indicar todas las columnas.

EXP

Number

EXP(n)

e elevado a la enésima potencia.

FLOOR

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

Conversión

HEXTORAW(c)

Convierte de una carácter hexadecimal a un raw.

INITCAP

Character

INITCAP(c)

c con la primer letra de cada palabra en mayúscula.

INSTR

Character

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

Busca 1 con n caracteres para la emésima ocurrencia de 2 y retorna la posición de la ocurrencia.

INSTRB

Character

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

Igual a INSTR, solo que los parámetros n y m se esperan en términos de bytes.

LAST_DAY

Date

LAST_DAY(a)

Ultimo día del mes que contiene a.

LEAST

Other

LEAST(e [,e]...)

El menor de una lista de expresiones e.

LENGTH

Character

LENGTH(c)

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

LENGTHB

Character

LENGTHB(c)

Igual que LENGTH excepto que en bytes.

LN

Number

LN(n)

Logaritmo natural de n, donde n > 0.

LOG

Number

LOG(b,n)

Logaritmo en base b de n.

LOWER

Character

LOWER(c)

c con todas las letras en minúsculas..

LPAD

Character

LPAD(1,n [,2])

La hilera 1 rellena a la izquierda hasta completar el largo n. Si el carácter 2 es indicado se usa como patrón de relleno y sino se utilizan blancos.

LTRIM

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.

MAX

Other

MAX(DISTINCT|ALL e)

Máximo de una expresión e.. ALL es el default.

MIN

Other

MIN(DISTINCT|ALL e)

Mínimo de una expresión e. ALL es el default.

MOD

Number

MOD(r,n)

Residuo de dividir r por n..

MONTHS_BETWEEN

Date

MONTHS_BETWEEN(a,b)

Número de meses entre dos fechas a y b..

NEW_TIME

Date

NEW_TIME(a, z1, z2)

Día y hora en la zona z2, cuando la fecha y hora de z1 es a.

NEXT_DAY

Date

NEXT_DAY(a, c)

Primer día de la semana identificada por c que está después de c.

NLSSORT

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 mayúscula.

NLS_LOWER

Character

NLS_LOWER(c [,parm])

c con todas las letras en minúscula

NLS_UPPER

Character

NLS_UPPER(c [,parm])

c con todas las letras en mayúscula.

NVL

Other

NVL(e1, e2)

Si e1 es nulo, retorna e2. Si e1 no es nulo retorna e1.

POWER

Number

POWER(m,n)

m elevado a la enésima potencia

RAWTOHEX

Conversión

RAWTOHEX(raw)

Convierte un valor raw a su equivalente hexadecimal.

REPLACE

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.

ROUND

Date

ROUND(n [,f])

Redondea la fecha al formato del modelo f. Si f es omitido, n será retornado para el día más cercano.

ROUND

Number

ROUND(n[,m])

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

ROWIDTOCHAR

Conversion

ROWIDTOCHAR(rowid)

Convierte de rowid a varchar2.

RPAD

Character

RPAD(1, n [, 2])

1 rellenado a la derecha con largo n y con la hilera 2.

RTRIM

Character

RTRIM(c [, s])

c con los caracteres removidos al final de la hilera.

SIGN

Number

SIGN(n)

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

SIN

Number

SIN(n)

Seno de n

SINH

Number

SINH(n)

Seno hiperbólico de n.

SOUNDEX

Character

SOUNDEX(c)

Una hilera con la representación fonética de c.

SUBSTR

Character

SUBSTR(c, m [,n])

Una porción de c, iniciando en el carácter 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.

SUBSTRB

Character

SUBSTRB(c, m [,n])

Igual que SUBSTR excepto que m y n son número de bytes.

SQRT

Number

SQRT(n)

Raíz cuadrada de n.

STDDEV

Group

STDDEV(DISTINCT|ALL n)

Desviación estándar de n.

SUM

Group

SUM(DISTINCT|ALL n)

Suma de números n.

SYSDATE

Date

SYSDATE

Fecha y hora actual.

TAN

Number

TAN(n)

Tangente de n.

TANH

Number

TANH(n)

Tangente hiperbólica de n.

TO_CHAR

Conversion

TO_CHAR(d [,f [,parm])

Convierte la fecha d a carácter con el formato f y el nls_date_language para parm.

TO_CHAR

Conversion

TO_CHAR(n [,f [,parm])

Convierte un número n a varchar2, según formato de parm.

TO_DATE

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 carácter c a un número, utilizando el formato f y el nls_number_format parm.

TO_SINGLE_BYTE

Conversion

TO_SINGLE_BYTE(c)

Convierte el carácter multibyte c a su equivalente en byte simple.

TRANSLATE

Character

TRANSLATE(c, f, t)

c con cada ocurrencia en f con cada correspondiente carácter en t.

TRUNC

Date

TRUNC(c [,f])

c con la porción de hora truncada al formato f.

TRUNC

Number

TRUNC(n[,m])

n truncado a emésimo decimal.. Si m es omitido, se toma 0.

UID

Other

UID

Un entero que en forma única identifica al usuario.

USER

Other

USER

Usuario actual como varchar2.

UPPER

Character

UPPER(c)

c con las letras en mayúscula.

VARIANCE

Group

VARIANCE(DISTINCT|ALL n)

Varianza de n.

VSIZE

Other

VSIZE(e)

Número de bytes que necesita la representación interna de e.

Algunos ejemplos utilizando funciones.

SELECT SUBSTR(address,1,20),
city
FROM customer
WHERE address IS NOT NULL
  AND UPPER(city) = 'ROCHESTER'

Véase que UPPER hacer que al convertir a mayúscula 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. Véase 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 más importantes. El DECODE tiene la siguiente sintaxis:

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

DECODE primero evalúa el valor o expresión val, y compara con exp1. Si val es igual exp1, la expresión exp2 es retornada. Si val no es igual a exp1, la expresión exp3 será evaluada y retorna la expresión exp4 si val es igual a exp3. Este proceso continúa 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 serán obtenidos junto con su salario. Cuando la fila del presidente es obtenida se presentará '******' en lugar de su salario.
Véase que con la función 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 conversión automática de sal a carácter.

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 serán obtenidos, con los demás 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 según el job, pero se ajusta para que aparezca primero el presidente luego los vendedores, administradores y todos los demás. Luego del decode son ordenados por el ename.

Redacción

Anterior: Tipos de datos Volver al principal : SQL y PL/SQLSiguiente: DDL (Data Definition Language)
© 2008Powered by NIDAVAL