성장 기록 블로그🌴

@ 데이터베이스 2일차 실습 예제 ( select절 출력하기 - 부서테이블 , 사원 테이블, 급여 , alias 등 ) 본문

AI & BigData 교육과정/Database 관련

@ 데이터베이스 2일차 실습 예제 ( select절 출력하기 - 부서테이블 , 사원 테이블, 급여 , alias 등 )

wlswls2s 2022. 9. 7. 16:56
728x90

< 데이터베이스 코드 모음>

< 부서 테이블 & 사원 테이블 >

<부서 테이블 >

 

=> 27개의 부서

 

< 사원 테이블 >

=> 107명의 사원

 

Q. 사원 테이블의 이름의 성, 입사일, 급여 순으로 출력하시오.

select last_name, hire_date, salary
from employees

Q. 근무하는 사원의 이름과 급여와 연봉을 출력하시오.

select FIRST_NAME, SALARY, SALARY*12
from employees

Q. 사원의 이름, 직업명, 급여, 보너스를 출력하시오

column last_name format a20
select last_name , job_id, salary, commission_pct
from employees

=> 보너스 부분에서 받은 사람도 있고, NULL이 있는 사람도 있음

 

< 주의 >

=> commision_pct가 있는 애들은 계산이 되지만, 없는 애들은 아예 결과가 안나옴
왜나면, 없는 구간은 null로 되어서 0으로 곱해져서 null이 되어버림
따라서 꼭 안에 널값을 없애주고 곱해야함.

 

<올바른 코드>

Q. 사원의 이름, 직업명, 연봉을 출력하시오. ( , 보너스를 받는 사원은 보너스를 고려하여 출력)

select last_name , job_id, salary*12*nvl(commission_pct,1)
from employees

nvl(commission_pct,1) : 보너스에서 null이 있는 곳에 1을 곱해라, 만약 0을 넣으면 0이 곱해지니 주의!

=> Null없이 잘 계산된 것을 확인할 수 있음

< 위의 코드에서 컬럼명을 보면 연봉의 경우가 친 코드 그대로 설정되어 지저분함>

=> 따라서, 이러한 경우 이름을 수정하기 위하여 *열별칭을 사용함 (AS)

select last_name , job_id, salary*12*nvl(commission_pct,1) as ANNSAL
from employees

<주의>
한 컬럼 당 하나의 alias(별칭)을 지정해야함
 
< Alias 별칭 정의 방법>
AS 라는 키워드 넣기 => last_name as name
AS없이 공백을 넣어 지정하는 방법 => last_name name
select last_name as name
from employees
< 공백인 경우 > - 검증이 필요하며 컬럼명은 무조건 대문자
select last_name name
from employees

=> 둘 중에 as를 쓰는게 나음, 컴마 이런거 구별이 힘들기 때문에 가독성이나 성능 측면에서도 as가 좋음.

< 만약 컬럼명을 첫글자만 대문자로하거나 소문자로 쓰고싶은 경우>
“” => 따옴표를 사용하면 됨
select last_name "Name"
from employees

 

Q. 회사에 근무하는 사원의 이름과 연봉을 구하시오.

( , 이름은 NAME으로 연봉은 AnnSal로 출력하시오)

select last_name as name , salary*12 "AnnSal"
from employees

< 중복행 제거 >

Q. 사원들의 부서번호를 출력하시오.

select department_id
from employees
실제 부서 테이블의 부서번호
select department_id
from departments



 

=> 중복된 부서번호가 쭉 나열됨


실제 부서번호는 27개이나, 107개가 출력된 걸 볼 수 있음. 107은 사원수임.

 

 

< 위 문제 해결하기 위한 방안 > - select 절에 컬럼명 앞에 DISTINCT 사용

select DISTINCT department_id
from employees
=> 12개가 아니라 11개의 부서에서 사원들이 근무하고 있음
왜나면 NULL이 하나 존재하기에.


따라서, 잘 봐야함.


또한, 총 부서번호는 27개인데 그 중에서 사원들은 11개의 부서에서만 근무하고 있음

 

< 그룹화 현상 >

Q. 부서 별로 업무명을 출력하시오.

< 문제점 >

select DISTINCT department_id, job_id
from employees

=> 중복 제거를 했음에도 오른쪽 그림을 보면 중복이 다 제거되지않음을 알 수 있음

 

따라서, 이러한 현상을 방지하기 위하여 부서별로 보유한 업무를 출력하도록함.

< 올바른 코드>

select DISTINCT department_id, job_id
from employees
order by 1

Q. 90번 부서에 근무하는 사원의 이름과 급여를 출력하시오. (Where절의 사용)

select last_name , salary
from employees
where department_id=90;
양식 : where 조건
< 90번 부서번호인 사원만>
where 부서번호 =(연산자) , where department_id=90
=> 여기서 코드에서
select last_name, job_id, department_id
from employees
where department_id = '90’


이렇게 쳐도 위에 그대로나옴.
=> why? DB안에 자동변환 기능이 있어서 인식을 해줌. 하지만 이렇게되면 얘는 문자로 인식하기 때문에 성능이 떨어지니 비추천함.
또한, 금액 중에 0,000 형식인게있는데 이런 기호가 들어간 숫자값은 무조건 문자!!!!

Q. 이름이 Whalen인 사원의 이름과 직업명, 부서번호를 출력하시오.

select last_name, job_id, department_id
from employees
where last_name = 'Whalen'

이름은 문자이기 때문에 ‘ ’(작은 따옴표)를 꼭 사용해줘야함. 또한, 반드시 테이블명에 저장된 이름 형식을 그대로 입력해주어야함. 만약 이름을 ‘whalen’이라고 검색했다면 no row select가 뜰꺼고 이는 매우 치명적인 오류임.

 

 

728x90