Oracle Database 사용
Oracle
Ubuntu 20 에서 설치 및 사용함 설치는 아래 URL 참조 했고 조금 어려웠던 점은 shared memory 가 900mb 로 잡혀있었는데 이게 작으면 Oracle이 안 살아 났다.(df -h 로 확인 가능) 그래서 늘려주는 작업을 아래 와 같이 진행 했다.
https://a292run.tistory.com/entry/Oracle-11gR2-on-Ubuntu-2004
sudo -s
umount /dev/shm
sudo rm -rf /dev/shm
sudo mkdir /dev/shm
mount --move /run/shm /dev/shm
sudo mount -t tmpfs shmfs -o size=2048m /dev/shm
- Booting 시 shm 설정
/etc/fstab 열고 아래 내용 추가
tmpfs /dev/shm tmpfs defaults,size=2g 0 0
DB 연결
- sqlplus sys as sysdba > conn system
scott 계정 Enable
테스트 계정인 듯 하다
- sqlplus / as sysdba
- @$ORACLE_HOME/rdbms/admin/utlsampl.sql
- sqlplus scott/tiger
Oracle DB 쿼리
- ORDER BY – ASC, DESC order by 절은 제일 마지막에 수행 된다. From 절을 먼저수행 하고 Select를 수행한 다음 Order By
- Where – Where 절은 From 절을 수행한 다음에 수행된다. 그래서 Select 절에 별칭을 지정했고 이를 Where절에서 사용하면 에러가 발생한다.
- nls_session_parameters 는 현제 접속한 Session 의 국가, 날짜 형식 에 대한 정보를 출력해 준다.
- ALTER SESSION SET NLS_DATE_FORMATE=’YY/MM/DD’ 로 형식 변경이 가능하다.
- 세션은 데이터베이스로 로그인 해서 로그아웃 할때 까지 부여되는 것 세션을 종료하면 세션 변경사항은 폐기된다.
- NVL – if null NVL(comm, 0 ) = 0, NULL 과의 산술연산은 NULL이다.
- <>, ^= 비교연산자로 같지 않다를 의미한다.
- NOT
- LIKE – wildcard 사용가능
- ‘S%’ – 처음 알파벳이 S 인 데이터
- ‘_M%’ – 두번째 철자가 M인 데이터
- IS NULL – NULL 인 데이터는 IS NULL 로 검색
- DISTINCT – Select 절에 사용되며 중복을 없애줌
- IN – where job in (‘SALESMAN’, ‘ANALYST’)
- TRUE AND NULL – 은 NULL 이다. NULL은 알수 없는 값임으로 TRUE 인지 FALSE인지 알 수 없다고 생각하면 편할것 같다.
- INITCAP – 첫번째 철자만 대문자 함수이다.
- SUBSTR – 특정 철자 추출
- LENGTH – 문자열 길이 LENGTHB 는 바이트 단위로
- INSTR – 특정 철자의 INDEX 출력
- DUAL – 더미 문법 시험에 좋다.
- RPLACE – 특정 철자를 다른 문자로 바꾼다. REPLACE(sal, 0, “#”), REGEXP_REPLACE(sal, ‘[0-3]’, ‘*’) as SAL
- LPAD, RPAD – 고정된 자리수를 지정하고 데이터가 자리수보다 작으면 지정한 문자를 체운다. LPAD(sal, 10, ‘*’)
- ROUND 반올림, TRUNC 버림, MOD 나머지값, FLOOR 몫
- MONTHS_BETWEEN – 날짜간 개월수 출력 MONTHS_BETWEEN(sysdate, hiredate) TO_DATE를 써서 산술연산해도 된다.
- ADD_MONTHS – 개월수를 더한 날짜 select ADD_MONTHS(TO_DATE(‘2019-05-01’, ‘RRRR-MM-DD’), 100) from dual
- select TO_DATE(‘2019-05-01’, ‘RRRR-MM-DD’) + interval ‘100’ month from dual이렇게 해도 된다.
- NEXT_DAY – 특정 날짜 뒤에 오는 요일의 날짜 출력 NEXT_DAY(‘2019/05/06’, ‘월요일’)
- LAST_DAY – 특정 날짜가 있는 달의 마지막 날짜 LAST_DAY(‘2019/05/22’)
- EXTRACT – 날짜에서 특정 년, 달 같은 요소를 추출
- TO_DATE – TO_DATE(’81/11/17′, ‘RR/MM/DD’)
- SET AUTOT ON 실행계획 출력
- NVL2 – if null else NVL2(comm, sal + comm, sal) – comm 이 NULL이면 sal을 출력 Null이 아니면 sal+comm 출력
- DECODE – If 문을 SQL로 구현한것 DECODE(deptno, 10, 300, 20, 400,0) if deptno = 10 300, else if deptno = 20 400 else 0 else에 해당하는 default 값은 생략 가능
- case – decode 와 마찬가지로 if 문을 SQL로 표현
- CASE WHEN sal >= 3000 then 500
- When sal >= 5000 then 300
- ELSE 0 END
- MAX, MIN, AVG(Null 무시)
- GROUP BY – 데이터를 그룹핑함
- select job, MAX(sal) from emp where job=’SALESMAN’; — error 발생 Job 은 행이 여러 개고 MAX는 한 개 임으로
- select job, MAX(sal) from emp where job=’SALESMAN’ GROUP BY job; — 정상동작
- select job, MAX(sal) from emp GROUP BY job; — 직업별 최고 연봉
- 실행 순서는 From, Where, Group By, Select 순으로 실행
- 함수는 Where절이 False라도 항상 출력된다. 예를 들어 select min(sal) from emp where 1=2; 는 no row selected 가 아니라 NULL이다.
- HAVING – WHERE 절과 비슷하지만 Group 함수(MIN, MAX, AVG, SUM 등등)를 허용한다.
- select job, sum(sal) from emp where job != ‘SALESMAN’ group by job HAVING sum(sal) >= 4000;
- 여기서 Having 절은 4번째로 수행된다.
- COUNT – NULL은 무시된다.
- RANK – 순위를 출력 select ename, job, sal, RANK() over (ORDER BY sal DESC) 순위 from emp where job in (‘ANALYST’, ‘MANAGER’); 이와 같은 하면 동등한 순위는 같은 Rank로 표시 되고 동순위 갯수 만큼 증가된 숫자로 Rank 가 출력 되는데 순차적으로 출력하고 싶다면 DENSE_RANK를 이용한다.
- select ename, sal, job, RANK() over (PARTITION BY job ORDER BY sal DESC) as 순위 — 직업별 월급 순위
- select DENSE_RANK(2975) within group(ORDER BY sal DESC) from emp; — 월급이 2975인 사원의 월급 순위
- NTILE – 등급을 정해놓고 그에 맞게 출력
- SELECT ename, job, sal,
NTILE(4) over (order by sal desc nulls last) 등급
from emp
where job in (‘ANALYST’, ‘MANAGER’, ‘CLERK’) - nulls last 는 null은 가장 마지막에 출력됨
- SELECT ename, job, sal,
- CUME_DIST – 순위의 비율 총 14명중에 1등인 사람 수
- LISTAGG – 데이터를 가로로 출력
- select deptno, LISTAGG(ename, ‘/’) within group(order by ename asc) from emp group by deptno;
- Deptno에 대한 사원들을 가로로 출력한다.
- select deptno, LISTAGG(ename || ‘(‘ || sal || ‘)’, ‘/’) within group(order by ename asc) from emp group by deptno;
- within group – LISTAGG, RANK, DENSE_RANK 등에 사용되면 집계 그룹의 정렬을 지정한다.
- LAG, LEAD – LAG 는 전행, LEAD는 다음행
- LAG(sal, 1) over (order by sal asc)
- PIVOT – 가로 출력 UNPIVOT – 세로 출력
- select * from (select deptno, sal from emp)
pivot (sum(sal) for deptno in (10, 20, 30));
- select * from (select deptno, sal from emp)
- SUM Over – 집계함수
- ROW_NUMBER – 번호를 매겨준다. OVER (Order by sal asc) 등의 내용이 필요 하다.
- ROWNUM – 출력행 제한 Where 절에서
- FETCH FIRST 5 ROWS ONLY – where 절에서 실행되지 않고 행을 제한한다
- select empno, ename, job, sal from emp
order by sal DESC
FETCH FIRST 5 ROWS ONLY; - FETCH FIRST 20PERCENT ROWS ONLY;
- 2 ROWS WITH TIES – 값이 동일하면 출력을 추가로 해준다.
- OFFSET 2 rows – 두번째 오프셋 부터 출력
- select empno, ename, job, sal from emp
- EQUI JOIN – From 절에서 콤마로 두개의 테이블을 가져온다
- Create Table
- CHAR – MAX 2000 바이트
- VARCHAR2 – MAX 4000바이트
- LONG – 가변길이 문자 데이터 MAX 2GB
- CLOB – 문자데이터 MAX 4GB
- BLOB – 바이너리 데이터 4GB
- NUMBER – 최대 32자리
- DATE – 날짜
- Index – create index emp_sal on emp(sal) 데이터 검색을 빠르게 하기 위해 사용한다.
- Index과정과장점
- Index로 지정된 데이터를 Sorting 하고 해당 데이터가 있는 물리 주소를 인덱스로 지정된 데이터에 매핑한다.
- Sorting이 되어 있음으로 Index 테이블에서 검색이 매우 빠르고 실제 데이터의 물리 번지를 알고 있으니 빠르게 접근이 가능하다.
- Index 단점
- 데이터 추가시 Index Table은 Sorting 되어야 함으로 추가, 삭제, 수정 시 성능 저하가 올 수 있다.
- Index과정과장점
- Sequence – 중복 번호 없이 데이터를 증가 시키려 할때
Oracle Object
- VIEW – 사용자에게 필요한 정보만 보여줄 목정으로 생성된 가상 테이블
- Index – create index emp_sal on emp(sal) 데이터 검색을 빠르게 하기 위해 사용한다.
- Index과정과장점
- Index로 지정된 데이터를 Sorting 하고 해당 데이터가 있는 물리 주소를 인덱스로 지정된 데이터에 매핑한다.
- Sorting이 되어 있음으로 Index 테이블에서 검색이 매우 빠르고 실제 데이터의 물리 번지를 알고 있으니 빠르게 접근이 가능하다.
- Index 단점
- 데이터 추가시 Index Table은 Sorting 되어야 함으로 추가, 삭제, 수정 시 성능 저하가 올 수 있다.
- Index과정과장점
- Sequence – 중복 번호 없이 데이터를 증가 시키려 할 때
- Trigger – 데이터 변화 이벤트시 자동적으로 수행되는 프로시져
- Package – 프로시저 변수 등의 모음
명령어 모음
systemctl status oracle // oracle 상태 조회
systemctl start oracle
systemctl stop oracle
// oracle Listener 정지 및 재실행
lsnrctl start
lsnrctl stop
블로그 구독하기 !!