Beruflich Dokumente
Kultur Dokumente
Gustavo Coronel
gcoronelc@gmail.com
gcoronelc.blogspot.com
Instalacin
Verificar los servicios instalados
iSQL*Plus
SQL Developer
Esquemas Ejemplo
SCOTT: Modelo muy bsico de recursos humanos.
HR: Modelo bsico de recursos humanos
OE: Modelo de pedidos
Esquema SCOTT
SQL> connect / as sysdba
Conectado.
SQL> alter user scott account unlock;
Usuario modificado.
SQL> connect scott/tiger
ERROR:
ORA-28001: the password has expired
Cambiando la contrasea para scott
Contrasea nueva: tiger
Confirmar contrasea nueva: tiger
Contrasea cambiada
Conectado.
SQL> select * from tab;
TNAME
TABTYPE CLUSTERID
------------------------------ ------- ---------DEPT
TABLE
EMP
TABLE
BONUS
TABLE
SALGRADE
TABLE
Esquema HR
SQL> connect / as sysdba
Conectado.
SQL> alter user hr
2 identified by hr
3 account unlock;
Usuario modificado.
SQL> connect hr/hr
Conectado.
SQL> select * from cat;
TABLE_NAME
TABLE_TYPE
------------------------------ -----------
REGIONS
COUNTRIES
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
LOCATIONS_SEQ
DEPARTMENTS_SEQ
EMPLOYEES_SEQ
EMP_DETAILS_VIEW
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
SEQUENCE
SEQUENCE
SEQUENCE
VIEW
11 filas seleccionadas.
Esquema OE
Como ejercicio habiliten este esquema, con contrasea OE.
Creacin de un esquema
SQL> connect / as sysdba
Conectado.
SQL> create user uni identified by uni;
Usuario creado.
SQL> grant connect,resource to uni;
Concesin terminada correctamente.
SQL> conn uni
Introduzca la contrasea:
Conectado.
SQL> create table msg(
2
origen varchar2(15),
3
destino varchar2(15),
4
mensaje varchar2(200)
5 );
Tabla creada.
SQL> connect uni/uni@172.17.2.50:1521/orcl.world
Conectado.
SQL> insert into msg
2 values('gustavo','todos',
3 'Bienvenidos a la UNI');
1 fila creada.
SQL> column mensaje format a30
SQL> select * from msg;
ORIGEN
DESTINO
MENSAJE
SENTENCIA SELECT
Sintaxis Bsica
SELECT * | lista_columnas | expresiones
FROM nombre_tabla
WHERE condicin_filtro
Ejemplo 1
SQL> select * from scott.emp;
EMPNO ENAME
JOB
MGR HIREDATE SAL COMM DEPTNO
------ ---------- --------- ----- -------- ----- ----- -----7369 SMITH
CLERK
7902 17/12/80 800
20
7499 ALLEN
SALESMAN 7698 20/02/81 1600 300
30
7521 WARD
SALESMAN 7698 22/02/81 1250 500
30
7566 JONES
MANAGER 7839 02/04/81 2975
20
7654 MARTIN
SALESMAN 7698 28/09/81 1250 1400
30
7698 BLAKE
MANAGER 7839 01/05/81 2850
30
7782 CLARK
MANAGER 7839 09/06/81 2450
10
7788 SCOTT
ANALYST 7566 19/04/87 3000
20
7839 KING
PRESIDENT
17/11/81 5000
10
7844 TURNER
SALESMAN 7698 08/09/81 1500
0
30
7876 ADAMS
CLERK
7788 23/05/87 1100
20
7900 JAMES
CLERK
7698 03/12/81 950
30
7902 FORD
ANALYST 7566 03/12/81 3000
20
7934 MILLER
CLERK
7782 23/01/82 1300
10
14 filas seleccionadas.
Ejemplo 2
En este ejemplo estamos seleccionando las columnas a
consultar.
SQL> select empno, ename, sal from scott.emp;
EMPNO ENAME
------ ---------- ----7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
SAL
800
1600
1250
2975
1250
2850
2450
3000
7839
7844
7876
7900
7902
7934
KING
5000
TURNER
1500
ADAMS
1100
JAMES
950
FORD
3000
MILLER
1300
14 filas seleccionadas.
Ejemplo 3
En este ejemplo muestra el salario proyectado con un aumento
de 15%.
SQL> select empno, ename, sal, sal*1.15 from scott.emp;
EMPNO ENAME
SAL
------ ---------- ----- ---------7369 SMITH
800
7499 ALLEN
1600
7521 WARD
1250
7566 JONES
2975
7654 MARTIN
1250
7698 BLAKE
2850
7782 CLARK
2450
7788 SCOTT
3000
7839 KING
5000
7844 TURNER
1500
7876 ADAMS
1100
7900 JAMES
950
7902 FORD
3000
7934 MILLER
1300
SAL*1.15
920
1840
1437,5
3421,25
1437,5
3277,5
2817,5
3450
5750
1725
1265
1092,5
3450
1495
14 filas seleccionadas.
Ejemplo 4
En este ejemplo estamos cambiando el ttulo de las columnas.
SQL> select
2
empno as codigo,
3
ename as nombre,
4
sal as salario,
5
sal*1.15 as "salario proyectado"
6 from scott.emp;
CODIGO NOMBRE
SALARIO salario proyectado
---------- ---------- ---------- -----------------7369 SMITH
800
920
7499 ALLEN
1600
1840
7521 WARD
1250
1437,5
7566 JONES
2975
3421,25
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
1437,5
3277,5
2817,5
3450
5750
1725
1265
1092,5
3450
1495
14 filas seleccionadas.
Ejemplo 5
Mostrar los empleados de HR que su salario es mayor a
15,000.00.
SQL> select
2
employee_id, first_name,
3
last_name, salary
4 from hr.employees
5 where salary > 15000.0;
EMPLOYEE_ID FIRST_NAME LAST_NAME
----------- ------------ ------------ ---------100 Steven
King
24000
101 Neena
Kochhar
17000
102 Lex
De Haan
17000
SALARY
Ejemplo 6
Mostrar los empleados del departamento de ventas en el
esquema SCOTT.
Paso 1: Averiguar el cdigo de ventas.
SQL> select * from SCOTT.dept;
DEPTNO DNAME
LOC
------ -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
3 from SCOTT.emp
4 where deptno = 30;
EMPNO ENAME
DEPTNO SAL
------ ---------- ------ ----7499 ALLEN
30 1600
7521 WARD
30 1250
7654 MARTIN
30 1250
7698 BLAKE
30 2850
7844 TURNER
30 1500
7900 JAMES
30 950
6 filas seleccionadas.
Ejemplo 7
Consultar los empleados de los departamentos Ventas,
Recursos Humanos y IT. Esquema HR.
Paso 1: Consultar los cdigos de los departamentos solicitados.
SQL> select * from HR.departments;
DEPARTMENT_ID DEPARTMENT_NAME
MANAGER_ID LOCATION_ID
------------- -------------------- ---------- ----------10 Administration
200
1700
20 Marketing
201
1800
30 Purchasing
114
1700
40 Human Resources
203
2400
50 Shipping
121
1500
60 IT
103
1400
70 Public Relations
204
2700
80 Sales
145
2500
90 Executive
100
1700
100 Finance
108
1700
110 Accounting
205
1700
120 Treasury
1700
130 Corporate Tax
1700
140 Control And Credit
1700
150 Shareholder Services
1700
160 Benefits
1700
170 Manufacturing
1700
180 Construction
1700
190 Contracting
1700
200 Operations
1700
210 IT Support
1700
220 NOC
1700
230 IT Helpdesk
1700
240 Government Sales
1700
250 Retail Sales
1700
260 Recruiting
1700
270 Payroll
1700
27 filas seleccionadas.
Ejemplo 8
SQL> select
2 employee_id, first_name, last_name, department_id
3 from HR.employees
4 where department_id = 40
5 or department_id = 60
6 or department_id = 80
7 order by department_id;
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID
----------- ------------ ------------ ------------203 Susan
Mavris
40
103 Alexander Hunold
60
104 Bruce
Ernst
60
105 David
Austin
60
106 Valli
Pataballa
60
107 Diana
Lorentz
60
145 John
Russell
80
Otra alternativa:
select
employee_id, first_name, last_name, department_id
from HR.employees
where department_id IN (40 ,60,80)
order by department_id;
Otra alternativa:
select
employee_id, first_name, last_name, department_id
from HR.employees
where department_id = SOME (40 ,60,80)
order by department_id;
Otra alternativa:
select
employee_id, first_name, last_name, department_id
from HR.employees
where department_id = ANY (40 ,60,80)
order by department_id;
Ejemplo 9
Consultar los empleados cuyo salario est entre 6000 y 12000.
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
SALARY
FROM HR.EMPLOYEES
WHERE SALARY BETWEEN 6000.0 AND 12000.0
ORDER BY SALARY;
Otra alternativa:
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
SALARY
FROM HR.EMPLOYEES
WHERE SALARY >= 6000.0
AND SALARY <= 12000.0
ORDER BY SALARY;
Ejemplo 10
Consultar los empleados de HR que su nombre empieza con las
letras que estn en el rango [E,M].
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
SALARY
FROM HR.EMPLOYEES
WHERE UPPER(SUBSTR(FIRST_NAME,1,1))
BETWEEN 'E' AND 'M'
ORDER BY FIRST_NAME;
Otra alternativa
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
SALARY
FROM HR.EMPLOYEES
WHERE UPPER(SUBSTR(FIRST_NAME,1,1)) >= 'E'
and UPPER(SUBSTR(FIRST_NAME,1,1)) <= 'M'
ORDER BY FIRST_NAME;
Ejemplo 11
Consultar los empleados que ingresaron a trabajar entre el ao
1996 y 1998.
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
HIRE_DATE
FROM HR.EMPLOYEES
WHERE HIRE_DATE BETWEEN
TO_DATE('01/01/1996','DD/MM/YYYY') AND
TO_DATE('31/12/1998','DD/MM/YYYY')
ORDER BY HIRE_DATE;
Otra alternativa.
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
HIRE_DATE
FROM HR.EMPLOYEES
WHERE EXTRACT(YEAR FROM HIRE_DATE)
BETWEEN 1996 AND 1998
ORDER BY HIRE_DATE;
Otra solucin
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
HIRE_DATE
FROM HR.EMPLOYEES
WHERE EXTRACT(YEAR FROM HIRE_DATE)
IN (1996,1997,1998)
ORDER BY HIRE_DATE;
Operador LIKE
Se utiliza para construir un patrn que debe cumplir una
cadena. Se utiliza los siguientes caracteres comodines:
Porcentaje (%) Representa una cadena
Subrayado (_) Representa un carcter
Ejemplo 12
Consultar los empleados que su nombre finaliza con la letra A e
inicia con la letra L.
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME
FROM HR.EMPLOYEES
WHERE UPPER(FIRST_NAME) LIKE 'L%A'
Uso de CASE
Ejemplo 13
Desarrolle una consulta que permita evaluar el salario de los
empleados de la siguiente manera:
RANGO
CALIFICACION
[0, 1500]
MALO
<1500, 3500]
REGULAR
<3500, 7500]
BUENO
<7500, >
MUY BUENO
SELECT
EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
SALARY,
CASE
WHEN SALARY <= 1500.0 THEN 'MALO'
WHEN SALARY <= 3500.0 THEN 'REGULAR'
WHEN SALARY <= 7500.0 THEN 'BUENO'
ELSE 'MUY BUENO'
END AS CALIFICACION
FROM HR.EMPLOYEES
FUNCIONES AGREGADAS
COUNT
MAX
MIN
SUM
AVG
Ejemplo 14
Contar la cantidad de empleados en HR.
SELECT COUNT(*) AS EMPS
FROM HR.EMPLOYEES;
EMPS
---------107
SELECT COUNT(EMPLOYEE_ID) AS EMPS
FROM HR.EMPLOYEES;
EMPS
---------107
SELECT COUNT(COMMISSION_PCT) AS EMPS
FROM HR.EMPLOYEES;
EMPS
---------35
Ejemplo 15
Se necesita el listado de los departamentos que tienen
actualmente por lo menos un empleado.
Ejemplo 16
Cuantos departamentos tienen empleados.
SELECT COUNT(DISTINCT DEPARTMENT_ID) AS DEPTS
FROM HR.EMPLOYEES;
Ejemplo 17
Obtener el salario mximo y mnimo del departamento de
ventas.
select * from hr.departments;
80 Sales
select
max(salary) as sal_maximo,
min(salary) as sal_minimo
from hr.employees
where department_id = 80;
SAL_MAXIMO SAL_MINIMO
---------- ---------14000
6100
Ejemplo 18
Calcular el importe de la planilla del departamento de ventas, y
el salario promedio.
select
sum(salary) as planilla,
avg(salary) as sal_promedio
from hr.employees
where department_id = 80;
Ejemplo 19
Incluir al clculo de la planilla la comisin.
select
sum(salary * (1 + NVL(COMMISSION_PCT,0))) as planilla,
avg(salary) as sal_promedio
from hr.employees
where department_id = 80;
GROUP BY
Permite agrupar las filas que repera la sentencia SELECT, luego
a cada grupo se le aplica las funciones agregadas como COUNT,
MAX, MIN, SUM y AVG.
Como consecuencia cada grupo se resume en una sola fila,
obteniendo resmenes de datos por grupos.
Ejemplo 20
Obtener la cantidad de empleados por departamento y el
importe de la planilla.
Criterio de agrupamiento: Departamento
SELECT
DEPARTMENT_ID,
COUNT(*) AS EMPS,
SUM(SALARY) AS PLANILLA
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL
GROUP BY DEPARTMENT_ID
ORDER BY 1;
Ejemplo 21
Cuantos empleados han ingresado por ao.
SELECT
EXTRACT(YEAR FROM HIRE_DATE) AS YEAR,
COUNT(*) AS EMPS
FROM HR.EMPLOYEES
GROUP BY EXTRACT(YEAR FROM HIRE_DATE)
ORDER BY 1;
Ejemplo 22
Cuantos empleados hay por puesto de trabajo en cada
departamento.
SELECT
DEPARTMENT_ID,
JOB_ID,
COUNT(*) AS EMPS
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL
GROUP BY DEPARTMENT_ID, JOB_ID
ORDER BY 1;
Ejemplo 23
Se necesita una consulta para averiguar que departamentos
tienen una planilla superior a 50,000.00.
SELECT
DEPARTMENT_ID,
COUNT(*) AS EMPS,
SUM(SALARY) AS PLANILLA
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL
GROUP BY DEPARTMENT_ID
HAVING SUM(SALARY) > 50000.0
ORDER BY 1;
DEPARTMENT_ID
EMPS PLANILLA
------------- ---------- ---------50
45
156400
80
34
304500
90
3
58000
100
6
51600
Ejemplo 24
Se necesita saber el cliente que ms ha consumido. Esquema
de trabajo OE.
SELECT *
FROM (SELECT
CUSTOMER_ID,
SUM(ORDER_TOTAL)
FROM OE.ORDERS
GROUP BY CUSTOMER_ID
ORDER BY 2 DESC ) T
WHERE ROWNUM = 1;
Ejemplo 25
Se necesita saber cuntos empleados han ingresado cada mes
por cada ao.
SELECT
EXTRACT(YEAR FROM HIRE_DATE) AS YEAR,
SUM(CASE EXTRACT(MONTH FROM HIRE_DATE)
WHEN 1 THEN 1 ELSE 0 END) AS ENE,
SUM(CASE EXTRACT(MONTH FROM HIRE_DATE)
WHEN 2 THEN 1 ELSE 0 END) AS FEB,
...
...
COUNT(*) AS EMPS
FROM HR.EMPLOYEES
GROUP BY EXTRACT(YEAR FROM HIRE_DATE)
ORDER BY 1;
CONSULTAS MULTI-TABLAS
Equijoin
Non-equijoin
Outer join
Selft join
Ejemplo 26
Consultar los empleados con su respectivo nombre de
departamento donde labora y el puesto de trabajo que ocupa.
SELECT
E.EMPLOYEE_ID,
E.FIRST_NAME,
D.DEPARTMENT_NAME,
J.JOB_TITLE,
E.SALARY
FROM HR.DEPARTMENTS D
INNER JOIN HR.EMPLOYEES E
ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
INNER JOIN HR.JOBS J
ON E.JOB_ID = J.JOB_ID;
Ejemplo 27
Se necesita saber cuntos empleados hay por ciudad.
SELECT
L.CITY,
COUNT(*) AS EMPS
FROM HR.EMPLOYEES E
INNER JOIN HR.DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
INNER JOIN HR.LOCATIONS L
ON D.LOCATION_ID = L.LOCATION_ID
GROUP BY L.CITY;
Ejemplo 28
Se necesita saber el salario de cada empleado y su respectivo
grado. Esquema de trabajo SCOTT.
SELECT
E.ENAME, E.SAL, S.GRADE
FROM SCOTT.EMP E
INNER JOIN SCOTT.SALGRADE S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL
Ejemplo 29
Listar todos los departamentos con sus respectivos empleados,
debe incluir los departamentos que no tienen empleados y los
empleados que no tienen departamentos. Esquema de trabajo
SCOTT.
Solo las filas que se combinan:
SELECT
D.DEPTNO, D.DNAME,
E.EMPNO, E.ENAME
FROM SCOTT.DEPT D
INNER JOIN SCOTT.EMP E
ON D.DEPTNO = E.DEPTNO;
SELECT
D.DEPTNO, D.DNAME,
E.EMPNO, E.ENAME
FROM SCOTT.DEPT D
RIGHT JOIN SCOTT.EMP E
ON D.DEPTNO = E.DEPTNO;
Ejemplo 30
Listar los empleados con el respecto nombre del su jefe.