공부/SQL

[SQL] 간단 문제 풀기

junani0v0 2024. 4. 4. 14:04

SQL중간 시험 오답노트.pdf
0.14MB

 

 

1.직원 테이블(s_emp)의 모든 행을 삭제하는 문장을 적으시오

select *from s_emp;

delete from table1;

TRUNCATE table table1;

 

2.직원 테이블(s_emp)에 존재하는 모든 직급(title)을 중복 없이 출력하시오

select distinct title

from s_emp;

 

select title

from s_emp

group by title;

 

3.직원 테이블을 부서별(dept_id) 내림차순, 연봉(salary) 오름차순으로 정렬하시오

select dept_id, salary

from s_emp

order by dept_id desc, salary;

 

4.직원 테이블에서 2015년도 이전에 입사한 직원의 수를 출력하시오

select * from s_emp;

select count(*)

from s_emp

where start_date<'2015/01/01';

 

5.연봉이 1000이상 5000이하인 직원을 모두 출력

select name,salary

from s_emp

where salary between 1000 and 5000;

 

6.각 부서(dept_id)별 평균 급여(avg(salary))를 계산해서 보여주시오

select dept_id, avg(salary)

from s_emp

group by dept_id

order by 1;

 

7.각 부서별(dept_id)로 직책(title)이 사원인 직원들의 평균 급여(avg(salary))를 계산해서 보여주시오

select name, avg(salary)

from s_emp

where title = '사원'

group by name

order by 1;

8.각 지역(region_id)별로 몇 개의 부서가 있는지를 나타내시오

select * from s_region;

select* from s_dept;

----

select region_id, count(*)

from s_dept

group by region_id;

 

9.각 부서별(dept_id)로 평균 급여(avg(salary))를 구하되 평균 급여가 2000이상인 부서만 나타내시오

select dept_id, round(avg(salary),2)

from s_emp

group by dept_id

having avg(salary)>= 2000

order by 1;

 

10.각 직책별(title)로 급여의 총합(sum(salary))을 구하되 직책(title)이 부장인 사람은 제외하시오

, 급여총합(sum(salary)) 8000(만원)이상인 직책(title)만 나타내며, 급여 총합에 대한 오름차순으로 정렬하시오

select title, sum(salary)

from s_emp

group by title

having sum(salary)>=8000

order by 2;

 

11.각 부서별(dept_id)로 직책(title)이 사원인 직원들에 대해서만 평균 급여(avg(salary))를 구하시오

select dept_id, avg(salary)

from s_emp

where title = '사원'

group by dept_id

order by 1;

 

12.각 부서(dept_id)내에서 각 직책별(title)로 몇 명의 인원(count(*))이 있는지를 나타내시오

select title, count(dept_id)

from s_emp

group by title

order by 1;

 

13.각 부서(dept_id)내에서 몇 명의 직원(count(*))이 근무하는지를 나타내시오

select dept_id, count(*)

from s_emp

group by dept_id order by 1;

14.각 부서별(dept_id)로 급여의 최소값(min(salary))과 최대값(max(salary))을 나타내시오. , 최소값과 최대값이 같은 부서는 출력하지 마시오

select dept_id, min(salary),max(salary)

from s_emp

group by dept_id

having min(salary)!=max(salary)

order by 1;

 

15.직원(s_emp)테이블과 부서(s_dept)테이블의 join하여, 사원의 이름(e.name)과 부서(e.dept_id), 부서명(d.name)을 나타내시오

select e.name, e.dept_id, d.name

from s_emp e, s_dept d

where e.dept_id = d.id

order by 2;

 

16.서울 지역에 근무하는 사원에 대해 각 사원의 이름(e.name)과 근무하는 부서명(d.name)을 나타내시오

select e.name , d.name

from s_emp e, s_dept d, s_region r

where e.dept_id = d.id

and d.region_id = r.id

and e.title != '사원'

and r.name like '서울%';

 

17.직원 테이블(s_emp)과 급여 테이블(salgrade)을 조인하여 사원의 이름(e.name)과 급여(e.salary), 그리고 해당 급여등급(s.grade)을 나타내시오

select * from salgrade;

select e.name, e.salary, s.grade

from s_emp e, salgrade s

where salary between losal and hisal

order by 3;

 

18.직원테이블(s_emp)과 고객테이블(s_customer)에서 사원의 이름(e.name)과 사번(e.id), 그리고 각 사원의 담당고객 이름(c.name)을 나타내시오. , 고객에 대하여 담당영업사원이 없더라도 모든 고객의 이름을 나타내고, 사번 순으로 오름차순 절렬하시오

select * from s_customer;

select e.name, e.id, c.name

from s_emp e, s_customer c

where e.id(+) = c.sales_rep_id

order by id;

 

 

19.직원 중에 '김정미'와 같은 직책(title)을 가지는 사원의 이름(e2.name)과 직책(e2.title), 급여(e2.salary), 부서번호(e2.dept_id)를 나타내시오(self join 사용)

select e2.name, e2.title, e2.salary, e2.dept_id

from s_emp e, s_emp e2

where e.title = e2.title

and e.name = '김정미'

and e2.name <>'김정미';

 

20.가장 적은 평균급여(min(avg(salary)))를 받는 직책(title)에 대해 그 직책(title)과 평균급여(avg(salary))를 나타내시오

select title, avg(salary)

from s_emp

group by title

having avg(salary)=(select min(avg(salary)) from s_emp group by title);

--서브

select min(avg(salary))

from s_emp

group by title ;

 

21.s_emp테이블에서 각 사원의 이름(name)과 급여(salary), 급여등급을 나타내시오. 급여가 4000만원 이상이면 A등급, 3000만원 이상이면 B등급, 2000만원 이상이면 C등급, 1000만원 이상이면 D등급, 1000만원 이상이면 E등급으로 나타내시오 (sal_grade테이블 사용하지 않고 decode()를 사용할 것)

select name, salary,

decode(trunc(salary/1000),0,'E',1,'D',2,'C',3,'B','A') as 급여등급

from s_emp;

-----case문 사용시----------------------

select name, salary,

    case

        when salary >= 4000 then 'A'

        when salary >= 3000 then 'B'

        when salary >= 2000 then 'C'

        when salary >= 1000 then 'D'

        else 'E'

    end

from s_emp;

 

22.자신의 급여(salary)가 자신이 속한 부서(dept_id)의 평균 급여(avg(salary))보다 적은 직원에 대해 이름(name), 급여(salary), 부서 번호(dept_id)를 출력하시오

select dept_id, salary, name

from s_emp outer

where salary < (select avg(salary) from s_emp group by outer.dept_id);

--서브

select avg(salary)

from s_emp

group by dept_id;

 

23.본인의 급여가 각 부서별 평균 급여avg(salary) 중 어느 한 부서(dept_id)의 평균급여보다 적은 급여를 받는

직원에 대해 이름(name),급여(salary), 부서번호(dept_id)를 출력하시오(any사용)

select name, salary, dept_id

from s_emp

where salary < any( select avg(salary) from s_emp group by dept_id);

--any 이중 어느거 하나라도 작으면 true

--서브

select avg(salary) from s_emp group by dept_id;

 

24.본인이 다른 사람의 관리자(manager_id)로 되어 있는 직원의 사번(id), 이름(name), 직책(title), 부서번호(dept_id)를 나타내시오(exists사용)

, 해석하면 manager_id가 자기 id로 되어있는 사람을 찾아라

select id, name, title, dept_id

from s_emp e

where exists (select id from s_emp where manager_id= e.id);

--exists 존재하는지 확인, 하나라도 있으면 거기서 끝 더 찾지 않는다

select * from s_emp ;

 

25.직원(s_emp) 테이블에서 이름을 사전순으로 정렬하여 5개의 데이터만 나타내시오

select *from (select * from s_emp order by name)

where rownum <= 5

order by name;

 

select *from (select * from s_emp where name not like 5 order by name)

where rownum <= 5

order by name;

 

select * from s_emp where name not like 5 order by name;

--서브 이름 사전순으로 잘라야해서 정렬을 해준다

select *from s_emp order by name;

--rownum 행의 수를 제한 할때 사용

'공부 > SQL' 카테고리의 다른 글

SQL 쪽지시험 오답노트  (0) 2024.04.04