项目作者: EdwinPalacio5

项目描述 :
Learning-SQL Database ORACLE 12 c
高级语言: TSQL
项目地址: git://github.com/EdwinPalacio5/learning-sql.git
创建时间: 2020-03-30T22:19:38Z
项目社区:https://github.com/EdwinPalacio5/learning-sql

开源协议:

下载


Learning-SQL Database ORACLE 12 c

Tabla de contenido

Accediendo a los datos mediante Select

SELECT

Muestra la estructura de la tabla departments

  1. describe departments;

Seleccionar todos los registros de la tabla departamento

  1. Select *
  2. from departments;

Seleccionar solo los campos department_id y location_id de todos los registros de la tabla departamento

  1. Select department_id , location_id
  2. from departments;

EXPRESIONES ARITMETICAS

Salario calculado con la regla 12*salario+100

  1. Select last_name, salary, (12*salary+100)
  2. from employees;

Salario calculado con la regla 12*(salario+100)

  1. Select last_name, salary, 12*(salary+100)
  2. from employees;

Resultado null al hacer operaciones con un dato nulo en este caso el campo comission_pct tiene valores nulos

  1. Select last_name, 12*salary*commission_pct
  2. from employees;

ALIAS

Haciendo uso de “as” se puede dar un alias a la columna.

  1. Select last_name as name, salary*12 as salario_anual
  2. from employees;

Tambien funciona al solo colocar el alias seguidamente de la columna.

Nota: cuando es más de una palabra es necesario escribir el alias en comillas dobles

  1. Select last_name name, salary*12 "salario anual"
  2. from employees;

OPERADORES DE CONCATENACION

con el operador || se logra concatenar el contenido de dos o más columnas

  1. Select last_name || job_id as "Employees"
  2. from employees;

Además, podemos agregar texto a las concatenaciones

  1. Select ('Name: ' || last_name || ' Codigo: ' || job_id) as "Employee Details"
  2. from employees;

Operador alternativo: este permite agregar cadenas de caracteres que tienen comillas. Ejemplo: q’[ text’s ]’

  1. Select (department_name || q'[ Department's Manager Id: ]' || manager_id)
  2. as "Department and manager"
  3. from departments;

Nota: Se puede usar como delimitador tanto llaves, cohchetes o parentesis ([],{},())

DISTINCT

Distinct permite eliminar resultados repetidos, para el ejemplo se hace la consulta en la tabla employees, para everiguar que
departamentos tienen empleados.

  1. Select distinct department_id
  2. from employees;

RESTRINGIENDO Y ORDENANDO DATOS

WHERE

Where: permite agregar una condición, para que solo sean devueltas las filas que cumplen dicha condición
Nota: en textos se debe buscar con comillas simples: ‘texto’, en fecha es formato DD-MM-AA

  1. Select employee_id, last_name, job_id, department_id
  2. from employees
  3. WHERE last_name = 'Whalen';
  4. Select employee_id, last_name, hire_date
  5. from employees
  6. WHERE hire_date = '17-JUN-03';

OPERADORES

Operador condición
= Igual que
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que
<> No igual que
BETWEEN … AND … Entre dos valores (ambos inclusive)
IN(SET) Conincidir con cualquiera de los elementos que se pasan por parametro
LIKE Coincider con el modelo de carácter
IS NULL Es un valo nulo

Usando el operador < se consultan los empleados que poseen salarios menores a 3000

  1. Select last_name, salary
  2. from employees
  3. where salary <3000;

Usando el operador de between se consulta los empleados que se su salario se encuentra en el rango especificado
Nota: para negar es NOT BETWEEN

  1. Select last_name, salary
  2. from employees
  3. where salary between 1000 and 2500;

Usando el operador in se consultan los empleados cuyo manager_id conincida con algunos de los valores especificados
Nota: para negar es NOT IN

  1. Select last_name, manager_id
  2. from employees
  3. where manager_id in (100,101);

Usando el operador like en este ejemplo se consultan los empleados cuyo job_id contenga en su segundo caracter un I, y que adelante posea cero o más carácteres.

  1. Select last_name, job_id
  2. from employees
  3. where job_id like '_I%';

Usando el operador is null se consultan los empleador cuyo manager_id es nulo
Nota: para negar es IS NOT NULL

  1. Select last_name, manager_id
  2. from employees
  3. where manager_id is null;

OPERADORES CONDICIONALES AND, OR, NOT

usando el operador not se consultan los empleador cuyo manager_id no son nulo

  1. Select last_name, manager_id
  2. from employees
  3. where manager_id is not null;

and devuelve true solamente si ambas condiciones son ciertas

  1. select employee_id, last_name, job_id, salary
  2. from employees
  3. WHERE salary >= 10000
  4. AND job_id LIKE '%K%';

or devuelve true si al menos una de sus condiciones es cierta

  1. select last_name, job_id, salary
  2. from employees
  3. WHERE salary >= 10000
  4. OR job_id LIKE '%K%';

OPERADOR ORDER BY

Ordena según el campo que se indique, por ejemplo: se ordenan por la fecha en que se contrataron.

Nota:
ASC: por defecto order by los ordena de manera ascendente,

  1. Select last_name, hire_date
  2. from employees
  3. order by hire_date;

DESC: si se desea ordenar de manera descendente

  1. Select last_name, hire_date
  2. from employees
  3. order by hire_date desc;

Nº de columna en el select: si se coloca ‘oder by 1’, los registros se ordenaran de acuerdo a la columna 1

  1. Select last_name,hire_date
  2. from employees
  3. order by 1;

VARIABLES DE SUSTITUCION

Se utilizan para almacenar temporalmente los valores de sustitución con un solo signo ampersand (&) y el doble ampersand (&&)

  • Se utilizan como complemento de:
    • Condiciones where
    • Clausulas Order by
    • expresiones de columna
    • nombres de tabla
    • sentencias enteras select

Ejemplo 1: (un solo ampersand) la siguiente consulta se emplea &employeed_num, esto permitirá que se despliegue una ventana para solicitar esa variable.

  1. Select employee_id, last_name
  2. from employees
  3. where employee_id = &employeed_num;
  4. Select employee_id, last_name
  5. from employees
  6. where last_name LIKE '%&last_name_sustitucion%';

Nota: No olvide que al utilizar variables de sustitución de tipo texto o fecha, estas deben de poner entre comillas

Ejemplo 2 (dos ampersand) se consultan los registros de la tabla employees, y mediante la variable &&column_name se despliega una sola vez la ventana para solicitar el valor de esa variable y se ocupa tanto para seleccionar la columna en el select y hacer el ordenamiento mediante esa columna

  1. Select employee_id, last_name, &&column_name
  2. from employees
  3. order by &column_name;

DEFINE , UNDEFINE

Ejemplo:

Nota No olvide que al utilizar la variable creada por define, se debe de utilizar el signo ampersand

  1. define employee_define = 100
  2. Select employee_id, last_name
  3. from employees
  4. where employee_id = &employee_define;
  5. undefine employee_define

SET VERIFY ON

Muestra la consulta antes y después de hacer el cambio de variable. Por ejemplo:

  1. SET VERIFY ON
  2. Select employee_id, last_name
  3. from employees
  4. where employee_id = &id;

Resultado

  1. Antiguo:Select employee_id, last_name
  2. from employees
  3. where employee_id = &id
  4. Nuevo:Select employee_id, last_name
  5. from employees
  6. where employee_id = 102
  7. EMPLOYEE_ID LAST_NAME
  8. ------------- ------------------------
  9. 102 De Haan

FUNCIONES DE CONVERSION

Funcion TO_CHAR

Fecha a Char

to_char(fecha, ‘modelo’)

Formato Valor
YEAR Año enunciado (en ingles)
YYYY Año completo en numero
YY Valor de 2 digitos para el año
MONTH Nombre completo del mes
MON Abreviatura de 3 letras del mes
MM Valor de 2 digitos del mes
DAY Nombre completo del día de la semana
DY Abreviatura de 3 letras del día de la semana
DD Valor de 2 digitos del día del mes
DDSPTH Escribe el numero del día en letras
HH24:MI:SS AM 15:45:32 PM

Concatenar caracteres

  1. DD "of" MONTH -> 12 of OCTOBER

Ejemplo:

  1. Select last_name, to_char(hire_date, 'dd Mon yy') as "Fecha de Contrato"
  2. from employees;
  3. Select last_name, to_char(hire_date, 'fm dd Mon yy') as "Fecha de Contrato"
  4. from employees;

Nota: fm elimina los espacios en blanco rellenados o suprime ceros a la izquierda

Numero a char

Formato Valor
9 representa un numero
0 Obliga a un cero para que se muestre
$ Coloca un signo de dolar a un flotante
L Utiliza el simbolo de moneda local
. Imprime un punto decimal
, Inprime una coma como indicador de miles

Ejemplo:

  1. Select last_name, to_char(salary,'$99,999.99') as "Salario"
  2. from employees;

Funcion TO_DATE

  1. Select last_name, hire_date
  2. From employees
  3. WHERE hire_date < to_date('01-Ene-08','DD Mon RR');

Nota: RR interpreta la parte del año de la fecha de 1950 a 1999

Funcion TO_NUMBER

  1. Select last_name, salary
  2. From employees
  3. WHERE salary < to_number('$2,230.87','$99,999.00');

Funciones Generales

NVL (expr1_a_evaluar, valor_a_tomar_si_es_null)

Convierte un valor nulo a un valor real

  1. Select last_name, nvl(commission_pct,0) as comision
  2. from employees;

Aplicación: en este caso, para que no se devuelve null el resultado, si es null se convierte a cero.

  1. Select last_name, salary, nvl(commission_pct,0) as comision,
  2. (salary + salary*nvl(commission_pct,0)) as "Salario Final"
  3. from employees;

NVL2 (expr1_a_evaluar, valor_a_tomar_sino_es_null,valor_a_tomar_si_es_null)

evalua una expresión y permite dar un varo si es nula, o dar otro valor si no lo es

  1. Select last_name, salary, commission_pct,
  2. nvl2(commission_pct,'Posee comision', 'No posee comisión') as comision
  3. from employees;

NULLIF (expr1_a_evaluar,expr2_a_evaluar)

evalua dos expresiones, y devuelve null si son iguales o el primer valor si son distintos.

  1. Select first_name, length(first_name) as "longitud fn",
  2. last_name, length(last_name) as "longitud ln",
  3. nullif(length(first_name),length(last_name)) as "nullif"
  4. from employees;

COALESCE (expr1_a_evaluar,expr2_a_evaluar, valor_a_mostrar_si_ambas_son_null)

Evalua dos expresiones, y si las dos son nulas se reemplaza el valor por el valor dado en el segundo parametro

  1. Select last_name, commission_pct, manager_id,
  2. coalesce(to_char(commission_pct), to_char(manager_id),'NO posee comision ni manager')
  3. from employees;

Nota: Los parametro enviados a coalesce, deben ser de tipo char

Expresiones condicionales

Sirven para proporcionar el uso de la logica IF-THEN-ELSE dentro de una sentencia SQL.

La expresión case

  1. Select last_name, job_id, salary,
  2. case job_id
  3. when 'IT_PROG' then 1.10*salary
  4. when 'ST_CLERK' then 1.15*salary
  5. when 'SA_REP' then 1.20*salary
  6. else salary
  7. end
  8. as "Revision de Salario"
  9. from employees;

La función decode

  1. Select last_name, job_id, salary,
  2. decode(job_id,'IT_PROG', 1.10*salary,
  3. 'ST_CLERK', 1.15*salary,
  4. 'SA_REP', 1.20*salary,
  5. salary)
  6. as "Revision de Salario"
  7. from employees;

FUNCIONES DE UNA SOLA FILA

FUNCIONES DE CARACTER

Funciones de caracter: lower, upper, initcap

FUNCION Resultado
LOWER(‘ Curso SQL ‘) curso sql
INITCAP(‘ Curso SQL ‘) Curso Sql
UPPER(‘ Curso SQL ‘) CURSO SQL

lower

  1. Select lower(last_name) as "apellido en minuscula"
  2. from employees
  3. where lower(last_name) = 'higgins';

upper

  1. Select upper(last_name) as "apellido en mayuscula"
  2. from employees
  3. where upper(last_name) = 'HIGGINS';

initcap

  1. Select initcap(first_name || ' ' || last_name)
  2. as "Nombre Completo con iniciales mayusculas"
  3. from employees
  4. where last_name = 'Higgins';

Funciones de Manipulación

FUNCION Resultado
CONCAT(‘Hello’, ‘World’) HelloWorld
TRIM(‘H’ FROM ‘HelloWorld’) elloWorld
SUBSTR(‘HelloWorld’,1,5) Hello
LENGTH(‘HelloWorld’) 10
INSTR(‘HelloWorld’, ‘W’) 6
LPAD(salary,10,’*’) *24000
RPAD(salary, 10, ‘*’) 24000*
REPLACE(‘JACK and JUE’,’J’,’BL’) BLACK and BLUE
  1. Select employee_id, concat(first_name, last_name) as name, job_id,
  2. length(last_name), instr(last_name, 'a') as "Posición de a"
  3. from employees
  4. where substr(job_id,4) = 'REP';

Nota1: substr(job_id,4) solo se indica a apartir de cual caracter se desea cobtener
Nota2: instr(last_name, ‘a’) devolverá cero, si last_name no contiene a, y devolverá la posición de la ultima a encontrada

ANIDAMIENTO DE FUNCIONES

Paso 1: Obtener del apellido los caracteres de la posicion 1 a la 3

  1. Select substr(last_name,1,3)
  2. from employees
  3. where department_id = 60;

Paso 2: Concatenar los primeros 3 caracteres del apellido con ‘_US’

  1. Select concat(substr(last_name,1,3), '_US' )
  2. from employees
  3. where department_id = 60;

Paso 3: Convertir a mayúsculas

  1. Select upper(concat(substr(last_name,1,3), '_US' ))
  2. from employees
  3. where department_id = 60;

FUNCIONES NUMERICAS

Round

  1. Select round(45.923,2), round(45.923,0),round(45.923,-1)
  2. from dual;

Nota: al poner -1 (Aproxima a la decena cercana)
al poner 1 o más (Aproxima a la cantidad de digitos especificados)
al poner 0 (Aproxima a la unidad cercana)

Trunc

  1. Select trunc(45.923,2),trunc(45.923,0),trunc(45.923,-1),trunc(45.923)
  2. from dual;

Nota: al poner -1 (corta a la decena en que se encuentra. NO aproxima)
al poner 1 o más (Corta a la cantidad de digitos especificados, sin aproximar)
al poner 0 (Coloca el numero en su unidad entera)

Mod

Devuelve el residuo de una división. Ejemplo: mod(1600, 500) = 100

  1. Select last_name, salary, mod(salary, 5000)
  2. From employees
  3. where job_id = 'SA_REP';

FUNCIONES FECHA

El formato de fecha por defecto es DD-MON-RR.

Formatos de fecha RR y YY

Año actual Fecha Especificada Formato RR Formato YY
1995 27-OCT-95 1995 1995
1995 27-OCT-17 2017 1917
2001 27-OCT-17 2017 2017
2001 27-OCT-95 1995 2095

FUNCION SYSDATE

devuelve la fecha actual

  1. Select sysdate
  2. from dual;

ARITMETICA DE FECHAS

Ejemplo: calcular las semanas de contratacion de un empleado desde su contratacion

  1. Select last_name, (sysdate-hire_date)/7 as "Semanas de trabajo"
  2. from employees
  3. where department_id = 90;

Nota: la resta devuelve el numero de días

FUNCIONES DE MANIPULACION

Funcion Resultado
MONTHS_BETWEEN Número de meses entre dos fechas
ADD_MONTHS Agrega mes calendario hasta la fecha
NEXT_DAY Día de la semana de la fecha especificada
LAST_DAY Último día del mes
ROUND Fecha redondeada
TRUNC Fecha truncada
  1. Select MONTHS_BETWEEN('01-abr-2020','01-Ene-2020')
  2. from dual;
  3. Resultado : 3
  1. Select add_months('04-Ene-2020',5)
  2. from dual;
  3. Resultado : 04/06/20
  1. Select next_day('01-abr-2020','Miércoles')
  2. from dual;
  3. Resultado : 08/04/20, exactamente el próximo miercoles será 08/04
  1. Select last_day('01-abr-2020')
  2. from dual;
  3. Resultado : 30/04/20

Round fechas

  1. Define micumple = '16-06-2020'
  2. Select to_date('&micumple'),
  3. round(to_date('&micumple'),'MONTH'),
  4. round(to_date('&micumple'),'YEAR')
  5. from dual;
  6. UNDEFINE micumple
  7. -- TO_DATE ROUND(mes) ROUND(año)
  8. ------------ -------- --------
  9. -- 16/06/20 01/07/20 01/01/20

Trunc fechas

  1. Define micumple = '16-06-2020'
  2. Select to_date('&micumple'),
  3. trunc(to_date('&micumple'),'MONTH'),
  4. trunc(to_date('&micumple'),'YEAR')
  5. from dual;
  6. UNDEFINE micumple
  7. -- TO_DATE TRUNC(mes) TRUNC(año)
  8. ------------ -------- --------
  9. -- 16/06/20 01/06/20 01/01/20

Nota: Trunc y Round recibe obligadamente el parametro en tipo fecha

Informes de datos agregados utilizando las funciones de grupo

Operan en un conjunto de filas para devolver un solo resultado por grupo

Operación Resultado
AVG Devuelve el Promedio
COUNT Cuenta los registros
MAX Devuelve el máximo
MIN Devuelve el mínimo
SUM Devuelve la suma
  1. Select AVG(salary), MAX(salary), MIN(salary), COUNT(salary), SUM(salary)
  2. from employees
  3. where job_id like '%REP%';

Uso de MIN y MAX en fecha

  1. Select MIN(hire_date), MAX(hire_date)
  2. from employees;

Count

Count (*)

devuelve el número de filas de una tabla

  1. Select count(*)
  2. from employees;

Count (columna(s)) devuelve el número de filas con valores no nulos

  1. Select count(commission_pct)
  2. from employees;

Count(Distinct expresion): devuelve el número de distintos valores no nulos de expresión

  1. Select count(distinct department_id)
  2. from employees;

AVG

Importante: al promediar es vital considerar que las funciones de grupo ignoran los valores nulos en la columna

  1. Select avg(commission_pct)
  2. from employees;
  3. Resultado: 0.22285

Forzando el uso de datos nulos en las funciones de grupo utilizando la función NVL para incluir nulos(recordar que NVL remmplaza el valor del primer parametro por el segundo, si al caso este es nulo)

  1. Select avg(nvl(commission_pct,0))
  2. from employees;
  3. -- Resultado: 0.07289

Group by en Funciones de Grupo

Es importante aclarar que los group by es una solución para cuando se quieren agregar columnas, que no son de agregación (que no son el resultado de un conjunto como las funciones de grupo)

En el presente caso se obtiene el salario promedio por departamento, al agregar department_id, este se agrega en el group by. Si no se agrega será tratado como un error

  1. Select department_id, AVG(salary)
  2. from employees
  3. group by department_id
  4. order by department_id;

Nota: Al agregar más de alguna columna en el select, estas deben ser agregadas también en el group by

  1. Select department_id, job_id, SUM(salary)
  2. from employees
  3. group by department_id, job_id
  4. order by department_id;

Clausula HAVING para restringir grupos

Having es utilizado para realizar restricciones despues de haber agrupado registros, cosa que con Where no se puede, ya que este lo hace antes de agrupar

Ejemplo 1: Obtener el salario máximo por departamento, pero solo aquellos que son mayor a 10,000

  1. Select department_id, max(salary)
  2. from employees
  3. group by department_id
  4. having max(salary) > 10000;

ejemplo 2: Para este caso se pretende mostrar el orden en que se colucan las clausulas:
GROUP BY -> HAVING -> ORDER BY

  1. Select job_id, sum(salary)
  2. from employees
  3. where job_id like '%REP%'
  4. group by job_id
  5. having sum(salary) > 10000
  6. order by job_id;

Mostrar datos de múltiples tablas usando Joins

Tipos de Join

Los Join son compatibles con SQL: El Estandar 1999 incluye los siguientes

Join Clausula
Natural Join NATURAL JOIN
JOIN JOIN USING
JOIN JOIN ON
Outer joins LEFT OUTER JOIN, RIGHT OUTER JOIN y FULL OUTER JOIN
Cross Join CROSS JOIN

Sintaxis

  1. Select table1.column, table2.column
  2. From table1
  3. [NATURAL JOIN table2] |
  4. [JOIN table2 USING (column_name)] |
  5. [JOIN table2 ON (table1.column = table2.column)] |
  6. [LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column = table2.column)] |
  7. [CROSS JOIN table2];

NATURAL JOIN

Se basa en todas las columnas de las dos tablas que tienen el mismo nombre, seleccionando las filas de las dos tablas que tienen valores iguales en todas las columnas coincidentes.
Nota: Si las columnas que tienen los mismos nombre son de diferente tipo, se devuelve un error.

  1. Select employee_id, last_name, department_id, department_name
  2. From employees
  3. Natural Join departments;

USING

Para especificar las columnas con las que se desea hacer la unión

  1. Select employee_id, last_name, department_id, department_name
  2. From employees
  3. Join departments using (department_id);

Observación 1: No cualificar una columna que se utiliza en la clausula USING. Si se quiere utilizar una columna cualificada no se debe ocupar el alias. por ejemplo: location_id

  1. Select l.city, d.department_name
  2. From locations l
  3. Join departments d using (location_id)
  4. where location_id = 1400;

Observación 2: la columna cualificada no tendrá alias ni en el where, ni el select ni ninguna otra parte

  1. Select e.employee_id, e.last_name, department_id, d.department_name
  2. From employees e
  3. Join departments d using (department_id)
  4. Where department_id = 30;

ON

Sirve para especificar las condiciones arbitrarias o especificar columnas a unirse

  1. Select e.employee_id, e.last_name, e.department_id , d.department_id, d.department_name
  2. From employees e
  3. Join departments d
  4. On (e.department_id = d.department_id);

Si deseamos añadir condiciones se podría mediante AND o WHERE. Ambas devuelven el mismo resultado, pero en terminos de performance es recomendable AND.

Utilizando AND

  1. Select e.employee_id, e.last_name, e.department_id , d.department_id, d.department_name
  2. From employees e
  3. Join departments d
  4. On (e.department_id = d.department_id)
  5. And e.department_id=30
  6. And e.salary > 10000;

Utilizando WHERE

  1. Select e.employee_id, e.last_name, e.department_id , d.department_id, d.department_name
  2. From employees e
  3. Join departments d
  4. On (e.department_id = d.department_id)
  5. Where e.department_id=30 and e.salary > 10000;

Al realizar JOIN en más de una tabla

  1. Select e.last_name, d.department_name, l.city
  2. From employees e
  3. Join departments d
  4. On (e.department_id = d.department_id)
  5. Join locations l
  6. On (l.location_id = d.location_id);

SELF JOIN

No es una clausula más, más bien, es el hecho de hacer join con la misma tabla. Por ejemplo:

  1. Select empleado.last_name, jefe.last_name
  2. From employees empleado
  3. Join employees jefe
  4. On (empleado.manager_id = jefe.employee_id);

Nonequijoins

En este caso la unión de tablas no corresponge a llaves primarias con llaves foraneas, sino en base a otros criterios, como por ejemplo:

  1. Select e.last_name, e.salary, j.grade_level
  2. From employees e
  3. Join job_grades j
  4. On (e.salary BETWEEN j.lowest_sal and j.highest_sal);

Outer Join

LEFT OUTER JOIN

Una combinación entre dos tablas que devuelve los resultados de la INNER join así como las filas no coincidentes de la izquierda

  1. Select e.last_name, d.department_name
  2. From employees e
  3. Left outer Join departments d
  4. On (e.department_id = d.department_id);

Nota: En este caso se mostrara el Inner Join y además los empleados que no estan asignados a un departamento

RIGHT OUTER JOIN

Una combinación entre dos tablas que devuelve los resultados de la INNER join así como las filas no coincidentes de la derecha

  1. Select e.last_name, d.department_name
  2. From employees e
  3. Right outer Join departments d
  4. On (e.department_id = d.department_id);

Nota: En este caso se mostrara el Inner Join y además los departamentos que no tienen asignado ningún empleado

FULL OUTER JOIN

Una combinación entre dos tablas que devuelve los resultados de la INNER join así como las filas no coincidentes de la izquierda y de la derecha.

  1. Select e.last_name, d.department_name
  2. From employees e
  3. Full outer Join departments d
  4. On (e.department_id = d.department_id);

Nota: En este caso se mostrara el Inner Join y además los departamentos que no tienen asignado ningún empleado y los empleados que no estan asignados a un departamento

CROSS JOIN

Produce el producto cruz o producto cartesiano entre dos tablas

  1. Select e.last_name, d.department_name
  2. From employees e
  3. Cross Join departments d;

Lo que es similar a hacer:

  1. Select e.last_name, d.department_name
  2. From employees e, departments d;

Uso de subconsultas

Ejemplo: Mostrar los empleados que tienen un salario mayor al de Abel

Paso 1: Consultamos el salario de Abel

  1. Select salary
  2. From employees
  3. Where last_name='Abel';

Paso 2: Utilizar subconsulta

  1. Select last_name as "Emp con mayor sal ", salary
  2. From employees
  3. Where salary > (Select salary
  4. From employees
  5. Where last_name='Abel');

Tipos de SubConsulta

Subconsulta de una sola fila

Se utilizan los operadores: =, <> , > , < , >= , <=

  1. Select last_name as "Empleados con salario min", salary
  2. From employees
  3. Where salary = (Select min(salary)
  4. From employees);

Primero se hace la subconsulta y despues la consulta mayor

  1. Select department_id, min(salary)
  2. From employees
  3. Group by department_id
  4. Having min(salary) > (Select min(salary)
  5. From employees
  6. Where department_id = 50);

Subconsulta de multiples filas

Al obtener más de una fila, se utilizan los siguientes operadores

Operador Significado
IN Igual a cualquier miembro de la lista
ANY Debe ir precedido de =,! =,>, <, <=,> =. Devuelve TRUE si existe al menos un elemento en el conjunto de resultados de la subconsulta para que la relación sea TRUE
ALL Debe ir precedido de =,! =,>, <, <=,> =. Devuelve TRUE si la relación es cierto para todos los elementos en el conjunto de resultados de la subconsulta

IN

Devuelve los empleados cuyo salario sea IGUAL A CUALQUIERA de los devueltos en la subconsulta

  1. Select last_name, job_id, salary
  2. From employees
  3. Where salary In (Select salary
  4. From employees
  5. Where job_id = 'IT_PROG');

ANY

Devuelve los empleados cuyo salario sea menor a CUALQUIERA de los devueltos en la subconsulta

  1. Select last_name, job_id, salary
  2. From employees
  3. Where salary < Any (Select salary
  4. From employees
  5. Where job_id = 'IT_PROG');

Nota: La diferencia más marcada entre Any e In, es que con Any se pueden utilizar no solo =, sino todos los demás operadores de <> , > , < , >= , <=

ALL

Devuelve los empleados cuyo salario sea menor a TODOS de los devueltos en la subconsulta

  1. Select last_name, job_id, salary
  2. From employees
  3. Where salary < All (Select salary
  4. From employees
  5. Where job_id = 'IT_PROG');
  6. `

Operador Exists, Not Exists

Devuelve true, si la subconsulta devuelve al menos un resultado

  1. Select *
  2. From departments
  3. Where not exists (Select *
  4. From employees
  5. Where employees.department_id = departments.department_id);

Importante: Valores Nulos

Si uno de los valores es nulo, la subconsulta no retornara ninguna fila, por lo que se debe tener especial cuidado en esto. En este caso consultamos todos aquellos empleados que no son manager

  1. Select last_name
  2. From employees
  3. Where employee_id NOT IN (Select manager_id
  4. From employees
  5. where manager_id is not null);

Duda: Al quitar el not, no es necesario hacer la validación, ¿por qué?

Operadores Conjuntos

Operador Union

Devuelve las filas de ambas consultas después de la eliminación de tuplas

  1. Select employee_id, job_id
  2. From employees
  3. UNION
  4. Select employee_id, job_id
  5. From job_history;

Union All

Igual que union pero no elimina filas duplicadas

  1. Select employee_id, job_id
  2. From employees
  3. UNION ALL
  4. Select employee_id, job_id
  5. From job_history;

Intersect

Devuelve las filas que son comunes entre las consultas

  1. Select employee_id, job_id
  2. From employees
  3. INTERSECT
  4. Select employee_id, job_id
  5. From job_history;

Minus

Devuelve todas las filas seleccionadas por la primera consulta que no están presentes en el segundo conjunto

  1. Select employee_id
  2. From employees
  3. MINUS
  4. Select employee_id
  5. From job_history;

Artificio: Coincidir Conjuntos Sentencias Select

Es importante destacar que en estas operaciones de conjunto, ambos conjuntos deben de tener la misma estructura y tipo de datos. Habrá ocasiones en que se quiera coincider dos conjuntos que no son compatibles, para eso se muestra el siguiente artificio:

  1. Select location_id, department_name "Department", TO_CHAR(NULL) "Warehouse location"
  2. From departments
  3. UNION
  4. Select location_id, TO_CHAR(NULL) "Department", state_province
  5. From locations;

En este caso, las columnas no compatibles se sustituyeron por: TO_CHAR(NULL)
Nota: Los nombres de las columnas serán dados por el primer conjunto

Order By en Conjuntos

la clausula order by solo será admitida en la ultima sentencia.

  1. Select employee_id, job_id
  2. From employees
  3. UNION
  4. Select employee_id, job_id
  5. From job_history
  6. order by job_id;

DML Lenguaje de Manipulación de Datos

Funcion Descripcion
INSERT Agrega una nueva fila a la tabla
UPDATE Modifica las filas existentes
DELETE Elimina las filas existentes
TRUNCATE Elimina todas las filas de una tabla
COMMIT Hace los cambios pedientes en permanentes
SAVEPONT Marca un punto de salvaguarda
ROLLBACK Descarta los cambios pendientes de datos
FOR UPDATE en clausula SELECT Bloquea las filas identificadas en el SELECT

Insert

Insert implícito: Se omiten columnas que no son obligatorias

  1. Insert into departments (department_id, department_name)
  2. values (280, 'QA');

Insert explicito: No se especifican lo campos, poy lo que el insert espera todos los campos, por lo que los campos que no se deseen agregar se pueden poner nulos

  1. Insert into departments
  2. values (290, 'Testing', NULL, NULL);

Copiando fila con otra tabla: En este caso la clausula values NO se agrega

  1. Insert into departments (department_id, department_name, manager_id, location_id)
  2. (Select 300, last_name, manager_id, 1000
  3. From employees
  4. Where employee_id = 127);

Update

  1. Update departments
  2. set department_name = 'Documentadores'
  3. where department_id = 300;

Update con sub consulta

  1. Update departments
  2. set (department_name, manager_id) = (Select last_name, manager_id
  3. From employees
  4. Where employee_id = 122)
  5. Where department_id = 300;
  6. `

Delete

  1. Delete
  2. From departments
  3. Where department_id = 300;
  4. `

Savepoint

  1. savepoint punto;

Rollback a un punto en especifico

  1. rollback to punto;

Rollback de todos los cambios pendientes

  1. rollback;

Commit

  1. commit;

For Update

  1. Select *
  2. From employees
  3. Where department_id = 50
  4. For update;

DDL Lenguaje de Definición de Datos

ALTER TABLE

Alter table ADD

Permite agregar una columna

  1. Alter table author
  2. Add (LASTNAME varchar(50) Not Null);

Alter table MODIFY

Permite modificar la definición de una columna

  1. Alter table author
  2. Modify (LASTNAME varchar(40));

Alter table DROP

Permite eliminar una columna

  1. Alter table author
  2. Drop (LASTNAME);

Alter table RENAME COLUMN

Permite renombrar una columna

  1. Alter table author
  2. Rename column LASTNAME to LAST_NAME;

Alter table READ ONLY

Permite configurar una tabla en solo lectura

  1. Alter table author
  2. Read Only;

Alter table READ WRITE

Permite configurar una tabla en lectura y escritura

  1. Alter table author
  2. Read Write;

Drop table name_table

Permite eliminar una tabla, al agregar PURGE se eliminan todos sus datos también

  1. Drop table user_role;

Create

  1. Create table Editorial(
  2. editorial_id number(8) not null,
  3. editorial_name varchar(50) not null
  4. );

Crear una table en base a otra (una consulta)

  1. Create table editorials as (
  2. Select *
  3. from editorial
  4. );
  5. Describe Editorials;

En el siguiente caso se decide las columnas y el nombre de las columnas que se tendrá y además los datos obtenidos en la consulta se agregan en la base que estamos creando:

  1. create table dpto80 as (
  2. Select last_name as apellido, salary*12 as "salario_anual"
  3. From employees
  4. Where department_id = 80
  5. );
  6. Describe dpto80;
  7. `

Constraint

Sintaxis de constraint:

  1. constraint name_constraint [primary key | not null | Unique | check] (editorial_id)
  2. Create table Editorial(
  3. editorial_id number(8) not null,
  4. editorial_name varchar(50) not null,
  5. constraint edi_id_pk primary key(editorial_id)
  6. );

Constrain check: se puede agregar operadores between, in, etc.

  1. Alter table employees
  2. add constraint salary_check check (SALARY > 0);

Foraneas

En este caso vamos a añadir primero el atributo que será foranea en la tabla secundaria book

  1. Alter table book
  2. add (editorial_id number(8) not null);
  3. `

Ahora vamos a hacer el constraint que nos permita crear la referencia de foreign key

  1. Alter table book
  2. add (constraint edi_id_fk Foreign Key (editorial_id)
  3. references editorial(editorial_id));

Y tambien podemos configurar el borrado, ya sea en cascada o set null, para ello primero borraremos la constraint

  1. Alter table book
  2. drop constraint edi_id_fk;
  3. Alter table book
  4. add (constraint edi_id_fk Foreign Key (editorial_id)
  5. references editorial(editorial_id)
  6. on delete cascade);
  7. Describe book;

Vistas del Diccionario de datos

Los diccionarios de datos es la metadata, es decir la deficion de todo lo que tenemos en nuestra base de datos.

La estructura de una diccionario de datos consiste en:

  • Tablas base
  • Vistas accesibles al usuario

Prefijo

  • User: Vista del usuario (lo que está en su esquema).
  • ALL: Vista ampliada del usuario (los que se tiene en su propio esquema y los que esquemas que otros usuarios han dado acceso).
  • DBA: Lo que está en los esquemas de todo el mundo.
  • V$: Los datos relacionados con el rendimiento.

Dictionary

contiene los nombres y descripciones de las tablas de diccionario y puntos de vista

  1. Describe dictionary;
  2. Select *
  3. From dictionary
  4. where table_name = 'USER_OBJECTS';

Objetos

  1. Select object_name, object_type, created, status
  2. From user_objects
  3. order by object_type;

Ver aquellas tablas que son de mi usuario

  1. Describe user_tables;
  2. Select table_name
  3. From user_tables;

Ver columnas de una tabla en específico

  1. Describe user_tab_columns;
  2. Select table_name, column_name
  3. From user_tab_columns
  4. where table_name = 'BOOK'
  5. Order by table_name;

Ver los constraint de mi usuario, en una tabla x

  1. Describe user_constraints;
  2. Select constraint_name, constraint_type, search_condition, r_constraint_name, delete_rule, status
  3. from user_constraints
  4. where table_name = 'BOOK'
  5. Order By constraint_type;

Ver constraint y en que columna se aplicó

  1. Describe user_cons_columns;
  2. Select constraint_name, column_name
  3. From user_cons_columns
  4. Where table_name = 'BOOK';

Comentarios

Añadir comentarios al diccionario de una tabla

  1. comment on table book
  2. is 'Libros';

Añadir comentarios al diccionario de una columna

  1. comment on column book.title
  2. is 'Titulo del libro';

Ver comentarios de las tablas, y de los comentarios

  1. Describe user_tab_comments;
  2. Select table_name, comments
  3. From user_tab_comments
  4. Where table_name = 'BOOK';
  5. Describe user_col_comments;
  6. Select column_name, comments
  7. From user_col_comments
  8. Where table_name = 'BOOK';

Nota: En los ejemplos anteriores solo se utilizó el prefijo user.

Secuencias

Secuencia: Genera valores numericos

  • Puede generar de forma automatica números únicos
  • Es un objteto compatible
  • Se puede utilizar para crear un valor de clave principal (para esto se ocupa normalmente)
  • Reemplaza el código de aplicación
  • Acelera el rendimiento de acceso a valores de secuencia cuando se almacena en caché en la memoria.

Sintaxis de Sequence

  1. Create sequence name_sequence
  2. increment by 10
  3. start with 10
  4. maxvalue 10000
  5. minvalue 10
  6. nocache
  7. nocycle
  8. order;

Nota: puede ser nocache o cache integer, nocycle o cycle, noorder o order.

Para acceder a los valores de sequence se puede: Nextval(siguiente) y Currval(actual)

Aplicacion: Columna por defecto de SQL usando una secuencia

  • Sintaxis SQL para columnas que permitan valor por defecto .nextval, .currval como una columan SQL expresión por defecto para columnas numéricas, donde es una secuencia de base de datos Oracle.

  • La expresión DEFAULT puede incluir la secuencia con seudo columnas CURRVAL y NEXTVAL, mientras exista la secuencia y usted tenga los privilegios necesarios para acceder a ella.

Ejemplo1: crear secuencia incremental de 1 en 1

  1. Create sequence sequence_emp_id
  2. start with 1;

Vincular secuencia con una tabla, para generar id

  1. Create table emp(
  2. id_emp number default sequence_emp_id.nextval not null,
  3. name_emp varchar(50)
  4. );

Probar inserciones

  1. Insert into emp(name_emp)
  2. values ('Edwin');
  3. Insert into emp(name_emp)
  4. values ('Joel');

Verificamos

  1. Select *
  2. From emp;
  3. Resultado
  4. ID_EMP NAME_EMP
  5. ---------- --------------------------------------------------
  6. 1 Edwin
  7. 2 Joel

Los valores de secuencia Caching

  • Almacenamiento en caché de valores de secuencia en la memoria da un acceso más rápido a esos valores.

  • Pueden ocurrir lagunas o vacíos en valores de secuencia cuando: una reversión se produce, los fallos del sistema, una secuencia se utiliza en otra tabla.

Modificando una sequence: Alter Sequence

Reglas para la modificación de una secuencia

  • Usted debe ser el propietario o tener el privilegio ALTER para la secuencia
  • Sólo los números de secuencia futuros se ven afectados.
  • La secuencia debe caer y volver a crear al reiniciar la secuencia en un número diferente.
  • En algunos se relaiza validación.
  • Para eliminar una secuencia, utilice la sentencia DROP:
  1. Alter sequence sequence_emp_id
  2. nocache
  3. nocycle;

Eliminar Sequence : Drop Sequence

  1. Drop sequence name_sequence;

Obtener información de sequence

  1. Describe user_sequences;
  2. Select *
  3. From user_sequences;

SINONIMOS

Da nombres alternativos a los objetos.

  • Es un objeto de base de datos
  • Puede ser creado para dar un nombre alternativo para una tabla o a otro objeto de base de datos
  • No requiere almacenamiento que no sea su definición en el diccionario de datos
  • Es útil para oculta la identidad y la ubicación de un objeto de esquema subyacente

Creación de un sinónimo de un objeto

Simplificar el acceso a los objetos la creación de un sinónimo (otro nombre para un objeto). Con sinónimos, puede:

  • Crear una referencia más fácil a una tabla que es propiedad de otro usuario.
  • Acortar largos nombres del objeto
  1. CREATE [Public] SYNONYM synonym
  2. FOR object;
  3. Create synonym sinonimo_sequence_id
  4. For sequence_emp_id;

Consultar información de sinonimos

  1. Describe user_synonyms;
  2. Select *
  3. From user_synonyms;

Eliminar sinonimo

  1. Drop synonym sinonimo_sequence_id;

Indice

Mejora el rendimiento de las consultas en la recuperación de datos

  • Es un objeto de esquema.
  • Puede ser utilizado por el servidor de Oracle para acelerar la recuperación de filas mediante el uso de un puntero.
  • Puede reducir la entrada/salida de disco (E/S) mediante el uso de un método de acceso ruta rápida para localizar datos de forma rápida.
  • Es dependiente los indices de las tablas.
  • Se usa y se mantiene de forma automática por el servidor Oracle.

¿Cómo se crean los indices?

  • Automaticamente: Un indice único se crea automáticamente cuando se define una restricción de CLAVE PRIMARIA o UNIQUE en una definición de tabla

  • Manualmente: Se puede crear un índice único o no único en las columnas para acelerar el acceso a las filas.

Sintaxis de Index

  1. Create [UNIQUE] [BITMAP] INDEX name_index
  2. On table (column1,...);

Ejemplo:

  1. Create Index emp_last_name_idx
  2. On employees(last_name);

Aplicación: Crear índice con el Create Table

  1. Create Table NEW_EMP
  2. (
  3. employee_id number(6)
  4. primary key using index
  5. (Create index emp_id_idx
  6. On NEW_EMP(employee_id)),
  7. first_name varchar2(20),
  8. last_name varchar2(20));

Consultar indice

  1. Describe user_indexes;
  2. Select index_name, table_name
  3. From user_indexes
  4. Where table_name = 'NEW_EMP';
  5. -- User_ind_columns
  6. Describe user_ind_columns;
  7. Select index_name, column_name
  8. From user_ind_columns
  9. Where table_name = 'departments';

Los índices de función-base

  • Un indice basado en las funciones se basa en expresiones.

  • La expresión de índice se construye a partir de columnas de tabla, constantes, funciones de SQL y funciones definidas por el usuario.

Ejemplo: Este indice lo que hará que el nombre del departamento lo vuelva mayúscula, entonces al hacer consultas esto va a mejorar el rendimiento.

  1. Create index upper_dept_name_idx
  2. On departments(UPPER(department_name));
  3. Select *
  4. From departments
  5. Where UPPER(department_name) = 'SALES';

Creación de varios indices en el mismo conjunto de columnas

  • Puede crear varios índices en el mismo conjunto de columnas.
  • Múltiples índices se pueden crear en el mismo conjunto de columnas sí:
    • Los índices son de diferentes tipos
    • Los índices utilizan diferentes particionamiento
    • Los índices tienen diferentes propiedades de unicidad

Ejemplo: para este caso hacemos alter en emp_id_name_idx1 haciendolo invisible para así poder crear el otro indice bajo el mismo conjunto de columnas

  1. Create index emp_id_name_idx1
  2. On employees(employee_id, first_name);
  3. Alter index emp_id_name_idx1 invisible;
  4. Create bitmap index emp_id_name_idx2
  5. On employees(employee_id, first_name);

Directrices de la creación de indice

Cree un índice cuando:

  • Una columna contiene una amplia gama de valores
  • una columna contine un gran número de valores nulos
  • Una o más columnas se utilizan con frecuencia juntos en una cláusula WHERE o una condición de unión
  • La tabla es grande y se espera que la mayoría de las consultas para recuperar menos de 2% a 4% de las filas de la tabla.

No cree un índice cuando:

  • Las columnas no se utilizan a menudo como un condición en la consulta.
  • La tabla es pequeña o se espera que la mayoría de consultas para recuperar más de un 2% a un 4% de las filas de la tabla.
  • La tabla se actualiza con frecuencia
  • las columnas indexadas se hace referencia como parte de una expresión.

Vistas

Lógicamente representa subconjunto de los datos de unas o más tablas

Ventajas

  • Para restringir acceso a datos
  • Para proporcionar independencia de datos
  • Para hacer consultas complejas fáciles
  • Para representar diferencres vistas de los mismos datos

Vistas simple y complejas

Caracteristica Vistas simples Vistas complejas
Numeros de tablas Uno Uno o más
Contiene funciones No Si
Contiene grupos de datos No Si
Operaciones DML a través de una vista Si No siempre

Sintaxis de vista

  1. CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view
  2. [(alias,...)]
  3. AS Subquery
  4. [WITH CHECK OPTION [CONSTRAINT constraint]]
  5. [WITH READ ONLY [CONSTRAINT constraint]];

La subconsulta puede contener sintaxis SELECT complejo.

Nota: antes de crear vistas, le daremos permisos para crealas al usuario hr, con el usuario SYSTEM

  1. grant create synonym to hr;
  2. grant create view to hr;

Creación de vistas simples

  1. Create view empvu80
  2. As (Select employee_id, last_name, salary
  3. From employees
  4. Where department_id = 80);
  5. Describe empvu80;
  6. Resultado
  7. Nombre ¿Nulo? Tipo
  8. ----------- -------- ------------
  9. EMPLOYEE_ID NOT NULL NUMBER(6)
  10. LAST_NAME NOT NULL VARCHAR2(25)
  11. SALARY NUMBER(8,2)

Recuperando datos de una vista

  1. Select *
  2. From empvu80;

Modificando una vista

En este caso, se le asignaran alias a la vista, en vez de usar los que trae la tabla originalmente

  1. Create or Replace View empvu80
  2. (id_number, name, sal, department_id)
  3. As (Select employee_id, first_name || ' ' || last_name, salary, department_id
  4. From employees
  5. Where department_id = 80);

Creación de vistas complejasç

Utilizando funciones de agregación, joins, etc.

  1. Create Or Replace View dept_sum_vu
  2. (name, minsal, maxsal, avgsal)
  3. As (Select d.department_name, min(e.salary), max(e.salary), avg(e.salary)
  4. From employees e
  5. Join departments d Using(department_id)
  6. group by d.department_name);
  7. Select *
  8. From dept_sum_vu;

Ver información de las vistas

  1. Describe user_views;
  2. Select view_name, text
  3. From user_views;

Reglas para realización de operaciones DML en una vista

Generalmente, usted puede realizar operaciones DML en vistas simples

No se puede eliminar una fila si la vista contine lo siguiente:

  • Funciones de grupo
  • Una clausula GROUP BY
  • La palabra clave DISTINCT
  • La palabra reservada ROWNUM

No se puede modificar los datos en una vista si contiene

  • Funciones de grupo
  • Una clausula GROUP BY
  • La palabra clave DISTINCT
  • La palabra reservada ROWNUM
  • Columnas definidas por expresiones

No se pueden agregar datos a través de una vista si la vista incluye

  • Funciones de grupo
  • Una clausula GROUP BY
  • La palabra clave DISTINCT
  • La palabra reservada ROWNUM
  • Columnas definidas por expresiones
  • Columnas NOT NULL sin valor por defecto en las tablas de base que no están señeccionados por la vista

Uso de la cláusula WITH CHECK OPTION

Puede asegurar de que las operaciones de DML se realizaron en la estancia de la vista en el dominio de la vista mediante la cláusula WITH CHECK OPTION

  1. Create or replace view empvu20
  2. as (Select *
  3. From employees
  4. Where department_id = 20)
  5. WITH CHECK OPTION constraint empvu20_ck;

Nota: Cualquier intento de de insertar una fila con un department_id diferente de 20 o para actualizar el número de departamento para cualqueir fila en la vista falla porque viola la restricción WITH CHECK OPTION.

Denegar Operaciones DML

  • Puede asegurar de que no hayan operaciones de DML ocurran mediante la adición de la opción WITH READ ONLY para su definición de la vista.
  • Cualquier intento de realizar una operación de DML en cualquier fila de la vista da resultados de error en el servidor Oracle.

Eliminar vista

  1. Drop view empvu80;

SubConsulta

Subsonsutas Escalares

Es una subconsulta que devuelve exactamente un valor de columna de una fila

Subconsultas Par

  1. Select employee_id, manager_id, department_id
  2. From employees
  3. Where (manager_id, department_id) IN (Select manager_id, department_id
  4. From employees
  5. Where first_name = 'John')
  6. And first_name <> 'John'
  7. order by employee_id;

Subconsulta no par

  1. Select employee_id, first_name, manager_id, department_id
  2. From employees
  3. Where (manager_id) IN (Select manager_id
  4. From employees
  5. Where first_name = 'John')
  6. And (department_id) IN (Select department_id
  7. From employees
  8. Where first_name = 'John')
  9. And first_name <> 'John'
  10. order by employee_id;

Sub consulta en CASE

  1. Select employee_id, first_name,
  2. (case
  3. when department_id = (Select department_id
  4. From departments
  5. Where location_id = 1800)
  6. then 'Canada'
  7. else 'USA'
  8. end) as "location"
  9. From employees;

Subconsultas en Order by

  1. Select employee_id, last_name
  2. From employees e
  3. order by (Select department_name
  4. From departments d
  5. Where e.department_id = d.department_id);

Subconsultas Correlacionadas

Subconsultas correlacionadas se utilizan para el procesamiento de fila por fila. Cada subconsulta se ejecuta una vez por cada fila de la columna externa

En este ejemplo, por cada fila se hace la consulta del salario promedio de su departamento, para así hacer la respectiva evaluación
Es decir, que cada vez que una fila de la consulta externa se procesa, se evalúa la consulta interna

  1. Select last_name, salary, department_id
  2. From employees tabla_externa
  3. Where salary > (Select AVG(salary)
  4. From employees tabla_interna
  5. Where tabla_interna.department_id = tabla_externa.department_id);

Operador Exists en Subconsultas

Prueba la existencia de filas en el conjunto de resultados de la subconsulta

Si un valor de la fila de la subconsulta se encuentra:

  • La busqueda no se continúa en la consulta interna
  • La condición se encuentra en valor VERDADERO

Si un vslor de la fila de la subconsulta NO se encuentra:

  • La busqueda se continúa en la consulta interna
  • La condición se encuentra en valor FALSO

Ejemplo: Consultar empleados que son manager

  1. Select employee_id, last_name, job_id, department_id
  2. From employees tabla_externa
  3. Where EXISTS ( Select 'X'
  4. From employees tabla_interna
  5. Where tabla_interna.manager_id = tabla_externa.employee_id);

Operador Not Exists en Subconsultas

Ejemplo: Obtener departamentos que no tienen empleados

  1. Select department_id, department_name
  2. From departments tabla_externa
  3. Where NOT EXISTS (Select 'X'
  4. From employees tabla_interna
  5. Where tabla_interna.department_id = tabla_externa.department_id);

Clausula WITH

  • El uso de cláusula WITH, puede usar el mismo bloque de consulta en una sentencia SELECT cuando se presenta más de una vez dentro de una consulta compleja

  • La cláusula WITH recupera los resultados de un bloque de consulta y lo almacena en tablas temporales del usuario

  • la cláusula WITH puede mejorar el rendimiento

  • Divide y venceras

En la siguiente consulta

  • Costo_departamento: suma de salario por departamento
  • costo promedio: salario promedio de los totales de departamento
  • En el select se muestran aquellos departamentos cuya suma de salarios sea mayor al promedio
  1. With
  2. costo_departamento As (Select d.department_name, SUM(e.salary) as total_dep
  3. From employees e
  4. Join departments d
  5. On (e.department_id = d.department_id)
  6. group by d.department_name),
  7. costo_promedio As (Select (SUM(total_dep)/ COUNT(*)) as promedio_dep
  8. From costo_departamento)
  9. Select *
  10. From costo_departamento
  11. Where total_dep > (Select promedio_dep
  12. From costo_promedio)
  13. Order By department_name;

WITH Recursiva

  • permite la formulación de consultas recursivas
  • crea una consulta con un nombre, llamado el WITH nombre del elemento recursivo
  • Continene dos tipos de miembros de bloque de consulta: un ancla y un recursivo
  • Es compatible con ANSI

Controlando el acceso a Usuarios

Crear Usuarios

  1. alter session set "_ORACLE_SCRIPT" = true;
  2. Create user edwin identified by pass;

Crear Role

  1. Create Role tester;

Dar privilegios a usuarios o roles

Sintaxis:

  1. Grant privilegio
  2. to user;
  3. Grant create session, create table, create sequence, create view
  4. to edwin;
  5. Grant create table, create view
  6. to tester;

Otorgar Role a Usuario

  1. Grant tester to edwin;

Cambiar la contraseña de usuario

  1. Alter user edwin identified by newpass;

Consultar privilegios Otorgados mediante la vista del diccionarios de datos

Vista del Diccionarioo de datos Descripción
ROLE_SYS_PRIVS Privilegios de Sistema otorgado a roles
ROLE_TAB_PRIVS Privilegios de tabla otorgado a roles
USER_ROLE_PRIVS Roles accesibles por el usuario
USER_SYS_PRIVS Privilegios de sistema otorgado a los usuarios
USER_TAB_PRIVS_MADE Privilegios de objetos otorgados en los objetos de usuarios
USER_TAB_PRIVS_RECD Privilegios de objetos otorgados al usuario
USER_COL_PRIVS_MADE Privilegios de objetos otorgados sobre las columnas de objetos de usuarios
USER_COL_PRIVS_RECD Privilegios de objeto otorgados a laos usuarios sobre específicas columnas

ANALITIC SQL FOR DATA WAREHOUSING

Oracle ha introducido muchas operaciones SQL para realizar operaciones analíticas en la base de datos.

  • Estas operaciones incluyen clasificación, promedios móviles, sumas acumulativas, ratios-informes y comparaciones de período a período.
  • Aunque anteriormente algunos de estos cálculo eran posibles utilizando SQL, esta sintaxis ofrece un rendimiento mucho mejor.
    Group By con los operadores ROLLUP y CUBE
  • Use ROLLUP o CUBE con Group BY para producir filas superagregadas mediante columnas de referencias cruzadas.

ROLLUP

  • Produce un conjunto de resultados que contiene las filas agrupadas regulares y los valores de subtotal y total general
  • Es un extensión de la clausula GROUP BY
  • Use la operación ROLLUP para producir agregados acumulativos, como subtotales.
  • Utilizado, para hacer operaciones de agregación para múltiples niveles en una jerarquía

    ```
    SELECT department_id, job_id, SUM(salary)
    FROM employees
    WHERE department_id < 60
    Group by rollup (department_id, job_id);

DEPARTMENT_ID JOB_ID SUM(SALARY)


  1. 10 AD_ASST 4400
  2. 10 4400
  3. 20 MK_MAN 13000
  4. 20 MK_REP 6000
  5. 20 19000
  6. 30 PU_MAN 11000
  7. 30 PU_CLERK 13900
  8. 30 24900
  9. 40 HR_REP 6500
  10. 40 6500
  11. 50 ST_MAN 36400
  12. 50 SH_CLERK 64300
  13. 50 ST_CLERK 55700
  14. 50 156400
  15. 211200
  16. 15 filas seleccionadas.
  1. ### ROLLUP Equivalente ocupando Grouping Sets
  2. Nota: Grouping sets permite agregar más de un conjunto de agrupación al group by

SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
Group by grouping sets (
(department_id, job_id),
(department_id),
());

  1. ### ROLLUP Equivalente ocupando Union All

SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
Group by (department_id, job_id)

UNION ALL

SELECT department_id, NULL , SUM(salary)
FROM employees
WHERE department_id < 60
Group by (department_id)

UNION ALL

SELECT NULL, NULL, SUM(salary)
FROM employees
WHERE department_id < 60;

  1. ## CUBE
  2. - Produce un conjunto de resultados que contiene las filas de ROLLUP y las de filas de tabulación cruzada.
  3. - CUBE es una extensión de la clásula GROUP BY
  4. - Puede usar el operador CUBE para generar valores de tabulación cruzada con una sola instrucción SELECT,
  5. es decir, produce el resultado conjunto de todas las combinaciones de los atributos específicados en el
  6. GROUP BY.
  7. Ejemplo: Recuperar la suma de los salarios agrupados por todas las combinaciones de departamento y puesto
  8. de trabajo, así como obtener el gran total
  9. Paso 1: Agrupamos
  10. Select department_id, job_id, SUM(salary)
  11. From employees
  12. WHERE department_id < 60
  13. Group by (department_id, job_id);
  14. Paso 2: Aplicamos CUBE, que nos permitirá ver los subtotales por job_id, subtotales por departamento, subtotales por departamento y job_id y el total global.

Select department_id, job_id, SUM(salary)
From employees
WHERE department_id < 60
Group by CUBE (department_id, job_id);

DEPARTMENT_ID JOB_ID SUM(SALARY)


  1. 211200 GRAN TOTAL
  2. HR_REP 6500
  3. MK_MAN 13000
  4. MK_REP 6000
  5. PU_MAN 11000
  6. ST_MAN 36400 TOTAL POR JOIB_ID
  7. AD_ASST 4400
  8. PU_CLERK 13900
  9. SH_CLERK 64300
  10. ST_CLERK 55700
  11. 10 4400
  12. 10 AD_ASST 4400 TOTAL POR JOB_ID Y DEPARTAMENTO
  13. 20 19000
  14. 20 MK_MAN 13000
  15. 20 MK_REP 6000
  16. 30 24900 TOTAL POR DEPARTAMENTO
  17. 30 PU_MAN 11000
  18. 30 PU_CLERK 13900
  19. 40 6500
  20. 40 HR_REP 6500
  21. 50 156400
  22. 50 ST_MAN 36400
  23. 50 SH_CLERK 64300
  24. 50 ST_CLERK 55700

24 filas seleccionadas.

  1. ### CUBE Equivalente en GROUPING SETS

Select department_id, job_id, SUM(salary)
FROM employees
Where department_id < 60
Group by GROUPING SETS (
(department_id,job_id),
(department_id),
(job_id),
()
);

DEPARTMENT_ID JOB_ID SUM(SALARY)


  1. 40 HR_REP 6500
  2. 20 MK_MAN 13000
  3. 20 MK_REP 6000
  4. 30 PU_MAN 11000
  5. 50 ST_MAN 36400
  6. 10 AD_ASST 4400
  7. 30 PU_CLERK 13900
  8. 50 SH_CLERK 64300
  9. 50 ST_CLERK 55700
  10. HR_REP 6500
  11. MK_MAN 13000
  12. MK_REP 6000
  13. PU_MAN 11000
  14. ST_MAN 36400
  15. AD_ASST 4400
  16. PU_CLERK 13900
  17. SH_CLERK 64300
  18. ST_CLERK 55700
  19. 10 4400
  20. 20 19000
  21. 30 24900
  22. 40 6500
  23. 50 156400
  24. 211200

24 filas seleccionadas.

  1. ### CUBE Equivalente en UNION ALL

Select department_id, job_id, SUM(salary)
FROM employees
Where department_id < 60
Group by (department_id, job_id)

UNION ALL

Select department_id, NULL, SUM(salary)
FROM employees
Where department_id < 60
Group by (department_id)

UNION ALL

Select NULL, job_id, SUM(salary)
FROM employees
Where department_id < 60
Group by (job_id)

UNION ALL

Select NULL, NULL, SUM(salary)
FROM employees
Where department_id < 60;

DEPARTMENT_ID JOB_ID SUM(SALARY)


  1. 50 ST_CLERK 55700
  2. 50 ST_MAN 36400
  3. 30 PU_CLERK 13900
  4. 50 SH_CLERK 64300
  5. 20 MK_MAN 13000
  6. 30 PU_MAN 11000
  7. 10 AD_ASST 4400
  8. 20 MK_REP 6000
  9. 40 HR_REP 6500
  10. 30 24900
  11. 20 19000
  12. 50 156400
  13. 40 6500
  14. 10 4400
  15. ST_MAN 36400
  16. PU_MAN 11000
  17. AD_ASST 4400
  18. SH_CLERK 64300
  19. PU_CLERK 13900
  20. MK_MAN 13000
  21. MK_REP 6000
  22. ST_CLERK 55700
  23. HR_REP 6500
  24. 211200

24 filas seleccionadas.
```