Data_Analysis_Track_33/SQL_문제풀이

SQL_02_문제풀이(SELECT, WHERE)

lsc99 2023. 8. 31. 17:07

예제를 시작하기 전에 예제에 사용될 데이터베이스와 테이블은 SQL_01_문제풀이(DB 생성 및 사용, select & distinct & concat) (tistory.com) 에서 확인할 수 있다. (주어진 Database와 Table 생성의 코드블록 활용)


WHERE 절

 

-- TODO: EMP 테이블에서 업무(job)가 'IT_PROG'인 직원들의 모든 컬럼의 데이터를 조회. 
select * from emp where job = 'IT_PROG';

-- TODO: EMP 테이블에서 업무(job)가 'IT_PROG'가 아닌 직원들의 모든 컬럼의 데이터를 조회. 
select * from emp where not job = 'IT_PROG';
-- select * from emp where job != 'IT_PROG';
-- select * from emp where job <> 'IT_PROG';

-- TODO: EMP 테이블에서 이름(emp_name)이 'Peter'인 직원들의 모든 컬럼의 데이터를 조회
select * from emp where emp_name = 'Peter'; -- sql은 대소문자 구별이 하지만 mysql은 대소문자 구별하지 않는다.
select * from emp where emp_name = 'peter';
select * from emp where binary emp_name = 'Peter'; -- binary를 추가하여 대소문자를 구별할 수 있다.

-- TODO: EMP 테이블에서 급여(salary)가 $10,000 이상인 직원의 ID(emp_id), 이름(emp_name)과 급여(salary)를 조회
select emp_id, emp_name, salary from emp where salary >= 10000 order by salary desc; -- 급여 내림차순

-- TODO: EMP 테이블에서 급여(salary)가 $3,000 미만인 직원의 ID(emp_id), 이름(emp_name)과 급여(salary)를 조회
select emp_id, emp_name, salary from emp where salary < 3000 order by salary desc;

-- TODO: EMP 테이블에서 급여(salary)가 $3,000 이하인 직원의 ID(emp_id), 이름(emp_name)과 급여(salary)를 조회
select emp_id, emp_name, salary from emp where salary <= 3000 order by 3 desc; -- 3 -> salary를 뜻한다.

-- TODO: 급여(salary)가 $4,000에서 $8,000 사이에 포함된 직원들의 ID(emp_id), 이름(emp_name)과 급여(salary)를 조회
select emp_id, emp_name, salary from emp where salary between 4000 and 8000 order by 3 desc;

-- TODO: 급여(salary)가 $4,000에서 $8,000 사이에 포함되지 않는 모든 직원들의  ID(emp_id), 이름(emp_name), 급여(salary)를 표시
select emp_id, emp_name, salary from emp where not salary between 4000 and 8000 order by 3 desc; -- 4000과 8000을 포함하지 않는다.
select emp_id, emp_name, salary from emp where not salary between 4001 and 7999 order by 3 desc; -- 4000과 8000이 포함이 된다.

-- TODO: EMP 테이블에서 2007년 이후 입사한 직원들의  ID(emp_id), 이름(emp_name), 입사일(hire_date)을 조회.
-- 참고: date/datatime에서 년도만 추출: year(값). ex) year('2020-10-10') => 2020
-- month('2020-10-10') => 10, day('2020-10-10') => 10
select emp_id, emp_name, hire_date from emp where year(hire_date) >= 2007 order by 3;

-- TODO: EMP 테이블에서 2004년에 입사한 직원들의 ID(emp_id), 이름(emp_name), 입사일(hire_date)을 조회.
select emp_id, emp_name, hire_date from emp where year(hire_date) = 2004 order by 3;

-- TODO: EMP 테이블에서 2005년 ~ 2007년 사이에 입사(hire_date)한 직원들의 ID(emp_id), 이름(emp_name), 업무(job), 입사일(hire_date)을 조회.
select emp_id, emp_name, job, hire_date from emp where year(hire_date) between 2005 and 2007 order by 3;

-- TODO: EMP 테이블에서 직원의 ID(emp_id)가 110, 120, 130 인 직원의  ID(emp_id), 이름(emp_name), 업무(job)을 조회
select emp_id, emp_name, job from emp where emp_id in (110, 120, 130);

-- TODO: EMP 테이블에서 부서(dept_name)가 'IT', 'Finance', 'Marketing' 인 직원들의 ID(emp_id), 이름(emp_name), 부서명(dept_name)을 조회.
select emp_id, emp_name, dept_name from emp where dept_name in ('IT', 'Finance', 'Marketing');

-- TODO: EMP 테이블에서 'Sales' 와 'IT', 'Shipping' 부서(dept_name)가 아닌 직원들의 ID(emp_id), 이름(emp_name), 부서명(dept_name)을 조회.
select emp_id, emp_name, dept_name from emp where dept_name not in ('Sales', 'IT', 'Shipping');

-- TODO EMP 테이블에서 업무(job)에 'SA'가 들어간 직원의 ID(emp_id), 이름(emp_name), 업무(job)를 조회
select emp_id, emp_name, job from emp where job like '%SA%';

-- TODO: EMP 테이블에서 업무(job)가 'MAN'로 끝나는 직원의 ID(emp_id), 이름(emp_name), 업무(job)를 조회
select emp_id, emp_name, job from emp where job like '%MAN';

-- TODO. EMP 테이블에서 커미션이 없는(comm_pct가 null인)  모든 직원의 ID(emp_id), 이름(emp_name), 급여(salary) 및 커미션비율(comm_pct)을 조회
select emp_id, emp_name, salary, comm_pct from emp where comm_pct is null;

-- TODO: EMP 테이블에서 커미션을 받는 모든 직원의 ID(emp_id), 이름(emp_name), 급여(salary) 및 커미션비율(comm_pct)을 조회
select emp_id, emp_name, salary, comm_pct from emp where comm_pct is not null;

-- TODO: EMP 테이블에서 관리자 ID(mgr_id)가 없는(상사가 없는) 직원의 ID(emp_id), 이름(emp_name), 업무(job), 소속부서(dept_name)를 조회
select emp_id, emp_name, job, dept_name from emp where mgr_id is null;

-- TODO : EMP 테이블에서 연봉(salary * 12) 이 200,000 이상인 직원들의 모든 정보를 조회.
select * from emp where salary * 12 >= 200000;

WHERE 조건이 여러 개일 경우(AND, OR)

 

-- TODO: EMP 테이블에서 부서(dept_name)가 'Sales'이고 업무(job)가 'SA_MAN'이고 급여가 $13,000 이하인 
-- 직원의 ID(emp_id), 이름(emp_name), 업무(job), 급여(salary), 부서(dept_name)를 조회
select emp_id, emp_name, job, salary, dept_name from emp where dept_name = 'Sales' and job = 'SA_MAN' and salary <= 13000;

-- TODO: EMP 테이블에서 업무(job)에 'MAN'이 들어가는 직원들 중에서 부서(dept_name)가 'Shipping' 이고 2005년이후 입사한 
-- 직원들의  ID(emp_id), 이름(emp_name), 업무(job), 입사일(hire_date),부서(dept_name)를 조회
select emp_id, emp_name, job, hire_date, dept_name from emp where job like '%MAN%' and dept_name = 'Shipping' and year(hire_date) >= 2005;


-- TODO: EMP 테이블에서 입사년도가 2004년인 직원들과 (입사년도와 상관없이) 급여가 $20,000 이상인 
--  직원들의 ID(emp_id), 이름(emp_name), 입사일(hire_date), 급여(salary)를 조회.
select emp_id, emp_name, hire_date, salary from emp where year(hire_date) = 2004 or salary >= 20000;


-- TODO : EMP 테이블에서, 부서이름(dept_name)이  'Executive'나 'Shipping' 이면서 급여(salary)가 6000 이상인 사원의 모든 정보 조회. 
select * from emp where dept_name in ('Executive', 'Shipping') and salary >= 6000;

-- TODO: EMP 테이블에서 업무(job)에 'MAN'이 들어가는 직원들 중에서 부서이름(dept_name)이 'Marketing' 이거나 'Sales'인 
-- 직원의 ID(emp_id), 이름(emp_name), 업무(job), 부서(dept_name)를 조회
select emp_id, emp_name, job, dept_name from emp where job like '%MAN%' and dept_name in ('Marketing', 'Sales');


-- TODO: EMP 테이블에서 업무(job)에 'MAN'이 들어가는 직원들 중 급여(salary)가 $10,000 이하이 거나 2008년 이후 입사한 
--  직원의 ID(emp_id), 이름(emp_name), 업무(job), 입사일(hire_date), 급여(salary)를 조회
select emp_id, emp_name, job, hire_date, salary from emp where job like '%MAN%' and (salary <= 10000 or year(hire_date) >= 2008);
-- OR 연산을 먼저 실행함으로서 MAN이 무조건 들어가게 된다

order by를 이용한 정렬

 

-- TODO: 급여(salary)가 $5,000을 넘는 직원의 ID(emp_id), 이름(emp_name), 급여(salary)를 급여가 높은 순서부터 조회
select emp_id ID, emp_name 이름, salary 급여 from emp where salary > 5000 order by salary desc;


-- TODO: EMP 테이블에서 직원의 ID(emp_id), 이름(emp_name), 업무(job), 입사일(hire_date)을 입사일(hire_date) 순서로 조회.
select emp_id ID, emp_name 이름, job 업무, hire_date 입사일 from emp order by hire_date asc;

-- TODO: EMP 테이블에서 ID(emp_id), 이름(emp_name), 급여(salary), 입사일(hire_date)을 
-- 급여(salary) 오름차순으로 정렬하고 급여(salary)가 같은 경우는 먼저 입사한(hire_date) 순서로 정렬.
select emp_id ID, emp_name 이름, salary 급여, hire_date 입사일 from emp order by salary asc, hire_date asc;