Sie sind auf Seite 1von 24

Introduccin a SQL

Gustavo Coronel
gcoronelc@gmail.com
gcoronelc.blogspot.com
Instalacin
Verificar los servicios instalados

Proceder a instalar el Oracle


Valores por defecto:
SID: orcl
Database name: orcl
Agregar:
Service Name: orcl.world
Password: oracle

Herramientas para trabajar con Oracle

SQL * Plus modo consola Linux

SQL*Plus Consola Windows

iSQL*Plus

SQL Developer

Inicio de Sesin como Super Usuario


CONNECT sys/oracle AS SYSDBA;

Inicio de session como usuario normal


CONNECT usuario/clave

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

--------------- --------------- -----------------------------gustavo


todos
Bienvenidos a la UNI

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.

El carcter asterisco (*) permite consultar todas las columnas.

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

Paso 2: Ejecutar la consulta.


SQL> select
2 empno, ename, deptno, sal

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;

Consulta por Rangos

Columna | expresin BETWEEN limit_inferior AND limite_superior

La consulta por rangos, para estos casos se utiliza el operador


BETWEEN. Incluye los expremos.

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

TRABAJO CON GRUPOS

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.

select distinct department_id


from hr.employees;
select * from hr.departments
where department_id in
(select distinct department_id
from hr.employees);

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;

CASE CON FUNCIONES AGREGADAS


SUM( CASE ... END )

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

Tipos de combinaciones de 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;

Se incluye los departamentos que no se combinan:


SELECT
D.DEPTNO, D.DNAME,
E.EMPNO, E.ENAME
FROM SCOTT.DEPT D
LEFT JOIN SCOTT.EMP E
ON D.DEPTNO = E.DEPTNO;

Se incluye los empleados que no se combinan:

SELECT
D.DEPTNO, D.DNAME,
E.EMPNO, E.ENAME
FROM SCOTT.DEPT D
RIGHT JOIN SCOTT.EMP E
ON D.DEPTNO = E.DEPTNO;

Combinan los dos resultados:


SELECT
D.DEPTNO, D.DNAME,
E.EMPNO, E.ENAME
FROM SCOTT.DEPT D
FULL JOIN SCOTT.EMP E
ON D.DEPTNO = E.DEPTNO;

Ejemplo 30
Listar los empleados con el respecto nombre del su jefe.

SELECT E.EMPNO, E.ENAME, J.ENAME AS JEFE


FROM SCOTT.EMP E
INNER JOIN SCOTT.EMP J
ON E.MGR = J.EMPNO

Das könnte Ihnen auch gefallen