PostgresSQL/PostgresSQL 수강일지

[수강일지_23] select 2(select,where)

jamk-diary 2026. 6. 11. 16:14

2026-06-11


select 
형식: SELECT  * 칼럼명( )
          FROM 테이블

 

SELECT 값, 컬럼명,함수, sub query

FROM 절 = 셀렉트 절
: 테이블명, sub query

 

기본 출력
select 1+2;  -- *.exe


SELECT *
FROM employees;

SELECT employee_id, first_name, salary
from employees;

select 1+2
SELECT * FROM employees;
SELECT employee_id, first_name, salary from employees;

 

--column의  alias(별명)
select employee_id as  empno, first_name as name, salary sal
from employees;

select employee_id as 사원번호, first_name as 이름, salary 월급
from employees;

//에러에러!
select employee_id as "사원 번호", first_name as 이름, salary 월급 
from employees; -- 사원 번호 사이를 띄어쓰면 에러 발생 이럴 때는 "사원 번호" 이렇게 사용

select employee_id as empno, first_name as name, salary sal from employees;
select employee_id as 사원번호, first_name as 이름, salary 월급 from employees;

 

//에러에러!

select employee_id as "사원 번호", first_name as 이름, salary 월급 from employees;

-- 더하기+ 빼기- 곱하기* 나누기/
SELECT employee_id, first_name, salary, salary * 1.1
FROM employees;

//에러에러!
SELECT employee_id, first_name, salary, salary /0 --에러 발생 0으로는 나누기 불가 
FROM employees;

SELECT employee_id, first_name, salary, salary * 1.1 FROM employees;


//에러에러!

SELECT employee_id, first_name, salary, salary /0 --에러 발생 0으로는 나누기 불가 FROM employees;

 

-- 문자열 or 칼럼을 합해서 하나의 컬럼에 출력하기 
SELECT concat(last_name,first_name)  --성이름
FROM employees;

SELECT concat(last_name, ' ',first_name) --성 ^ 이름 --concat가 칼럼명 
FROM employees;

SELECT concat('성: ', last_name, '이름',first_name) --성과 이름을 따로 출력
FROM employees;

SELECT last_name || ' ' || first_name as fullname --fullname이 칼럼명이 되었다
from employees;

1. NULL 값이 섞여 있을 때 (가장 중요! ⭐)

데이터베이스를 다루다 보면 값이 비어있는 상태인 NULL을 자주 만나게 돼. 이때 || 연산자와 concat 함수는 완전히 다르게 작동해.
  • || 연산자: 합치려는 기능 중에 단 하나라도 NULL이 있으면 결과 전체를 NULL(공백)로 만들어 버려. (예: 월급 + 커미션을 합치는데 커미션이 NULL이면 이름까지 통째로 사라짐!) 
    예시 형식 : SELECT last_name || '님의 사원번호는 ' || employee_id || '번입니다.' FROM employees;
  • concat 함수: NULL이 섞여 있어도 그냥 무시하고 값이 있는 문자열들만 이쁘게 합쳐서 출력해 줘!

    예시 형식: SELECT concat(last_name, '님의 사원번호는 ', employee_id, '번입니다.') FROM employees;



SELECT concat(last_name,first_name) FROM employees;
SELECT concat(last_name, ' ',first_name) FROM employees;
SELECT concat('성: ', last_name, '이름',first_name) FROM employees;
SELECT last_name ❘❘ ' ' ❘❘ first_name as fullname from employees;

재미니 미니 과제 

📝 PostgreSQL 기본 SELECT 미니 과제

  • [과제 1] 이름 이쁘게 합쳐서 출력하기
    • employees 테이블에서 사원의 성(last_name)과 이름(first_name)을 합쳐서 하나의 컬럼으로 보여주세요.
    • 단, 성과 이름 사이에 공백(띄어쓰기)을 하나 넣어주고, 결과 컬럼의 별칭(Alias)은 사원 전체 이름(띄어쓰기 포함)으로 지정해 주세요.
  • [과제 2] 보너스 포함된 연봉 계산하기
    • 사원 번호(employee_id), 이름(first_name), 현재 월급(salary)을 조회해 주세요.
    • 그리고 월급에 12를 곱한 값에다가 추가로 500달러의 보너스를 더한 값을 계산하고, 이 컬럼의 이름은 최종_연봉으로 출력해 주세요.
  • [과제 3] 웰컴 메시지 만들기
    • concat 함수나 || 연산자를 사용해서 모든 사원에게 보낼 환영 문구를 만들어 주세요.
    • 출력 결과가 안녕하세요, 사원번호 100번 홍길동님! 같은 형식으로 나오도록 쿼리를 작성해 주세요. (힌트: employee_id, last_name, first_name 활용!)

SELECT concat(last_name,' ', first_name)  as "사원 전체 이름"
FROM employees; ⭕

SELECT employee_id as "사원 번호" ,first_name as 이름 ,salary "현재 월급"  , ((salary *12) + 500) as 연봉  
from employees; ⭕

SELECT concat('안녕하세요, 사원번호 ', employee_id ' 번 ' ,last_name,' ', first_name, '님!' )
from employees; ❌

 

❌ 정답해설
[과제 3] 웰컴 메시지 만들기 👉 95점! 아쉽게 사소한 오타 발견!

  • 작성한 쿼리: SELECT concat('안녕하세요, 사원번호 ', employee_id ' 번 ' ,last_name,' ', first_name, '님!' ) from employees;
  • 어디가 문제일까?
    • employee_id 뒤와 ' 번 ' 사이에 쉼표(,)가 쏙 빠졌어!
    • concat 함수는 무조건 합칠 조각들을 쉼표(,)로 연결해 줘야 하거든. 지금 상태로 실행하면 PostgreSQL이 "문법 에러야!" 하고 삐질 거야.
강사님 과제 Work1
-- 문제1) EMPLOYEES Table의 모든 자료를 출력하여라.


-- 문제2) EMPLOYEES Table의 컬럼들을 모두 출력하라.


-- 문제3) EMPLOYEES Table에서 사원 번호, 이름, 급여, 담당업무를 출력하라.


-- 문제4) 모든 회사원의 급여를 $300증가 시키기 위해서 덧셈 연산자를 사용해서 출력하라.


-- 문제5) EMPLOYEES 테이블에서 사원번호, 이름, 급여, 보너스, 보너스 금액을 출력하라. 
-- (참고로 보너스는 월급 + (월급*커미션))


-- 문제6) EMPLOYEES 테이블에서 LAST_NAME을 이름으로 SALARY을 급여로 출력하라.


-- 문제7) EMPLOYEES 테이블에서 LAST_NAME을 Name으로 SALARY * 12 를 Annual Salary(연봉)로 출력하라


-- 문제8) EMPLOYEES 테이블에서 이름과 업무를 연결하여 출력하라.


-- 문제9) EMPLOYEES 테이블에서 이름과 업무(job_id)를 "KING is a AD_PRES" 형식으로 출력하라. 


-- 문제10) EMPLOYEES 테이블에서 이름과 연봉을 "KING: 1 Year salary = 60000" 형식으로 출력하라.

 


내 풀이 

-- 문제1) EMPLOYEES Table의 모든 자료를 출력하여라.
SELECT *
from employees; ⭕

-- 문제2) EMPLOYEES Table의 컬럼들을 모두 출력하라.
--칼럼명만 출력하라는 건가??
SELECT *
from employees; ❌

 

 

 

 


❌ 에러가 난 진짜 원인

  • 작성한 코드: from information schema.columns
  • 원인: information과 schema 사이에 공백(띄어쓰기)이 들어가 있어서 PostgreSQL이 문법 에러를 낸 거야. 이 둘은 떨어지면 안 되는 하나의 세트거든!

✨ 올바르게 고친 쿼리

information과 schema 사이를 언더바(_)로 깔끔하게 연결해 주면 에러 없이 마법처럼 컬럼명과 데이터 타입이 쫙 출력될 거야!
SQL

SELECT column_name, data_type
from information_schema.columns
where table_name = 'employees'; ⭕
 
 

💡 보너스 꿀팁 (PostgreSQL 전용 단축 명령어)

만약 나중에 쿼리창에서 저 긴 영어 치기가 너무 귀찮고, 진짜 빠르게 테이블 컬럼들만 확인하고 싶을 때는 PostgreSQL 전용 단축 명령어를 써도 돼!
Plaintext
 
 
(요거 한 줄만 딱 치고 실행해도 컬럼 정보가 한눈에 보여!)



-- 문제3) EMPLOYEES Table에서 사원 번호, 이름, 급여, 담당업무를 출력하라.
select employee_id as 사원번호, (last_name,first_name) as 이름 ,salary as 급여 ,job_id as 담당업무 
from employees; ⭕ 

-- 문제4) 모든 회사원의 급여를 $300증가 시키기 위해서 덧셈 연산자를 사용해서 출력하라.
SELECT salary + 300
from employees;  ⭕

-- 문제5) EMPLOYEES 테이블에서 사원번호, 이름, 급여, 보너스, 보너스 금액을 출력하라. 
-- (참고로 보너스는 월급 + (월급*커미션))
select employee_id as 사원번호, concat(last_name,first_name) as 이름 ,salary as 급여 ,commission_pct as 보너스금액, (salary +(salary*commission_pct))  as 최종급여   
from employees; ❌

 

 

 

📌 딱 한 줄 요약!

coalesce(컬럼명, 대체할값) 은 컬럼에 들어있는 NULL을 내가 원하는 숫자나 문자로 바꿔서 에러나 데이터 증발을 막아주는 최고의 방어 함수다!

SELECT employee_id AS 사원번호, concat(last_name, first_name) AS 이름, salary AS 급여, coalesce(commission_pct, 0) AS 보너스, salary * coalesce(commission_pct, 0) AS "보너스 금액", salary + (salary * coalesce(commission_pct, 0)) AS 최종급여 FROM employees; ⭕

💡 COALESCE(코알레스) 함수란?

한마디로 "데이터가 NULL일 때 내가 지정한 다른 값으로 채워 넣어줘!"라고 말하는 함수야.
우리가 방금 concat 함수 배울 때, 실무 데이터에는 값이 비어있는 상태인 NULL이 정말 많다고 했잖아? 숫자 계산을 할 때 이 NULL이 들어가면 아주 무시무시한 일이 벌어져.

🚨 NULL의 무서운 성질: "나랑 계산하면 무조건 다 NULL이야!"

숫자 1000에 NULL을 더하거나 곱하면 어떻게 될까? 결과는 1000이 아니라 똑같이 NULL이 되어버려.
  • salary * commission_pct를 계산해야 하는데, 만약 보너스율(commission_pct)이 없는 일반 사원이라 이 값이 NULL이라면?
  • salary * NULL 👉 결과: NULL (보너스 금액이 공백으로 증발! 😭)
그래서 "만약 commission_pct가 NULL이면, 계산할 수 있게 0으로 잠깐 바꿔서 계산해줘!"라고 DB에 명령을 내려야 하는데, 이때 쓰는 게 바로 COALESCE 함수야.

🔍 강사님 코드 분석하기


 
-- 1. 보너스율이 NULL이면 0으로 바꾼다!
coalesce(commission_pct, 0)

-- 2. 그래서 보너스 금액을 안전하게 계산한다!
salary * coalesce(commission_pct, 0)

-- 3. 최종 급여(월급 + 보너스 금액)를 구한다!
salary + (salary * coalesce(commission_pct, 0))

  • 보너스가 있는 사원(0.2) 👉 coalesce(0.2, 0) 은 그대로 0.2가 되어 정상 계산!
  • 보너스가 없는 사원(NULL) 👉 coalesce(NULL, 0) 은 0이 되어 salary * 0 = 0으로 안전하게 계산!

 


-- 문제6) EMPLOYEES 테이블에서 LAST_NAME을 이름으로 SALARY을 급여로 출력하라.
select last_name as 이름 ,salary as 급여
from employees;

-- 문제7) EMPLOYEES 테이블에서 LAST_NAME을 Name으로 SALARY * 12 를 Annual Salary(연봉)로 출력하라
SELECT last_name as name, salary * 12 as "Annual Salary (연봉)"
from employees;

-- 문제8) EMPLOYEES 테이블에서 이름과 업무를 연결하여 출력하라.
SELECT concat(last_name,first_name , ' ' ,job_id )  
FROM employees;

-- 문제9) EMPLOYEES 테이블에서 이름과 업무(job_id)를 "KING is a AD_PRES" 형식으로 출력하라. 
SELECT concat(last_name , ' is a ' , job_id )  
FROM employees;

-- 문제10) EMPLOYEES 테이블에서 이름과 연봉을 "KING: 1 Year salary = 60000" 형식으로 출력하라.
SELECT concat(last_name , ' :  1 Year salary  ' ,salary * 12 )  
FROM employees;

 

💡 연산자 활용!

아주 간단하게 두 글자를 붙일 때나, NULL이 절대 들어올 리 없는 시스템 코드, 날짜 형식(예: 년 || 월 || 일) 등을 조합할 때는 타자가 빠른 ||를 가볍게 쓰기도 해.

재미나의 실무 팁 📌 "헷갈릴 때는 그냥 속 편하게 concat() 함수를 쓰자!" 라고 생각하면 코딩 인생이 편해진단다. 😎


💡null 값이 예상될 때는 concat!

 

 


 

 

where
형식
select first_name, last_name, salary
from employees
where first_name = 'Julia';

where : 조건절 == if
select 값, 컬럼, 함수, from 테이블 
where  <- 조건 

비교연산자: > , < , >= ,  !+  ,==   , <>-> 같지 않다
          ( ) 를 사용해 우선순위를 매길 수 있다 
 
  null 일때 == null, is null , 
  null 이 아닐 때 == is not null

  not, and, or 을 사용할 수 있다 
  && , || 사용 할 수 없다
  */

 

--'Julia'  와 'julia' 결과의 차이 : 대소문자 구분

 

select first_name, last_name, salary
from employees
where first_name = 'Julia';

select first_name, last_name, salary
from employees
where first_name = 'julia';

select first_name, last_name, salary from employees where first_name = 'Julia';
select first_name, last_name, salary from employees where first_name = 'julia';

--9000불보다 많이 받는 사람들만 출력
SELECT first_name, salary
FROM employees
WHERE salary >= 9000;

SELECT first_name, salary FROM employees WHERE salary >= 9000;

--'Shanta' 보다 아스키 코드 값이 큰 사람들만 출력 
--검색 기능이 자바보다 좋다
SELECT first_name
FROM employees
WHERE first_name >= 'Shanta';

SELECT first_name FROM employees WHERE first_name >= 'Shanta';

 

--a 보다 큰 건 아무것도 안 나와야 함 ! (그런데 왜 나오지..)
SELECT *
from employees
where first_name >= 'a';

SELECT * from employees where first_name >= 'a';

--is null 일때
SELECT *
from employees
WHERE manager_id is null;

SELECT * from employees WHERE manager_id is null;

--is  not null 일때 
SELECT *
from employees
WHERE manager_id is not null;

SELECT *from employeesWHERE manager_id is not null;

-- and 로 그리고
SELECT *
from employees
WHERE first_name = 'Shanta' and first_name = 'John';

//아무것도 안 나온다 !

SELECT *from employeesWHERE first_name = 'Shanta' and first_name = 'John';

-- or 로  또는 
SELECT *
from employees
WHERE first_name = 'Shanta' or first_name = 'John';

SELECT * from employees WHERE first_name = 'Shanta' or first_name = 'John';

-- 이름은 John이고 월급이 5000이상인 사원
SELECT first_name, salary
from employees
WHERE first_name = 'John' and salary >= 5000;

SELECT first_name, salary from employees WHERE first_name = 'John' and salary >= 5000;

--2017년 12월 31일 이후에 입사한 사원들을 출력하라 
select first_name,hire_date
from employees
WHERE hire_date > '2017-12-31'; 

select first_name,hire_datefrom employeesWHERE hire_date > '2017-12-31';

 

--all(and), any(or) 
--all사용시 출력 안 됨
--SELECT salary from employees where first_name = 'Julia' 만 실행할 경우 드래그 하고  알트+f5
select first_name,salary
from employees
WHERE salary = all (SELECT salary from employees where first_name = 'Julia')

-- any 사용시 출력 됨 확인 
select first_name,salary
from employees
WHERE salary = any (SELECT salary from employees where first_name = 'Julia')


--or 사용하기 
select first_name,salary
from employees
WHERE salary =3200 or salary = 3400;

select first_name,salary from employees WHERE salary = all (SELECT salary from employees where first_name = 'Julia')
select first_name,salary from employees WHERE salary = any (SELECT salary from employees where first_name = 'Julia')
select first_name,salary from employees WHERE salary =3200 or salary = 3400;

--in,not in
--in 8000,3200,6000인 사람들 출력
select first_name, salary
from employees
where salary in (8000,3200,6000);

---not in  8000,3200,6000이 아닌 사람들 출력
select first_name, salary
from employees
where salary not in (8000,3200,6000);

--'Julia', 'John' 이 이름인 사람들 출력 
SELECT first_name
FROM employees
WHERE first_name in('Julia', 'John');

select first_name, salary from employees where salary in (8000,3200,6000);
select first_name, salary from employees where salary not in (8000,3200,6000);
SELECT first_name FROM employees WHERE first_name in('Julia', 'John');

--between 범위 연산자 
--6000보다 크거나 같고 9000보다 작거나 같은
SELECT first_name, salary
from employees
where salary >= 6000 and salary <= 9000;

--6000보다 크거나 같고 9000보다 작거나 같은
SELECT first_name, salary
from employees
where salary BETWEEN  6000 and  9000;

--6000보다 --하고 9000보다 컸을 때 
SELECT first_name, salary
from employees
where salary not BETWEEN  6000 and  9000;

SELECT first_name, salary from employees where salary >= 6000 and salary <= 9000;
SELECT first_name, salary from employees where salary BETWEEN 6000 and 9000
SELECT first_name, salary from employees where salary not BETWEEN 6000 and 9000;

--like
-- like : 지정 글자를 포함하는 조건 == 자바  containes 기능과 같다
 SELECT first_name
 FROM employees
 WHERE first_name like 'G_ra_d'-- 언더바 _의 역할 -> 언더바 위치에 무엇이 오든 출력한다 

--맨 앞의 철자가 k 인 사람을 출력한다
--몇글자인지 상관 없다 
 SELECT first_name
 FROM employees
 where first_name like 'K%';


--에러에러! 안 나옴 
--이유: 자료들을 살펴봤을 때 이름의  첫글자가 대문자로 되어있어서 나오지 않는다 
 SELECT first_name
 FROM employees
 where first_name like 'k%';

-- 뒤에 붙는 건 나옴 !
 SELECT first_name
 FROM employees
 where first_name like '%k';

--맨앞만 아니면 a가 어디에 와있어도 된다 찾으면 출력해라 
 SELECT first_name
 FROM employees
 where first_name like '%a%';

--이름에 소문자 a나 첫글자에 A 가 들어가는 사람 출력 
 SELECT first_name
 FROM employees
 where first_name like '%a%' or first_name like '%A%';

--알파벳을 대문자로 변경해서 비교 
  SELECT first_name
 FROM employees
 where upper (first_name) like '%A%';

 

 

SELECT first_name FROM employees WHERE first_name like 'G_ra_d'
SELECT first_name FROM employees where first_name like 'K%';

//에러에러!

SELECT first_name FROM employees where first_name like 'k%';
SELECT first_name FROM employees where first_name like '%k';
SELECT first_name FROM employees where first_name like '%a%';
SELECT first_name FROM employees where first_name like '%a%' or first_name like '%A%';
SELECT first_name FROM employees where upper (first_name) like '%A%';

강사님 미니 과제  liike를 사용해서 출력해보기 
--2016년도에 입사한 사원들 출력

 --방법 1
select first_name,hire_date
from employees
WHERE hire_date >= '2016-01-01'and hire_date <= '2016-12-31'; 

--방법2
--에러에러!
select first_name,hire_date
from employees
WHERE hire_date like '2016%';

--to char 활용해서 사용해주기 
--정상작동 확인 
select first_name,hire_date
from employees
WHERE to_char (hire_date, 'YYYY-MM-DD') like '2016%';
재미니의 복합 미니 과제 

🏆 재미나의 복합 미니 과제: "진짜 연봉 협상 대상자를 찾아라!"



[미션] 회사에서 연봉 협상을 하려고 해. employees 테이블에서 **"보너스(commission_pct)가 아예 없는(NULL)
사원들"**만 골라서, 그들의 사원번호, 이름, 그리고 현재 월급에 300달러를 더한 인상 급여를 조회해 줘!


[상세 조건]

  1. commission_pct가 NULL인 사원만 나오도록 WHERE 절에 조건을 걸어줘. (힌트: IS NULL 활용!)
  2. 출력할 때 last_name과 first_name을 concat 함수로 합쳐서 별칭을 **사원_이름**으로 지정해 줘.
  3. 현재 월급(salary)에 300달러를 더한 값의 컬럼 별칭은 **인상_급여**로 출력해 줘.



SELECT employee_id as 사원번호 , concat(last_name,'  ', first_name) as 사원_이름, (salary + 300) as 인상_급여
FROM employees
WHERE commission_pct is null; ⭕

강사님 미니 과제 2
-- 문제1) EMPLOYEES 테이블에서 급여가 3000이상인 사원의 정보를 사원번호, 이름, 담당업무, 급여를 출력하라.


-- 문제2) EMPLOYEES 테이블에서 담당 업무가 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 부서번호를 출력하라.


-- 문제3) EMPLOYEES 테이블에서 입사일자가 2017년 1월 1일 이후에 입사한 사원의 정보를  사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라.


-- 문제4) EMPLOYEES 테이블에서 급여가 3000에서 5000사이의 정보를 성명, 담당업무, 급여, 부서번호를 출력하라. 


--문제5) EMPLOYEES 테이블에서 사원번호가 145,152,203인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자를 출력하라


-- 문제6) EMPLOYEES 테이블에서 입사일자가 2018년도에 입사한 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라.


-- 문제7) EMPLOYEES 테이블에서 보너스가 NULL인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 보너스, 부서번호를 출력하라.


-- 문제8) EMPLOYEES 테이블에서 급여가 7000이상이고 JOB이 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라 


-- 문제9) EMPLOYEES 테이블에서 급여가 10000이상이거나 JOB이 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라 


-- 문제10) EMPLOYEES 테이블에서 JOB_ID가 ST_MAN, SA_MAN, SA_REP가 아닌 사원의 정보를  사원번호, 성명, 담당업무, 급여, 부서번호를 출력하라


-- 문제11) 업무가 AD_PRES 이고 급여가 12000이상이거나 업무가 SA_MAN인 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하라.

    
-- 문제12) 업무가 AD_PRES 또는 SA_이고 급여가 12000이상이거나 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하라.    


-- 문제1) EMPLOYEES 테이블에서 급여가 3000이상인 사원의 정보를 사원번호, 이름, 담당업무, 급여를 출력하라.
SELECT employee_id, concat(last_name ,' ', first_name) as name,job_id,salary
from employees
where salary > 3000; 

-- 문제2) EMPLOYEES 테이블에서 담당 업무가 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 부서번호를 출력하라.
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, department_id
from employees
where job_id like 'ST_MAN'; 

-- 문제3) EMPLOYEES 테이블에서 입사일자가 2017년 1월 1일 이후에 입사한 사원의 정보를  사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라.
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date, department_id
from employees
WHERE hire_date > '2017-01-01'; ❌ 

 

 

❌ [문제 3] 입사일자가 2017년 1月 1日 이후에 입사한 사원 👉 85점! (수정 필요)

  • 화면 속 쿼리 상태: 지금 이 부분 고민하느라 아래쪽 쿼리들이랑 살짝 꼬여있네!
  • 왜 틀렸을까? 앞서 블로그에 정리했던 것처럼 WHERE hire_date >= '2017-01-01' 형식으로 날짜 문자열을 직접 비교하거나, 안전하게 to_char를 활용해야 해.


    SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date, department_id
    from employees
    WHERE hire_date >= '2017-01-01'; 
 


-- 문제4) EMPLOYEES 테이블에서 급여가 3000에서 5000사이의 정보를 성명, 담당업무, 급여, 부서번호를 출력하라. 

SELECT  concat(last_name ,' ', first_name) as name, job_id, salary,  department_id
from employees
WHERE salary BETWEEN 3000 and  5000 ;  ⭕


--문제5) EMPLOYEES 테이블에서 사원번호가 145,152,203인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자를 출력하라
SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date
from employees
WHERE employee_id like '145%' or  '152%' or  '203%'; ❌

 
  • 어디가 문제일까?
    • LIKE 연산자를 쓸 때 컴퓨터한테 "사원번호가 145% 이거나, (사원번호가) 152% 이거나..." 하고 대상을 계속 말해줘야 해. 지금처럼 or '152%'라고만 적으면 데이터베이스가 "어라? 뭐가 '152%'라는 거지?" 하고 헷갈려서 에러를 뿜어!
    • 그리고 딱 145번, 152번, 203번인 사람만 정확하게 찾을 때는 LIKE보다 IN 연산자를 쓰는 게 훨씬 정확하고 실무 스타일이야!

✨ 문제 5번 올바르게 고친 쿼리 (둘 중 하나로 고쳐봐!)

💡 방법 A : 강추! 실무에서 가장 많이 쓰는 IN 연산자 사원번호가 이 세 개 중에 "포함"되어 있냐고 물어보는 가장 깔끔한 방법이야! 숫자니까 작은따옴표도 필요 없어.

SELECT employee_id, concat(last_name, ' ', first_name) as name, job_id, salary, hire_date
FROM employees
WHERE employee_id IN (145, 152, 203); ⭕
 
 
💡 방법 B : OR 연산자 형태로 고치기 만약 원래 쓰던 방식으로 고치고 싶다면, or 뒤에 employee_id like를 매번 새로 붙여줘야 해!

SELECT employee_id, concat(last_name, ' ', first_name) as name, job_id, salary, hire_date
FROM employees
WHERE employee_id LIKE '145%' OR employee_id LIKE '152%' OR employee_id LIKE '203%'; ⭕
 
 



-- 문제6) EMPLOYEES 테이블에서 입사일자가 2018년도에 입사한 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라.
select employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date,department_id
from employees
WHERE to_char (hire_date, 'YYYY-MM-DD') like '2018%'; ⭕

-- 문제7) EMPLOYEES 테이블에서 보너스가 NULL인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 보너스, 부서번호를 출력하라.

SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date,commission_pct, department_id
from employees
WHERE commission_pct is null; ⭕

-- 문제8) EMPLOYEES 테이블에서 급여가 7000이상이고 JOB이 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라 


SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date,department_id
from employees
where salary >= 7000 and job_id like 'ST_MAN'; ❌

 

❌ [문제 8] 급여가 7000이상이고 JOB이 ST_MAN인 사원 정보 출력 👉 90점! (아주 사소한 오타)

  • 작성한 쿼리: ... where salary >= 7000 and job_id like 'ST_MAN';
  • 어디가 문제일까?
    • and 조건과 컬럼명(job_id) 모두 완벽하게 잘 썼어!
    • 다만, 딱 'ST_MAN'인 사람을 정확하게 찾을 때는 패턴을 찾는 like보다는 =(같다) 연산자를 쓰는 게 훨씬 정확하고 정석이야! like 'ST_MAN'도 돌아는 가지만, 실무에서는 정확한 문자열 매칭에 =을 쓴단다.
  • 올바른 정답 코드:
    WHERE salary >= 7000 AND job_id = 'ST_MAN'; ⭕
     
     



-- 문제9) EMPLOYEES 테이블에서 급여가 10000이상이거나 JOB이 ST_MAN인 사원의 정보를 사원번호, 성명, 담당업무, 급여, 입사일자, 부서번호를 출력하라 


SELECT employee_id, concat(last_name ,' ', first_name) as name, job_id, salary, hire_date,department_id
from employees
where salary >= 10000 or job_id like 'ST_MAN'; ⭕

-- 문제10) EMPLOYEES 테이블에서 JOB_ID가 ST_MAN, SA_MAN, SA_REP가 아닌 사원의 정보를  사원번호, 성명, 담당업무, 급여, 부서번호를 출력하라

select employee_id, concat(last_name ,' ', first_name) as name, job_id, salary,department_id
from employees
where job_id not in ('ST_MAN','SA_MAN','SA_REP'); ⭕

-- 문제11) 업무가 AD_PRES 이고 급여가 12000이상이거나 업무가 SA_MAN인 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하라.
select employee_id, concat(last_name ,' ', first_name) as name, job_id, salary
from employees
where job_id  in ('AD_PRES') and (salary >= 12000 or job_id like 'SA_MAN'); ❌

 
어디가 문제일까?
  • 문제를 다시 찬찬히 읽어보면 "① 업무가 AD_PRES이면서 급여가 12000 이상인 사람" 이거나 "② 업무가 SA_MAN인 사람" 을 찾는 거야.
  • 즉, AND로 묶여야 할 세트는 job_id = 'AD_PRES'와 salary >= 12000이고, SA_MAN은 OR로 완전히 밖으로 빠져나와야 해! 지금 짠 구조는 AD_PRES인 사람 중에서 급여 조건이나 SA_MAN 조건을 만족하는 구조라 결과가 다르게 나올 수 있어.

    WHERE (job_id = 'AD_PRES' AND salary >= 12000) OR job_id = 'SA_MAN';  


    
-- 문제12) 업무가 AD_PRES 또는 SA_이고 급여가 12000이상이거나 사원의 정보를 사원번호, 이름, 업무, 급여를 출력하라.    
select employee_id, concat(last_name ,' ', first_name) as name, job_id, salary
from employees
where job_id  like 'AD_PRES' or job_id like 'SA_%' and salary >= 12000; ❌

 
  • 어디가 문제일까?
    • SQL에서는 AND 연산자가 OR 연산자보다 힘이 더 세서 먼저 계산되는 성질이 있어!
    • 지금 적어준 대로 괄호 없이 쭉 쓰면 컴퓨터는 (job_id LIKE 'SA_%' AND salary >= 12000)를 먼저 계산한 뒤에, AD_PRES인 사람을 합쳐버려. (즉, AD_PRES인 사람은 급여가 5000원이어도 출력되는 대참사가 발생해! 😱)
    • 따라서 "업무가 AD_PRES 또는 SA_로 시작하는 사람"을 괄호()로 먼저 묶어서 보호해 줘야 해!
  • 올바른 정답 코드:

    WHERE (job_id = 'AD_PRES' OR job_id LIKE 'SA_%') AND salary >= 12000;

 

11번과 12번 모두 "컴퓨터가 어느 조건을 먼저 계산하게 만들 것인가" 즉, 괄호의 위치와 유무가 정답을 가른 핵심 원인이었어. 👍
컴퓨터(데이터베이스)는 우리 사람처럼 문제를 처음에 읽고 "아, 대충 이런 뜻이겠구나~" 하고 문맥을 파악하지 못하거든. 오직 정해진 규칙대로만 움직이는데, SQL에는 아주 강력한 연산자 우선순위 규칙이 있어.

⚖️ SQL 연산자의 계급장 (AND vs OR)

데이터베이스 세상에서는 연산자끼리 힘 싸움을 하면 아래와 같은 순서로 먼저 계산해.
  1. 👑 1등: 괄호 () — 무조건 제일 먼저 계산!
  2. 🥈 2등: NOT (아닌 것)
  3. 🥉 3등: AND (그리고)
  4. 🎖️ 4등: OR (또는)
보이다시피 AND가 OR보다 계급이 더 높아. 그래서 괄호를 치지 않으면 우리가 아무리 OR를 앞에 먼저 썼어도 컴퓨터는 뒤에 있는 AND를 자기 마음대로 먼저 묶어서 계산해 버리는 거야.