Comando Describe Sirve para conocer la estructura de una tabla, las columnas que la forman y su tipo y restricciones. describe department Cláusula WHERE Utilizada para proponer las condiciones que han de cumplir todas las filas para salir en el resultado de la consulta.
Operadores de Comparación en WHERE Igualdad (=): Con este filtro los datos de la búsqueda obtenidos serán iguales a los caracteres espec ificados: select * from emp where cod_dep = 100; Desigualdad (!=, <>, ^=): Con este filtro los datos obtenidos seran desiguales a los caracteres especificados: select * from emp where cod_dep != 100; Menor que (<): Con este filtro los datos obtenidos serán menores a los caracteres especificados: select * from emp where cod_dep < 200; Mayor que (>): Con este filtro los datos obtenidos serán mayores a los caracteres especificados: select * from emp where cod_dep > 200; Menor o igual que (<=): Con este filtro los datos obtenidos serán me nores o iguales a los caracteres especificados: e specificados: select * from emp where cod_dep <= 200; Mayor o igual que (>=): Con este filtro los datos obtenidos serán mayores o iguales a los caracteres especificados: select * from emp where cod_dep >= 200; IN: Con este filtro se comparan los datos para que sean Igual a cualquiera de los miembros entre paréntesis: select * from emp where cod_dep in (100, 300); NOT IN: Con este filtro se comparan los datos para que sean Distinto a cualquiera de los miembros entre paréntesis select * from emp where cod_dep not in (200); Between: Con este filtro se buscan los datos que estén entre el rango ingresado: select * from emp where cod_emp between 100 and 199;
Not Between: Con este filtro se buscan los datos que estén fuera del rango ingresado: select * from emp where cod_emp not between 100 and 199; LIKE: Este filtro realiza la búsqueda partiendo de una cadena de caracteres o dígitos específicos entre comilla simple: select * from emp where nombre like 'Ma%'; CONCATENAR: select nombre||oficio from emp; ORDER BY Se utiliza para especificar el crite rio de ordenación de la respuesta a la consulta SQL> select nombre, salario from emp order by salario desc, nombre; DISTINCT La cláusula DISTINCT es utilizada para eliminar las filas duplicadas obtenidas como respuesta a una consulta. select distinct oficio from emp;
Funciones Aritméticas ABS(n): Calcula el valor absoluto de n. select abs(-15) from dual;
CEIL(n): Calcula el valor entero inmediatamente superior o igual a n. select ceil(15.7) from dual; FLOOR(n): Calcula el valor entero inmediatamente inferior o igual a n. select floor(15.7) from dual; MOD(m,n): Calcula el resto resultante de dividir m entre n. select mod(11,4) from dual; POWER(m,n): Calcula la potencia n-esima de m. select power(3,2) from dual; ROUND(m,n): Calcula el redondeo de izquierda del punto decimal. select round(123.456,1) from dual;
m
a n decimales. Si n<0 el redondeo se efectúa a por la
SQRT(n): Calcula la raíz cuadrada de n. select sqrt(4) from dual; TRUNC(m,n): Calcula m truncado a n decimales (n puede ser negativo). select trunc(123.456,1) from dual;
SIGN(n): Calcula el signo de n, devolviendo -1 si n<0, 0 si n=0 y 1 si n>0. select sign(-12) from dual;
Funciones de Cadenas de Caracteres CONCAT: Devuelve cad1 concatenada con cad2. Esta función es equivalente al operador ||. select concat(concat(nombre,' es '),oficio) from emp;
GROUP BY Agrupa las filas resultado de una consulta en conjuntos y aplicar funciones sobre esos conjuntos de filas. SELECT {* | {columna,}+} FROM {tabla,}+ WHERE condición GROUP BY {columna ,} + HAVING condición ORDER BY {expresiónColumna [ASC | DESC],}+; En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la cláusula HAVING se especifica la condición que han de cumplir los g rupos para pasar al resultado. La evaluación de las diferentes cláusulas en tiempo de e jecución se efectúa en el siguiente orden: WHERE filtra las filas GROUP BY crea una tabla de grupo nueva HAVING filtra los grupos ORDER BY clasifica la salida
Funciones de Agrupamiento Agrupamiento COUNT(col): Cuenta el número de filas agrupadas. select count(nombre),oficio from emp group by oficio;
to dos los valores de la columna col . AVG(col): Calcula el valor medio de todos select avg(salario),oficio from emp group by oficio; MAX(col): Calcula el valor máximo de todos los valores de la columna col . select max(salario),oficio from emp group by oficio; MIN(col): Calcula el valor mínimo de todos los valores de la columna col . select min(salario),oficio from emp group by oficio; SUM(col): Calcula la suma de los valores de la c olumna col. select sum(salario), oficio from emp group by oficio; oficio ; STDDEV(col): Calcula la desviación típica de los valores de la columna valores nulos. select stddev(salario), oficio from emp group by oficio;
col
sin tener en cuenta los
VARIANCE(col): Calcula la varianza de los valores de la columna nulos. select variance(salario), oficio from emp group by oficio;
sin col sin
tener en cuenta los valores
Expresiones con Sentencias Select Unión, UNION: Combina todas las filas del primer conjunto con todas las filas del segundo. Cualquier fila duplicada se reducirá a una sola. SELECT product_id FROM order_items inventories;
SELECT UNION SELECT
product_id FROM
Intersección, INTERSECT: Examinará las filas de los conjuntos de entrada y devolverá aquellas que aparezcan en ambos. SELECT TO_BINARY_FLOAT(3) FROM DUAL
SELECT INTERSECT SELECT
3f FROM DUAL;
Diferencia, MINUS: Devuelve aquellas filas que están en el primer conjunto pero no en el segundo. SELECT product_id FROM inventories order_items;
SELECT MINUS SELECT
product_id FROM
Combinaciones: Así, podríamos intentar una consulta que seleccionara el campo nombre de la tabla emp y el nombre del departamento. Y aquí surge el primer problema, ¿cómo distinguimos entre dos columnas que llamándose igual, pertenecen a tablas distintas? Para eso se utiliza como prefijo o el nombre de la tabla (dep.nombre) o un alias de tabla, un nombre que se asocia a cada tabla y se coloca como prefijo a la columna (d.nombre).
SQL> select e.nombre, d.nombre from emp e, dep d Combinación Externa: Si realizamos la consulta anterior, el nuevo departamento no aparecerá en la respuesta. Pero esto se puede evitar si señalamos en la cláusula WHERE la posibilidad de que en la tabla de empleados no exista alguno de los códigos de departamento que si exista en la tabla de departamentos. Esto se hace colocando un (+) de la siguiente manera: SQL> select e.nombre, e.nombre, d.nombre d.nombre 2 from emp e, dep d 3 where e.cod_dep(+)=d.cod_dep; Subconsultas A veces se han de utilizar en una consulta los resultados de otra consulta, llamada subconsulta. Un ejemplo de esto ocurre cuando queremos conocer los nombres de los empleados cuyo salario está por encima de la media:
SQL> select nombre from emp 2 where salario > (select avg(salario) from emp);
Ejercicio 1 Bases de Datos: muestre los apellidos y nombres ordenados alfabeticamente, de todos los gerentes en los que haya estado un empleado laborando en algun puesto MENOS DE TRES MESES, asuma mes comercial de 30 dias, use la base HR de Oracle
SELECT last_name, first_name FROM hr.employees e WHERE EMPLOYEE_ID IN (select d.manager_id from hr.departments d where manager_id is not null ) AND employee_id in (select manager_id from hr.employees where months_between(sysdate,hire_date) < 3.0) ORDER BY last_name, first_name; esta es la mas facil, selecciono nombres y apellidos, y filtro el employee_id para que sea igual una subconsulta donde obtengo todos los managers de empleados, y claro ademas filtro otra vez el employee_id para los empleados de menos de 3 meses
SELECT last_name,first_name FROM hr.employees WHERE employee_id in (select manager_id from hr.employees where (sysdate-hire_date < 90) ) ORDER BY last_name, first_name; Todavia mas facil, filtro el employee_id eligiendo los manager_id de los empleados que tienen menos de 90 dias, recordemos que al restar dos fechas obtenemos el numero de dias entre las dos fechas Ejercicio 2: Realice una consulta que muestre el nombre de la region y pais, citando para cada uno de los paises, muestre el total de empleados que laboran en cada pais, y ademas el coeficiente de rotacion de personal (total empleados entre total de empleados despedidos o que cambiaron hacia otro puesto) esquema HR oracle
SELECT r.region_name, p.country_id, p.country_name , count(e.employee_id) as total_empleados , count(e.employee_id) / ( select count(j.employee_id) from HR.job_history j natural join hr.departments natural join hr.locations x where x.country_id = p.country_id ) as COF FROM hr.regions r join hr.countries p on (r.region_id=p.region_id) join hr.locations l on (l.country_id=p.country_id) (l.country_id=p.country_ id) natural join hr.departments natural join hr.employees e GROUP BY r.region_name, p.country_id, p.country_name Esta esta mas divertida, primero se hace la c ascada de relaciones, desde regions, hasta employees, colocando alias a las tablas, se inicia normalmente, hasta el c ount, luego si te fijas, utilizo el c ampo de la consulta externa p.country para filtar la consulta interna, para sacar el coeficiente que pide, pues estamos agrupando por el country_id.
Ejercicio 3: Realice una consulta que muestre el Department_id, el Department_name, el total de empleados por departamento, la cantidad de dias promerio que tienen laborando los empleados en dicho depto, y el nombre y el apellido del empleado que tiene mas dias laborando en ese depto (asuma que solo hay un empleado con mas dias laborando), muestre solo la informacion para deptos que tienen mas de 3 empleados laborando
SELECT d.department_id,d.department_name, count(e.employee_id) as Total_Empleados, avg(sysdate-e.hire_date) as DiasProm, (select max( x.first_name) from hr.employees x where x.department_id=d.department_id AND (sysdate-x.hire_date) = ( select max(sysdate-e2.hire_date) from hr.employees e2 where e2.DEPARTMENT_ID=d.department_id e2.DEPARTMENT_ID=d. department_id ) ) as Nombre, (select max( x.last_name) from hr.employees x where x.department_id=d.department_id AND (sysdate-x.hire_date) = ( select max(sysdate-e2.hire_date) from hr.employees e2 where e2.DEPARTMENT_ID=d.department_id e2.DEPARTMENT_ID=d. department_id ) ) as Apellidos FROM hr.departments d join hr.employees e on (d.department_id=e.department_id) GROUP BY d.department_id, d.department_name ;