오라클을 처음 사용해보면서 공부한 것을 정리할 겸 글을 적어봅니다 :)
1. 오라클에서 제공하는 기본 테이블
오라클에서 데이터베이스의 기본적인 데이터 저장 단위인 테이블을 몇개 제공해줍니다.
여기서는 그 중 DEPT와 EMP 테이블을 사용해서 정리해보겠습니다.
DEPT : 부서 정보가 담긴 테이블입니다.
DEPTNO : 부서의 번호
DNAME : 부서의 이름
LOC : 부서의 위치
EMP: 사원들의 정보가 담긴 테이블입니다.
EMPNO : 사원 번호
ENAME : 사원 이름
JOB : 사원 직책
MGR : 사수의 사원번호
HIREDATE : 입사일
SAL : 급여
COMM : 추가 수당
DEPTNO : 부서 번호
2. SELECT문
SELECT문을 사용해서 각 테이블의 데이터를 조회할 수 있는데,
먼저 SELECT 명령의 세 가지 특성을 보도록 하겠습니다.
1. SELECTION : 특정 업무에서 필요로하는 행을 선택.
ex) SELECT * FROM emp -> EMP 테이블의 모든 정보를 조회하는데,,,
WHERE sal > 2000; -> sal(급여)가 2000 이상인 행만 조회
where절은 나중에 적어보겠지만, 간단히 짚고 넘어가자면 where문은 프로그래밍의 조건문과 같다고 보시면 됩니다.
if문인것이죠.
그러면 위에 문장은 어떻게 출력이 되는지 보겠습니다.
먼저 SELECT문으로 emp의 모든 정보를 출력했을 때 보겠습니다.
emp 테이블에는 총 14개의 사원 정보가 들어있습니다.
그런데 어떤 정보는 비어있고 어떤 정보는 그대로 있고... 뭔가 이상하죠?
간단히 말하면 저 비어있는것은 NULL 입니다. 어떠한 값도 아닌 그저 정보가 없는 것이죠.
왜 정보가 없죠??
MGR의 비어있는 부분을 보겠습니다.
그리고 그 행에 해당하는 사람의 직책을 보니... PRESIDENT 입니다!!
그렇죠.. 사장이죠?
사장에게 사수가 있을리가 없죠. 그래서 NULL값입니다.
그러면 COMM은 뭐죠?
아까 COMM은 추가 수당이라고 했습니다.
COMM에 값이 있는 사람들의 직책을 보면 SALESMAN입니다.
즉, 세일즈맨이 각자 자기 물건을 팔고 나온 추가 수당이란 소리겠죠.
추가수당이 0인 세일즈맨 직원은 신입이거나 정말 하나도 팔지못한 사람이란 소리입니다.
잠시 NULL값에 대해 알아보았고 다시 본론으로 돌아와서...
그러면 where문을 사용한 위의 문장을 실행하면 어떻게 될까요?
사진과 같이 SAL이 2000 이상인 사원들의 행만 보여주는 것을 볼 수 있습니다.
이처럼 필요로 하는 행을 선택할 수 있는 특성이 있습니다.
2. PROJECTION : 테이블을 구성하는 많은 컬럼들 중 필요로 하는 컬럼만 선택할 수 있다.
emp 테이블을 보니 많은 컬럼들이 있는데, 항상 모든 컬럼을 조회할 필요는 없죠.
따라서 필요한 컬럼들만 조회할 수 있습니다.
ex) SELECT ename, job
FROM emp;
위 사진과 같이 emp 테이블의 정보 중 ENAME(사원 이름)과 JOB(직책) 만 뽑아서 조회할 수 있습니다.
3. JOIN : 두개 이상의 테이블을 연결해서 가상의 통합 테이블을 만들 수 있다.
이것도 나중에 정리할 예정이지만, 우선 이런 특성이 있구나 라고 알고만 계셔도 좋습니다.
우선 예시로 무슨말인지 보여드리겠습니다.
emp 테이블에는 LOC라는 정보가 없습니다.
그러나 dept 테이블에는 LOC 라는 부서 위치정보가 있죠.
이 정보를 emp 테이블과 엮어서 하나의 가상 테이블로 만들어서 정보를 확인할 수 있습니다.
3. SELECT 문장의 구성
SELECT 문장은 필수적으로 있어야하는 문장입니다.
FROM절도 필수로 있어야 하구요.
그 외의 구성으로는 WHERE(옵션) -> GROUP BY(옵션) -> HAVING(옵션) -> ORDER BY(옵션) 순서로 구성되어야 합니다.
중간에 어떤 옵션을 적지 않더라도 사용 순서는 유지되어야 하죠.
그리고 SELECT 문장은 아래와 같이 표현할 수 있습니다.
SELECT [DISTINCT | ALL] { * | COLUMN_LIST}
어렵게 보이시겠지만, 차근차근 보면
SELECT는 필수적으로 적어야 합니다.
그리고 DISTINCT라는 애 혹은 ALL 이라는 애가 와야하고,
뒤에는 *(전체) 혹은 어떤 컬럼의 이름이 오는 구성입니다.
즉 "|" 이것은 or라는 의미이며
SELECT DISTINCT *
SELECT ALL *
SELECT DISTINCT column_list 이런식으로 쓸 수 있다는 소리입니다.
그러면 DISTINCT 와 ALL은 무엇일까요?
4. DISTINCT 와 ALL
1) DISTINCT
우리는 emp 테이블의 정보들 중 부서번호가 무엇이 있는지 알고 싶습니다.
SELECT와 FROM으로 조회를 하겠죠.
어... 그런데 좀 지저분하지 않나요?
너무 중복이 많습니다.
이러한 중복을 제거 해주는것을 DISTINCT라고 합니다.
SELECT DISTINCT deptno
FROM emp;
보기 깔끔해졌죠?
이것으로 emp 테이블에있는 사원들은 총 3개의 부서들로 나눠져 있다는 것을 알 수 있습니다.
그러면 ALL은 무엇이냐??
눈치 빠르신 분들은 이미 ALL이 무엇인지 봤다는걸 아셨을 겁니다.
DISTINCT를 안쓰면 기본값인 ALL로 처리가 됩니다. 그래서 중복이 포함되어서 나왔지요.
그런데 ALL을 쓰셔도 상관없긴 합니다.
똑같이 나오는것을 볼 수 있습니다.
5. HEADING
지금까지 글을 읽으시면서 뭔가 불편한거 없으셨나요?
처음 배우는것이라면 모든게 불편하셨을 수 있으시겠지만...
컬럼 명이 ENAME, SAL, DEPTNO 이런식으로 적혀있어서 뭔가 직관적이지 않습니다.
간혹 저도 한눈에 안읽힐 때가 많습니다.
컬럼 명을 우리는 지정해 줄 수 있습니다.
SELECT ename 사원명, job as 업무, mgr manager, sal "월 급여"
FROM emp;
쓰는 방법은 위와 같이
- column_list 바로 뒤에 그냥 쓰는 방법
- as를 붙인 후 쓰는 방법
- "" 큰 따옴표로 사용하는 방법
세 가지가 있습니다.
결과는 이렇습니다.
확실히 각 컬럼이 어떤 정보인지 직관적으로 되었죠?
6. 계산식(Expression)
여러분들이 사원들 정보를 보다보니 각자의 연봉이 궁금해졌고 이를 표기하고 싶습니다.
이럴 때 계산식을 사용해서 표시할 수 있습니다.
SELECT ename, job, sal, sal * 12, deptno
FROM emp;
sal는 급여라고 했습니다. 그러면 곱하기 12를 하면, 연봉이 나오겠죠.
그래서 column_list에 sal 곱하기 12 라고 표기하였습니다.
출력이 잘 나오겠죠? 기대하며 출력해봅니다.
잘 나왔....
어... 그런데 컬럼 명이 저렇게 나와도 될까요?
아까 위에 적었던 HEADING을 이용해서 새로 이름을 지어줍시다.
Annual Salary 라고 이름을 바꿔서 출력해줬습니다.
훨씬 보기 좋네요.
그러면 이제 추가수당까지 계산해서 출력해봅시다.
이건 밑에를 보시기 전에 먼저 해보시기를 추천합니다.
.
.
.
.
.
.
.
.
.
.
.
해보셨나요??
혹시 이렇게 하시지 않았나요?
SELECT ename, job, sal, comm, sal * 12 + comm as "Annual Salary", deptno
FROM emp;
출력이 이렇게 나왔을겁니다.
제대로 나온건가요?
아니죠. 추가 수당이 있는 직원 외, 다른 직원의 연봉은 계산이 되지 않았습니다.
이는 바로 NULL값 때문인데요, 이를 위해서 나중에 정리글을 쓸 예정이지만, NVL라는 null velue 함수를 이용해야합니다.
간단히 말하면 'null 값이면 대체 값으로 연산해서 실행해줘' 라고 명령하는 함수입니다.
SELECT ename, job, sal, comm, sal * 12 + NVL(comm, 0) as "Annual Salary", deptno
FROM emp;
위와 같이 NVL(comm, 0) 라고 명령해줘서,
'null 값이면 0으로 계산해줘' 라고 명령합니다.
실행해볼까요?
이제 제대로 연봉이 다 계산되어 나온것을 볼 수 있습니다.
7. ORDER BY
우리는 이제 emp 테이블에 있는 사원들의 연봉까지 정리해서 출력해보았습니다.
그런데 좀 더 깔끔하게 출력해볼까요?
ORDER BY 절은 가장 마지막 절이죠.
ORDER BY 구성을 보겠습니다.
ORDER BY {col_list} [asc | desc]
col_list는 컬럼 명을 뜻하죠.
그러면 asc 와 desc는 무엇일까요?
asc : ascending이란 뜻으로 오름차순이란 뜻 입니다. 기본값 입니다. 고로, 생략 가능합니다.
desc : descending 즉, 내림차순이란 뜻 입니다.
바로 예시를 보겠습니다.
SELECT ename, hiredate
FROM emp
ORDER BY hiredate;
사원들의 정보를 입사일 순으로 정렬하는 예제 입니다.
날짜가 잘 정렬되어 나온것을 볼 수 있습니다.
!!!잠깐!!! 오라클의 기본 날짜 형식에 대해 알아보고 가실게요!!!
오라클은 기본 날짜 형식이 RR/MM/DD 형태입니다. 사실 시간도 표기할 수 있는데, 그건 나중에 알아보고 우선 년도 달 일 형태라는 것을 알고 갑니다.
RR : 0 ~ 49 까지는 XXXX 라는 뜻입니다. 앞 두자리는 시스템 년도로 표기가 됩니다.
(현재 2023년이니 23으로 표기).
50 ~ 99 까지는 19XX 라는 뜻입니다. 즉 80/12/17은 1980년 12월 17일이란 뜻이죠.
1800년대는 그냥 18XX형태로 얼마든지 표기가 가능합니다.
위 내용은 그저 기본 표기법에 근거하여 설명했을 뿐, 얼마든지 다르게 표기할 수 있습니다.
그러면 본론으로 돌아와서 내림차순으로 한번 볼까요?
SELECT ename, hiredate
FROM emp
ORDER BY hiredate desc;
위 ORDER BY 기본 형식에 의해 desc을 하면 내림차순이 된 것을 볼 수 있습니다.
근데,,, 정렬을 하나에 의해서만 가능할까요?
SELECT ename, job, deptno
FROM emp
ORDER BY job;
위와 같이 입력해 봅니다.
JOB 컬럼을 보시면 사전순으로 잘 정렬되어 졌지만 동일한 이름이 많습니다.
이렇게 된다면, 동일한 행에 대해서 실행할 때마다 다른 순서로 출력될 수 있습니다.
그래서 정렬 후 동일 행에 관해 이차적인 정렬을 진행할 수 있습니다.
SELECT ename, job, deptno
FROM emp
ORDER BY job, deptno;
위와 같이 적으면,
job 컬럼에 대해 먼저 정렬을 진행한 후, 동일한 행에 관해 이차적으로 deptno컬럼을 정렬합니다.
위 결과와 비교해보시면, deptno 컬럼의 결과도 동일한 행 끼리는 정렬이 되어진 모습을 볼 수 있습니다.
그러나 내림차순할 때 주의사항이 있습니다.
내림차순 시, decs라고 적는것은 알고 있지만 아래와 같이 적어보겠습니다.
SELECT ename, job, deptno
FROM emp
ORDER BY job , deptno desc;
어 뭐야!! 직책은 왜 오름차순이지?!
위 결과처럼 그저 ORDER BY col_list... desc; 라고 적으시면 맨 마지막에 적은 컬럼에 관해서만 내림차순이 적용됩니다.
즉, 각 컬럼에 대해 내림차순 명령을 적어주셔야 합니다.
SELECT ename, job, deptno
FROM emp
ORDER BY job desc, deptno desc;
각 컬럼 뒤에 desc 라고 내림차순 명령을 함으로써 잘 정렬된 모습을 볼 수 있습니다.
여기까지 SELECT에 관한 정리였습니다.