GreysitoErPutoAmo

Subconsultas 2

Mar 6th, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.74 KB | None | 0 0
  1. /*PAG 123 EMILIA HA DICHO QUE LAS CONSULTAS NO PUEDEN ESTAR EN LA MISMA LINEA*/
  2.  
  3. /*Pregunta de emilia, sacar los empleados cuyo salario sea igual que el minimo del departamento*/
  4. SELECT EMP_NO, APELLIDO
  5. FROM EMPLE
  6. WHERE SALARIO = (SELECT MIN(SALARIO) FROM EMPLE WHERE DEPT_NO=30);
  7.  
  8. /*En uno de los departamentos deberiamos tener 2 empleados con el salario mínimo, si no lo tenemos insertamos un nuevo empleado"/
  9.  
  10. /*Hacer select del minimo salario de cada departamento con GROUP BY*/
  11. SELECT DEPT_NO, MIN(SALARIO)
  12. FROM EMPLE
  13. GROUP BY DEPT_NO;
  14.  
  15. /*pedimos todos los empleados que tengan el minimo salario en cada departamento, incluimos IN para que devuelva mas de un valor*/
  16. SELECT *
  17. FROM EMPLE
  18. WHERE (DEPT_NO, SALARIO)
  19. IN (SELECT DEPT_NO, MIN(SALARIO) FROM EMPLE GROUP BY DEPT_NO);
  20.  
  21. /*SUBCONSULTA CORRELACIONADA (apartado D): pedimos lo mismo que en la anterior pero de distinta forma, en el libro pide el maximo, pero yo soy mas chulo =)*/
  22. SELECT *
  23. FROM EMPLE E
  24. WHERE SALARIO = (SELECT MIN(SALARIO) FROM EMPLE WHERE DEPT_NO = E.DEPT_NO);
  25. /*debemos poner un alias E a la tabla EMPLE y así al comparar el numero de departamento lo compara con el numero de departamento del empleado*/
  26.  
  27. /*EJERCICIO 12 PAG. 121 - CONSULTAR DATOS de empleados que trabajen en madrid y barcelona*/
  28.  
  29. /*primero seleccionamos los numeros de dept que esten en madrid y barcelona*/
  30. SELECT DEPT_NO
  31. FROM DEPART
  32. WHERE LOC IN ('MADRID', 'BARCELONA');
  33.  
  34. /*seleccionamos los datos de los empleados de los 2 departamentos que nos da la consulta anterior*/
  35. SELECT *
  36. FROM EMPLE
  37. WHERE DEPT_NO IN(20,30);
  38.  
  39. /*unimos las dos consultas anteriores poniendo la primera como subconsulta de la segunda*/
  40. SELECT *
  41. FROM EMPLE
  42. WHERE DEPT_NO IN (SELECT DEPT_NO FROM DEPART WHERE LOC IN ('MADRID', 'BARCELONA'));
  43.  
  44. /*apellidos y oficios de todos los empleados del departamento 20 cuyo trabajo sea idéntico al de cualquiera
  45. de los empleados del departamento 'VENTAS'*/
  46. SELECT APELLIDO, OFICIO
  47. FROM EMPLE
  48. WHERE DEPT_NO=20 AND OFICIO IN (SELECT OFICIO  FROM EMPLE  WHERE DEPT_NO =(SELECT DEPT_NO FROM DEPART WHERE DNOMBRE='VENTAS'));
  49.  
  50. /*apellido de los empleados con el mismo oficio y salario que 'GIL'. En esta consulta se introduce una variante:
  51. hasta ahora las subconsultas nos devolvían una columna, aunque pueden devolver más de una. En este caso, la subconsulta
  52. devuelve dos columnas, el oficio y el salario*/
  53. SELECT APELLIDO, SALARIO
  54. FROM EMPLE
  55. WHERE (OFICIO, SALARIO) = (SELECT OFICIO, SALARIO FROM EMPLE WHERE APELLIDO ='GIL');
  56. /*si tenemos 2 gil en la tabla nos dará error al devolvernos varios valores,
  57. podemos borrar uno de los gil para que no de error. OTRA SOLUCION: podemos no borrar gil y poner una clausula ANY para que seleccione cualquiera de los gil*/
  58. DELETE FROM EMPLE WHERE EMP_NO=7788;
  59.  
  60. /*ahora provamos esta select con solo 1 gil para ver que nos devuelve los mismos datos que la anterior consulta*/
  61. SELECT APELLIDO, SALARIO FROM EMPLE
  62.  WHERE OFICIO= (SELECT OFICIO FROM EMPLE WHERE APELLIDO ='GIL')
  63.  AND SALARIO= (SELECT SALARIO FROM EMPLE WHERE APELLIDO ='GIL');
  64. /*insertaremos de nuevo un gil para ver las consecuencias, basicamente volverá a dar el mismo error usemos cualquiera de las 2 consultas.*/
  65. INSERT INTO EMPLE VALUES(5656,'GIL','ANALISTA',3333,'12/12/12',3000,1,20);
  66.  
  67. /*probamos las 2 select de antes con  ANY a ver si sale bien*/
  68. SELECT APELLIDO, SALARIO
  69. FROM EMPLE
  70. WHERE (OFICIO, SALARIO) = ANY (SELECT OFICIO, SALARIO FROM EMPLE WHERE APELLIDO ='GIL');
  71.  
  72.  
  73. SELECT APELLIDO, SALARIO FROM EMPLE
  74.  WHERE OFICIO= ANY (SELECT OFICIO FROM EMPLE WHERE APELLIDO ='GIL')
  75.  AND SALARIO= ANY (SELECT SALARIO FROM EMPLE WHERE APELLIDO ='GIL');
  76.  /*si un empleado tiene el mismo salario que un gil y el empleo de otro gil saldrá en la lista, y no deberia salir*/
Add Comment
Please, Sign In to add comment