본문 바로가기

SQL/ORACLE

SQL HR 예제 문제 풀이 2

이번 문제는 도시 중에서도 부서가 없는 도시를 조회하는 문제이다.
SELECT 절에서는 도시를 조회하기 위하여 CITY 컬럼을 두었고,
FROM 절에서는 도시를 기준하기 위하여 LOCATIONS 를 두었다.
WHERE 절에서 조건을 거는데, LOCATIONS 의 LOCATION_ID 가 DEPARTMENTS 의 LOCATION_ID 와 일치하지 않으면 되기 때문에 서브쿼리를 사용하여 DEPARTMENTS 의 LOCATION_ID 를 SELECT 해오도록 하였다.

 

위의 문제를 응용한 문제이다. 
국가 명을 조회하는데 사원이 존재하지 않는 국가를 조회해야 하는 문제이다. 
사원에 대한 정보는 EMPLOYEES 테이블에 존재하고 있는데, 이 테이블에는 국가와 관련한 정보가 없다.
대신 DEPARTMENTS 테이블을 지나 LOCATIONS 테이블에 도달하면 국가와 관련한 COUNTRY_ID 를 찾을 수 있게 된다. 
이를 위하여 서브쿼리에서 LOCATIONS 테이블에서의 COUNTRY_ID 를 SELECT 해오는데
DEPARTMENTS 테이블의 LOCATION_ID 가 같은 경우와 EMPLOYEES 테이블의 DEPARTMENT_ID 가 같은 경우를 묶어서 SELECT 해온다.

 

 

이번 문제는 순서를 천천히 진행하면 문제에 접근할 수 있다.
먼저 사원 번호가 150 번인 사원의 입사일을 출력할 수 있어야 한다. 

그 다음 이 150 번 사원의 입사일과 모든 사원의 입사일을 비교하여 
150 번 사원보다 먼저 입사한 사원을 출력해야 한다.
먼저 입사했다는 것은 150 번 사원의 입사일보다 작은 경우를 찾아야 한다.

이제 이 내용을 FROM 절에 넣어 문제의 첫 번째 줄을 완성시킨다.

이제 문제의 두 번째 줄을 살펴보자.
모든 정보를 조회해야 하기 때문에 위의 SELECT 에서 * 를 사용하였고,
이번에는 가장 최근에 입사한 사원을 찾아야 한다.
가장 최근이라는 것은 입사일이 가장 크다는 것이기 때문에 사원들의 입사일을 구했던 쿼리에 ORDER BY 절을 추가해준다.
입사일을 기준으로 내림차순이 될 수 있도록 한다.

마지막으로 내림차순 정렬이 된 사원의 데이터 중 가장 첫 번째 행을 출력할 수 있도록
WHERE 절에 ROWNUM = 1 을 추가한다.

 

이번 문제는 사원의 모든 정보를 조회해야 하는데
사원들 중에서도 직무를 전환한 이력이 있는 사원이어야 한다.
사원의 모든 정보를 출력하기 위해서는 FROM 절의 대상 테이블이 사원 테이블이어야 한다.
WHERE 절에는 직무 전환 이력이 있는지를 확인해야 하는데
사원들의 직무 전환 이력은 JOB_HISTORY  테이블에 존재한다.
두 테이블 간의 EMPLOYEE_ID 데이터를 비교하여 출력한다.

 

사원의 모든 정보를 조회해야 하기 때문에 FROM 절에는 EMPLOYEES 테이블을 작성하였다.
사원 중에서도 부서장으로 있는 사원이기 때문에 사원의 MANAGER_ID 가 
각 부서의 MANAGER_ID 와 일치하는 사원을 WHERE 절에서 출력하면 된다.  

 

이번 문제는 사원 중에서도 다른 사원의 상사로 있는 사원의 모든 정보를 조회하는 문제이다.
대상이 되는 사원은 모든 같은 테이블에 존재하고 있기 때문에 FROM 절에는 EMPLOYEES 테이블이 두 번 쓰인다.
사원의 번호가 상사의 사원 번호와 같은 경우를 찾아야 한다.
앞의 테이블에서는 상사의 사원 번호를 가져오고, 뒤의 테이블에서는 사원 번호를 가져와 비교를 한다.

 

이번 문제는 조회 대상 컬럼이 각각 다른 테이블에 존재하기 때문에  JOIN 으로 묶어서 사용하였다.
그중에서도 이름에 대해 특정한 조건을 걸고 있기 때문에 LIKE 함수를 사용하였다.
C 로 시작하고 s 로 끝나며 그 중간에는 몇 글자가 있는지 상관없기 때문에 % 로 조건을 작성하였다.

 

이 문제는 29번 문제에서 NOT IN 으로 변경하여,
직무 전환한 이력이 없는 사원을 추출하는 문제이다.

 

이번 문제의 대상이 될 것은 150 번 사원과 사원들이다.
때문에 FROM 절에서 150 번 사원의 정보와 사원들에 관련한 정보를 작성하면 된다.

150 번 사원의 입사일과 연봉을 이후에 비교해야 하기 때문에 두 컬럼명을 SELECT 한다.
다음에는 사원 테이블을 함께 작성한다.

별칭을 작성하여 각 데이터를 WHERE 절에서 쓸 수 있도록 하였다. 
그 다음 WHERE 절에서 150 번 사원보다 입사일이 늦고, 더 많은 연봉을 받는다는 조건식을 작성하였다. 
두 조건 모두 만족해야 하기 때문에 AND 로 붙여 사용했다.

 

이번 문제는 31 번 문제에서 조건을 하나 추가하면 된다.
직원의 입사일보다 상사의 입사일이 늦는 사원의 정보만 추출해야 하기 때문에
AND 로 입사일 비교문을 추가하였다. 
DATE 타입에서는 날짜가 과거일수록 작다고 본다.

 

이번 문제는 간단한 조건식만 작성해 주면 된다.
WHERE 절에 상사의 직원 번호가 100 번과 일치하는지 여부를 따지면 된다.

 

이번 문제는 도시 중에서도 해당 도시에서 근무하는 사원의 수가 가장 많은 도시를 추출해야 한다.
때문에 먼저 도시별 사원 수를 출력해야 한다.

사원이 속한 도시에 관한 정보는 부서 테이블을 타고 지역 테이블까지 연결되어야 한다.
때문에 JOIN 으로 연결하여 이들을 CITY 로 묶어 인원 수가 가장 많은 순서로 정렬하였다.
이후 이 정렬된 데이터 안에서 도시명을 출력할 것인데, 
사원 수가 가장 많은 첫 번째 도시를 출력하는 WHERE 절 조건을 추가한다.

 

부서마다 직무가 여러 가지 있는 경우가 있다.
이번 문제는 직무의 종류가 가장 많은 부서의 이름을 조회하라는 문제이다.
이러한 경우와 관련한 문제이다. 
먼저 찾아야 하는 데이터는 부서별 어떤 직무가 있는지 알아야 한다.

GROUP BY 절을 통해 부서별, 직무별 그룹화를 하여 데이터를 얻었다. 
이제 이 데이터를 바탕으로 부서별 직무가 몇 개 있는지 알아야 한다.

이제 여기에서 가장 많은 직무가 있는 부서명을 출력하면 되는 것이다. 

 

39번 문제는 담당 직무의 최대 연봉을 받고 있는 사원들의 모든 정보를 조회하라는 문제이다.
먼저 추출해야 할 정보는 담당 직무별 최대 연봉을 알아야 한다.

이를 바탕으로 최대 연봉과  사원 테이블의 연봉이 일치하는 사원의 모든 정보를 조회하면 된다.

 

40 번 문제는 39 번 문제에서 최대 연봉이 아닌 최소 연봉으로 조건을 변경하면 된다. 

 

이번 문제는 부서별, 직무별로 사원을 구분하여
최대 연봉과 최소 연봉 그리고 구분된 사원 수를 구하는 문제이다.
사원 테이블에 부서 테이블과 직무 테이블을 JOIN 하여 이들을 부서별, 직무별로 그룹화 하기 위하여
GROUP BY 절을 활용하였다.

 

이 문제에서는 먼저 사원 수가 가장 많은 도시를 구해야하기 때문에 
도시별로 사원 수가 어떻게 되어 있는지에 대한 데이터 추출이 필요하다.
사원 테이블에는 도시에 대한 정보가 없으니 부서 테이블을 타고 들어가야 한다.
다음은 가장 많은 사원 수를 가진 도시와 사원, 부서, 장소에 대한 FROM 절을 만들어 줘야 한다.

 

이번 문제는 위의 문제를 변형한 문제이다. 
마찬가지로 사원수가 가장 많은 도시를 먼저 구해주었다.
여기에서 해당 도시를 추출하여 FROM 절에 포함시킨다.

이번 문제는 직무별뿐만 아니라 부서별 그룹을 하였기 때문에 
직무에 포함된 부서에 대한 월급 정보가 나눠 결과가 나온 것이다.

 

가장 오래된 사원을 구하기 위해서 먼저 사원들의 입사일을 출력해서 확인해야 한다.
이들 중 가장 오래된 사원은 첫 번째 출력된 사원으로 이 정보만을 다음과 같이 빼야 한다.

그 다음 이 입사일과 일치하는 사원의 정보를 빼오면 된다.

이번 문제는 44번 문제의 변형이다.
최근에 입사한 사원의 입사일을 조회하기 위해서 ORDER BY 절에 DESC 키워드를 사용하였다.

또는 집계 함수를 활용하여 이렇게 작성할 수도 있다. 

 

SQL 의 DATE 타입은 연산이 가능하기 때문에 위의 풀이처럼 바로 - 를 통해 일차를 알 수 있다.
날짜에서 날짜를 빼면 일차가 연산된다.

 

 

일차에 대한 연산을 위에서 했기 때문에 여기에 24를 곱해준다.
24를 곱해주는 이유는 하루가 24시간이기 때문이고
SQL 에서는 곱하기의 우선 순위가 빼기보다 먼저이기 때문에 일차를 구하는 연산을 괄호로 묶어준다.

 

'SQL > ORACLE' 카테고리의 다른 글

SQL HR 예제 문제 풀이 3  (0) 2022.11.06
SQL HR 예제 문제 풀이 1  (1) 2022.11.04
ORACLE SQL DEVELOPER 사이드바(접속) 보이게 하기  (0) 2022.11.04
GROUP BY : 그룹 함수  (0) 2022.11.02
데이터 타입 변환  (0) 2022.10.28