Post on 07-Feb-2018
7/21/2019 SQL FUNDAMENTOS
1/196
SQL FUNDAMENTOSEXAMEN CERTIFICACIN ORACLE
OCA (ORACLE CERTIFICATION ASOCIATE)
UNIDAD 1TECNOLOGAS ORACLE SERVER Y EL PARADIGMA RELACIONAL
1. TECNOLOGAS DE SERVIDOR
1.1. ARQUITECTURA ORACLE SERVER
La instancia es un conjunto de procesos y estructuras de memoria, su existencia es temporal,puede ser iniciada y detenida, los usuarios de la base de datos establecen sesionesmediante instancias.
Para el manejo del lenguaje SQL se utiliza SQL Developer (Grafico) o SQL*Plus (Consola)
1.2. SERVIDOR DE APLICACIONES ORACLE
Diseado para el manejo de aplicaciones WEB para J2EE.
1.3. ADMINISTRADOR ORACLE ENTERPRISE
Herramienta diseada para la administracin de Oracle, maneja tres formularios:
A. Control de la base de datosB. Control de servidor de aplicacionesC. Control GRID
1.4. COMPUTACIN GRID
Combinar procesamiento y almacenamiento para obtener mayor eficacia y efectividad.
2. ENTENDIMIENTO DE ESTRUCTURAS RELACIONALES
2.1. FILAS Y TABLAS
Tablas = EntidadFila = DatoColumna = Atributos
7/21/2019 SQL FUNDAMENTOS
2/196
2.2. NORMALIZACIN DE DATOS
1 forma normal = Eliminar atomicidad2 forma normal = Eliminar dependencias de columnas3 forma normal = Separar elementos independientes
4 y 5 forma = afinamiento en las tablas
3. RESUMIR EL LENGUAJE SQL
3.1. ESTNDAR SQL
SQL = Lenguaje de consulta estructurado (ISO, ANSI 1979)Oracle maneja Java, PL/SQL y SQL
3.2. COMANDOS SQL
Existen 16 comandos
DML (Lenguaje de manipulacin de datos)
SELECTINSERTUPDATEDELETEMERGE
DDL (Lenguaje de definicin de datos)
CREATEALTERDROPRENAMETRUNCATECOMMENT
DCL (Lenguaje de control de datos)
GRANTREVOKE
TCL (Lenguaje de control de transacciones)
COMMITROLLBACKSAVEPOINT
7/21/2019 SQL FUNDAMENTOS
3/196
4. USO DE LAS HERRAMIENTAS CLIENTE
4.1. SQL*PLUS
Manejo de instrucciones Oracle a nivel texto
4.2. SQL*PLUS EN LINUX
>/u01/app/oracle/product/db_1/bin/sqlplus>sqlplus system/admin@orcl
4.3. SQL*PLUS EN WINDOWS
D:\oracle\app\product\11.1.0\db_2\BIN\sqlplus.exe>sqlplus system/admin@orcl
Forma de conexin sin login
>sqlplus /nolog
7/21/2019 SQL FUNDAMENTOS
4/196
4.4. CREANDO Y PROBANDO UNA CONEXIN A UNA BASE DE DATOS
>sqlplus scott/tiger@orcl>sqlplus scott/tiger@linsrv1.bplc.co.za:1521/orcl.bplc.com
4.5. INSTALANDO Y EJECUTANDO SQL DEVELOPER
Descargar desde ORACLE iberia y descomprimir, ejecutarlo y manejar en modo grafico
5. HACER UNA DEMOSTRACIN DE ESQUEMAS
5.1. ESQUEMA HR y OE
Oracle trae por defecto los esquemas HR y OE
5.2. DEMOSTRACIN DE CREACIN DE ESQUEMAS
>alter user hr account unlock identified by hr;>alter user oe account unlock identified by oe;
Se puede ingresar como superusuario con
>sqlplus / as sysdba
7/21/2019 SQL FUNDAMENTOS
5/196
7/21/2019 SQL FUNDAMENTOS
6/196
MODELO LOGICO HR
7/21/2019 SQL FUNDAMENTOS
7/196
UNIDAD 2SENTENCIA SQL SELECT
1. CAPACIDADES DE LA SENTENCIA SQL SELECT
1.1. INTRODUCCIN A LA SENTENCIA SQL SELECT
Bsqueda de datos en las tablas se utiliza la sentencia SELECT
SELECT identifica las columnas what FROM identifica la tabla which
1.2. COMANDO DESCRIBE EN TABLAS
DESC[RIBE] .tablename
2. EJECUTANDO UNA SENTENCIA SELECT BSICA
2.1. Sintaxis de una sentencia SELECT primaria
SELECT * | {[DISTINCT] column|expression [alias],}FROM table;
7/21/2019 SQL FUNDAMENTOS
8/196
2.2. REGLAS A SER SEGUIDAS
Maysculas o minsculas
SELECT * FROM LOCATIONS;Select * from locations;select * from locations;
7/21/2019 SQL FUNDAMENTOS
9/196
Terminacin de sentencias
select country_name, country_id, location_id from countries;
select city, location_id,state_province, country_id
from locations/
Identacin, lectura y buenas prcticas
select city, location_id,state_province, country_idfrom locations
2.3. EXPRESIONES Y OPERADORES SQL
Operadores aritmticos
7/21/2019 SQL FUNDAMENTOS
10/196
Expresiones y alias en columnas
Expresin: (END_DATE-START_DATE)+1Alias: select alias [as] a
7/21/2019 SQL FUNDAMENTOS
11/196
Operaciones de concatenacin de caracteres y STRING
7/21/2019 SQL FUNDAMENTOS
12/196
Literales y la tabla DUAL
SELECT 'literal'||'processing using the REGIONS table'FROM regions;
Dos Quotes Individuales o la alternativa al operador Quote
Cuando en letras se quiere representar la comilla sencilla se hace doble as:
select 'Plural''s have one quote too many' from dual;
7/21/2019 SQL FUNDAMENTOS
13/196
NULL
7/21/2019 SQL FUNDAMENTOS
14/196
EJERCICIOS UNIDAD 2
Esta prctica podr realizarse tanto con SQL*PLUS como con SQL Developer. Si se utilizaSQL*PLUS ejecutar desde una terminal de unix lo siguiente:
sqlplus hr/hr@prod
Si se utiliza SQL Developer ejecutarlo haciendo doble clic en el cono del escritorio, crearuna conexin para el usuario HR y conectarse, todo ello de acuerdo a los pasos que sedetallan a continuacin:
7/21/2019 SQL FUNDAMENTOS
15/196
Esquema HR - Descripcin de las tablas
REGIONS contiene regiones como ser Amrica, Asia, etc.
Nombre Nulo? Tipo----------------------------------------- --------------- ----------------------------
REGION_ID NOT NULL NUMBERREGION_NAME VARCHAR2(25)
COUNTRIES contiene pases, cada uno de ellos asociados a una regin.
Nombre Nulo? Tipo----------------------------------------- --------------- ----------------------------COUNTRY_ID NOT NULL CHAR(2)COUNTRY_NAME VARCHAR2(40)REGION_ID NUMBER
LOCATIONS contiene la direcciones de las oficinas de la compaa en cada pas
Nombre Nulo? Tipo----------------------------------- --------------- ---------------------------LOCATION_ID NOT NULL NUMBER(4)STREET_ADDRESS VARCHAR2(40)POSTAL_CODE VARCHAR2(12)CITY NOT NULL VARCHAR2(30)STATE_PROVINCE VARCHAR2(25)COUNTRY_ID CHAR(2)
DEPARTMENTS contiene los departamentos de trabajo de las distintas locaciones. Cadadepartamento puede o no tener un empleado manager( relacin con tabla EMPLOYEES)
Nombre Nulo? Tipo----------------------------------------- -------- ----------------------------DEPARTMENT_ID NOT NULL NUMBER(4)DEPARTMENT_NAME NOT NULL VARCHAR2(30)MANAGER_ID NUMBER(6)LOCATION_ID NUMBER(4)
7/21/2019 SQL FUNDAMENTOS
16/196
EMPLOYEES contiene el detalle de cada empleado trabajando en un departamento.Algunos empleados pueden no tener asignados departamento
Nombre Nulo? Tipo----------------------------------------- -------- ----------------------------EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)LAST_NAME NOT NULL VARCHAR2(25)EMAIL NOT NULL VARCHAR2(25)PHONE_NUMBER VARCHAR2(20)HIRE_DATE NOT NULL DATEJOB_ID NOT NULL VARCHAR2(10)SALARY NUMBER(8,2)COMMISSION_PCT NUMBER(2,2)MANAGER_ID NUMBER(6)DEPARTMENT_ID NUMBER(4)WORK_RECORD VARCHAR2(4000)
JOBS contiene los diferentes tipos de trabajo que puede tener un empleado
Nombre Nulo? Tipo----------------------------------------- -------- ----------------------------JOB_ID NOT NULL VARCHAR2(10)JOB_TITLE NOT NULL VARCHAR2(35)MIN_SALARY NUMBER(6)MAX_SALARY NUMBER(6)
JOB_HISTORY contiene el historial de puestos de trabajo de los empleados
Nombre Nulo? Tipo----------------------------------------- -------- ----------------------------EMPLOYEE_ID NOT NULL NUMBER(6)START_DATE NOT NULL DATEEND_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)DEPARTMENT_ID NUMBER(4)
7/21/2019 SQL FUNDAMENTOS
17/196
2.1 Prctica Comando DESCRIBE
a. En el editor escriba el comando DESCRIBE JOBS.b. Ejecute el comando presionando F5 en caso de SQL DEVELOPER o en
SQL*PLUS
c. La descripcin de la tabla JOBS aparecer en pantallad. Realice los mismos pasos para describir las tablas JOB_HISTORY, LOCATIONS,COUNTRIES y REGIONS
e. SQL Developer provee adems otra forma para visualizar las estructuras de las tablas.Navegue por la jerarqua del panel izquierdo que nace a partir del nombre de conexinhr. Haga click en TABLES y luego en DEPARTMENTS. SQL Developer describe latabla automticamente mostrndola en la pantalla de la derecha.
2.2 Prctica Comando SELECT
a. Mostrar todas las columnas de las tablas REGIONS y COUNTRIES:
>SELECT * FROM REGIONS;>SELECT * FROM COUNTRIES;
b. Consultar nmero de empleado, nombre, apellido, fecha de ingreso y sueldo de todos losempleados de la tabla EMPLOYEES:
>SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, HIRE_DATE, SALARYFROM EMPLOYEES;
c. Consultar los puestos de trabajo y su salario mximo en la tabla JOBS:
>SELECT JOB_TITLE, MAX_SALARYFROM JOBS;
2.3. Prctica Comando SELECT con Operadores y expresiones
a. Mostrar de los empleados el nombre, apellido, salario actual y cul sera el salario si se leaumentan 1000$ (usar alias en las columnas de clculo):
>SELECT FIRST_NAME, LAST_NAME, SALARY Salario actual, SALARY + 1000 Salario futuroFROM EMPLOYEES;
7/21/2019 SQL FUNDAMENTOS
18/196
b. Verificar como cumplen las reglas de precedencia y el efecto del uso de parntesis en lassiguientes sentencias:
>SELECT LAST_NAME, SALARY, 12*SALARY+100+10 AS CALCULO 1FROM EMPLOYEES;
>SELECT LAST_NAME, SALARY, 12*(SALARY+100)+10 AS CALCULO 2FROM EMPLOYEES;
c. Consultar el apellido del empleado, la fecha de ingreso y un clculo de la fecha de ingresosumados 5 das:
>SELECT LAST_NAME, HIRE_DATE, HIRE_DATE + 5FROM EMPLOYEES;
d. Consulte la tabla JOBS y retorne una expresin con la siguiente forma:
El cdigo de trabajo para el trabajo es: .
>SELECT 'El codigo de trabajo para el trabajo ' || job_id || ' es:' || job_title
FROM JOBS;
e. Agregue un alias a la columna con el texto Descripcion del trabajo
>SELECT El codigo de trabajo para el trabajo || JOB_TITLE || es: || JOB_ID AS
Descripcion del trabajo FROM JOBS;
f. Mostrar los departamentos que tienen empleados trabajando (no mostrar filas repetidas)
>SELECT DISTINCT DEPARTMENT_ID FROM EMPLOYEES;
g. Mostrar la expresin Hello World (usando la tabla dual)
>SELECT Hello World FROM DUAL;
h. Ejecutar el resultado de la operacin aritmtica 1000 dividido 5:
>SELECT 1000/5 FROM DUAL;
7/21/2019 SQL FUNDAMENTOS
19/196
UNIDAD 3LIMITANDO Y ORDENANDO DATOS
1. LIMITAR LAS FILAS RECUPERADAS POR UNA CONSULTA
7/21/2019 SQL FUNDAMENTOS
20/196
a. CLAUSULA WHERE
Condiciones basadas en nmeros
select last_name, salary from employeeswhere salary = 10000;
select last_name, salary from employeeswhere salary = department_id;
select last_name, salary from employeeswhere salary/10 = department_id*10;
7/21/2019 SQL FUNDAMENTOS
21/196
Condiciones basadas en caracteres
select last_namefrom employeeswhere job_id='SA_REP';
select employee_id, job_idfrom employeeswhere last_name=first_name;
Condiciones basadas en fechas
select employee_id from job_historywhere start_date = end_date;
select employee_id from job_history
where start_date = 13/01/01;
7/21/2019 SQL FUNDAMENTOS
22/196
b. OPERADORES DE COMPARACIN
Igualdad y desigualdad
Clause 1: where salary = 5000;Clause 3: where salary department_id;Clause 4: where salary != 4000+department_id;
7/21/2019 SQL FUNDAMENTOS
23/196
CondicinBETWEEN
select last_name from employeeswhere salary between 3400 and 4000;
select first_name, hire_date from employees
where hire_date between '24-JUL-1994' and '07-JUN-1996';
select first_name, hire_date from employeeswhere '24-JUL-1994' between hire_date+30 and '07-JUN-1996';
7/21/2019 SQL FUNDAMENTOS
24/196
CondicinIN
select last_name from employeeswhere salary in (1000,4000,6000);
select last_name from employeeswhere last_name in ('King','Garbharran','Ramklass');
select last_name from employeeswhere hire_date in ('01-JAN-1998','01-DEC-1999');
Condicin LIKE
7/21/2019 SQL FUNDAMENTOS
25/196
select first_name from employeeswhere first_name like 'A%';
select * from jobswhere job_id like 'SA_%';
select job_id from jobswhere job_id like 'SA\_%' escape '\';
CondicinIS NULL
select last_name from employeeswhere commission_pct is null;
7/21/2019 SQL FUNDAMENTOS
26/196
c. OPERADORES BOOLEANOS
OperadorAND
select first_name, last_name, commission_pct, hire_date
from employeeswhere first_name like 'J%'and commission_pct > 0.1;
7/21/2019 SQL FUNDAMENTOS
27/196
OperadorOR
select first_name, last_name, commission_pct, hire_datefrom employeeswhere first_name like 'B%'or commission_pct > 0.35;
OperadorNOT
select first_name, last_name, commission_pct, hire_datefrom employeeswhere first_name not like 'B%'or not (commission_pct > 0.35);
7/21/2019 SQL FUNDAMENTOS
28/196
d. Reglas de precedencia
7/21/2019 SQL FUNDAMENTOS
29/196
2. ORDENAR LAS FILAS RECUPERADAS POR UNA CONSULTA
a. ClausulaORDER BY
Ordenamiento ascendente y descendente
7/21/2019 SQL FUNDAMENTOS
30/196
select last_name, hire_date, salaryfrom employeeswhere job_id in ('SA_REP','MK_MAN')order by last_name;
select last_name, salary, hire_date, hire_date-(salary/10) emp_value
from employeeswhere job_id in ('SA_REP','MK_MAN')order by emp_value;
Ordenamiento posicional
select last_name, hire_date, salaryfrom employeeswhere job_id in ('SA_REP','MK_MAN')order by 2;
Ordenamiento compuesto
select job_id, last_name, salary, hire_datefrom employeeswhere job_id in ('SA_REP','MK_MAN')order by job_id desc, last_name, 3 desc;
7/21/2019 SQL FUNDAMENTOS
31/196
3. SUSTITUCIN AMSPERSAND
a. VARIABLES DE SUSTITUCIN
Sustitucin individual Amspersand
7/21/2019 SQL FUNDAMENTOS
32/196
Sustitucin doble Amspersand
select first_name, last_namefrom employeeswhere last_name like '%&SEARCH%'and first_name like '%&SEARCH%';
7/21/2019 SQL FUNDAMENTOS
33/196
Sustituyendo nombres de columna
select first_name, job_id, &&colfrom employeeswhere job_id in ('MK_MAN','SA_MAN')order by &col;
Sustituyendo expresiones y texto
select &SELECT_CLAUSEfrom &FROM_CLAUSEwhere &WHERE_CLAUSEorder by &ORDER_BY_CLAUSE;
7/21/2019 SQL FUNDAMENTOS
34/196
7/21/2019 SQL FUNDAMENTOS
35/196
Comandos DEFINE y UNDEFINE
SET DEFINE OFFSET DEFINE ON
7/21/2019 SQL FUNDAMENTOS
36/196
Comando VERIFY
SET VERIFY ON|OFF
7/21/2019 SQL FUNDAMENTOS
37/196
7/21/2019 SQL FUNDAMENTOS
38/196
7/21/2019 SQL FUNDAMENTOS
39/196
7/21/2019 SQL FUNDAMENTOS
40/196
7/21/2019 SQL FUNDAMENTOS
41/196
EJERCICIOS UNIDAD 3
1. Prctica Primer parte
Consultar employee_id, last_name, job_id, department_id de los empleados quepertenezcan al departamento 90
SELECT employee_id, last_name, job_id, department_idFROM employeesWHERE department_id = 90 ;
Consultar nombre y apellido de los empleados cuyo sueldo sea mayor o igual a 6000
SELECT last_name, first_nameFROM employees
WHERE salary >= 6000;
Consultar nombre y apellido de los empleados cuyo apellido sea Smith
SELECT last_name, first_nameFROM employeesWHERE last_name = Smith;
Seleccionar apellido y salario de los empleados que ganen entre 1000 y 10000
SELECT last_name, salaryFROM employeesWHERE salary BETWEEN 1000 AND 10000;
Recupere de la tabla de departamentos una lista con aquellos nombres de departamentoque finalicen con la cadena ing:
SELECT department_nameFROM departmentsWHERE department_name LIKE %ing;
7/21/2019 SQL FUNDAMENTOS
42/196
2. Prctica Segunda parte
Mostrar employee_id, last_name, job_id, salary de los empleados que tengan su salariomayor o igual a 10000 que su job_id contenga la cadena MAN:
SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >= 10000OR job_id LIKE '%MAN%';
Consultar apellido, nombre y fecha de ingreso de los empleados que ganen 3000$ ypertenezcan al departamento 50:
SELECT last_name, first_name
FROM employeesWHERE salary = 3000AND department_id=50;
Consultar apellido y job_id de los empleados cuyo job_id no sea ni 'IT_PROG', ni'ST_CLERK' ni 'SA_REP' :
SELECT last_name, job_idFROM employeesWHERE job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');
3. Prctica Tercera parte
Listar department_id y department_name de la tabla de departamentos ordenado pordepartment_id de manera ascendente:
SELECT department_id, department_nameFROM departmentsORDER BY department_id;
Mostrar apellido, nombre y fecha de ingreso de los empleados ordenados por fecha deingreso de manera descendente:
SELECT last_name, job_id, department_id, hire_dateFROM employeesORDER BY hire_date DESC;
7/21/2019 SQL FUNDAMENTOS
43/196
De la tabla de cargos (JOBS) obtenga para cada cargo: el nombre, el salario mnimo ymximo. Obtenga tambin la diferencia entre el salario mximo y el mnimo. Listesolamente aquellos cargos que tengan en su nombre la cadena President o Manager.Ordene el resultado en forma descendente por la columna que contiene la variacin delos salarios:
SELECT job_title, min_salary,max_salary, (max_salary min_salary) varianceFROM jobsWHERE job_title LIKE %President%' OR
job_title LIKE %Manager%
ORDER BY variance DESC;
4. Prctica Cuarta parte
Consultar employee_id, last_name, salary, department_id de un empleado ingresando elemployee_id, armar la consulta para que permita ingresar dinmicamente el employee_id
SELECT employee_id, last_name, salary, department_idFROM employeesWHERE employee_id = &employee_num ;
Desarrolle un query que permita determinar el impuesto a deducir a un empleado. Ellegajo y el porcentaje a deducir sern ingresados dinmicamente al ejecutar el query. Lasentencia deber mostrar las columnas EMPLOYEE_ID, FIRST_NAME, SALARY,
ANNUAL SALARY (SALARY * 12), porcentaje de impuesto y el importe del impuesto
TAX_RATE/100 *( SALARY *12)
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY,SALARY*12 AS ANNUAL SALARY,
&&TAX_RATE,&TAX_RATE/100*(SALARY*12) AS TAX
FROM EMPLOYEESWHERE EMPLOYEE_ID = &EMPLOYEE_ID;
7/21/2019 SQL FUNDAMENTOS
44/196
UNIDAD 4FUNCIONES DE UNA SOLA FILA
1. TIPOS DE FUNCIONES DISPONIBLES EN SQL
A. DEFINIENDO UNA FUNCIN
7/21/2019 SQL FUNDAMENTOS
45/196
7/21/2019 SQL FUNDAMENTOS
46/196
Operando sobre datos de carcter
7/21/2019 SQL FUNDAMENTOS
47/196
Manipulacin de caracteres
REPLACE('1#3#5#7#9#','#','->') 1->3->5->7->9->
7/21/2019 SQL FUNDAMENTOS
48/196
Operando sobre datos numricos
7/21/2019 SQL FUNDAMENTOS
49/196
7/21/2019 SQL FUNDAMENTOS
50/196
7/21/2019 SQL FUNDAMENTOS
51/196
Date1 Date2 = Num1
Date1 Num 1 = Date2
Date1 + Num1 = Date2
7/21/2019 SQL FUNDAMENTOS
52/196
7/21/2019 SQL FUNDAMENTOS
53/196
7/21/2019 SQL FUNDAMENTOS
54/196
EJERCICIOS UNIDAD 4
1. Prctica Primer parte
Consultar employee_id, apellido y nombre, ambos en mayscula, de los empleados
que pertenezcan al departamento 90:
SELECT employee_id, UPPER(last_name), UPPER(first_name)FROM employeesWHERE department_id = 90;
Consultar el job_id, el job_id en minscula, job_title y el job_title en minscula de latabla de jobs:
SELECT job_id, LOWER(job_id) , job_title, LOWER(job_title)
FROM jobs;
Obtener una lista de los empleados(apellido y nombre) cuyo nombre contenga lacadena "li" independientemente de que dicha cadena este en maysculas, minsculaso sea una combinacin de ambas :
SELECT first_name, last_nameFROM employeesWHERE LOWER(first_name) LIKE '%li%';
2. Prctica Segunda parte
Consultar nombre, apellido, el primer carcter del nombre y los primeros 5 caracteresdel apellido de los empleados pertenecientes al departamento 90
SELECT FIRST_NAME, LAST_NAME, SUBSTR(FIRST_NAME,1,1),SUBSTR(LAST_NAME,1,5)
FROM EMPLOYEESWHERE DEPARTMENT_ID=90;
Seleccionar apellido, salario, mostrar el salario completando hasta 10 caracteres * a laizquierda:
SELECT last_name,LPAD(salary,10,'*') "Salary"FROM employees;
7/21/2019 SQL FUNDAMENTOS
55/196
3. Prctica Tercera parte
Ejecutar la siguiente select e interpretar el funcionamiento de la funcin ROUND:
SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1),ROUND(345.923,-2),ROUND(355.923,-2)
FROM DUAL;
Mostrar apellido, salario, y el resto de dividir el salario por 5000 de los empleados deljob_id ='SA_REP':
SELECT last_name, salary, MOD(salary, 5000)FROM employeesWHERE job_id = 'SA_REP';
4. Prctica Cuarta parte
Obtenga la lista de empleados que trabajaron ms de 100 meses desde la fecha enque fueron contratados. Liste el cdigo de empleado, apellido y fecha de contratacin.
SELECT EMPLOYEE_ID, LAST_NAME, HIRE_DATE
FROM EMPLOYEESWHERE MONTHS_BETWEEN(sysdate, HIRE_DATE) > 100;
7/21/2019 SQL FUNDAMENTOS
56/196
UNIDAD 5FUNCIONES DE CONVERSIN Y EXPRESIONES CONDICIONALES
1. TIPOS DE FUNCIONES DE CONVERSIN DISPONIBLES EN SQL
A. FUNCIONES DE CONVERSIN
Conversin de datos de tipo implcito
7/21/2019 SQL FUNDAMENTOS
57/196
Conversin de datos de tipo explicito
2. FUNCIONES DE CONVERSIN TO_CHAR, TO_NUMBER Y TO_DATE
a. Usando funciones de conversin
ALTER SESSION set NLS_CURRENCY='GBP';
National Language Support (NLS) session parameters
Conversin de nmeros a caracteres con TO_CHAR
TO_CHAR(number1, [format], [nls_parameter]),
select to_char(00001)||' is a special number' from dual;
select to_char(00001,'0999999')||' is a special number' from dual;
7/21/2019 SQL FUNDAMENTOS
58/196
7/21/2019 SQL FUNDAMENTOS
59/196
Conversin de fechas a caracteres con TO_CHAR
TO_CHAR(date1, [format], [nls_parameter]),
select to_char(sysdate)||' is today''s date' from dual;
select to_char(sysdate,'Month') ||'is a special time' from dual;
select to_char(sysdate,'fmMonth')||'is a special time' from dual;
7/21/2019 SQL FUNDAMENTOS
60/196
7/21/2019 SQL FUNDAMENTOS
61/196
7/21/2019 SQL FUNDAMENTOS
62/196
7/21/2019 SQL FUNDAMENTOS
63/196
select to_date('25-DEC', 'DD-MON') from dual;
select to_date('25-DEC-2010 18:03:45', 'DD-MON-YYYY HH24:MI:SS') from dual;
select to_date('25-DEC-10', 'fxDD-MON-YYYY') from dual;
Conversin de caracteres a nmeroscon TO_NUMBER
TO_NUMBER(string1, [format], [nls_parameter]),
select to_number('$1,000.55') from dual;
select to_number('$1,000.55','$999,999.99') from dual;
7/21/2019 SQL FUNDAMENTOS
64/196
7/21/2019 SQL FUNDAMENTOS
65/196
3. EXPRESIONES CONDICIONALES EN SENTENCIA SELECT
A. FUNCIONES ANIDADAS
7/21/2019 SQL FUNDAMENTOS
66/196
B. FUNCIONES GENERALES
FUNCIN NVL
NVL(original, ifnull)
select nvl(1234) from dual;
select nvl(null,1234) from dual;
select nvl(substr('abc',4),'No substring exists') from dual;
7/21/2019 SQL FUNDAMENTOS
67/196
FUNCIN NVL2
NVL2(original, ifnotnull, ifnull)
select nvl2(1234,1,'a string') from dual;select nvl2(null,1234,5678) from dual;select nvl2(substr('abc',2),'Not bc','No substring') from dual;
7/21/2019 SQL FUNDAMENTOS
68/196
FUNCIN NULLIF
NULLIF(ifunequal, comparison_term)
select nullif(1234,1234) from dual;select nullif(1234,123+1) from dual;select nullif('24-JUL-2009','24-JUL-09') from dual;
7/21/2019 SQL FUNDAMENTOS
69/196
FUNCIN COALESCE
COALESCE(expr1, expr2,,exprn)
COALESCE(expr1,expr2) = NVL(expr1,expr2)
COALESCE(expr1,expr2,expr3) = NVL(expr1,NVL(expr2,expr3))select coalesce(null, null, null, 'a string') from dual;select coalesce(null, null, null) from dual;select coalesce(substr('abc',4),'Not bc','No substring') from dual;
7/21/2019 SQL FUNDAMENTOS
70/196
C. FUNCIONES CONDICIONALES
FUNCIN DECODE
DECODE(expr1,comp1, iftrue1,[comp2,iftrue2...[ compN,iftrueN]], [iffalse])
select decode(1234,123,'123 is a match') from dual;
select decode(1234,123,'123 is a match','No match') from dual;
select decode('search','comp1','true1', 'comp2','true2','search','true3',substr('2search',2,6),'true4' , 'false') from dual;
7/21/2019 SQL FUNDAMENTOS
71/196
7/21/2019 SQL FUNDAMENTOS
72/196
EXPRESIN CASE
CASE search_exprWHEN comparison_expr1 THEN iftrue1[WHEN comparison_expr2 THEN iftrue2
WHEN comparison_exprN THEN iftrueNELSE iffalse]
END
selectcase substr(1234,1,3)when '134' then '1234 is a match'when '1235' then '1235 is a match'when concat('1','23') then concat('1','23')||' is a match'else 'no match'endfrom dual;
CASEWHEN condition1 THEN iftrue1[WHEN condition2 THEN iftrue2
WHEN conditionN THEN iftrueNELSE iffalse]END
7/21/2019 SQL FUNDAMENTOS
73/196
select last_name, hire_date,trunc(months_between(sysdate,hire_date)/12) years,trunc(months_between(sysdate,hire_date)/60) "Years divided by 5",casewhen trunc(months_between(sysdate,hire_date)/60) < 1 then 'Intern'when trunc(months_between(sysdate,hire_date)/60) < 2 then 'Junior'
when trunc(months_between(sysdate,hire_date)/60) < 3 then 'Intermediate'when trunc(months_between(sysdate,hire_date)/60) < 4 then 'Senior'else 'Furniture'end Loyaltyfrom employeeswhere department_id in (60,10);
7/21/2019 SQL FUNDAMENTOS
74/196
EJERCICIOS UNIDAD 5
1. Prctica Primer parte
Consultar apellido, nombre y salario con el formato '$99,999.99' ordenados porapellido:
SELECT last_name, first_name, TO_CHAR(salary,'$99,999.99')FROM employeesORDER by last_name;
Consultar los job_id , salario mximo y el salario mximo con el formato '9999.99' detodos los Jobs ordenados por job_id. Evaluar si la mscara elegida es correcta.
SELECT job_id, max_salary, TO_CHAR(max_salary,'9999.99')FROM jobs
ORDER BY job_id;
Obtener una lista de los empleados(apellido y nombre) cuyo da de ingreso haya sidosbado. Mostrar adems la fecha de ingreso con el alias START_DATE y con unformato que se muestre como el siguiente texto:
Saturday, the 17th of February, One Thousand Nine Hundred Ninety-Six.
SELECT first_name,last_name,TO_CHAR(hire_date, 'fmDay, "the "ddth "of " Month, Yyyysp.') START_DATE
FROM employeesWHERE TO_CHAR(hire_date,'fmDay') = 'Saturday';
Obtener una lista de los empleados(apellido y fecha de ingreso) , la fecha de ingresodebe mostrarse con un formato como el siguiente texto:
Seventeenth of June 2007
SELECT last_name,TO_CHAR(hire_date, 'fmDdspth "of" Month YYYY') HIREDATE
FROM employees;
7/21/2019 SQL FUNDAMENTOS
75/196
Mostrar employee_id , job_id y end_date de la tabla job_history ordenado porend_date. La columna end_date debe mostrarse con el alias "Quitting Date" y con unformato como el siguiente texto:
SATURDAY the 27th of October 2001
SELECT EMPLOYEE_ID,job_id,TO_CHAR(end_date,'fmDAY "the "ddth "of" Month YYYY') "Quitting Date"
FROM job_historyORDER BY end_date;
2. Prctica Segunda parte
Consultar nombre, apellido y fecha de ingreso de todos los empleados cuya fecha deingreso sea mayor al 01/01/2008:
SELECT first_name, last_name, hire_dateFROM employeesWHERE hire_date > TO_DATE('01/01/2008', 'DD/MM/YYYY');
Seleccionar apellido y mostrar concatenadas las 8 primeras letras del apellido con lacadena _US, a esta concatenacin mostrarla en maysculas:
SELECT last_name,
UPPER(CONCAT(SUBSTR (LAST_NAME, 1, 8), '_US'))FROM employees;
Mostrar apellido, salario, commission(mostrar cero si es nula) y el salario anualsumadas las comisiones:
SELECT last_name, salary, NVL(commission_pct, 0),(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
FROM employees;
Mostrar apellido, salario, comisin y la leyenda Gana comisin o No gana comisincon el alias EMPLOYEE_TYPE segn sea o no nula, para los empleados cuyoapellido empiece con G:
SELECT last_name, salary, commission_pct,NVL2(commission_pct,'Gana comisin','No gana comisin') EMPLOYEE_TYPE
FROM employeesWHERE last_name LIKE 'G%';
7/21/2019 SQL FUNDAMENTOS
76/196
Evaluar la siguiente funcin COALESCE:
SELECT COALESCE(state_province,postal_code,city), postal_code, state_province, cityFROM locationsWHERE country_id in ('UK','IT','JP');
3. Prctica Tercera parte
Buscar dentro de la tabla LOCATIONS las filas que tengan el country_id=US. Mostrarla siguiente leyenda con alias LOCATION_INFO segn sea el valor de la columnaSTATE_PROVINCE(usar decode). Ordenar por LOCATION_INFO.
Washington mostrar Headquarters
Texas mostrar Oil Wells
California mostrar CITY column value
New Jersey mostrar The STREET_ADDRESS column value
SELECT DECODE(state_province, 'Washington', 'Headquarters','Texas', 'Oil Wells','California', city,'New Jersey', street_address) LOCATION_INFO
FROM locationsWHERE country_id='US'ORDER BY location_info;
Mostrar apellido, salario y la siguiente leyenda con el alias qualified_salary para cadaempleado segn sea el caso usando CASE:
Salario menor a 5000 mostrar LowSalario menor a 10000 mostrar MediumSalario menor a 20000 mostrar Good
SELECT last_name,salary,(CASE WHEN salary
7/21/2019 SQL FUNDAMENTOS
77/196
UNIDAD 6
INFORMES AGREGADOS DE DATOS MEDIANTE FUNCIONES DE GRUPO
1. FUNCIONES DE GRUPO
a. Definicin de las funciones de grupo
7/21/2019 SQL FUNDAMENTOS
78/196
b. Tipos y sintaxis de las funciones de grupo
COUNT({*|[DISTINCT|ALL] expr});
1. COUNT(*)2. COUNT(DISTINCT expr)3. COUNT(ALL expr)4. COUNT(expr)
Query 1: select count(*) from employeesQuery 2: select count(commission_pct) from employeesQuery 3: select count(distinct commission_pct) from employeesQuery 4: select count(hire_date), count(manager_id) from employees
AVG([DISTINCT|ALL] expr);
1. AVG(DISTINCT expr)2. AVG(ALL expr)3. AVG(expr)
Query 1: select avg(2) from employees
Query 2: select avg(salary) from employeesQuery 3: select avg(distinct salary) from employeesQuery 4: select avg(commission_pct) from employees
SUM([DISTINCT|ALL] expr) ;
1. SUM(DISTINCT expr)2. SUM(ALL expr)3. SUM(expr)
7/21/2019 SQL FUNDAMENTOS
79/196
Query 1: select sum(2) from employeesQuery 2: select sum(salary) from employeesQuery 3: select sum(distinct salary) from employeesQuery 4: select sum(commission_pct) from employees
MAX([DISTINCT|ALL] expr); MIN([DISTINCT|ALL] expr)
1. MAX(DISTINCT expr); MIN(DISTINCT expr)2. MAX(ALL expr); MIN(ALL expr)3. MAX(expr); MIN(expr);
Query 1: select min(commission_pct), max(commission_pct) from employeesQuery 2: select min(start_date),max(end_date) from job_historyQuery 3: select min(job_id),max(job_id) from employees
VARIANCE([DISTINCT|ALL] expr);
1. VARIANCE(DISTINCT expr)2. VARIANCE(ALL expr)3. VARIANCE(expr)
STDDEV([DISTINCT|ALL] expr);
1. STDDEV(DISTINCT expr)2. STDDEV(ALL expr)3. STDDEV(expr)
7/21/2019 SQL FUNDAMENTOS
80/196
7/21/2019 SQL FUNDAMENTOS
81/196
7/21/2019 SQL FUNDAMENTOS
82/196
2. USANDO GRUPOS DE DATOS CON LA CLAUSULA GROUP BY
G1(group_item) = resultG1(G2(group_item ) = resultG1(G2(G3(group_item))) is NOT allowed.
a. GROUP BY
SELECT column|expression|group_function(column|expression [alias]),}FROM table[WHERE condition(s)][GROUP BY {col(s)|expr}][ORDER BY {col(s)|expr|numeric_pos } [ASC|DESC] [NULLS FIRST|LAST]];
7/21/2019 SQL FUNDAMENTOS
83/196
select max(salary), count(*)from employeesgroup by department_idorder by department_id;
7/21/2019 SQL FUNDAMENTOS
84/196
b. Agrupacin para mltiples columnas
select department_id, sum(commission_pct)from employeeswhere commission_pct is not nullgroup by department_id;
select department_id, job_id, sum(commission_pct)from employees
where commission_pct is not nullgroup by department_id, job_id;
7/21/2019 SQL FUNDAMENTOS
85/196
3. INCLUIR O EXCLUIR FILAS AGRUPADAS CON LA CLAUSULA HAVING
7/21/2019 SQL FUNDAMENTOS
86/196
a. Restringir los resultados del grupo
select department_idfrom job_historywhere department_id in (50,60,80,110);
select department_id, count(*)from job_historywhere department_id in (50,60,80,110)group by department_id;
b. La clausula HAVING
SELECT column|expression|group_function(column|expression [alias]),}FROM table[WHERE condition(s)]
[GROUP BY {col(s)|expr}][HAVING group_condition(s)][ORDER BY {col(s)|expr|numeric_pos } [ASC|DESC] [NULLS FIRST|LAST]];
7/21/2019 SQL FUNDAMENTOS
87/196
select department_id, count(*)from job_historywhere department_id in (50,60,80,110)group by department_idhaving count(*)>1;
7/21/2019 SQL FUNDAMENTOS
88/196
Ejercicios UNIDAD 6
1. Prctica Primer parte
Contar la cantidad de empleados que se encuentran en el departamento 50:
SELECT COUNT(*)FROM employeesWHERE department_id = 50;
Contar la cantidad de empleados del departamento 50 cuya comisin es no nula :
SELECT COUNT(commission_pct)FROM employeesWHERE department_id = 80;
Contar la cantidad de departamentos distintos que existen dentro de tabla empleados:
SELECT COUNT(DISTINCT department_id)FROM employees;
Sumar los salarios de todos los empleados que ingresaron despus del 01/01/2008:
SELECT SUM(salary)FROM employeesWHERE hire_date > TO_DATE(01/01/2008,DD/MM/YYYY);
Sumar los distintas comisiones de los empleados del departamento 80:
SELECT SUM(DISTINCT commission_pct)FROM employeesWHERE department_id=80
Obtener el clculo del salario promedio de todos los empleados de la compaa:
SELECT AVG(salary)
FROM employees;
Obtener la mnima y mxima fecha de ingreso, el mnimo y mximo salario de losempleados con job_id ='SA_REP' :
SELECT MIN(hire_date),MIN(salary), MAX(hire_date),MAX(salary)FROM employeesWHERE job_id='SA_REP';
7/21/2019 SQL FUNDAMENTOS
89/196
2. Prctica Segunda parte
Obtener el mximo salario y cantidad de empleados por departamento de todos losempleados. Ordenar la salida por department_id:
SELECT department_id, MAX(salary), COUNT(*)
FROM employeesGROUP BY department_idORDER BY department_id;
Mostrar la cantidad de empleados ingresados por ao en la compaa, ordenarlos demanera descendente por cantidad de ingresados:
SELECT TO_CHAR(HIRE_DATE,'YYYY') , COUNT(*)FROM EMPLOYEESGROUP BY TO_CHAR(HIRE_DATE,'YYYY')
ORDER BY COUNT(*) DESC;
Obtener el salario promedio por departamento de todos los empleados:
SELECT department_id, AVG(salary)FROM employeesGROUP BY department_id;
Obtener la suma de los salaries por puesto de trabajo dentro de cada departamento.Ordenar la salida por department_id:
SELECT department_id , job_id, SUM(salary)FROM employeesGROUP BY department_id, job_idORDER BY department_id;
3. Prctica Tercera parte
Mostrar aquellos departamentos cuyo salario mximo sea mayor de 10000$.
e rSELECT department_id, MAX(salary)FROM employeesGROUP BY department_idHAVING MAX(salary)>10000 ;
7/21/2019 SQL FUNDAMENTOS
90/196
Mostrar los das de la semana donde hubo ms de 15 ingresos de empleados:
SELECT TO_CHAR(HIRE_DATE,'DAY'), COUNT(*)FROM EMPLOYEESGROUP BY TO_CHAR(HIRE_DATE,'DAY')HAVING COUNT(*) > 15;
Mostrar aquellos puestos de trabajo que no contentan la cadena REP en su job_id yque la suma de los salarios en cada uno de los mismos sea mayor a 13000$.Mostrarlos ordenados por suma de salarios:
SELECT job_id, SUM(salary)FROM employeesWHERE job_id NOT LIKE '%REP%'GROUP BY job_idHAVING SUM(salary) > 13000
ORDER BY SUM(salary);
7/21/2019 SQL FUNDAMENTOS
91/196
UNIDAD 7MOSTRAR DATOS DE VARIAS TABLAS
7/21/2019 SQL FUNDAMENTOS
92/196
7/21/2019 SQL FUNDAMENTOS
93/196
7/21/2019 SQL FUNDAMENTOS
94/196
7/21/2019 SQL FUNDAMENTOS
95/196
7/21/2019 SQL FUNDAMENTOS
96/196
7/21/2019 SQL FUNDAMENTOS
97/196
7/21/2019 SQL FUNDAMENTOS
98/196
1. SENTENCIA SELECT PARA ACCEDER A DATOS EQUIJOINS Y NONEQUIJOINS
Ejemplo de la misma consulta escrita en SQL ANSI 1999 y la sintxis propia de Oracle
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees eJOIN departments dON (e.department_id = d.department_id);
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idFROM employees e, departments dWHERE e.department_id = d.department_id;
a. Tipos de JOINS
EQUIJOINS: Join sobre dos o ms tablas, por igualdad de campos.
7/21/2019 SQL FUNDAMENTOS
99/196
NATURAL JOINS
SELECT table1.column, table2.columnFROM table1NATURAL JOINtable2;
7/21/2019 SQL FUNDAMENTOS
100/196
SELECT table1.column, table2.columnFROM table1JOINtable2 USING(join_column1, join_column2);
7/21/2019 SQL FUNDAMENTOS
101/196
SELECT table1.column, table2.columnFROM table1JOINtable2 ON(table1.column_name = table2.column_name);
7/21/2019 SQL FUNDAMENTOS
102/196
select r.region_name, c.country_name, l.city, d.department_namefrom departments d
join locations l on (l.location_id=d.location_id)join countries c on (c.country_id=l.country_id)join regions r on (r.region_id=c.region_id);
select r.region_name, c.country_name, l.city, d.department_namefrom departments d
join locations l using (location_id)join countries c using (country_id)join regions r using (region_id);
Query 1: select d.department_name from departments djoin locations l on (l.LOCATION_ID=d.LOCATION_ID)where d.department_name like 'P%'
Query 2: select d.department_name from departments djoin locations l on(l.LOCATION_ID=d.LOCATION_ID and d.department_name like 'P%')
7/21/2019 SQL FUNDAMENTOS
103/196
NONEQUIJOINS
Por desigualdad, sin correspondencia directa entre campos de tablas. La relacin se puedeestablecer mediante criterios de rango (, BETWEEN, ...)
SELECT table1.column, table2.columnFROM table1[JOIN table2 ON (table1.column_name < table2.column_name)]|[JOIN table2 ON (table1.column_name > table2.column_name)]|[JOIN table2 ON (table1.column_name = table2.column_name)]|[JOIN table2 ON (table1.columnBETWEEN table2.col1AND table2.col2)]|
2.UNIENDO UNA TABLA AS MISMA CON SELF-JOIN
a. Uniendo una tabla dentro de s misma usando la clausula JOIN ON
Query 1: select id, name, father_id from family;
Query 2: select name from family where id=&father_id;
Query 3: select f1.name Dad, f2.name Child from family f1 join family f2 on (f1.id=f2.father_id)
7/21/2019 SQL FUNDAMENTOS
104/196
3. VISTA DE DATOS QUE NO CUMPLE CON UNA CONDICIN DE UNIN MEDIANTEOUTER JOINS
a. LEFT OUTER JOINS
SELECT table1.column, table2.columnFROM table1LEFT OUTER JOIN table2ON (table1.column = table2.column);
Query 1: select e.employee_id, e.department_id EMP_DEPT_ID,d.department_id DEPT_DEPT_ID, d.department_namefrom departments dleft outer join employees eon (d.DEPARTMENT_ID=e.DEPARTMENT_ID)
where d.department_name like 'P%'
7/21/2019 SQL FUNDAMENTOS
105/196
b. RIGHT OUTER JOINS
SELECT table1.column, table2.columnFROM table1RIGHT OUTER JOIN table2ON (table1.column = table2.column);
select e.last_name, d.department_name from departments dright outer join employees eon (e.department_id=d.department_id)where e.last_name like 'G%';
7/21/2019 SQL FUNDAMENTOS
106/196
c. FULL OUTER JOINS
SELECT table1.column, table2.columnFROM table1FULL OUTER JOIN table2ON (table1.column = table2.column);
7/21/2019 SQL FUNDAMENTOS
107/196
4. GENERAR UN PRODUCTO CARTESIANO DE 2 O MS TABLAS
a. Creando productos cartesianos con CROSS JOIN
SELECT table1.column, table2.columnFROM table1CROSS JOIN table2;
Query 1: select * from jobs cross join job_history;Query 2: select * from jobs j cross join job_history jhwhere j.job_id='AD_PRES';
7/21/2019 SQL FUNDAMENTOS
108/196
Ejercicios UNIDAD 7
1. Prctica Primer parte
Mostrar department_id, department_name, street_address y city de todos losdepartamentos que se encuentren en la ciudad de Toronto. Usar las tablasDEPARTMENTS Y LOCATIONS, usar NATURAL JOIN para obtener los resultados.
SELECT department_id, department_name, STREET_ADDRESS, cityFROM departmentsNATURAL JOIN locationsWHERE city='Toronto'
Crear una consulta para mostrar nombre de pais y regin de todos los paises. Usar lastablas COUNTRIES y REGIONS, usar NATURAL JOIN para obtener los resultados.
SELECT country_name, region_id, region_nameFROM countries NATURAL JOIN regions;
Crear una consulta para mostrar employee_id, last_name, first_name,department_name de todos los empleados. Usar JOIN USING para obtener losresultados:
SELECT employee_id, last_name, first_name, department_nameFROM employeesJOIN departments USING (department_id);
Buscar apellido, fecha de ingreso, puesto de trabajo actual, el primer puesto en lacompaa junto con la fecha de comienzo y fin en dicho puesto. Usar tablasJOB_HISTORY y EMPLOYEES, usar JOIN ON.
SELECT e.last_name, e.hire_date, e.job_id CURRENT_JOB,j.job_id PREVIOUS_JOB, j.start_date, j.end_date,FROM job_history jJOIN employees eON (j.start_date = e.hire_date AND j.employee_id=e.employee_id);
7/21/2019 SQL FUNDAMENTOS
109/196
Buscar employee_id, last_name, department_id, department_name, manager_id de
todos los empleados cuyo manager sea el 149. Usar tablas EMPLOYEES,DEPARTMENTS y usar JOIN ON para obtener los resultados:
SELECT e.employee_id, e.last_name, e.department_id,d.department_name, e.manager_idFROM employees e JOIN departments dON (e.department_id = d.department_id)WHERE e.manager_id = 149;
Consultar todos los departamentos y mostrar nombre de departamento, ciudad, pas yregin donde se encuentra ubicado. Ordenado por departamento. Usar tablasDEPARTMENTS, LOCATIONS, COUNTRIES, REGIONS, usar JOIN ON:
SELECT d.department_name, l.city, c.country_name, r.region_nameFROM departments dJOIN locations l ON (l.location_id=d.location_id)JOIN countries c ON (c.country_id=l.country_id)JOIN regions r ON (r.region_id=c.region_id)ORDER BY d.department_name;
2. Prctica Segunda parte
Mostrar nombre y apellido de cada empleado y el nombre y apellido de su manager.Usar los alias de tablas worker y manager.
SELECT worker.first_name , worker.last_name ,manager.first_name , manager.last_name
FROM employees workerJOIN employees managerON (worker.manager_id = manager.employee_id);
Obtener el producto cartesiano de las regiones 3 y 4 con todos los paises, ordenar por
regin y pas
SELECT r.region_name, c.country_nameFROM regions rCROSS JOIN countries cWHERE r.region_id IN (3,4)ORDER BY region_name, country_name;
7/21/2019 SQL FUNDAMENTOS
110/196
3. Prctica Tercera parte
Mostrar apellido, department_id, department_name para todos los empleados, mostraraquellos empleados que no tengan departamento asignado tambin.
e rSELECT e.last_name, e.department_id, d.department_name
FROM employees e LEFT OUTER JOIN departments dON (e.department_id = d.department_id);
Mostrar deparment_id, department_name de todos los departamentos y losempleados que pertenecen a cada uno de ellos. Incluir tambin aquellosdepartamentos que no tengan empleados asignados:
SELECT e.department_id, d.department_name, e.last_nameFROM employees e RIGHT OUTER JOIN departments dON (e.department_id = d.department_id);
Mostrar apellido, department_id, department_name para todos los empleados, mostraraquellos empleados que no tengan departamento asignado as como tambin todoslos departamentos que no tengan empleados asignados.
SELECT e.last_name, d.department_id, d.department_nameFROM employees e FULL OUTER JOIN departments dON (e.department_id = d.department_id);
7/21/2019 SQL FUNDAMENTOS
111/196
UNIDAD 8USO DE SUBCONSULTAS
1. DESCRIBIR LOS TIPOS DE PROBLEMAS QUE PUEDEN RESOLVER LASSUBCONSULTAS
7/21/2019 SQL FUNDAMENTOS
112/196
a. El uso de un conjunto de resultados de subconsultas para propsitos decomparacin
7/21/2019 SQL FUNDAMENTOS
113/196
select avg(salary) from employees;select last_name from employees where salary < result_of_previous_query;
select last_name from employeeswhere salary < (select avg(salary)from employees);
select department_name from departments where department_id in(select distinct(department_id) from employees);
select department_name from departments inner join employeeson employees.department_id = departments.department_idgroup by department_name;
b. Transformacin Estrella
select from sales s, products p, buyers b, channels cwhere s.prod_code=p.prod_codeand s.buy_code=b.buy_codeand s.chan_code=c.chan_codeand p.product=Booksand b.country=Germanyand c.channel=Internet;
c. Generando una tabla con subconsultas SELECT
select avg(salary),country_id from(select salary,department_id,location_id,country_id fromemployees natural join departments natural join locations)
group by country_id;d. Generar valores de proyeccin
7/21/2019 SQL FUNDAMENTOS
114/196
select
(select max(salary) from employees) *(select max(commission_pct) from employees) / 100
from dual;
e. Generando filas para ser pasadas a sentencias DML
insert into dates select sysdate from dual;
2. LISTAR LOS TIPOS DE SUBCONSULTAS
Single-row subqueries Multiple-row subqueries Correlated subqueries
7/21/2019 SQL FUNDAMENTOS
115/196
Subconsultas correlacionadas
select p.last_name, p.department_idfrom employees pwhere p.salary < (select avg(s.salary) from employees s
where s.department_id=p.department_id);
7/21/2019 SQL FUNDAMENTOS
116/196
3. ESCRIBIR CONSULTAS DE MLTIPLES Y NICAS FILAS
select last_name from employeeswhere manager_id in(select employee_id from employees where department_id in(select department_id from departments where location_id in
(select location_id from locations where country_id=UK)));
select job_title from jobs natural join employees group by job_titlehaving avg(salary) =(select max(avg(salary)) from employees group by job_id);
select last_name from employees where salary > all(select salary from employees where department_id=80);select last_name from employees where salary >(select max(salary) from employees where department_id=80);
7/21/2019 SQL FUNDAMENTOS
117/196
7/21/2019 SQL FUNDAMENTOS
118/196
7/21/2019 SQL FUNDAMENTOS
119/196
Ejercicios UNIDAD 8
1. Prctica Primer parte
Escribir un query que use subqueries en la lista de columnas del select. El query debereportar la fecha de hoy, el nmero total de departamentos y el nmero total deempleados:
SELECT sysdate Today,(SELECT COUNT(*) FROM departments) Dept_count,(SELECT COUNT(*) FROM employees) Emp_count
FROM dual;
Escribir una query que use subqueries en la lista de columnas del select. Identificar elmximo salario y la mxima comisin de todos los empleados.
SELECT (SELECT MAX(salary) FROM employees) "Max Salary" ,(SELECT MAX(commission_pct) FROM employees) "Max Commission"
FROM dual;
Buscar apellido, job y salario de todos los empleados cuyo salario sea igual al salariomnimo. Usar subquery en el WHERE.
SELECT last_name, job_id, salaryFROM employees
WHERE salary =(SELECT MIN(salary)FROM employees);
Buscar el apellido y job de los empleados que tengan el mismo job que el empleado141. Usar subquery en el WHERE:
SELECT last_name, job_idFROM employeesWHERE job_id =
(SELECT job_idFROM employeesWHERE employee_id = 141);
7/21/2019 SQL FUNDAMENTOS
120/196
Buscar apellido, job y salario de todos los empleados que tengan el mismo job que elempleado de apellido Taylor y salario mayor a Taylor. Usar subqueries en el WHERE,evaluar el porqu del error de esta query.
SELECT last_name, job_id, salaryFROM employees
WHERE job_id =(SELECT job_idFROM employeesWHERE last_name = 'Taylor')
AND salary >(SELECT salaryFROM employeesWHERE last_name = 'Taylor');
Consultar apellido, nombre y salario de todos los empleados cuyo salario es mayorque el del empleado con apellido Abel, usar subquery en WHERE.
SELECT last_name, first_name, salaryFROM employeesWHERE salary >
(SELECT salaryFROM employeesWHERE last_name = 'Abel');
Buscar los apellidos de todos los empleados que tengan un salario mayor al salariopromedio general, usar subquery en el WHERE
SELECT last_nameFROM employeesWHERE salary < (SELECT AVG(salary) FROM employees);
Buscar el salario mnimo de aquellos departamentos que tengan el salario mnimomayor al del departamento 50. Usar suquery en HAVING.
SELECT department_id, MIN(salary)FROM employeesGROUP BY department_idHAVING MIN(salary) >
(SELECT MIN(salary)FROM employeesWHERE department_id = 50);
7/21/2019 SQL FUNDAMENTOS
121/196
2. Prctica Segunda parte
Escribir un query que muestre el apellido y nombre de todos los empleados que seanmanagers. Usar operador IN.
SELECT last_nameFROM employeesWHERE (employee_id IN (SELECT manager_id FROM employees));
Mostrar el employee_id, apellido, job y salario de todos los empleados que no seanIT_PROG y a su vez que sus salarios sean menores a los salario del puestoIT_PROG. Utilizar operador ANY .
SELECT employee_id, last_name, job_id, salaryFROM employees
WHERE salary < ANY(SELECT salaryFROM employeesWHERE job_id = 'IT_PROG')
AND job_id 'IT_PROG';
Mostrar el employee_id, apellido, job y salario de todos los empleados que no seanST_CLERK y a su vez que sus salarios sean mayores a los salario del puestoST_CLERK. Utilizar operador ALL .
SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary > ALL
(SELECT salaryFROM employeesWHERE job_id = 'ST_CLERK')
AND job_id 'ST_CLERK;
Obtener un subquery en el FROM obteniendo los campos salary, department_id,location_id y country_id haciendo natural join entre employees , departments,
locations. A partir de ese subquery obtener salario mximo por pais.
SELECT MAX(salary),country_idFROM (SELECT salary,department_id, location_id,country_id
FROM employeesNATURAL JOIN departmentsNATURAL JOIN locations)
GROUP BY country_id;
7/21/2019 SQL FUNDAMENTOS
122/196
Mostrar department_id, apellido y salario de todos los empleados cuyo salario seamayor al salario promedio del departamento al cual pertenecen. Usar correlatedsubquery.
SELECT department_id, last_name, salaryFROM employees x
WHERE salary > (SELECT AVG(salary)FROM employeesWHERE x.department_id = department_id)
ORDER BY department_id;
7/21/2019 SQL FUNDAMENTOS
123/196
UNIDAD 9USANDO OPERADORES DE CONJUNTO
1. DESCRIBIR LOS OPERADORES DE CONJUNTO
UNION Returns the combined rows from two queries, sorting them and removingduplicates.
UNION ALL Returns the combined rows from two queries without sorting or removingduplicates.
INTERSECT Returns only the rows that occur in both queries result sets, sorting them andremoving duplicates.
MINUS Returns only the rows in the first result set that do not appear in the second resultset, sorting them and removing duplicates.
2. UTILIZAR UN OPERADOR DE CONJUNTO PARA COMBINAR VARIAS CONSULTASEN UNA SOLA CONSULTA
a. Operador UNION ALL
7/21/2019 SQL FUNDAMENTOS
124/196
b. Operador UNION
c. Operador INTERSECT Y MINUS
7/21/2019 SQL FUNDAMENTOS
125/196
3. CONTROLAR EL ORDEN DE LAS FILAS DEVUELTAS
select department_id dept,to_number(null) mgr,sum(salary)from employeesgroup by department_idunion all
select to_number(null),manager_id,sum(salary) from employeesgroup by manager_idunion allselect to_number(null),to_number(null),sum(salary) fromemployees;
select department_id dept,to_number(null) mgr,sum(salary)from employeesgroup by department_idunionselect to_number(null),manager_id,sum(salary) from employees
group by manager_idunion allselect to_number(null),to_number(null),sum(salary) fromemployees;
select 20,count(1) from employees where department_id=20union allselect 30,count(1) from employees where department_id=30union allselect 40,count(1) from employees where department_id=40;
select manager_id from employees where department_id=20intersectselect manager_id from employees where department_id=30minusselect manager_id from employees where department_id=40;
select department_id dept,to_number(null) mgr,sum(salary)from employeesgroup by department_idunion
select to_number(null),manager_id,sum(salary) from employeesgroup by manager_idunion allselect to_number(null),to_number(null),sum(salary) fromemployees;
7/21/2019 SQL FUNDAMENTOS
126/196
Ejercicios UNIDAD 9
1. Prctica Primer parte
Ejecute el siguiente query para comprobar el funcionamiento del operador UNION.Que se observa? Cuantas veces se repite cada regin?
SELECT region_nameFROM regionsUNIONSELECT region_nameFROM regions;
Ahora ejecute el mismo query con UNION ALL para comprobar el funcionamiento deeste operador
SELECT region_nameFROM regionsUNION ALLSELECT region_nameFROM regions;
Listar los empleados y puestos de trabajo actuales junto con los empleados y puestodel historial. Usar operador UNION para no mostrar filas repetidas, evitando mostraraquellos empleados que actualmente tengan un puesto que hayan ocupado en elpasado.
SELECT employee_id, job_idFROM employeesUNIONSELECT employee_id, job_idFROM job_history;
Mostrar los employee_id de los empleados que actualmente son SA_MAN junto conlos que en el pasado fueron SA_REP(utilizo UNION por si empleados estuvieron enambos puestos de trabajo):
SELECT employee_idFROM employeesWHERE job_id in ('SA_MAN')UNIONSELECT employee_idFROM job_historyWHERE job_id in ('SA_REP');
7/21/2019 SQL FUNDAMENTOS
127/196
Mostrar department_id, department_name, city de los departamentos que estn enToronto y los que estn en Seattle. Usar operador de conjuntos(conveniente usarUNION ALL ya que no hay departamentos que estn en ambas ciudades a la vez, seevita el ordenamiento)
SELECT department_id, department_name, cityFROM departmentsNATURAL JOIN locationsWHERE city='Toronto'UNION ALLSELECT department_id, department_name, cityFROM departmentsNATURAL JOIN locationsWHERE city='Seattle';
Mostrar en un mismo query department_id, deparment_name del departamento 80junto con employee_id, last_name de los empledos que pertenezcan al departamento80. Usar operadores de conjunto.
SELECT department_id, department_nameFROM departmentsWHERE department_id =80UNION ALLSELECT employee_id, last_nameFROM employees
WHERE department_id =80;
2. Prctica Segunda parte
Mostrar employee_id y job_id de aquellos empleados que tienen actualmente unpuesto de trabajo que ya han tenido en el pasado.
SELECT employee_id, job_idFROM employeesINTERSECT
SELECT employee_id, job_idFROM job_history;
7/21/2019 SQL FUNDAMENTOS
128/196
Crear un reporte que liste los employee_id y job_id de los empleados cuyo trabajoactual coincide con el puesto de trabajo que tuvieron cuando entraron a la compaa.
SELECT employee_id, job_idFROM employeesINTERSECT
SELECT e.employee_id, j.job_idFROM job_history jJOIN employees eON (j.start_date = e.hire_date AND j.employee_id=e.employee_id);
Listar los departamentos que no contengan el puesto de trabajo(job_id) ST_CLERK.Usar operadores de conjunto para realizar este reporte.
SELECT department_idFROM departments
MINUSSELECT department_idFROM employeesWHERE job_id='ST_CLERK';
Mostrar el nombre de aquellos paises donde no haya departamentos de la compaa.
SELECT country_nameFROM countriesMINUSSELECT country_nameFROM departmentsNATURAL JOIN locationsNATURAL JOIN countries;
Mostrar los employee_id de aquellos empleados que no han cambiado nunca supuesto de trabajo:
SELECT employee_id
FROM employeesMINUSSELECT employee_idFROM job_history;
7/21/2019 SQL FUNDAMENTOS
129/196
Mostrar los employee_id de aquellos empleados que han trabajado en el pasado tantoen SA_REP como en SA_MAN
SELECT employee_idFROM job_historyWHERE job_id='SA_REP'
INTERSECTSELECT employee_idFROM job_historyWHERE job_id='SA_MAN';
3. Prctica Tercer parte
Mostrar employee_id , job_id y salarios actuales de los empleados junto con lospuestos que tuvieron en el pasado. Como job_history no guarda salarios pasados usarcolumna dummy en cero(literal 0) para poder unir ambas tablas. Usar UNION, el
reporte saldr ordenado
SELECT employee_id, job_id,salaryFROM employeesUNIONSELECT employee_id, job_id,0FROM job_history;
Ejecutar el siguiente query y evaluar como participan las columnas dummy.
SELECT location_id, department_name "Department", TO_CHAR(NULL) "Warehouselocation"FROM departmentsUNIONSELECT location_id, TO_CHAR(NULL) "Department", state_provinceFROM locations;
7/21/2019 SQL FUNDAMENTOS
130/196
UNIDAD 10MANIPULACIN DE DATOS (DML)
SELECT INSERT UPDATE DELETE MERGE
1. INSERTAR FILAS EN UNA TABLA
insert into hr.regions values (10,'Great Britain');insert into hr.regions (region_name, region_id) values ('Australasia',11);
7/21/2019 SQL FUNDAMENTOS
131/196
insert into hr.regions (region_id) values (12);insert into hr.regions values (13,null);
7/21/2019 SQL FUNDAMENTOS
132/196
7/21/2019 SQL FUNDAMENTOS
133/196
7/21/2019 SQL FUNDAMENTOS
134/196
insert into employees (employee_id, last_name, hire_date)values (1000,'WATSON','03-Nov-07');
insert into employees (employee_id, last_name, hire_date)values (1000,upper('Watson'),to_date('03-Nov-07','dd-mon-yy'));
insert into employees (employee_id,last_name,hire_date)values (1000 + 1,user,sysdate - 7);
INSERT INTO table [ (column [, column] ) ] subquery;
insert into regions_copy select * from regions;
truncate table department_salaries;insert into department_salaries (department,staff,salaries)select coalesce(department_name,'Unassigned'),
count(employee_id),sum(coalesce(salary,0))
from employees e full outer join departments don e.department_id = d.department_id
group by department_nameorder by department_name;insert allwhen 1=1 theninto emp_no_name (department_id,job_id,salary,commission_pct,hire_date)values (department_id,job_id,salary,commission_pct,hire_date)when department_id 80 theninto emp_non_sales (employee_id,department_id,salary,hire_date)values (employee_id,department_id,salary,hire_date)
7/21/2019 SQL FUNDAMENTOS
135/196
when department_id = 80 theninto emp_sales (employee_id,salary,commission_pct,hire_date)values (employee_id,salary,commission_pct,hire_date)select employee_id,department_id,job_id,salary,commission_pct,hire_datefrom employees where hire_date > sysdate - 30;
7/21/2019 SQL FUNDAMENTOS
136/196
2. ACTUALIZAR FILAS EN UNA TABLA
UPDATEtable SETcolumn=value [,column=value] [WHERE condition];
7/21/2019 SQL FUNDAMENTOS
137/196
7/21/2019 SQL FUNDAMENTOS
138/196
7/21/2019 SQL FUNDAMENTOS
139/196
3. BORRAR FILAS EN UNA TABLA
a. Removiendo filas con DELETE
7/21/2019 SQL FUNDAMENTOS
140/196
delete from employees where employee_id=206;delete from employees where last_name like 'S%';delete from employees where department_id=&Which_department;delete from employees where department_id is null;
7/21/2019 SQL FUNDAMENTOS
141/196
delete from employees where department_id in(select department_id from departments where location_id in(select location_id from locations where country_id in(select country_id from countries where region_id in(select region_id from regions where region_name='Europe'))))
b.Removiendo filas con TRUNCATE
TRUNCATE TABLE table;
c. MERGE
7/21/2019 SQL FUNDAMENTOS
142/196
7/21/2019 SQL FUNDAMENTOS
143/196
MERGE INTO employees e using new_employees non (e.employee_id = n.employee_id)when matched thenupdate set e.salary=n.salarywhen not matched theninsert (employee_id,last_name,salary)
values (n.employee_id,n.last_name,n.salary);
7/21/2019 SQL FUNDAMENTOS
144/196
4. CONTROL DE TRANSACCIONES
7/21/2019 SQL FUNDAMENTOS
145/196
a. Declaraciones de control de transacciones
COMMIT
COMMIT;
ROLLBACK
7/21/2019 SQL FUNDAMENTOS
146/196
ROLLBACK[TOSAVEPOINTsavepoint] ;
SAVEPOINT
SAVEPOINT savepoint;
7/21/2019 SQL FUNDAMENTOS
147/196
AUTOCOMMIT
SET AUTOCOMMIT ON
SET AUTOCOMMIT OFF
7/21/2019 SQL FUNDAMENTOS
148/196
7/21/2019 SQL FUNDAMENTOS
149/196
7/21/2019 SQL FUNDAMENTOS
150/196
7/21/2019 SQL FUNDAMENTOS
151/196
7/21/2019 SQL FUNDAMENTOS
152/196
7/21/2019 SQL FUNDAMENTOS
153/196
Ejercicios UNIDAD 10
1. Prctica Primer parte
Haga un query de la tabla REGIONES para verificar que valores estn usados en lacolumna REGION_ID
SELECT * FROM regions;
Inserte una fila en la tabla REGIONS, proporcionando los valores 101, Great Britain.
INSERT INTO regions VALUES (101,'Great Britain');
Inserte una fila en la tabla REGIONS, proporcionando los valores como variables desustitucin
INSERT INTO regions VALUES (&Region_number,'&Region_name');
Al solicitar el valor, ingrese 102 para el numrico, Australia para el nombre. Usar comillasen el ingreso del string.
Inserte una fila en la tabla REGIONS, calculando la REGION_ID como un valor msalto que el valor ms alto actual. Usar subquery en clusula values.
INSERT INTO regions VALUES ((SELECT MAX(region_id)+1 FROM regions), 'Oceania');
Confirmar la insercin de las filas.
SELECT * FROM regions;
Hacer commit.COMMIT;
2. Prctica Segunda parte
Modifique la columna region_name de fila de regions con region_id=101, actualizar
con Scandinavia:
UPDATE regionsSET region_name='Scandinavia'WHERE region_id=101;
Devolver el mensaje 1 row updated
7/21/2019 SQL FUNDAMENTOS
154/196
Modifique la columna region_name de la tabla regions de aquellas filas con region_idmayor a 100. Setear region_name igual a Iberia
UPDATE regions SET region_name='Iberia' WHERE region_id > 100;
Devolver el mensaje 3rows updated
Ejecutar el siguiente update con subqueries y analizar que realiza.
UPDATE regionsSET region_id=(region_id+(SELECT MAX(region_id) FROM regions))WHERE region_id IN (SELECT region_id
FROM regionsWHERE region_id > 100);
Devolver el mensaje 3 rows updated
Confirmar el estado de las filas.
SELECT * FROM regions;
Hacer commit.
COMMIT;
3. Prctica Tercer parte
Borrar de regions la fila con region_id = 204:
DELETE FROM regions WHERE region_id=204;
Devolver el mensaje 1 row deleted
Intentar borrar todas las filas de la tabla regions , que ocurre?
DELETE FROM regions;
Dar error, debido a una violacin de constraints.
Borrar filas ejecutando el siguiente delete con subqueries:
7/21/2019 SQL FUNDAMENTOS
155/196
DELETE FROM regionsWHERE region_id IN (SELECT region_id FROM regions
WHERE region_name='Iberia');
Devolver el mensaje 2 rows deleted
Confirmar que la tabla REGIONS contiene las 4 filas originales.
SELECT * FROM regions;
Hacer commit.
COMMIT;
4. Prctica Cuarta parte
Conectar dos sesiones concurrentemente con usuario HR. La siguiente tabla lista los pasos aseguir en cada sesin:
Paso En su primera sesin En su segunda sesin
1 select * from regions; select * from regions;
2 insert into regions insert into regions
values(100,'UK'); values(101,'GB');
3 select * from regions; select * from regions;
Ambas sesiones ven datos diferentes: los datos originales ms suspropios cambios
4 commit;
5 select * from regions; select * from regions;
La transaccin de la sesin 1 public los datos para todos, la otratransaccin
sigue siendo visible para la sesion 2 nicamente
6 rollback; rollback;
7 select * from regions; select * from regions;
7/21/2019 SQL FUNDAMENTOS
156/196
En la primer session no hay nada para rollbackear, la segunda session sihar rollback ya que no se haba ejecutado commit hasta el momento
8 delete from regions where delete from regions where
region_id=100; region_id=101;
9 select * from regions; select * from regions;
Cada fila borrada sigue estando visible en la session contraria
10 commit; commit;
11 select * from regions; select * from regions;
Transacciones finalizadas, ambas sesiones ahora tienen una lecturaconsistente de la tabla
Conectar 2 sesiones concurrentes, ejecutar en cada una de ellas el siguiente select forupdate:
SELECT * FROM regionsWHERE region_id=2FOR UPDATE;
7/21/2019 SQL FUNDAMENTOS
157/196
UNIDAD 11USO DE SENTENCIAS DDL PARA CREAR Y GESTIONAR TABLAS
1. CLASIFICAR OBJETOS DE LA BASE DE DATOS PRINCIPAL
a. Tipos de Objetos
SQL> select object_type,count(object_type) from dba_objects
b. Usuarios y esquemas
7/21/2019 SQL FUNDAMENTOS
158/196
A user is a person who can connect to the database.
The user will have a username and a password. A schema is a container for the objectsowned by a user.
When a user is created, their schema is created too.
A schema is the objects owned by a user; initially, i t will be empty
c. Nombrar objetos de esquema
d. Espacio de nombres de objetos
Tables Views Sequences Private synonyms
7/21/2019 SQL FUNDAMENTOS
159/196
2. ENUMERAR LOS TIPOS DE DATOS QUE ESTN DISPONIBLES PARA LASCOLUMNAS
a. VARCHAR2
Variable-length character data, from 1 byte to 4KB. The data is stored in the databasecharacter set.
b. NVARCHAR2
Like VARCHAR2, but the data is stored in the alternative national language character set, oneof the permitted Unicode character sets.
c. CHAR
Fixed-length character data, from 1 byte to 2KB, in the database character set. If the data isnot the length of the column, then it will be padded with spaces.
d. RAW
Variable-length binary data, from 1 byte to 4KB. Unlike the CHAR and VARCHAR2 datatypes, RAW data is not converted by Oracle Net from the databases character set to the userprocesss character set on SELECT or the other way on INSERT.
7/21/2019 SQL FUNDAMENTOS
160/196
e. NUMBER
Numeric data, for which you can specify precision and scale.The precision can range from to 1 to 38, the scale can range from 84 to 127.
f. FLOAT
This is an ANSI data type, floating-point number with precision of 126 binary (or 38 decimal).Oracle also provides BINARY_FLOAT and BINARY_DOUBLE as alternatives.
g. INTEGER
Equivalent to NUMBER, with scale zero.
h. DATE
This is either length zero, if the column is empty, or 7 bytes. All DATE data includes century,year, month, day, hour, minute, and second.The valid range is from January 1, 4712 BC to December 31, 9999 AD.
i. TIMESTAMP
This is length zero if the column is empty, or up to 11 bytes, depending on the precisionspecified. Similar to DATE, but with precision of up to 9 decimal places for the seconds, 6places by default.
j. TIMESTAMP WITH TIMEZONE
Like TIMESTAMP, but the data is stored with a record kept of the time zone to which it refers.The length may be up to 13 bytes, depending on precision. This data type lets Oracledetermine the difference between two times by normalizing them to UTC, even if the timesare for different time zones.
k.TIMESTAMP WITH LOCAL TIMEZONE
Like TIMESTAMP, but the data is normalized to the database time zone on saving. Whenretrieved, it is normalized to the time zone of the user process selecting it.
l. INTERVAL YEAR TO MONTH
Used for recording a period in years and months between two DATEs or TIMESTAMPs.
m. INTERVAL DAY TO SECOND
Used for recording a period in days and seconds between two DATEs or TIMESTAMPs.
n. CLOB
Character data stored in the database character set, size effectively unlimited: 4GB multipliedby the database block size.
o. NCLOB
Like CLOB, but the data is stored in the alternative national language character set, one ofthe permitted Unicode character sets.
7/21/2019 SQL FUNDAMENTOS
161/196
p. BLOB
Like CLOB, but binary data that will not undergo character set conversion by Oracle Net.
q. BFILE
A locator pointing to a file stored on the operating system of the database server. The size ofthe files is limited to 4GB.
r. LONG
Character data in the database character set, up to 2GB. All the functionality of LONG (andmore) is provided by CLOB; LONGs should not be used in a modern database, and if yourdatabase has any columns of this type they should be converted to CLOB. There can only beone LONG column in a table.
s. LONG RAW
Like LONG, but binary data that will not be converted by Oracle Net. Any LONG RAWcolumns should be converted to BLOBs.
t. ROWIDA value coded in base 64 that is the pointer to the location of a row in a table. Encrypted.Within it is the exact physical address. ROWID is an Oracle proprietary data type, not visibleunless specifically selected.
7/21/2019 SQL FUNDAMENTOS
162/196
7/21/2019 SQL FUNDAMENTOS
163/196
7/21/2019 SQL FUNDAMENTOS
164/196
7/21/2019 SQL FUNDAMENTOS
165/196
3. CREANDO UNA TABLA SIMPLE
7/21/2019 SQL FUNDAMENTOS
166/196
7/21/2019 SQL FUNDAMENTOS
167/196
a. Creacin de tablas con columnas especificadas
CREATE TABLE[schema.]table [ORGANIZATION HEAP]
(column datatype [DEFAULT expression][,column datatype [DEFAULT expression]);
CREATE TABLE SCOTT.EMP(EMPNO NUMBER(4),ENAME VARCHAR2(10),HIREDATE DATE DEFAULT TRUNC(SYSDATE),SAL NUMBER(7,2),COMM NUMBER(7,2) DEFAULT 0.03);
7/21/2019 SQL FUNDAMENTOS
168/196
b. Creacin de tablas con subconsultas
CREATE TABLE [schema.]tableAS subquery;
create table employees_copy as select * from employees;
create table emp_dept asselect last_name ename,department_name dname,round(sysdate hire_date) servicefrom employees natural join departments order by dname,ename;
7/21/2019 SQL FUNDAMENTOS
169/196
c. Alterar las tablas despus de creadas
7/21/2019 SQL FUNDAMENTOS
170/196
Adding columns:
Modifying columns:
Dropping columns:
7/21/2019 SQL FUNDAMENTOS
171/196
Marking columns as unused:
Renaming columns:
alter table emp rename column hiredate to recruited;
7/21/2019 SQL FUNDAMENTOS
172/196
Marking the table as read-only:
alter table emp read only;
ALTER TABLE tablename DROP UNUSED COLUMNS;
d. Quitar y Truncar tablas
DROP TABLE[schema.]tablename ;
7/21/2019 SQL FUNDAMENTOS
173/196
7/21/2019 SQL FUNDAMENTOS
174/196
4. EXPLICAR CONSTRAINTS EN EL TIEMPO DE CREACIN DE LA TABLA
7/21/2019 SQL FUNDAMENTOS
175/196
7/21/2019 SQL FUNDAMENTOS
176/196
7/21/2019 SQL FUNDAMENTOS
177/196
7/21/2019 SQL FUNDAMENTOS
178/196
7/21/2019 SQL FUNDAMENTOS
179/196
7/21/2019 SQL FUNDAMENTOS
180/196
7/21/2019 SQL FUNDAMENTOS
181/196
7/21/2019 SQL FUNDAMENTOS
182/196
7/21/2019 SQL FUNDAMENTOS
183/196
7/21/2019 SQL FUNDAMENTOS
184/196
7/21/2019 SQL FUNDAMENTOS
185/196
1 create table dept(2 deptno number(2,0) constraint dept_deptno_pk primary key3 constraint dept_deptno_ck check (deptno between 10 and 90),4 dname varchar2(20) constraint dept_dname_nn not null);5 create table emp(6 empno number(4,0) constraint emp_empno_pk primary key,
7 ename varchar2(20) constraint emp_ename_nn not null,8 mgr number (4,0) constraint emp_mgr_fk references emp (empno),9 dob date,10 hiredate date,11 deptno number(2,0) constraint emp_deptno_fk references dept(deptno)12 on delete set null,13 email varchar2(30) constraint emp_email_uk unique,14 constraint emp_hiredate_ck check (hiredate >= dob + 365*16),15 constraint emp_email_ck16 check ((instr(email,'@') > 0) and (instr(email,'.') > 0)));
7/21/2019 SQL FUNDAMENTOS
186/196
Ejercicios UNIDAD 11
1. Prctica Primer parte
Crear la tabla DEPT con las siguientes caractersticas: id NUMBER(7), name VARCHAR2(25)
CREATE TABLE dept(id NUMBER(7),name VARCHAR2(25));
DESCRIBE dept
Llenar la tabla DEPT a partir de la tabla DEPARTMENTS con las columnasnecesarias
INSERT INTO deptSELECT department_id, department_nameFROM departments;
COMMIT;
Crear la tabla EMP con las siguientes caractersticas:
id NUMBER(7) last_name VARCHAR2(25) first_name VARCHAR2(25) dept_id NUMBER(7)
CREATE TABLE emp(id NUMBER(7),
last_name VARCHAR2(25),first_name VARCHAR2(25),dept_id NUMBER(7));
DESCRIBE emp
7/21/2019 SQL FUNDAMENTOS
187/196
Llenar tabla EMP a partir de la tabla EMPLOYEES:
INSERT INTO EMPSELECT employee_id, last_name, first_name, department_idFROM employees;
COMMIT;
Confirmar en la tabla USER_TABLES del diccionario de datos existen las 2 tablascreadas recientemente: DEPT y EMP
SELECT table_nameFROM user_tablesWHERE table_name IN ('DEPT', 'EMP');
2. Prctica Segunda parte
Modificar la tabla EMP para que permita apellidos de hasta 50 caracteres, confirmar elcambio verificando la estructura de la tabla
ALTER TABLE empMODIFY (last_name VARCHAR2(50));
DESCRIBE emp
Crear la tabla emp2 basada en la estructura de EMPLOYEES, incluir las columnasEMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY y DEPARTMENT_ID. Losnombres de las columnas deben ser ID, FIRST_NAME, LAST_NAME, SALARY , yDEPT_ID, respectivamente.
CREATE TABLE emp2 ASSELECT employee_id id, first_name, last_name, salary, department_id dept_id
FROM employees;
7/21/2019 SQL FUNDAMENTOS
188/196
Agregar la columna job_id del tipo VARCHAR2 longitud 9 en la tabla EMP2, confirmarcambio con el comando DESCRIBE, notar que la columna queda ltima en ladefinicin de la tabla
ALTER TABLE emp2
ADD (job_id VARCHAR2(9));
DESCRIBE emp2
Borrar la columna first_name de la tabla EMP2, confirmar el cambio verificando laestructura de la tabla
ALTER TABLE emp2
DROP COLUMN FIRST_NAME;
DESCRIBE emp2
Borrar la tabla EMP2
DROP TABLE emp2;
3. Prctica Tercera parte
Crear primary key llamada my_emp_id_pk en la tabla EMP sobre la columa ID.
ALTER TABLE emp ADD CONSTRAINT my_emp_id_pk PRIMARY KEY (id);
Crear primary key llamada my_dept_id_pk en la tabla DEPT sobre la columa ID.
ALTER TABLE dept ADD CONSTRAINT my_dept_id_pk PRIMARY KEY(id);
Crear una FK en la tabla EMP que asegure que los empleados no pueden asignarse adepartamentos no existentes, la FK debe llamarse my_emp_dept_id_fk.
ALTER TABLE empADD CONSTRAINT my_emp_dept_id_fk FOREIGN KEY (dept_id)REFERENCES dept(id);
7/21/2019 SQL FUNDAMENTOS
189/196
UNIDAD 12CREACIN DE OTROS OBJETOS DE ESQUEMA
1. CREANDO VISTAS COMPLEJAS Y SIMPLES
a. Porque usar una vista
Security. Simplifying user SQL. Preventing error. Making data comprehensible. Table and column names are often long and prettymeaningless. The view and its columns can be much more obvious. Performance.
Vistas para reforzar la seguridad
create view hr.emp_fin as selecthire_date,job_id,salary,commission_pct,department_id from hr.employees;
select * from emp_fin where department_id=50;
select department_name, sum(salary) from departments natural join emp_fingroup by department_name;
Vistas para simplificar usuarios SQL
create view dept_sal asselect d.department_name, sum(e.salary) fromdepartments d left outer join employees e on d.department_id=e.department_idgroup by department_name order by department_name;
select * from dept_sal;
Vistas para prevenir errores
create table emp(empno number constraint emp_empno_pk primary key,ename varchar2(10),deptno number,active varchar2(1) default 'Y');
create view current_staff as select * from emp where active='Y';
7/21/2019 SQL FUNDAMENTOS
190/196
Vistas para mejorar el rendimiento
create view dept_emp asselect /*+USE_HASH (employees departments)*/ department_name, last_namefrom departments natural join employees;
b. Vistas simples y complejas
c. Crear Vistas, Alterar Vistas, y Quitar Vistas
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW[schema.]viewname [(alias [,alias])]
AS subquery[WITH CHECK OPTION [CONSTRAINT constraintname]][WITH READ ONLY [CONSTRAINT constraintname]] ;
OR REPLACE If the view already exists, it will be dropped before being created. FORCE or NOFORCE The FORCE keyword will create the view even if the detail table(s)in the subquery does not exist. NOFORCE is the default and will cause an error if the detailtable does not exist. WITH CHECK OPTION This is to do with DML. If the subquery includes a WHERE clause,then this option will prevent insertion of rows that wouldnt be seen in the view or updates thatwould cause a row to disappear from the view. By default, this option is not enabled, whichcan give disconcerting results. WITH READ ONLY Prevents any DML through the view. CONSTRAINT constraintname This can be used to name the WITH CHECK OPTION andWITH READ ONLY restrictions so that error messages when the restrictions causestatements to fail, will be more comprehensible.
DROP VIEW [schema.]viewname ;
7/21/2019 SQL FUNDAMENTOS
191/196
2. RECUPERAR DATOS DESDE VISTAS
create view dept_emp asselect department_name, last_name fromdepartments join employees using (department_id);
select * from dept_emp where department_name='Marketing';
select * from(select department_name, last_namefrom departments join employees using (department_id))
where department_name='Marketing';
3. CREAR SINNIMOS PRIVADOS Y PBLICOS
select * from hr.employees@prod;
create public synonym emp forhr.employees@prod;
select * from emp;
CREATE [PUBLIC] SYNONYM synonym FOR object ;
DROP [PUBLIC] SYNONYM synonym ;ALTER SYNONYM synonym COMPILE;
4. CREAR MANTENER Y USAR SECUENCIAS
a. Creacin de secuencias
CREATE SEQUENCE [schema.]sequencename[INCREMENT BY number][START WITH number][MAXVALUE number | NOMAXVALUE][MINVALUE number | NOMINVALUE][CYCLE | NOCYCLE][CACHE number | NOCACHE]
[ORDER | NOORDER];
CREATE sequence seq1;
mailto:hr.employees@prodmailto:hr.employees@prodmailto:hr.employees@prodmailto:hr.employees@prod7/21/2019 SQL FUNDAMENTOS
192/196
b. Usando secuencias
create sequence order_seq start with 10;create sequence line_seq start with 10;
insert into orders (order_number,order_date,customer_number)values (order_seq.nextval,sysdate,'1000');insert into order_lines (order_number,line_number,item_number,quantity)values (order_seq.currval,line_seq.nextval,'A111',1);insert into order_lines (order_number,line_number,item_number,quantity)values (order_seq.currval,line_seq.nextval,'B111',1);commit;
ALTER SEQUENCE sequencename[INCREMENT BY number][START WITH number][MAXVALUE number | NOMAXVALUE][MINVALUE number | NOMINVALUE][CYCLE | NOCYCLE][CACHE number | NOCACHE][ORDER | NOORDER] ;
alter sequence order_seq cache 1000;
drop sequence order_seq;
5. CREAR Y MANTENER INDICES
a. Creando y usando ndices
CREATE [UNIQUE | BITMAP] INDEX [ schema.]indexnameON [schema.]tablename (column [, column] ) ;
7/21/2019 SQL FUNDAMENTOS
193/196
7/21/2019 SQL FUNDAMENTOS
194/196
Ejercicios UNIDAD 12
1. Prctica Primer parte
Crear la vista EMPLOYEES_VU basada en las columnas employee_id, last_name, y
department_id de la tabla employees. La vista debe tener los nombres de columnanro_empleado, apellido y nro_departamento respectivamente(usar alias)
CREATE OR REPLACE VIEW employees_vu ASSELECT employee_id nro_empleado,
last_name apellido,department_id nro_departamento
FROM employees;
Mostrar la vista EMPLOYEES_VU con todas sus columnas, luego volver a mostrar lavista pero solo las columnas de nro de empleado y apellido:
SELECT * FROM employees_vu;
SELECT nro_empleado, apellido FROM employees_vu;
Consultar las vistas que tiene el esquema, usar la vista del diccionario de datosUSER_VIEWS para realizar este chequeo. Notar que el esquema ya tiene una vistacreada con anterioridad:
SELECT view_name, text FROM user_views;
Crear una vista llamada DEPT50 que contenga las columnas employee_id, last_name,y department_id de todos los empleados del departamento 50. Los nombres decolumna deben ser EMPNO, EMPLOYEE, DEPTNO respectivamente. No permitir queun empleado sea reasignado a otro departamento cuando se realizan DMLs sobre lavista.
CREATE VIEW dept50 AS
SELECT employee_id empno, last_name employee,department_id deptno
FROM employeesWHERE department_id = 50WITH CHECK OPTION CONSTRAINT emp_dept_50;
7/21/2019 SQL FUNDAMENTOS
195/196
Ver la estructura de la vista creada en el punto anterior y su contenido
DESCRIBE dept50
SELECT * FROM dept50;
Intentar actualizar a travs de la vista dept50 el empleado Matos para asignarlo aldepartamento 80, que ocurre?
UPDATE dept50SET deptno = 80WHERE employee = 'Matos';
3. Prctica Segunda parte
Crear un sinnimo llamado vista_empleados para la vista employees_vu .
CREATE SYNONYM vista_empleados FOR employees_vu;
Crear un sinnimo llamado vista_depto50 para la vista dept50.
CREATE SYNONYM vista_depto50 FOR dept50;
Ver la estructura de ambas vistas usando los sinnimos.
DESCRIBE vista_empleados
DESCRIBE vista_depto50
Consultar ambas vistas pero usando los sinnimos:
SELECT * FROM vista_empleados;
SELECT * FROM vista_depto50;
3. Prctica Tercer parte
Crear una secuencia que se utilizar como primary key de la tabla DEPT. Lasecuencia se debe llamar DEPT_ID_SEQ, debe arrancar en 200 y un mximo de1000, el incremento debe ser de a 10
7/21/2019 SQL FUNDAMENTOS
196/196