성장 기록 블로그🌴
@ 데이터베이스 2일차 실습 예제 ( select절 출력하기 - 부서테이블 , 사원 테이블, 급여 , alias 등 ) 본문
@ 데이터베이스 2일차 실습 예제 ( select절 출력하기 - 부서테이블 , 사원 테이블, 급여 , alias 등 )
wlswls2s 2022. 9. 7. 16:56< 데이터베이스 코드 모음>
< 부서 테이블 & 사원 테이블 >
<부서 테이블 >
=> 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가 뜰꺼고 이는 매우 치명적인 오류임. |