Cons SQL

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 16

Entregar 17 consultas con evidencias funcionales así:

3 consultas con funciones de fecha

4 consultas con funciones de carácter

3 consultas con funciones de numero

3 consultas anidando funciones

3 consultas usado WHEN

 1 Consulta que muestre la edad de una persona usando su fecha de


nacimiento

or ejemplo, para ordenar los resultados de forma ascendente por ciudad, y los que
sean de la misma ciudad de forma descendente por nombre, utilizaríamos esta
cláusula de ordenación:
… ORDER BY Ciudad, Nombre DESC …

Como a la columna Ciudad no le hemos puesto ASC o DESC se usará para la misma


el valor predeterminado (que es ASC)

OJO: Aunque al principio si aún no se está habituado, pueda dar la impresión de


que se ordena por ambas columnas en orden descendente. Si es eso lo que
queremos deberemos escribir … ORDER BY Ciudad DESC, Nombre DESC …

Algunos ejemplos
Para terminar este repaso a las consultas simples  practicarlas un poco, veamos
algunos ejemplos con la base de datos Northwind en SQL Server:

- Mostrar todos los datos de los Clientes de nuestra empresa:


SELECT * FROM Customers

- Mostrar apellido, ciudad y región (LastName, city, region) de los empleados de


USA (nótese el uso de AS para darle el nombre en español a los campos devueltos):
SELECT E.LastName AS Apellido, City AS Ciudad, Region
FROM Employees AS E

WHERE Country = ‘USA’

- Mostrar los clientes que no sabemos a qué región pertenecen (o sea, que no
tienen asociada ninguna región) :
SELECT * FROM Customers WHERE Region IS NULL

- Mostrar las distintas regiones de las que tenemos algún cliente, accediendo sólo a
la tabla de clientes:
SELECT DISTINCT Region FROM Customers WHERE Region IS NOT NULL

- Mostrar los clientes que pertenecen a las regiones CA, MT o WA, ordenados por
región ascendentemente y por nombre descendentemente.
CODE SELECT * FROM Customers WHERE Region IN(‘CA’, ‘MT’, ‘WA’)

ORDER BY Region, CompanyName DESC

- Mostrar los clientes cuyo nombre empieza por la letra “W”:


SELECT * FROM Customers WHERE CompanyName LIKE ‘W%’

- Mostrar los empleados cuyo código está entre el 2 y el 9:


SELECT * FROM Employees WHERE EmployeeID BETWEEN 2 AND 9

- Mostrar los clientes cuya dirección contenga “ki”:


SELECT * FROM Customers WHERE Address LIKE ‘%ki%’

Aprende los fundamentos de SQL paso a paso y se te abrirá un mundo nuevo lleno


de posibilidades. »

- Mostrar las Ventas del producto 65 con cantidades entre 5 y 10, o que no tengan
descuento:
SELECT * FROM [Order Details] WHERE (ProductID = 65 AND Quantity BETWEEN
5 AND 10) OR Discount = 0
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

 Función
 Operador
 =  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
TRUE si una de ambas condiciones es
OR
TRUE
TRUE si la condición es FALSE y FALSE
NOT
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.

Tipo Sintaxis Retorna


Nombre
ABS Number ABS(n) Valor absoluto de n.
Suma a la fecha a, b meses
ADD_MONTHS Date ADD_MONTHS(a,b)
(b puede ser negativo).
Representación decimal de
ASCII Character ASCII(c)
c.
Promedio del valor de n. ALL
AVG Group AVG(DISTINCT|ALL n) es el valor por defecto
default.
Menor entero mayor o igual
CEIL Number CEIL(n)
a n.
Convierte un carácter a un
CHARTOROWID Conversión CHARTOROWID(c)
tipo de datos rowid.
Representación carácter del
CHR Character CHR(n)
valor decimal n.
Carácter 1 concatenado con
CONCAT Character CONCAT(1,2)
el 2.
Convierte una hilera de
CONVERT(a, dest_c
CONVERT Conversion caracteres a de un conjunto
[,source_c])
de caracteres a otro.
COS Number COS(n) Coseno de n.
COSH Number COSH(n) Coseno hiperbólico de n.
Número de registros en una
consulta. ALL es el default y
COUNT Group COUNT(DISTINCT|ALL e) e puede ser representado
como * para indicar todas las
columnas.
e elevado a la enésima
EXP Number EXP(n)
potencia.
Mayor entero menor o igual
FLOOR Number FLOOR(n)
a n.
El mayor elemento de una
GREATEST Other GREATEST(e [,e]...)
lista de expresiones e.
Convierte de una carácter
HEXTORAW Conversión HEXTORAW(c)
hexadecimal a un raw.
c con la primer letra de cada
INITCAP Character INITCAP(c)
palabra en mayúscula.
Busca 1 con n caracteres
para la emésima ocurrencia
INSTR Character INSTR(1, 2 [, n [, m]])
de 2 y retorna la posición de
la ocurrencia.
Igual a INSTR, solo que los
INSTRB Character INSTRB(1,2[,n[,m]]) parámetros n y m se esperan
en términos de bytes.
Ultimo día del mes que
LAST_DAY Date LAST_DAY(a)
contiene a.
El menor de una lista de
LEAST Other LEAST(e [,e]...)
expresiones e.
Número de caracteres en c.
Si c es un tipo de datos de
LENGTH Character LENGTH(c)
largo fijo, todos los blancos
son incluidos.
Igual que LENGTH excepto
LENGTHB Character LENGTHB(c)
que en bytes.
Logaritmo natural de n,
LN Number LN(n)
donde n > 0.
LOG Number LOG(b,n) Logaritmo en base b de n.
c con todas las letras en
LOWER Character LOWER(c)
minúsculas..
La hilera 1 rellena a la
izquierda hasta completar el
largo n. Si el carácter 2 es
LPAD Character LPAD(1,n [,2])
indicado se usa como patrón
de relleno y sino se utilizan
blancos.
Remueve caracteres a la
izquierda de c. Si el conjunto
s es definido, remueve los
LTRIM Character LTRIM(c [,set])
caracteres iniciales hasta
que no aparezca el conjunto
set.
Máximo de una expresión e..
MAX Other MAX(DISTINCT|ALL e)
ALL es el default.
Mínimo de una expresión e.
MIN Other MIN(DISTINCT|ALL e)
ALL es el default.
MOD Number MOD(r,n) Residuo de dividir r por n..
Número de meses entre dos
MONTHS_BETWEEN Date MONTHS_BETWEEN(a,b)
fechas a y b..
Día y hora en la zona z2,
NEW_TIME Date NEW_TIME(a, z1, z2) cuando la fecha y hora de z1
es a.
Primer día de la semana
NEXT_DAY Date NEXT_DAY(a, c) identificada por c que está
después de c.
Hilera de bytes para ordenar
NLSSORT Character NLSSORT((c [,parm])
c.
c con la primer letra de cada
NLS_INITCAP Character NLS_INITCAP(c [,parm])
palabra en mayúscula.
c con todas las letras en
NLS_LOWER Character NLS_LOWER(c [,parm])
minúscula
c con todas las letras en
NLS_UPPER Character NLS_UPPER(c [,parm])
mayúscula.
Si e1 es nulo, retorna e2. Si
NVL Other NVL(e1, e2)
e1 no es nulo retorna e1.
m elevado a la enésima
POWER Number POWER(m,n)
potencia
Convierte un valor raw a su
RAWTOHEX Conversión RAWTOHEX(raw)
equivalente hexadecimal.
Remplaza cada ocurrencia
de la hilera s1 en c con r2. Si
REPLACE Character REPLACE(c, s1 [, r2])
r2 se omite las ocurrencias
de r1 son borradas.
Redondea la fecha al
formato del modelo f. Si f es
ROUND Date ROUND(n [,f])
omitido, n será retornado
para el día más cercano.
n redondeado a m. Si m
ROUND Number ROUND(n[,m]) está, es redondeado a m
lugares.
Convierte de rowid a
ROWIDTOCHAR Conversion ROWIDTOCHAR(rowid)
varchar2.
1 rellenado a la derecha con
RPAD Character RPAD(1, n [, 2])
largo n y con la hilera 2.
c con los caracteres
RTRIM Character RTRIM(c [, s]) removidos al final de la
hilera.
-1 if n < 0, 0 if n = 0, 1 if n >
SIGN Number SIGN(n)
0.
SIN Number SIN(n) Seno de n
SINH Number SINH(n) Seno hiperbólico de n.
Una hilera con la
SOUNDEX Character SOUNDEX(c)
representación fonética de c.
Una porción de c, iniciando
en el carácter m por n
caracteres. Si m es negativo
se cuentan los espacios a
SUBSTR Character SUBSTR(c, m [,n])
partir del final. Si n es
omitido, son retornados
todos los caracteres hasta el
final de c.
Igual que SUBSTR excepto
SUBSTRB Character SUBSTRB(c, m [,n]) 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.
Convierte la fecha d a
carácter con el formato f y el
TO_CHAR Conversion TO_CHAR(d [,f [,parm])
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.
Convierte un varchar2 c a un
TO_DATE Conversion TO_DATE(c [, f [, parm]) tipo fecha, con el formato f y
nls_date_formate parm.
Convierte c a su equivalente
TO_MULTI_BYTE Conversion TO_MULTI_BYTE(c)
en multibyte.
Convierte el carácter c a un
número, utilizando el formato
TO_NUMBER Conversion TO_NUMBER(c [,f [, parm]])
f y el nls_number_format
parm.
Convierte el carácter
TO_SINGLE_BYTE Conversion TO_SINGLE_BYTE(c) multibyte c a su equivalente
en byte simple.
c con cada ocurrencia en f
TRANSLATE Character TRANSLATE(c, f, t) con cada correspondiente
carácter en t.
c con la porción de hora
TRUNC Date TRUNC(c [,f])
truncada al formato f.
n truncado a emésimo
TRUNC Number TRUNC(n[,m]) decimal.. Si m es omitido, se
toma 0.
Un entero que en forma
UID Other UID
única identifica al usuario.
Usuario actual como
USER Other USER
varchar2.
c con las letras en
UPPER Character UPPER(c)
mayúscula.
VARIANCE Group VARIANCE(DISTINCT|ALL n) Varianza de n.
Número de bytes que
VSIZE Other VSIZE(e) 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.

SELECT *FROM EMPLOYEES;

SELECT FIRST_NAME,SALARY
FROM employees
where salary > (SELECT salary
from employees
where employee_id = 103);

--los que tienen un salario superior al


--salario del empledo con codigo 103
--y fecha de ingreso inferior a la fecha de ingreso
--del empleado en mencion

SELECT FIRST_NAME,SALARY
FROM employees
where salary > (SELECT salary
from employees
where employee_id = 103)
and hire_date < (SELECT hire_date
from employees
where employee_id= 103);
--funcioens de grupo
SELECT FIRST_NAME,SALARY
FROM employees
where salary > (SELECT ROUND(AVG(salary)) FROM employees);

--CON HAVING
select *from employees;

--probar el having con suma y promedio


SELECT department_id, ROUND(AVG(salary))
FROM employees
group by department_id
HAVING SUM(SALARY) > (
SELECT ROUND(AVG(salary))
FROM employees
);

--subconsultas con ANY


--como m�nimo,
--uno de los valores de la lista devuelta por la subconsulta.
SELECT first_name, last_name, salary
FROM employees
WHERE salary > ANY (select salary
FROM employees
WHERE salary <2500);

SELECT employee_id,first_name, last_name, salary


FROM employees
WHERE salary > ALL
(SELECT ROUND(avg(salary))
from employees
group by department_id);
--prueba
SELect employee_id, salary from employees
WHERE employee_id=100;

--contraprueba no eficienete con respecto a la anterior

SELECT employee_id,first_name, last_name, salary


FROM employees
WHERE salary = (SELECT salary from employees
WHERE employee_id=100);

SELECT CEIL(AVG(salary)
from employees

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy