Sunteți pe pagina 1din 18

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 condicin] [GROUP BY col, col, ...] [HAVING condicin] [ORDER BY col [DESC|ASC] [, col [DESC|ASC] ...]]; Donde expre_colum puede ser un a columna de tabla, una constante, una expresin ar itmtica, una funcin o varias funciones anidadas. Es importante hacer notar que cada comando SQL finaliza con punto y coma(;). Cua ndo se escriben scripts, estos utilizarn un slash (/) al final del comando. FROM Especifica la tabla o lista de tablas de las que se recuperarn los datos. Por eje mplo para obtener los datos del nombre y departamento de los empleados de la emp resa, 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 usua rio actual debe indicarse de forma prefija el esquema dueo, quedando de la siguie nte forma: SELECT ename, deptno FROM dueo.emp; Debe notarse que esto para efectos de un sistema no es conveniente, pues si fues e necesario mover tablas entre esquemas o bien utilizar las mismas aplicaciones en distintas bases de datos, deben actualizarse las aplicaciones, por esta razn e s conveniente definir sinnimos para las tablas de tal forma que no haya que espec ificar el esquema dueo, salvo casos muy especficos. WHERE Este permite filtrar las filas seleccionadas, por medio de una condicin, que defi ne el criterio de seleccin. El formato de la condicin es la mayora de los casos: ex presin operador expresin. Las expresiones pueden ser constantes, operaciones aritmticas, valores nulos o el nombre de una columna. Mientras que los operadores de comparacin son los siguien tes: Operadores Comparacin =, >, <, >=, <=, !=, <> IN, NOT IN, BETWEEN, NOT BETWEEN LIKE IS NULL, IS NOT NULL

Se pueden construir condiciones mltiples basados en los operadores lgicos AND, OR y NOT. Tambin se pueden utilizar los parntesis para establecer el orden de precede ncia. Algunos ejemplos de clusulas 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 clasificacin del resultado de la consulta, ASC esp ecifica 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 opcin para recuperar todas las filas de la consulta, aunque se encuent re repetidas. Es la opcin por defecto. DISTINCT Slo recupera las filas que son distintas. Si se consultamos los departamentos de la tabla de empleados, el resultado seran los nmeros de departamento de existentes : SELECT deptno FROM emp En este caso aparecen todos los departamentos de los empleados, aunque el nmero d e 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 clusula FROM pueden utilizarse alias para distinguir o abreviar el nombre d e las tablas y as referenciar las columnas en las dems 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 idnticos nombre, entre distintas tablas. En el caso del WHERE se utiliza para crear el criterio de seleccin del grupo y ha cer 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 presentacin de los encabezados en las consultas, de tal f orma que no aparezca el nombre fsico de la columna, sino el que nosotros deseemos

. Por ejemplo: SELECT d.dname "Nombre Departamento", d.deptno "Nmero Departamento" FROM dept d Operadores aritmticos 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 comparacin y lgicos A continuacin se listan dichos operadores Operadores de Comparacin Operador Funcin = Igual a > Mayor que >= Mayor o igual que < Menor que <= Menor o igual que != <> Distinto de

Operadores Lgicos Operador Funcin AND TRUE si ambas condiciones son TRUE OR TRUE si una de ambas condiciones es TRUE NOT TRUE si la condicin es FALSE y FALSE si la condicin es TRUE. Operadores de comparacin de hileras Para comparar hileras podemos hacer uso del igual (=). As podemos ubicar dentro d e 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 emplead os cuyo nombre inicie con la letra 'E', en cuyo caso podemos utilizar el operado r LIKE, el cual permite incluir los siguientes caracteres especiales: '%' Comodn: representa cualquier cadena de 0 o ms caracteres. '_' Marcador de posicin: representa un carcter cualquiera. Se pueden utilizar de la siguiente manera: SELECT * FROM emp WHERE ename LIKE 'E%' Comprobaciones con conjuntos Tenemos, adems de las operaciones binarias ya vistas, otras que comparar los dato s contra una lista. De esta forma el IN se puede utilizar para verificar si una expresin pertenece o no a un conjunto de valores. Su forma general es expresin [NOT] IN (lista de valores separados por coma) Ejemplos de utilizacin del IN pueden ser los siguientes: SELECT * FROM emp WHERE deptno IN ( 10, 20 ); SELECT ename FROM emp WHERE job IN ( 'CLERK', 'SALESMAN' ) Otra opcin puede ser el verificar si una expresin se encuentra o no en un rango es pecfico, esto por medio del BETWEEN, cuyo formato es: Expresin [NOT] BETWEEN valor_inicial AND valor_final Ejemplo de su utilizacin: SELECT ename, sal FROM emp WHERE sal BETWEEN 200 AND 500; Nota: Puede observarse que ambas clusulas pueden sustituirse por expresiones que utilicen el OR y AND. En caso del IN se crean n comparaciones de la expresin cont ra el conjunto de valores, unidas mediante ORs. Para el BETWEEN se pueden hacer dos comparaciones con el mayor-igual y menor-igual, y la expresin, estas unidas p or un AND. Agrupacin de elemento GROUP BY y HAVING Existen algunas funciones que permiten obtener resultados sobre un conjunto de d atos, como puede ser el tener el total, promedio, mximo, etc., de una columna. Po r ejemplo, podemos obtener el salario promedio de los empleados de la compaa: 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 ms pequeos o determinados. Este podra ser el ca so 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 colu mnas 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 limita r la consulta ya vista solo para los departamentos que tengan ms 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 definicin de nuestros esquema s. 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 coment arios. SELECT table_name FROM dictionary ORDER BY table_name; Otras tablas interesantes son all_tables, all_columns, all_views y all_constrain ts. Para visualizar el nombre de las columnas que componen una tabla se utiliza la i nstruccin "DESC nombre_tabla". El DESC viene de DESCribe, en este caso la abrevia cin es la ms utilizada. Otra vista muy utilizada es el cat, que muestra los objetos como tablas, secuenc ias y vistas propios del usuario que est conectado. Uniones entre tablas Esta operacin de combinar las tablas incluidas en la clusula FROM, es en la mayora de los casos sencilla, sin embargo el no hacerlo bien puede provocar problemas d e rendimiento. Debe considerarse que en una unin (join) no deben de haber demasia das tablas juntas, pues quizs implique un mal diseo y la denormalizacin sea una sal ida 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 ms tablas incluidas en el FROM no tiene la estructura adecuada en la clusula 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 consult a retornar 30 filas. Esto es por cada nombre departamento se listan todos los emp leados sin importar el departamento. Es entonces necesario para agregar la clusul a WHERE X.deptno = Z.deptno, para que el resultado sea el deseado, o sea 10 fila s. Outer Joins Cuando se habla de utilizar outer join, quiere decir que se pueden seleccionar f ilas de una tabla aunque no existan correspondientes en la otra tabla. Para ello se utiliza el smbolo (+): SELECT d.dname, e.ename FROM emp e, dept d, WHERE d.deptno(+) = e.deptno ORDER BY d.dname,e.ename En un caso hipottico, el presidente de la compaa nunca fue asignado a un departamen to, por que nunca hubiese sido obtenido en las consultas anteriores, dado que el nmero 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 depar tamentos quedan vacas (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 fcilmente si ella contiene referencias a columnas de la consulta padre en la clusula WHERE. Vase que las columnas de la s ubconsulta 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 bus can los empleados que estn en departamento ADMIN. El uso del IN es para indicar s i est contenido (puede combinarse con el NOT), y es utilizado cuando la subconsul ta devuelve cero, uno o ms registros. Si se utilizar el operador de igualdad (=), se asume que solo una fila es retornada. Si la subconsulta no devuelve ninguna c olumna o ms de una se dara un error Oracle. Adems vase que consulta podra escribirse directamente con un join. Por lo que las s ubconsultas son utilizadas generalmente por criterios de rendimiento o porque lo s 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 cu enta. Vase que esta es una subconsulta correlacionada, pues referencia a una colu mna 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 d epartamentos que tengan clientes que se ubiquen en 'ROCHESTER' y 'NEW YORK'. SEL ECT 'X' ser retornado y para evaluado por el NOT EXISTS (cuando no encuentre fila s 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 tab las de la subconsulta (es mejor la constante). Funciones (Built-In Functions) Las funciones son parte intrnseca de cualquier comando SQL. Aqu se muestra una lis ta de las funciones ms 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) Representacin 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 Conversin CHARTOROWID(c) Convierte un carcter a un tipo de datos rowid. CHR Character CHR(n) Representacin carcter del valor decimal n. CONCAT Character CONCAT(1,2) Carcter 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 hiperblico de n. COUNT 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. EXP Number EXP(n) e elevado a la ensima 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 Conversin HEXTORAW(c) Convierte de una carcter hexadecimal a un raw. INITCAP Character INITCAP(c) c con la primer letra de cada palabra en mayscula. INSTR Character INSTR(1, 2 [, n [, m]]) Busca 1 con n caracteres para la emsima ocurrencia de 2 y retorna la posicin de la

ocurrencia. INSTRB Character INSTRB(1,2[,n[,m]]) Igual a INSTR, solo que los parmetros n y m se esperan en trminos de bytes. LAST_DAY Date LAST_DAY(a) Ultimo da del mes que contiene a. LEAST Other LEAST(e [,e]...) El menor de una lista de expresiones e. LENGTH Character LENGTH(c) Nmero de caracteres en c. Si c es un tipo de datos de largo fijo, todos los blanc os 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 minsculas.. LPAD Character 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. LTRIM Character LTRIM(c [,set]) Remueve caracteres a la izquierda de c. Si el conjunto s es definido, remueve lo s caracteres iniciales hasta que no aparezca el conjunto set. MAX Other MAX(DISTINCT|ALL e) Mximo de una expresin e.. ALL es el default. MIN Other MIN(DISTINCT|ALL e) Mnimo de una expresin e. ALL es el default. MOD 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. 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 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. 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 ensima potencia

RAWTOHEX Conversin 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 ocurren cias 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 da ms 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 hiperblico de n. SOUNDEX Character SOUNDEX(c) Una hilera con la representacin fontica de c. SUBSTR Character SUBSTR(c, m [,n]) Una porcin de c, iniciando en el carcter m por n caracteres. Si m es negativo se c uentan los espacios a partir del final. Si n es omitido, son retornados todos lo s caracteres hasta el final de c. SUBSTRB Character SUBSTRB(c, m [,n]) Igual que SUBSTR excepto que m y n son nmero de bytes. SQRT Number SQRT(n) Raz cuadrada de n. STDDEV Group

STDDEV(DISTINCT|ALL n) Desviacin estndar de n. SUM Group SUM(DISTINCT|ALL n) Suma de nmeros n. SYSDATE Date SYSDATE Fecha y hora actual. TAN Number TAN(n) Tangente de n. TANH 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. TO_DATE Conversion TO_DATE(c [, f [, parm]) Convierte un varchar2 c a un tipo fecha, con el formato f y nls_date_formate par

m. 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 Character TRANSLATE(c, f, t) c con cada ocurrencia en f con cada correspondiente carcter en t. TRUNC Date TRUNC(c [,f]) c con la porcin de hora truncada al formato f. TRUNC Number TRUNC(n[,m]) n truncado a emsimo 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 mayscula. VARIANCE Group VARIANCE(DISTINCT|ALL n) Varianza de n. VSIZE 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 s er evaluada y retorna la expresin exp4 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 salar io. Cuando la fila del presidente es obtenida se presentar '******' en lugar de s u salario. Vase que con la funcin NVL para evaluar el manager_id. En este caso solo el presid ente 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 con versin 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' s e muestra el salario de todos excepto del presidente, si el usuario es el presid ente 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 todo s los dems. Luego del decode son ordenados por el ename. Redaccin

S-ar putea să vă placă și