gi_dor

주말) SQL 예제 복습 본문

First/SQL

주말) SQL 예제 복습

기돌 2023. 4. 16. 00:06

코드 따라치기 이후 
복습으로 예제 문제만 보고 코드짜기 

2일전 ? 까지만해도 간단한 예제를 던져주면 흠... 하고 이걸 어떻게 시작해야하지... 
고민하느라 손도 못대던 문제들이 대다수였다..

더이상은 혼자서 시작도 못할것 같아서 다른분께 도움요청 !

 내가 문제 접근하는걸 보시더니
문제 시작하는 방법부터 잘못 되었다고 조언해주셨다 자기는 문제에  정보를 전부다 써놓고 시작했다고 하셨다
우선, 문제를 시작하기전에 모르면 일단 table 부터 전부다 조회 해보고 
필요한 정보들이 어떤건지 문제를 손으로 하나하나 쪼개고 나서 테이블 고르라고 하셨다

Q. 각 부서별로 직급이 과장인 사람들의 평균 급여  // 문제 쪼개기

▪ 각 부서별(dept_id가 부서에다가 부서별로 보여 줘야하니   group으로 묶어서..)  
▪ 직급이 과장인(일단 title = '과장')사람들
▪ 평균 급여 avg(salary)..
▪ title , dept_id ,salary가 어디 table 에 들어있는 조회
▪ s_emp  table인걸 발견

▪ group by dept_id  
▪ where title = '과장'
▪ select dept_id , avg(salary)
▪ from s_emp 

조합해보면..

select dept_id , avg(salary)
from s_emp
where title = '과장'
group by dept_id
;

결국 예제를 다 풀수 있게 되었는데 뒷편에 join을 보니 다시 막막해졌다..


 

--23.04.15 예제 복습하기
-- '사원'의 이름과 직급 부서 연봉 조회
select name as 이름 ,title as 직급 , dept_id 부서
from s_emp
where title = '사원'
;
select name , title, dept_id
from s_emp
where title like '사원'
;

-- 근무자의 이름 , 직급 , 연봉 , 보너스 (연봉5배)
select name 이름 ,title 직급, salary 연봉 , salary*5 as 보너스
from s_emp
;
-- 근무자의 이름 ,직급, 연봉 , 보너스 (연봉5배) '사원만'
select name 이름 ,title 직급 , salary 연봉 , salary * 5 보너스
from s_emp
where title like '사원'
;
-- 근무자의 이름 , 직급 ,연봉 , 보너스 (연봉5배) '과장만'
select name 이름 , title 직급 , salary 연봉 , salary*5 보너스
from s_emp
where title = '과장'
;
--합성 연산자 || 이용해서 '이름 직급'으로 출력
select name || ' ' || title 
from s_emp
;
select name || '  '|| title "이름          직급"
from s_emp
;

--연봉이 500 ~2500 인 사람의 이름과 직급을 표기 하시오 , 단 사원만
select name , title , salary
from s_emp
where title = '사원'
and salary between 500 and 2500
;
-- 연봉이 500 ~3000인 사람의 이름과 직급 오름차순으로 조회
select name , title , salary
from s_emp
where salary BETWEEN 500 and 3000
order by salary
;
-- 연봉이 1500 이상인 사람의 이름과 연봉 직급을 조회하시오
select * from s_emp;  -- 연봉 구간 보려고 전체 조회함
select name , salary , title
from s_emp
where salary >= 1500
;
-- 연봉이 2000 이상인 사람의 이름과 직급 부서 연봉 조회
select name , title , dept_id , salary
from s_emp
where salary >= 2000
;
-- 입사 날짜가 16/12/31 이전에 입사한 사람의 이름과 직급 입사 날짜 를 출력
select name , title , start_date
from s_emp
where start_date <= '16/12/31'
;
-- 입사 날짜가 15/12/31 이후에 입사한 사람의 이름과 직급 입사 날짜 조회
select name 이름, title 직급 , start_date "입사 날짜"
from s_emp
where start_date >= '15/12/31'
;

-- 이름과 직급 부서 를 조회 하는데 부서가 110 ,113인 사람만 조회 
select name 이름 , title 직급 , dept_id 부서
from s_emp
where dept_id in(110,113)
;

-- 이름과 직급 부서 조회 부서가 110 , 113, 111 인 사람만조회
select name , title , dept_id
from s_emp
where dept_id in(110,113,111)
;
-- 이름과 직급 부서 조회 부서가 110 , 113, 111 인 사람만조회 하는데 '사원만'
select name , title , dept_id 
from s_emp
where dept_id in (110 , 113, 111)
and title = '사원'
;
-- 이름 입사 날짜 직급을 조회 하는데 입사날짜에 17일에 입사한 사람만
select name ,title , start_date
from s_emp
where start_date like '%17%'
;
-- 이름 ,입사 날짜 ,직급 ,부서 조회 하는데 입사날짜에 17일에 입사한 사람, 단 '사원만'
select name , start_date ,title, dept_id
from s_emp
where start_date like '%17%'
and title = '사원'
;
-- 각 부서별 평균급여를 계산해서 조회
select dept_id ,avg(salary)
from s_emp
group by dept_id
;
-- 각 부서별로 직급이 사원인 사람들의 평균 급여를 조회해줘
select dept_id , avg(salary) "부서내 사원연봉"
from s_emp
where title = '사원'
group by dept_id
;

-- 각 부서별로 직급이 과장인 사람들의 평균 급여
select dept_id , avg(salary)
from s_emp
where title = '과장'
group by dept_id
;

-- 각 지역별로 몇개의 부서가 있는지 조회
select * from s_region;
select * from s_emp;
select * from s_dept; -- 1번지역에 부서 4개, 2번부서 2개있는거 확인

select region_id , count(name)
from s_dept
group by region_id
;

-- 각 부서별로 평균 급여를 구하라 , 평균 급여가 2000이상인 부서만 나타내줘
select dept_id , avg(salary) 
from s_emp
group by dept_id
having avg(salary) >= 2000
;

-- 각 직책별로 급여의 총합을 구하되 직책이 부장인 사람은 제외
select title , sum(salary)
from s_emp
group by title
having title not like '%부장'
;
-- 단 급여의 총합이 8000 이상이 직책만 나타내고 급여 총합에 대해 오름차순으로 정렬
select title , sum(salary)
from s_emp
group by title
having title not like '%부장'
and sum(salary) >= 8000
order by sum (salary)
;
-- 각 부서별로 직급이 사원인 사람들에 대해 평균 급여를 구해줘
select dept_id 부서 , avg(salary) 급여평균
from s_emp
where title = '사원'
group by dept_id
;

-- 각 부서(dept_id)내에 직급별title 로 몇명의 인원count이있는지 나타내시오
select dept_id , title , count(*)
from s_emp
group by dept_id ,title
;

-- 각 부서내의 몇명의 직원이 근무하는지 조회
select dept_id , count (*)
from s_emp
group by dept_id
;
-- 각 부서별dep_id로 급여의 최소값 min(salary)과 최대값을 max(salary) 나태내줘
select dept_id , min(salary) , max (salary)
from s_emp
group by dept_id 
;
-- 각 부서별로 급여의 최소값과 최대값을 나타내주고 , 최소값과 최대값이 같은 부서는 출력하지마

--select dept_id , min (salary) , max (salarty)
--from s_emp
--where min(salary) != max(salary)
--group by dept_id
----;  에러 
-------------------------------------------
-- max (salarty) 오타 => max (salary)
-- min , max는 having 절로 가야함 왜?
-- 그룹함수 max,min은 having으로

select dept_id , min(salary) , max(salary)
from s_emp
group by dept_id
having min (salary) != max (salary)
;

그룹함수에 대한 조건식 having 에 대해 잘모르는것같다...

 

728x90

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

정리 _ 테이블 생성 , 조작 , group by , JOIN  (0) 2023.04.17
정리_관계형 데이터 베이스 RDB  (0) 2023.04.17
정리_SQL 기초문법  (0) 2023.04.15
정리_문자형 함수 , 숫자형 함수  (0) 2023.04.15
SQL 기본  (0) 2023.04.11