SQL
ORACLE SQL) JOIN 연습문제
2025. 8. 8. 16:48

1. 70년대 생(1970~1979) 중 여자이면서 전씨인 사원의 이름과 주민번호, 부서 명, 직급 조회  

SELECT EMP_NAME, EMP_NO, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN JOB USING(JOB_CODE)
WHERE SUBSTR(EMP_NO,1,2) BETWEEN '70' AND '79' 
        AND SUBSTR(EMP_NO, 8, 1) IN('2','4')
        AND (EMP_NAME LIKE '전%');



2. 이름에 ‘형’이 들어가는 사원의 사원 코드, 사원 명, 직급 조회  

SELECT EMP_ID, EMP_NAME, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE)
WHERE EMP_NAME LIKE '%형%';


3. 부서코드가 D5이거나 D6인 사원의 사원 명, 직급 명, 부서 코드, 부서 명 조회  

SELECT EMP_NAME, JOB_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN JOB USING(JOB_CODE)
WHERE DEPT_CODE IN ('D5', 'D6');



4. 보너스를 받는 사원의 사원 명, 부서 명, 지역 명 조회  

SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME, BONUS*100, '%'
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCAL_CODE = LOCATION_ID)
WHERE BONUS IS NOT NULL;



5. 사원 명, 직급 명, 부서 명, 지역 명 조회  

SELECT EMP_NAME, JOB_NAME ,DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN JOB USING(JOB_CODE)
JOIN LOCATION ON(LOCAL_CODE = LOCATION_ID);


6. 한국이나 일본에서 근무 중인 사원의 사원 명, 부서 명, 지역 명, 국가 명 조회  

SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME, NATIONAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCAL_CODE = LOCATION_ID)
JOIN NATIONAL USING(NATIONAL_CODE)
WHERE NATIONAL_NAME IN('한국', '일본');




 7. 한명의 사원과 같은 부서에서 일하는 사원의 이름 조회 (자체조인 활용)  
-  같은 부서에서 일하는 다른 사원의 이름을 조회하시오.  
-  단, 모든 사원이 자신의 부서에서 함께 일하는 다른 사원의 이름을 확인할 수 있어야 합니다.  
-  (예: 사원 A가 속한 부서에서 다른 사원 B의 이름을 조회) 

SELECT A.EMP_NAME, B.EMP_NAME 
FROM EMPLOYEE A
JOIN EMPLOYEE B ON(A.DEPT_CODE = B.DEPT_CODE)
WHERE A.EMP_ID != B.EMP_ID
ORDER BY A.EMP_ID;



8. 보너스가 없고 직급 코드가 J4이거나 J7인 사원의 이름, 직급 명, 급여 조회 (NVL 이용) 

SELECT EMP_NAME, JOB_NAME, SALARY
FROM EMPLOYEE
LEFT JOIN JOB USING(JOB_CODE)
WHERE NVL(BONUS, 0) = 0 
        AND JOB_CODE IN('J4','J7');


9. 부서 명과 부서 별 급여 합계 조회  

SELECT DEPT_TITLE, SUM(SALARY)
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
GROUP BY DEPT_TITLE;
-- GROUP BY DEPT_CODE, DEPT_TITLE;



10. 부서 별 급여 합계가 전체 급여 총 합의 20%보다 많은 부서의 부서 명, 부서 별 급여 합계 조회 
-전체 급여 총 합의 20%를 계산해서 구하는 방식

SELECT DEPT_TITLE, SUM(SALARY)
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
GROUP BY DEPT_TITLE
HAVING SUM(SALARY) >= 14019248; --SELECT SUM(SALARY)*0.2 FROM EMPLOYEE;  = 14019248


 >> 서브 쿼리 방식

SELECT DEPT_TITLE, SUM(SALARY)
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
GROUP BY DEPT_TITLE
HAVING SUM(SALARY) >= (SELECT SUM(SALARY)*0.2 FROM EMPLOYEE);




11. 나이 상 가장 막내의 사원 코드, 사원 명, 나이, 부서 명, 직급 명 조회

SELECT EMP_ID, EMP_NAME,
       FLOOR(MONTHS_BETWEEN(SYSDATE, TO_DATE(SUBSTR(EMP_NO, 1, 6), 'RRMMDD')) / 12) AS "나이",
       DEPT_TITLE, JOB_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING (JOB_CODE)
WHERE TO_NUMBER(SUBSTR(EMP_NO, 3, 2)) BETWEEN 1 AND 12   -- 월이 1~12
  AND TO_NUMBER(SUBSTR(EMP_NO, 5, 2)) BETWEEN 1 AND 31   -- 일이 1~31
  AND FLOOR(MONTHS_BETWEEN(SYSDATE, TO_DATE(SUBSTR(EMP_NO, 1, 6), 'RRMMDD')) / 12) = (
      SELECT MIN(FLOOR(MONTHS_BETWEEN(SYSDATE, TO_DATE(SUBSTR(EMP_NO, 1, 6), 'RRMMDD')) / 12))
      FROM EMPLOYEE
      WHERE TO_NUMBER(SUBSTR(EMP_NO, 3, 2)) BETWEEN 1 AND 12
        AND TO_NUMBER(SUBSTR(EMP_NO, 5, 2)) BETWEEN 1 AND 31
  );




'SQL' 카테고리의 다른 글

SQL_18) 정규화가 무엇일까?  (0) 2025.12.18
SQL_17) RDBMS란 무엇인가?  (0) 2025.12.15
DQL 연습문제  (3) 2025.08.06
ORACLE SQL_16) TRIGGER  (0) 2025.08.06
ORACLE SQL_15) PL SQL  (4) 2025.08.06