1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | ----------------------------2021-03-08 -- 직급이 대리, ASIA 지역에 근무하는 직원의 -- 사번, 이름, 직급명, 부서명, 근무지역명, 급여(원화표시) SELECT EMP_ID, EMP_NAME, JOB_NAME, DEPT_TITLE, LOCAL_NAME, TO_CHAR(FLOOR(SALARY),'L999,999,999') AS 급여 FROM EMPLOYEE JOIN JOB ON (EMPLOYEE.JOB_CODE=JOB.JOB_CODE) JOIN DEPARTMENT ON (DEPT_ID=DEPT_CODE) JOIN LOCATION ON (LOCATION_ID=LOCAL_CODE) WHERE JOB_NAME='대리' AND LOCAL_NAME LIKE 'ASIA%'; -- ㄴ 변수???? 사용 SELECT EMP_ID, EMP_NAME, JOB_NAME, DEPT_TITLE, LOCAL_NAME, TO_CHAR(FLOOR(SALARY),'L999,999,999') AS 급여 FROM EMPLOYEE E JOIN JOB J ON (E.JOB_CODE=J.JOB_CODE) JOIN DEPARTMENT D ON (DEPT_ID=DEPT_CODE) JOIN LOCATION L ON (LOCATION_ID=LOCAL_CODE) WHERE JOB_NAME='대리' AND LOCAL_NAME LIKE 'ASIA%'; -- NON EQUAL JOIN : 동등한 컬럼을 가지고 비교를 하는게 아니라 범위컬럼을 비교 SELECT EMP_NAME, SALARY, SAL_GRADE.SAL_LEVEL FROM EMPLOYEE E JOIN SAL_GRADE ON (E.SALARY BETWEEN SAL_GRADE.MIN_SAL AND SAL_GRADE.MAX_SAL); -- 전지연의 매니저 이름 조회 (단일행 서브쿼리 : 서브쿼리 RESULTSET이 1개 ROW 1개 인 것) SELECT E.EMP_ID, E.EMP_NAME, E.MANAGER_ID, M.EMP_NAME AS 매니저명 FROM EMPLOYEE E JOIN EMPLOYEE M ON E.MANAGER_ID=M.EMP_ID WHERE E.EMP_NAME='전지연'; -- 위를 서브쿼리 이용 SELECT EMP_NAME FROM EMPLOYEE WHERE EMP_ID=(SELECT MANAGER_ID FROM EMPLOYEE WHERE EMP_NAME='전지연'); -- 전체사원의 평균 급여보다 많이 받는 사원의 이름, 부서코드, 월급 조회 SELECT EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY>(SELECT AVG(SALARY) FROM EMPLOYEE); -- 전 사원 중 최소급여를 받는 사원의 이름, 부서코드, 직책코드, 월급 조회 SELECT MIN(SALARY) FROM EMPLOYEE; SELECT EMP_NAME, DEPT_CODE, JOB_CODE, SALARY FROM EMPLOYEE WHERE SALARY = (SELECT MIN(SALARY) FROM EMPLOYEE); -- 최대급여를 받는 사원과 윤은해랑 같은 급여 받는 사원 조회 SELECT EMP_NAME, DEPT_CODE, JOB_CODE, SALARY FROM EMPLOYEE WHERE SALARY = (SELECT MAX(SALARY) FROM EMPLOYEE) OR SALARY=(SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME='윤은해'); -- 다중행 서브쿼리 : 서브쿼리 결과 (RESULTSET) 컬럼 1개, ROW 다수 SELECT DEPT_CODE FROM EMPLOYEE WHERE EMP_NAME IN ('송종기','윤은해'); SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE --WHERE DEPT_CODE = (SELECT DEPT_CODE FROM EMPLOYEE WHERE EMP_NAME IN ('송종기', '윤은해')); = 사용 안됨 WHERE DEPT_CODE IN (SELECT DEPT_CODE FROM EMPLOYEE WHERE EMP_NAME IN ('송종기', '윤은해')); -- ㄴ WHERE DEPT_CODE IN('D9', 'D5'); -- 대표, 부사장을 제외한 사원의 사원명, 부서명, 직책명 조회 SELECT EMP_NAME, DEPT_TITLE, JOB_NAME FROM EMPLOYEE JOIN JOB ON (JOB.JOB_CODE=EMPLOYEE.JOB_CODE) JOIN DEPARTMENT ON (DEPT_ID=DEPT_CODE) WHERE JOB_NAME NOT IN (SELECT JOB_NAME FROM DEPARTMENT WHERE JOB_NAME IN('대표','부사장')); -- 직급이 대표, 부사장이 아닌 ASIA1 에서 근무하는 사원 조회 SELECT EMP_NAME FROM EMPLOYEE WHERE JOB_CODE NOT IN (SELECT JOB_CODE FROM JOB WHERE JOB_NAME IN('부사장', '대표')) AND DEPT_CODE IN (SELECT DEPT_ID FROM DEPARTMENT JOIN LOCATION ON LOCATION_ID=LOCAL_CODE WHERE LOCAL_NAME='ASIA1'); -- 다중행 서브쿼리를 동등비교 했을 땐, 결괏값을 OR로 묶어서 처리한다. -- ANY / ALL 다중값에 대해 대소비교를 할 수 있는 예약어 -- ANY : RESULTSET 으로 나온값을 OR 연결해서 대소비교 한다. -- X > ANY(다중행서브쿼리) : ANY에 있는 어떤 값보다 X가 크면 TRUE -> 최소값보다 크면 TRUE; -- D5,D6부서에서 최저급여 받는 사원보다 많이받는 사원의 이름 월급 부서코드 조회 SELECT EMP_NAME, SALARY, DEPT_CODE FROM EMPLOYEE WHERE SALARY > ANY(SELECT SALARY FROM EMPLOYEE WHERE DEPT_CODE IN ('D6', 'D5')); -- 직책이 J3, J5인 사원 최소급여 보다 많이 받는 사원 조회 SELECT * FROM EMPLOYEE WHERE SALARY > ANY(SELECT SALARY FROM EMPLOYEE WHERE JOB_CODE IN ('J3', 'J5')); -- X < ANY (서브쿼리) : ANY에 있는 어떤 값보다 X가 작기만 하다 -> 최댓값보다 작으면 TRUE. -- 부서 D2, D5 에서 최대급여인 사원보다 더 받는 사원 조회 SELECT * FROM EMPLOYEE WHERE SALARY > (SELECT MAX(SALARY) FROM EMPLOYEE WHERE DEPT_CODE = 'D2' OR DEPT_CODE = 'D5'); -- 다중행, 다중열 서브쿼리 : 행, 열 모두 다수 -- 부서별 최소급여 조회 SELECT DEPT_CODE, MIN(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE; -- 부서별 최소급여받는 사원 조회 SELECT * FROM EMPLOYEE WHERE (DEPT_CODE, SALARY) IN (SELECT DEPT_CODE, MIN(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE); -- 부서별 최대급여 사원 하고 최소급여 받는 사원 조회 -- 사원명, 부서명, 급여 출력.. NULL 도 출력 SELECT EMP_NAME, NVL(DEPT_TITLE,'인턴'), SALARY FROM EMPLOYEE LEFT JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID WHERE (NVL(DEPT_CODE,1), SALARY)IN(SELECT NVL(DEPT_CODE,1), MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE) OR (NVL(DEPT_CODE,'GOM'), SALARY)IN(SELECT NVL(DEPT_CODE,'GOM'), MIN(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE); -- 상관서브쿼리(상호연관) : 메인뭐리의 값을 서브쿼리에 주고 서브쿼리를 수행한 다음 그 결과를 다시 메인쿼리로 반환 -- ㄴ 서브쿼리의 WHERE절에 메인쿼리의 값을 가져와 비교 -- EXISTS : 서브쿼리 결과가 있을 때 ROW 있으면 TRUE, ROW 0개면 FALSE SELECT * FROM EMPLOYEE WHERE EXISTS (SELECT 1 FROM EMPLOYEE WHERE EMP_ID='200'); -- 상관서브쿼리로 DEPT_CODE 가 있는 사원 출력 -- IS NOT NULL 또는 JOIN 미사용 -- 이름, DEPT_CODE SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE E WHERE EXISTS(SELECT EMP_NAME FROM EMPLOYEE WHERE DEPT_CODE=E.DEPT_CODE); -- 웨어절 셀렉트 바로 뒤 EMP_NAME에는 아무 컬럼이나 넣어도 됨. 값이 있나 확인용이라.. -- 급여를 가장 많이받는 사원을 상관서브쿼리로 조회 -- 사워명, 급여 SELECT EMP_NAME, SALARY FROM EMPLOYEE E WHERE NOT EXISTS(SELECT '돈많다~' FROM EMPLOYEE WHERE SALARY>E.SALARY); -- 직급이 J1,J2,J3가 아닌 사원 중에서 자신의 부서 평균급여보다 많이 받는 사원 조회 SELECT EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE E WHERE JOB_CODE NOT IN ('J1','J2','J3') AND SALARY>(SELECT AVG(SALARY)FROM EMPLOYEE WHERE DEPT_CODE=E.DEPT_CODE); | cs |
'KH정보교육원_웹 프로그래머 과정 > Oracle DB' 카테고리의 다른 글
Database 기본7 (제약조건) (0) | 2021.03.10 |
---|---|
Database 기본6 (0) | 2021.03.09 |
Database 기본4 (0) | 2021.03.07 |
Database 기본3 (0) | 2021.03.02 |
SQL Developer (0) | 2021.02.25 |