본문 바로가기

SQL/ORACLE

SQL HR 예제 문제 풀이 3

48 번 문제는 조건에 맞는 사원의 성과 연봉을 조회하는 문제이다.
SELECT 절에는 조회 대상 컬럼을 작성해주고,
FROM 절에는 사원의 데이터가 있는 사원 테이블을 작성해주고,
WHERE 절에는 조회 조건인 연봉 12000 이상을 작성하였다.

 

49 번 문제는 특정한 사원을 조회해야 하는 문제이다. 
SELECT  절에는 조회 대상이 될 컬럼 명을 작성해주고,
FROM 절에는 사원의 데이터가 있는 사원 테이블을 작성해주고,
WHERE 절에는 조회 조건인 사원 번호 176 인 사람을 찾도록 작성하였다.

 

50 번 문제는 연봉이 특정 범위에 포함되지 않는 사람을 찾는 문제이다.
특정 범위를 찾는 것은  BETWEEN AND 로 범위를 쉽게 특정할 수 있는데, 
이 범위가 아닌 것을 찾을 때에는 앞에 NOT 키워드를 붙여주면 된다. 

 

51 번 문제는 특정 일자에 고용된 사원들에 대한 조회를 해야 하는 문제이다.
위의 문제와 마찬가지로 WHERE 절에 조건을 BETWEEN AND 을 사용하였고,
각각의 대상이 되는 날짜는 단순히 '2005/02/20'으로 사용하게 되면 문자열로 인식하기 때문에 HIRE_DATE 의 DATE 타입과 맞지 않아 묵시적 형변환이 발생하기도 한다. 
묵시적 형변환보다는 명시적 형변환을 사용하도록 하자.

 

52 번 문제는 범위가 아닌 몇 개의 특정한 부서를 찾아야 하는 문제이다.
이럴 때에는 IN 연산자를 활용하여 괄호 안의 값과 일치하는 값만을 출력할 수 있게 된다.
또한 정렬에도 알파벳 순이라는 조건이 있기 때문에 성을 기준하여 작성하였다.
기본 정렬은 A-Z 이기 때문에 ASC 키워드를 작성하지 않아도 괜찮지만,
Z-A 정렬을 하고 싶다면 DESC 키워드를 작성해줘야 한다.

 

53 번 문제는 조건이 추가되었다.
WHERE 절에서 조건이 두 개 이상이 되면, AND 또는 OR 로 조건을 연결할 수 있다.
AND 를 사용하면 AND 기준으로 앞 뒤 조건 모두를 만족하는 형태만 출력되고,
OR 를 사용하면 OR 기준으로 앞 또는 뒤 조건 중 하나만 만족해도 출력된다.
이번 문제는 두 조건 모두를 만족해야 하기 때문에 조건을 AND 로 연결하였다.

 

54 번 문제는 특정한 연도에 입사한 사원의 정보를 추출하는 문제이다.
입사일에서 연도만 추출하여 2005 년과 일치하는지 찾으면 된다.
DATE 타입에서 특정 부분을 추출하여 문자열과 비교하기 위하여 TO_CHAR 함수를 사용하였고, 
포멧은 연도만 추출할 것이기 때문에 'YYYY' 를 작성해줬다.

55 번 문제는 매니저가 없는 사원을 조회하는 문제이다.
매니저가 없는 경우는 매니저 번호가 없는 사람을 조건으로 추가하면 된다.
매니저 번호가 없는 경우는 NULL 이기 때문에 해당 컬럼이 NULL 인 경우를 찾아야 하는데,
NULL 값은 IS NULL 로 찾아야 한다. 
= 연산자로 찾으려고 하면 NULL = NULL 로 연산되는데 이 경우에는 알 수 없는 값으로 처리되어 FALSE 가 된다. 
NULL 값이 아닌 경우를 찾고 싶으면 IS NOT NULL 로 찾을 수 있다.

 

55 번 문제에서 IS NOT NULL 을 적용한 문제이다.

 

57 번 문제에서는 커미션을 받는 사원만 추출해야 하고, 연봉과 커미션을 역순으로 정렬해야 한다.
커미션을 받는 사람은 해당 컬럼의 데이터가 NULL 이 아니기 때문에 IS NOT NULL 로 찾아주면 된다.
정렬 기준이 두 개 이상이되면 쉼표 , 로 구분한다.

 

이번 문제는 특정한 위치에 원하는 글자가 포함되어 있는지 확인하기 위한 작업이 필요하다.
이러한 작업에는 LIKE 연산자를 유용하게 활용할 수 있다.
언더바 _ 를 통해 몇 글자가 필수로 있어야 하는지 표현해 줘야 하며 여기서는 a 가 네번째에 나타나야 함을 알려주기 위하여 a 앞에 언더바를 세 개 작성하였다.
그 다음 a 다음에는 무엇이 와야 한다는 특정한 조건이 없기 때문에 어떤 문자든, a 로 끝이 나든 상관없기에 % 를 작성해 주었다.

 

이번 문제는 특정 위치가 아닌 포함만 되면 되기 때문에 특정 문자 앞에 % 를 작성해 주었다.
또한 a 또는 e 를 가진 이름이라고 하였기 때문에 이 조건에 대해서는 OR 연산자를 통해 묶어 주었다.

 

이번 문제는 SELECT 절에 사용할 조회 컬럼에 대한 명시가 없지만, 조건에 맞는 조회를 해왔는지 확인하기 위하여 이름, 연봉, 직무에 대한 컬럼을 추가하였다.
또한 특정 데이터에 대한 포함 여부를 가리는 조건이기 때문에 IN 연산자를 사용하였다.

 

61 번 문제는 직무의 종류에 따라 등급을 달리 부여하여 출력하는 문제이다.
이럴 때 활용하기 좋은 것이 바로 CASE WHEN 이다.
JOB_ID 에 입력된 값에 따라 WHEN 절에서 작성한 데이터와 일치하면 THEN 값으로 출력하게 되는 것이다.
기타 이외의 것은 ELSE 문을 통해 작성할 수 있다.
CASE 문은 길게 작성되기 때문에 별칭을 작성해 주는 것이 좋다.

 

62 번 문제는 사원이 소속된 부서의 이름을 출력해야 한다.
하지만 사원 테이블을 확인해 보면 사원은 부서 번호만을 가지고 있다.
때문에 부서 테이블을 연결하여 사용해야 한다.
이 때 사원이 가진 부서 번호에 따른 부서 이름을 가져와야 하기 떄문에
USING 에 부서 번호를 작성해 주었다.

 

63 번 문제는 부서 번호 30 과 90 에 소속된 직무를 한 번만 출력하는 문제이다. 
중복된 행을 제거하고 한 번만 출력하도록 하기 위하여 DISTINCT 키워드를 사용하였다.

64 번 문제는 커미션을 받는 사원의 이름, 부서명, 지역 아이디, 도시명을 조회하는 문제이다. 
부서명은 부서 테이블에, 도시명은 지역 테이블에 있기 때문에 각각의 테이블을 JOIN 으로 묶었다.
그중에서도 커미션을 받는 사원을 기준으로 해야 하기 때문에 ON 절에 조건을 추가하였다.

 

65 번 문제는 시애틀에서 근무하는 사원에 대한 정보를 출력해야 한다.
앞서 말했듯이 사원 테이블에는 지역에 대한 정보가 없기 때문에 
부서 테이블 그리고 지역 테이블까지 연결되어야 한다.
그중에서도 지역 번호가 시애틀의 지역 번호와 일치하는 사람을 출력해야 하기 때문에 조건을 추가하였다.

 

 

 

66 번 문제는 먼저 LAST_NAME 이 DAVIES 인 사람의 입사일을 알아야 한다.

이 입사일보다 나중에 들어 온 사람들을 조회해야 하기 때문에 
WHERE 절에 HIRE_DATE > (DAVIES 의 입사일) 을 해주면 된다.

 

이 문제에서는 자신의 상사와의 입사일을 비교해야 한다.
상사 또한 사원 테이블에 같이 존재하기 때문에 사원의 상사 번호와 상사의 직원 번호가 같아야 한다.
이 때의 입사일을 비교하는 것이기 때문에 AND 연산자로 연결하였다.

 

이번 문제는 집계 함수와 소수점 관련 함수를 이용하면 쉽게 풀이 가능하다.
문제의 조건에는 자연수로 조회하기가 있기 때문에 소수점을 버리는 TRUNC 함수를 사용하였다.
최댓값을 찾기 위해 MAX, 최솟값을 찾기 위해 MIN, 합계를 찾기 위해 SUM, 평균을 찾기 위해 AVG 함수를 사용했다.

 

이번 문제는 68 번 문제에서 직무별 조회라는 새로운 조건이 생겼다.
~별은 GROUP BY 절에 작성하여 직무별을 구할 수 있다.

 

70 번 문제는 직무별로 해당 직무를 수행하는 인원 수를 구하는 문제이다.
직무별로 GROUP BY 로 묶인 항목은 COUNT(*) 함수를 통해 해당 데이터에 포함되는 열을 셀 수 있다.

 

71 번 문제는 먼저 상사로 있는 사원을 먼저 구해야 한다.

중복된 값과 NULL 값을 제외하여 상사의 번호를 추출하였다.
이제 이 값을 COUNT 하기 위하여 EMPLOYEE_ID 와 일치할 때 COUNT 할 수 있도록 하면 된다.
또는 COUNT 함수의 특징을 활용할 수 있다.
COUNT(*) 일 경우에는 NULL 값을 포함한 값을 결과로 보여주지만, 
COUNT(컬럼명) 인 경우에는 NULL 값을 제외하게 된다.
여기서 중복되는 값까지 제외하면 위의 쿼리보다 짧게 작성 가능하다.

 

72 번 문제는 최대 연봉과 최소 연봉을 구하여 - 연산을 적용하면 된다.

 

이번 문제는 출력해야 하는 결과에 관련한 데이터가 사원 테이블과 부서 테이블에 있다.
그래서 JOIN 으로 연결하였고, 
부서별 그룹화를 해야 하기 때문에 GROUP BY 절을 작성해 주었다.
여기서 주의해야 할 점은 GROUP BY 절에 부서뿐만 아니라 위치 컬럼도 쓰였다는 것이다.
SELECT 절에서 사용하고 싶은 컬럼은 반드시 GROUP BY 절에 작성해야 하기 때문임을 잊으면 안 된다.

 

이번 문제는 각 연도별 입사한 인원 수를 개별적으로 조회하기 위한 문제이다.
특정한 연도와 동일한 데이터를 추출하기 위해서는 WHERE 절의 조건으로 TO_CHAR 함수를 활용하였다.
여기에서 DISTINCT 를 사용하지 않으면 전체 인원수만큼이 출력되기 때문에 한번만 출력하기 위하여 사용하였다. 

 

75 번 문제는 (각 부서별의 각 직무별 연봉 총합)과 (각 부서별 연봉 총합)을 나눠서 생각해야 한다.
먼저 앞 부분에 대해 쿼리를 작성해 보면

위와 같이 작성할 수 있다.
그 다음은 각 부서별 연봉 총합을 조회해야 하는데
먼저 SELECT SUM(SALARY) 를 통해 연봉 총합을 조회할 수 있을 것이고,
FROM 절에는 사원 테이블을 추가할 수 있을 것이다.
그렇다면 어떻게 부서별로 총합을 구할 수 있을까?
여기서 SELECT 절에서 구하고자 하는 부서와 앞서 작성했던 부서가 서로 동일할 때 합을 구하도록 하면 된다. 
한 부서에는 여러 직무가 있기 때문에 부서를 기준하는 것이다. 

예를 들어 부서 번호 20에는 두 개의 직무가 있는데 각 13000 과 6000 을 합치기 위해서는 20에 일치하는 모든 값을 연봉을 총합하는 것이다.

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

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