Sie sind auf Seite 1von 7

Seleccionar el nombre de las personas de la tabla personas y el nombre de la ciudad en la que viven de la tabla ciudades cambiando el nombre de la tabla

de ciudades por ciudad. SQL> select personas.nombre, ciudades.nombre "ciudad" from personas, ciudades where personas.codciudad=ciudades.codigo; Seleccionar la cantidad de personas que viven en cada ciudad: select count(*), ciudades.nombre ciudad from ciudades group by ciudades.nombre; para ver las ciudades con mas de una persona select count(*), ciudades.nombre ciudad from personas,ciudades where codciudad=codigo group by ciudades.nombre having count(*)>1; para ordenar por orden inverso de ciudad select count(*), ciudades.nombre ciudad from personas,ciudades where codciudad=codigo group by ciudades.nombre order by ciudades.nombre desc; para ordenar por el numero de personas de mas pobladas a menos select count(*), ciudades.nombre ciudad from personas,ciudades where codciudad=codigo group by ciudades.nombre order by count(*) desc; otra opcion select count(*), ciudades.nombre ciudad from personas,ciudades where codciudad=codigo group by ciudades.nombre order by 1 desc; ordena por el pimer campo de la tabla para mayores de edad select count(*), ciudades.nombre ciudad from personas,ciudades where codciudad=codigo and edad>=18 group by ciudades.nombre order by count(*) desc; para ver las ciudades que no tienen habitantes mostrando el nombre de las ciudades

por claridad esta bien poner parentesis (select ciudades.nombre ciudad from ciudades) minus (select ciudades.nombre from personas,ciudades where codciudad=codigo); personas que viven en alicante y trabajan en la empresa ES MEJOR ESTA FORMA (select personas.nombre empleado from personas where codciudad='a') intersect (select ename from emp); o tambien asi peor (select personas.nombre from personas where codciudad='a') intersect (select ename from personas,ciudad,emp where codciudad='a'); sacar el nombre de todas las personas de la base de datos (select personas.nombre from personas) union (select ename from emp);

Para poder sacar los departamentos que hay y ver los que trabajan en el seria con el llamado outer join, que consiste en poner la marca (+) para que rellene los campos con un null que no tienen ningun empleado y no se los cargue como otras veces, tabla1 seria departamento y tabla2 seria empleados SELECT .... FROM tabla1, tabla2, ... WHERE tabla1.campo1 = tabla2.campo2 (+) tabla2.campo3 (+) = valor ...; select dept.dname departamento from dept, emp where dept.deptno = emp.deptno (+);

and

Esto solo saca los departamentos con morralla Ahora numero de personas que hay por departamento con group by Con esto conseguimos que ponga un 0 en el departamento que no tiene empleados, si usamos count (*) sale 1 aunque no halla empleados ya que count (*) cuenta lineas. select count(emp.deptno), dept.dname departamento from dept, emp where dept.deptno = emp.deptno (+) group by dept.dname; Ahora para ver la ordenacion jerarquica desde el jefe al empleado con sus manager START WITH condicion CONNECT BY campo_HIJO = PRIOR campo_PADRE seria : hay que ver ename, empno y mgr select ename, empno,mgr from emp start with mgr is null connect by mgr = prior empno; Ahora para sacar por niveles select empno,mgr,level,ename from emp start with mgr is null connect by mgr = prior empno; Ahora tabulando el nombre segun el nivel SELECT LPAD(' ',2*(LEVEL-1)) || empno,level,ename org_chart FROM emp START WITH job = 'PRESIDENT' CONNECT BY PRIOR empno = mgr;

********************************************************************** SUBCONSULTAS Mostrar la media del salario select avg(sal) from emp; Seleccionar las personas que cobran mas que la media

select ename "nombre", sal "salario" from emp where sal > (select avg(sal) from emp); Nombre de la ciudad mas habitada select personas.codciudad from personas group by codciudad having count(*) = (select max (count (*)) from personas group by codciudad); Ahora personas que viven en la ciudad mas habitada select personas.nombre, personas.codciudad from personas where codciudad = (select personas.codciudad from personas group by codciudad having count(*) = (select max (count (*)) from personas group by codciudad)); Personas que cobran menos de la mitad que el jefe Primero sacamos el valor de la mitad del sueldo del jefe select emp.ename, sal/2 from emp where mgr is null; Ahora hay que sacar los empleados que cobran menos que eso select emp.ename,sal from emp where sal < (select sal/2 from emp where mgr is null); Personas que menos cobran en la empresa select emp.ename, sal salario from emp where sal = (select MIN (sal) from emp); Ahora compaeros de departamento de los pobres select ename from emp where deptno in (select deptno from emp where sal = (select MIN (sal) from emp)) minus (select ename from emp

where sal = (select MIN (sal) from emp)); Una subconsulta puede ir en cualquier parte, como en un from, en un select despues de los campos, pero esta poco recomendado por eficiencia de tiempo. esto anterior esta bien porque devuelve una cosa pero si tuviera que devolver varias columnas habria que hacer esto otro SELECT ... FROM ... WHERE (valor1, valor2, ...) = (SELECT campo1, campo2, .. . FROM .... ..... ); Aqui en vez del comparador = se puede usar like o in tambien, con > y < la cosa cambia, su uso normal es con =,like o in

Para meter todas las lineas de una tabla dentro de otra se usa un inserte into... y en vez del values se pondria el select insert into tabla (select.... este select debe devolver lo mismo, es decir, si en el insert el primero es fecha el select debe devolver fecha el primero) tambien se puede hacer un create as (select...) crearia una tabla con los datos de ese select Ahora vamos a crear la tabla de pobres create table daw116 as (select ename from emp where deptno in (select deptno from emp where sal = (select MIN (sal) from emp)) minus (select ename from emp where sal = (select MIN (sal) from emp))); empleados que cobran mas que la media de su departamento, hay que hacerlo con subconsultas sincronizadas, primero miraremos el sueldo medio de cada departamento para ver que tendria que salir Con el primer select anidado vemos la media de departamento, el segundo select nos dice quien cobra mas que la media de su departamento select ename, sal, deptno, (select avg (sal) from scott.emp e3 where e3.deptno=e1.deptno) media from scott.emp e1 where sal > (select avg (sal)

from scott.emp e2 where e2.deptno=e1.deptno); Empleados mas antiguos que la antiguedad media de su departamento select sysdate-hiredate "dias",ename,deptno from scott.emp e1 where sysdate-hiredate > (select avg (sysdate-hiredate) from scott.emp e2 where e2.deptno=e1.deptno); select sysdate-hiredate "dias", ename,deptno,(select avg (sysdate-hiredate) from scott.emp e3 where e3.deptno=e1.deptno)media from scott.emp e1 where sysdate-hiredate > (select avg (sysdate-hiredate) from scott.emp e2 where e2.deptno=e1.deptno); empleados que trabajan en departamentos con mas de 4 personas select count(*),deptno from scott.emp group by deptno; con esto sacamos la media de cada departamento

select count(*),deptno from scott.emp group by deptno having count(*)>4; ahora sacar el nombre de los que trabajan en esos departamentos select ename,deptno from scott.emp where deptno IN (select deptno from scott.emp group by deptno having count(*)>4); Ahora vamos a utilizar el update con select esto sirve para modificar y poder operar con los datos que tu quieras esto sirve para poder poner a cada empleado el salario medio de su departamento update scott.emp set sal = (select Ejemplo sal_max from scott.dept where dept.deptno=emp.deptno);

Exists se limita a comprobar que el select que metes dentro devuelve alguna linea, existe tambien el not exists que es al contrario --------------------------------------------------------------------------------------------------Ahora nombre de las personas y nombre departamento select emp.ename "Nombre", dept.dname "Dpto" from emp, dept where emp.deptno=dept.deptno; para saber cuantas personas hay por departamento select count(*),dept.dname dpto from emp,dept where emp.deptno=dept.deptno group by dept.dname;

Das könnte Ihnen auch gefallen