Ejercicio 1 – Funciones de SQL

Anuncio
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
Ejercicio 1 – Funciones de SQL
1.
Mostrar el nombre, identificador del departamento y comisión de todos los empleados.
Ordenarlos primero por el nombre de manera alfabéticamente descendente, seguido por la
comisión de manera ascendente y registros nulos al inicio (SQL*Developer).
SELECT first_name, department_id, commission_pct
FROM employees
ORDER BY first_name DESC, commission_pct NULLS FIRST;
2.
Seleccionar los nombres de los departamentos y el identificador del administrador.
Ordenarlos primero por el identificador del administrador de manera descendente con los
valores nulos al final, seguido por nombre de departamento alfabéticamente ascendente.
Utilizar la posición de la columna para el primer ordenamiento y alias de la columna para el
segundo ordenamiento.
SELECT department_name depto, manager_id
FROM departments
ORDER BY 2 DESC NULLS LAST, depto;
3.
Seleccionar el identificador del trabajo, el máximo, el mínimo, la suma y el promedio del
salario de todos los empleados por cada identificador de trabajo.
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
SELECT job_id, MAX(salary) "MAXIMO", MIN(salary) "MINIMO",
SUM(salary) "SUMA", AVG(salary) "PROMEDIO"
FROM employees
GROUP BY job_id;
4.
Seleccionar el identificador del administrador y el menor salario que es pagado por el
administrador. Excluir aquellos grupos donde el salario mínimo es menor a 6000. Ordenar
por salarios minimos de manera descendente.
SELECT manager_id , MIN(salary) "MINIMO"
FROM employees
GROUP BY manager_id
HAVING MIN(salary) > 6000
ORDER BY MIN(salary) DESC;
5.
Seleccionar los nombres de los empleados con la primera letra en mayúscula, los apellidos
de los empleados en mayúsculas y los correos electrónicos en minúsculas.
SELECT INITCAP(first_name) "NOMBRE",
UPPER(last_name) "APELLIDO", LOWER(email) "EMAIL"
FROM employees;
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
6.
Seleccionar todas las direcciones disponibles agregando al inicio la siguiente cadena:
“DIRECCION: ”.
SELECT CONCAT('DIRECCION: ',street_address) "DIRECCION"
FROM locations;
7.
Obtener los primeros 10 caracteres de todas las direcciones y mostrar la longitud original
de cada dirección.
SELECT SUBSTR(street_address,0,10) "10 CARACTERES",
LENGTH(street_address) "LONGITUD"
FROM locations;
8.
Seleccionar el nombre de los empleados, la posición donde se encuentra la primera letra
“a” en su nombre. Además seleccionar el nombre agregando el carácter “*” hasta cubrir 15
posiciones y seleccionando el nombre agregando el carácter “!” hasta cubrir 10 posiciones.
SELECT first_name, INSTR(first_name,'a') "POSICION A",
LPAD(first_name,15,'*') "IZQUIERDA *",
RPAD(first_name,10,'!') "DERECHA !"
FROM employees;
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
9.
Seleccionar todas las direcciones, mostrar las direcciones eliminando el carácter “1”
cuando aparezca al inicio de la dirección y mostrar las direcciones reemplazando el carácter
“1” por “10” que aparezcan en la dirección.
SELECT street_address "DIRECCION",
TRIM(LEADING '1' FROM street_address) "ELIMINA 1 INICIO",
REPLACE(street_address,'1','10') "REEMPLAZA"
FROM locations;
10. Seleccionar la comisión de los empleados, mostrar el valor redondeado al segundo decimal,
truncado al primer decimal, el número entero superior e inferior de la comisión. Así
también mostrar el salario y residuo de la división del salario y la comisión. Ordenar por
comisión de manera ascendente y mostrar los valores nulos al final.
SELECT commission_pct, ROUND(commission_pct,2) "REDONDEO",
TRUNC(commission_pct,1) "TRUNCADO",
CEIL(commission_pct) "ENTERO SUP",
FLOOR(commission_pct) "ENTERO INF",
salary, MOD(salary,commission_pct) "MODULO"
FROM employees
ORDER BY 1 NULLS LAST;
11. Mostrar la fecha actual de la sesión, así como la fecha y hora más precisa de la sesión.
Además seleccionar la fecha de contratación de los empleados y los meses que han
transcurrido desde su contratación al día actual.
SELECT CURRENT_DATE "FECHA SESION",
CURRENT_TIMESTAMP "FECHA PRECISA", hire_date,
MONTHS_BETWEEN(SYSDATE,hire_date) "MESES"
FROM employees;
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
12. Seleccionar la fecha de contratación de los empleados, la fecha del segundo mes que
trabajaron, el siguiente día “Lunes” que trabajaron desde su fecha de contratación y el
último día del mes que fueron contratados.
SELECT hire_date, ADD_MONTHS(hire_date,2) "AGREGA MESES",
NEXT_DAY(hire_date,'LUNES') "SIGUIENTE DIA",
LAST_DAY(hire_date) "ULTIMO DIA"
FROM employees;
13. Mostrar la fecha de contratación de los empleados, redondear la fecha de contratación
tomando como referencia tanto el mes como el año. Así también truncar la fecha de
contratación tomando como referencia tanto el mes como el año de contratación.
SELECT hire_date, ROUND(hire_date,'MONTH') "REDONDEO MES",
ROUND(hire_date,'YEAR') "REDONDEO AÑO",
TRUNC(hire_date,'MONTH') "TRUNCADO MES",
TRUNC(hire_date,'YEAR') "TRUNCADO AÑO"
FROM employees;
14. Seleccionar el nombre de los empleados, la fecha de contratación mostrando el siguiente
formato [DD][MM][YYYY]. Así también sus teléfonos y convertir a un formato numérico los
tres primeros números del mismo.
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
SELECT first_name,
TO_CHAR(hire_date,'[DD][MM][YYYY]') "FECHA",
phone_number,
TO_NUMBER(SUBSTR(phone_number,0,3),'999') "NUMERO"
FROM employees;
15. Mostrar los nombres y comisión de los empleados. También indicar que la comisión es “0”
cuando no tenga valor y la última sección debe mostrar la leyenda “CON COMISION”
cuando el empleado tenga comisión, o la leyenda “SIN COMISION” cuando no haya valor.
SELECT first_name, commission_pct,
NVL(commission_pct,0) "COMISION 0",
NVL2(commission_pct,'CON COMISION','SIN COMISION')
"COMISION"
FROM employees;
16. Seleccionar el apellido y correo electrónico de los empleados. Así también mostrar un valor
nulo si la longitud del apellido y el correo son iguales. Mostrar la comisión y en caso de que
la comisión sea nula indicar el valor “10’” si no es nula multiplicar la comisión por “100”.
SELECT last_name, email,
NULLIF(LENGTH(last_name),LENGTH(email)) "EQUIVALENTE",
commission_pct, COALESCE(commission_pct*100,10)
"COMISION"
FROM employees;
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
17. Seleccionar el identificador y el apellido de los empleados de la tabla “EMPLOYEES” donde
el identificador sea menor a 120. Unir los registros sin duplicar los resultados
seleccionando el identificador y el apellido de los empleados de la tabla “EMPLOYEES2”
donde el identificador sea menor a 200. Ordenar la salida por identificador de manera
ascendente.
SELECT employee_id,
FROM employees
WHERE employee_id <
UNION
SELECT employee_id,
FROM employees2
WHERE employee_id <
ORDER BY 1;
last_name
120
last_name
200
18. Seleccionar el identificador y el apellido de los empleados de la tabla “EMPLOYEES” donde
el identificador sea menor a 120. Unir los registros, incluyendo los duplicados de la
selección del identificador y del apellido de los empleados de la tabla “EMPLOYEES2”
donde el identificador sea menor a 200. Ordenar la salida por identificador de manera
descendente.
SELECT employee_id,
FROM employees
WHERE employee_id <
UNION ALL
SELECT employee_id,
FROM employees2
WHERE employee_id <
ORDER BY 1 DESC;
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
last_name
120
last_name
200
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
19. Seleccionar el identificador y el apellido de los empleados de la tabla “EMPLOYEES” donde
el identificador sea menor a 120. Mostrar los registros que hay en común con la selección
del identificador y del apellido de los empleados de la tabla “EMPLOYEES2” donde el
identificador sea mayor a 100. Ordenar la salida por identificador de manera ascendente.
SELECT employee_id,
FROM employees
WHERE employee_id <
INTERSECT
SELECT employee_id,
FROM employees2
WHERE employee_id >
ORDER BY 1;
last_name
120
last_name
100
20. Seleccionar el identificador y el apellido de los empleados de la tabla “EMPLOYEES” donde
el identificador sea menor a 150. Mostrar solo los registros de la primera selección que no
estén en la proyección del identificador y del apellido de los empleados de la tabla
“EMPLOYEES2” donde el identificador sea menor a 140. Ordenar la salida por identificador
de manera ascendente.
SELECT employee_id,
FROM employees
WHERE employee_id <
MINUS
SELECT employee_id,
FROM employees2
WHERE employee_id <
ORDER BY 1;
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
last_name
150
last_name
140
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
21. Seleccionar los nombres de los empleados, el identificador y el nombre del departamento
al que pertenecen cada uno. Realizar la unión de las tablas con la sintaxis antigua para un
JOIN.
SELECT e.first_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id;
22. Realizar la consulta anterior con la nueva sintaxis para un JOIN utilizando la cláusula ON.
SELECT e.first_name, e.department_id, d.department_name
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);
23. Consultar los nombres de los empleados, el identificador su administrador, el identificador
y nombre del departamento al que pertenece cada uno. Realizar la unión de las tablas con
la sintaxis antigua para un JOIN.
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
SELECT e.first_name, e.manager_id,
d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.manager_id = d.manager_id;
24. Realizar la consulta anterior con la nueva sintaxis para un JOIN utilizando la cláusula USING.
SELECT first_name, manager_id,
department_id, department_name
FROM employees JOIN departments
USING (department_id,manager_id);
25. Realizar la consulta anterior con la nueva sintaxis utilizando la cláusula NATURAL JOIN.
SELECT first_name, manager_id, department_id, department_name
FROM employees NATURAL JOIN departments;
26. Mostrar el número de registros resultantes del producto cartesiano entre la tabla
“LOCATIONS” y “REGIONS” sin utilizar la sintaxis de JOIN.
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
SELECT COUNT(*)
FROM locations, regions;
27. Realizar la misma operación anterior utilizando la sintaxis de JOIN para un producto
cartesiano.
SELECT COUNT(*)
FROM locations CROSS JOIN regions;
28. Para el siguiente ejercicio de auto evaluación es necesario establecer una conexión con
el usuario OE y conocer la estructura e información de las tablas “CUSTOMERS” y
“ORDERS”.
El departamento de ventas ha pedido un reporte especializado al administrador de la
base de datos, donde involucra información de los clientes y los pedidos realizados. Es
necesario realizar una sola consulta para el reporte requerido, de acuerdo a las
siguientes condiciones:
 El nombre de los clientes debe ser con letras mayúsculas con el título “NOMBRE”
 El apellido de los clientes en letras minúsculas con el título “APELLIDO”.
 El territorio debe contener 3 símbolos “+” a la izquierda y 2 símbolos “>>” a la derecha. Se
debe concatenar el lenguaje a la derecha de la cadena conformada anteriormente y
agregarle el título “TERRITORIO”. No utilizar funciones (CONCAT), ni operadores de
concatenación (||).
 De la cuenta de correo electrónico solo debe de mostrar el símbolo de arroba y dominio.
Donde la segunda parte del dominio “EXAMPLE.COM” debe ser reemplazada por
“VENTAS.COM” y agregar el título “DOMINIO”.
 La fecha de nacimiento debe mostrarse en un formato específico “'[12] [de] [Agosto] [de]
[2015]” y como título “NACIMIENTO”.
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
 A partir de la fecha de nacimiento indicar el número de años que tiene el cliente, basado
en la fecha y hora precisa de la sesión. Redondear a un solo decimal y agregar el título
“AÑOS”.
 Unir los clientes con sus órdenes.
 Indicar la fecha de entrega, a partir de la fecha en que el cliente realizó su orden
sumando 1 mes y truncarla con referencia al mes. Incluir el título “ENTREGA”.
 Agrupar para mostrar la suma del costo de las órdenes que cumplan el criterio de
agrupación. Mostrar un número entero superior de la suma y agregar el título “COSTO”.
 Del criterio de selección, solo mostrar los registros que tengan un “COSTO” mayor a
100,000.
 Una vez obtenido el reporte anterior, mostrar solo los registros que intersecan con el
criterio de “COSTO” mayor a 150,000.
 Ordenar por “COSTO” de manera descendente.
Resultado: Solo 3 registros
SELECT
UPPER(cust_first_name) "NOMBRE",
LOWER(cust_last_name) "APELLIDO",
CONCAT(RPAD(LPAD(nls_territory, LENGTH(nls_territory)+3, '+'),
LENGTH(nls_territory)+5,'>>'), nls_language) "TERRITORIO",
REPLACE(SUBSTR(cust_email, INSTR(cust_email, '@')), 'EXAMPLE.COM',
'VENTAS.COM') "DOMINIO",
TO_CHAR(date_of_birth, 'fm [DD] "[de]" [MONTH] "[de]" [YYYY]')
"NACIMIENTO",
ROUND(MONTHS_BETWEEN(CURRENT_TIMESTAMP,date_of_birth)/12, 1) "AÑOS",
TRUNC(ADD_MONTHS(order_date,1),'MONTH') "ENTREGA",
CEIL(SUM(order_total)) "COSTO"
FROM customers JOIN orders USING(customer_id)
GROUP BY
UPPER(cust_first_name),
LOWER(cust_last_name),
CONCAT(RPAD(LPAD(nls_territory, LENGTH(nls_territory)+3, '+'),
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
LENGTH(nls_territory)+5, '>>'), nls_language),
REPLACE(SUBSTR(cust_email, INSTR(cust_email, '@')), 'EXAMPLE.COM',
'VENTAS.COM'),
TO_CHAR(date_of_birth,'fm [DD] "[de]" [MONTH] "[de]" [YYYY]'),
ROUND(MONTHS_BETWEEN(CURRENT_TIMESTAMP, date_of_birth)/12, 1),
TRUNC(ADD_MONTHS(order_date,1), 'MONTH')
HAVING CEIL(SUM(order_total)) > 100000
INTERSECT
SELECT
UPPER(cust_first_name) "NOMBRE",
LOWER(cust_last_name) "APELLIDO",
CONCAT(RPAD(LPAD(nls_territory, LENGTH(nls_territory)+3, '+'),
LENGTH(nls_territory)+5, '>>'), nls_language) "TERRITORIO",
REPLACE(SUBSTR(cust_email, INSTR(cust_email, '@')), 'EXAMPLE.COM',
'VENTAS.COM') "DOMINIO",
TO_CHAR(date_of_birth,'fm [DD] "[de]" [MONTH] "[de]" [YYYY]')
"NACIMIENTO",
ROUND(MONTHS_BETWEEN(CURRENT_TIMESTAMP, date_of_birth)/12, 1) "AÑOS",
TRUNC(ADD_MONTHS(order_date,1),'MONTH') "ENTREGA",
CEIL(SUM(order_total)) "COSTO"
FROM customers JOIN orders USING(customer_id)
GROUP BY
UPPER(cust_first_name),
LOWER(cust_last_name),
CONCAT(RPAD(LPAD(nls_territory, LENGTH(nls_territory)+3, '+'),
LENGTH(nls_territory)+5, '>>'), nls_language),
REPLACE(SUBSTR(cust_email, INSTR(cust_email, '@')), 'EXAMPLE.COM',
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Oracle Database 12c: SQL & PL/SQL Fundamentals
Instructor: Ing. Ricardo Hernández Valencia
'VENTAS.COM'),
TO_CHAR(date_of_birth,'fm [DD] "[de]" [MONTH] "[de]" [YYYY]'),
ROUND(MONTHS_BETWEEN(CURRENT_TIMESTAMP,date_of_birth)/12, 1),
TRUNC(ADD_MONTHS(order_date,1), 'MONTH')
HAVING CEIL(SUM(order_total)) > 150000
ORDER BY "COSTO" DESC;
E-mail: contacto@certificatic.org
Tel: (55) 67232060
WhatsApp: 5525697362
www.certificatic.org
ADDRESS: Sur 69-A # 3138
Col. Viaducto Piedad
Del. Iztacalco C.P. 08200
Descargar