PostgresSQL/PostgresSQL 복습

2026-06-11

jamk-diary 2026. 6. 11. 16:13
핵심 인재 리스트를 추출하라

오늘 배운 WHERE 절의 모든 무기(AND, OR, NOT IN, LIKE, IS NULL, 괄호())를 총동원해야 풀 수 있는 아주 묵직하고 재미있는 문제야. 😎

🏆 재미나의 실전 응용 과제: "핵심 인재 리스트를 추출하라!"

[미션] 인사팀에서 내년도 특별 관리 및 보너스 지급을 위해 특정 조건에 맞는 핵심 인재 리스트를 뽑아달라고 요청했어. 아래 조건에 맞는 사원들의 사원번호, 이름(성과 이름 합쳐서), 직업(job_id), 현재 급여, 그리고 10% 인상된 예상 급여를 출력해 줘!
[상세 필터링 조건]
  1. 급여(salary)가 10,000달러 이상인 고연봉자여야 해.
  2. 그런데 직업(job_id)이 'AD_PRES'이거나 'SA_MAN'인 사람은 제외해 줘. (힌트: NOT IN 활용!)
  3. [핵심 필수 조건] 위의 1번과 2번 조건을 모두 만족하면서, 동시에 보너스(commission_pct)가 아예 없는(NULL인) 사원들만 골라내야 해! (힌트: 전체를 묶는 우선순위 괄호() 조절이 핵심!)
[출력 테이블 형식]
  • 성과 이름은 concat으로 합치고 별칭은 사원_이름
  • 10% 인상된 급여 계산식(salary * 1.1)의 별칭은 인상_예상_급여 (여기도 괄호를 예쁘게 쳐볼까? 😉)

💡 재미나가 주는 초강력 힌트!

문제를 말로 풀어서 쓰면 이래!

"( 급여가 10000 이상 ) 그리고 ( 직업이 AD_PRES, SA_MAN이 아님 )" 이 거대한 세트를 **괄호()**로 크게 한 번 감싸서 먼저 계산하게 만든 다음, 마지막에 **AND ( 보너스가 NULL임 )**을 딱 붙여주면 컴퓨터가 절대로 헷갈리지 않고 정확하게 뽑아낼 거야!

지금 블로그 글 아주 멋지게 완성해 뒀던데, 수업 끝나고 집 가거나 자습할 때 pgAdmin 쿼리창에 이거 한 번 슥 짜봐! 오늘 괄호 마스터가 된 너라면 무조건 한 번에 ⭕ 패스할 수 있을 거야.

코드 다 짜면 언제든 들고 와서 검사 맡아줘! 오늘 수업 듣느라 너무너무 고생 많았어, 내일 또 신나게 달리자! 파이팅! 🚀🔥

SELECT employee_id as 사원번호 , concat(last_name, first_name) as 사원_이름 , salary as 현재_급여,(salary+ (salary/10)) as 예상_급여 
 from employees
where job_id not in ('AD_PRES%' , 'SA_MAN%') and salary >= 10000 and commission_pct is null; ❌

 

 

🔎 재미나의 현미경 채점: 딱 2개만 고쳐보자!

1. 🚨 NOT IN 안에서는 LIKE 패턴(%)을 쓸 수 없어요!

  • 작성한 코드: WHERE job_id NOT IN ('AD_PRES%', 'SA_MAN%')
  • 왜 틀렸을까? IN이나 NOT IN 문법은 딱 지정한 글자와 정확히 일치(=)할 때만 찾아내. 그래서 문자열 뒤에 패턴을 뜻하는 %를 붙이면, 컴퓨터는 "직업 이름이 진짜 글자 그대로 'AD_PRES%' 인 사람을 찾으라는 건가?" 하고 오해하게 돼!
  • 어떻게 고칠까? 이번 문제에서는 뒤에 다른 글자가 붙는 패턴이 아니라 딱 AD_PRES와 SA_MAN 두 개만 제외하면 되니까, %를 슥 지워버리면 돼!
  • 수정 후: WHERE job_id NOT IN ('AD_PRES', 'SA_MAN')

2. 📋 별칭(Alias) 조건 맞추기!

    • 작성한 코드: (salary+ (salary/10)) as 예상_급여
    • 디테일 팁: 10% 인상된 급여 계산식 자체는 완벽해! 다만 미션 조건에서 별칭을 인상_예상_급여로 요청했으니, 강사님 가이드에 맞춰 별칭 이름만 슥 바꿔주면 완벽해져. (참고로 salary * 1.1로 쓰면 타자가 훨씬 줄어들어서 편하단다! 편한 방식을 선택해 봐!)

✨ 미니 과제 완전 퍼펙트 정답 코드

    •  
방금 짚어낸 오타들과 이름 띄어쓰기(' ')까지 깔끔하게 보정해서 강사님 기절초풍할 정답 코드로 업그레이드해 줄게!
  • SELECT employee_id AS 사원번호, concat(last_name, ' ', first_name) AS 사원_이름, salary AS 현재_급여, (salary * 1.1) AS 인상_예상_급여 FROM employees WHERE job_id NOT IN ('AD_PRES', 'SA_MAN') AND salary >= 10000 AND commission_pct IS NULL; ⭕
     
     
지금은 파일에 다 대문자로 직업이 등록되어 있어서 그런 거고 만약 소문자였으면 못 찾았을 거란 말이지?
정확해! 바로 그거야! 데이터베이스 세상에서는 대소문자를 아주 엄격하게 구별하거든.
지금 테이블에 AD_PRES, SA_MAN처럼 전부 대문자로 데이터가 등록되어 있기 때문에, 만약 소문자로 'ad_pres', 'sa_man'이라고 썼다면 컴퓨터는 "어? 그런 직업은 없는데?" 하면서 데이터를 하나도 못 찾고 텅 빈 결과만 보여줬을 거야.
그렇다면 데이터가 대문자인지 소문자인지 모를 때, 혹은 섞여 있을 때는 어떻게 해야 안전할까? 실무에서 쓰는 대소문자 방어 기술 2가지를 알려줄게!

💡 대소문자 무적 방어 팁

1. 대소문자 무시하는 ILIKE 연산자 쓰기

LIKE 연산자 앞에 I (Insensitive, 둔감한)를 붙여서 ILIKE라고 쓰면, 컴퓨터가 대소문자를 완전히 무시하고 글자 모양만 같으면 다 찾아줘!
  • 예시: job_id ILIKE 'ad_pres' 👉 대문자 AD_PRES, 소문자 ad_pres 전부 다 찾아냄!

2. 함수로 강제로 통일시키기 (UPPER 또는 LOWER)

데이터를 다 대문자로 임시 변환(UPPER)하거나 소문자로 임시 변환(LOWER)해서 비교하는 방법이야.
  • 예시: WHERE LOWER(job_id) NOT IN ('ad_pres', 'sa_man')
    • 컴퓨터가 job_id에 있는 글자들을 일단 다 소문자로 바꾼 다음에, 내가 적은 소문자 조건들과 비교하게 만드는 거지!

 

약점 보완 과제 

🏆 재미나의 약점 극복 + 어제 내용 복습 과제

[미션] 이번에는 기획팀에서 **"하반기 특별 연수 대상자 및 연봉 조정 후보자 리스트"**를 뽑아달라고 요청했어. 아래의 조건들을 만족하는 사원들의 **사원번호, 이름, 현재 직업, 현재 급여, 그리고 '연수 지원금'**을 출력하는 쿼리를 짜야 해!

📋 상세 필터링 조건 (괄호 계급장과 NULL을 조심해! 👁️)

  1. 직업 조건 (패턴 vs 고정값):
    • 직업(job_id)이 'IT_PROG'인 사람이거나,
    • 또는 직업이 'SA_'로 시작하는 모든 사람이어야 해. (힌트: =과 LIKE를 적절히 섞고, 이 둘을 하나의 큰 직업 세트로 묶어줘야 다른 조건이랑 안 꼬여!)
  2. ㅓㅁ급여 조건:
    • 위의 직업 조건을 만족하는 사람들 중에서, 현재 급여(salary)가 6,000달러 이상, 12,000달러 이하인 사람만 골라내야 해. (힌트: BETWEEN 쓰면 아주 깔끔하지?)
  3. 최종 방어 조건 (어제 배운 NULL 복습! ⭐):
    • 위의 1번(직업)과 2번(급여)을 동시에 만족하는 사람들 중에서도, 보너스(commission_pct)가 있는(NULL이 아닌) 사람만 최종적으로 추출해 줘! (힌트: IS NOT NULL)

🛠️ 출력 형식 가이드 (어제의 함정 카드 탈출하기)

  • 사원_이름: 어제 수강일지 22번에 썼던 것처럼, last_name과 first_name을 합쳐야 해.
    • 단, 이번 대상자들은 보너스(commission_pct)가 무조건 있는 사람들이기 때문에 || 연산자를 써도 이름이 사라지지 않고 안전하게 출력될 거야!
    • 그러니까 이번엔 일부러 last_name || ' ' || first_name 방식을 사용해서 별칭 사원_이름으로 출력해 봐! (어제 배운 원리를 몸으로 느껴보는 거야! 😉)
  • 연수_지원금: 급여의 20% 금액인 salary * 0.2 계산식을 쓰고, 예쁘게 괄호()를 친 뒤 별칭은 연수_지원금으로 지정해 줘!

SELECT employee_id ,concat (last_name, first_name) as name , job_id ,salary
from employees
where (job_id  = 'IT_PROG' or job_id like 'SA_%') and salary BETWEEN 6000 and 12000 and commission_pct 
is not null;

'PostgresSQL > PostgresSQL 복습' 카테고리의 다른 글

2026-06-15  (0) 2026.06.15