[Oracle] 계층형 쿼리(START WITH ~ CONNECT BY PRIOR ~ ORDER SIBLINGS BY ~)
·
[DB]/- Oracle
1. 계층형 쿼리란?계층형 쿼리란 한 테이블 내에 부모-자식 관계를 갖는 두 컬럼이 존재할 때 이 관계를 기준으로 트리 구조로 데이터를 조회할 때 사용하는 쿼리다. 예를 들면 다음과 같은 경우에 계층형 쿼리를 사용할 수 있다.직원 테이블 : 직원 A가 직원 B의 매니저이고, 직원 B는 직원 C의 매니저인 경우부서 테이블 : 부서 A는 부서 B의 상위 부서이고, 부서 B는 부서 C의 상위 부서인 경우게시판 댓글 테이블 : 댓글은 대댓글과 대댓글의 대댓글(대대댓글?)의 구조를 가짐위 사진처럼 계층형 쿼리는 LEVEL 값을 갖는다. 컬럼명도 그대로 LEVEL이며, 최상위 행이 1, 최상위 행의 자식 행이 2, 이 자식 행의 자식 행이 3인 구조를 갖는다.2. 사용 방법사용 방법은 다음과 같다.SELECT *F..
[Oracle] 집합 연산자(UNION, UNION ALL, INTERSECT, MINUS)
·
[DB]/- Oracle
오라클에는 4가지 집합 연산자[UNION, UNION ALL, INTERSECT, MINUS]가 존재한다. 이중 UNION ALL을 제외한 나머지 3개는 모두 정렬(SORT)과 중복 제거(UNIQUE)가 이뤄진다. 반면 UNION ALL 연산자는 정렬과 중복 제거 없이 단순 쿼리 결과 합치기만 이뤄진다. 그러므로 UNION ALL 연산자는 성능에 부담이 가지 않지만 UNION, INTERSECT, MINUS 연산자는 많이 사용할수록 성능에 부담을 주게 된다.※ 주의사항조회하는 컬럼의 개수와 데이터 타입은 두 쿼리가 반드시 일치해야 한다. 컬럼을 여러개 조회하는 경우 이것들을 하나의 집합으로 묶어서 조회하기 때문에 반드시 개수와 데이터 타입이 일치해야 한다. 그렇지 않으면 아래와 같은 오류가 발생한다. Q..
[JSP|Oracle] 쿼리에 로직을 담아야 하나? 코드(서비스)에 로직을 담아야 하나?
·
[DB]/- Oracle
[서론]쿼리를 짜다보면 이 로직을 쿼리에 담아야 할지, 코드(서비스)에 담아야 할지 고민되는 순간이 있다. 예를 들면 '조회된 데이터 중 null인 데이터에 대한 처리'가 필요한 경우가 있다. 쿼리에서 처리하는 것도, 코드에서 처리하는 것도 모두 가능하고 공부하는 환경에서는 큰 차이를 느낄 수도 없기 때문이다. 이 의문에 대한 답은 "그때그때 상황에 따라 적절히 사용해야 한다"라고 말할 수 있다. 아니 사실은 코드에서 더 많은 처리가 이뤄지는 편이긴 하다. 이에 대한 궁금증을 가진 사람들의 글은 어렵지 않게 찾아볼 수 있다. 아래 첨부된 사이트만 보더라도 이 의문에 대한 답변을 얻을 수 있다. OKKY에는 은둔 고수들이 정말 많다... 서비스 로직 위주 vs 쿼리 위주 | OKKY Q&A스프링 위주로 공..
[Oracle] JOIN할 때 조건을 ON 절에 적는 것과 WHERE 절에 적는 것의 차이
·
[DB]/- Oracle
JOIN할 때 조건을 ON 절에 적는 것과 WHERE 절에 적는 것에 어떤 차이가 있는지 궁금해졌다. 결론부터 말하자면 INNER JOIN에서는 차이가 없고, OUTER JOIN에서는 차이가 발생한다. INNER JOIN에서 ON 절에 적는 조건은 의미적으로 JOIN 조건을 뜻하고, WHERE 절에는 JOIN 조건이 아닌 조회할 데이터에 대한 조건을 뜻한다.오라클에서 기본으로 제공하는 EMPLOYEES 테이블과 DEPARTMENTS 테이블을 JOIN 해보도록 하겠다. DEPARTMENTS 테이블의 PRIMARY KEY인 DEPARTMENT_ID는 EMPLOYEES 테이블의 FOREIGN KEY이다.1. INNER JOIN부서 번호(department_id)가 90번인 직원들의 직원 번호, 이름, 매니저 ..
[Oracle] 트랜잭션 Lock, 테이블 Lock [TX, TM / Exclusive Mode와 Share Mode의 차이]
·
[DB]/- Oracle
포스팅을 시작하기에 앞서 Lock을 다루기 위해서는 2개의 세션이 필요하다. 나는 SQL Developer과 sqlplus를 사용하였다. 내가 사용하는 계정은 학습용으로 만든 ORCLSTUDY이다. 이 두 세션 ID(SID)를 잘 구분하길 바란다.SELECT sid, username, program FROM v$session WHERE username='ORCLSTUDY';또 사용할 test 테이블은 다음과 같은 구조를 가지고 있다.CREATE TABLE test ( id NUMBER PRIMARY KEY, name VARCHAR2(50));INSERT INTO test VALUES(1, '홍길동');INSERT INTO test VALUES(2, '김개똥');INSERT INTO test V..
[Oracle] GROUP BY와 DISTINCT의 차이
·
[DB]/- Oracle
Oracle DB에서 GROUP BY와 DISTINCT는 같은 결과를 반환한다. 개념적으로 봤을때 GROUP BY는 값을 그룹핑하여 그룹별 데이터를 조회하는 것이고, DISTINCT는 중복된 값이 여러개 있을 때 1개씩만 나오도록 조회하는 것이다. 이 둘의 예제는 다음과 같다. 오라클의 기본 테이블을 기준으로 하는데 만약 기본 테이블 사용법을 모른다면 아래 포스팅을 참고하길 바란다. [Oracle] employees, departments 등의 기본 제공 테이블 사용 방법** Oracle 11g를 기준으로 작성되었습니다. **1. HR 계정이란?오라클에는 기본 제공 테이블이 존재한다. 이것들을 사용하여 다양한 실습을 해볼 수 있는데, 이는 HR 계정으로 접속해야 사용할 수 있다.semin1127.tist..
[Oracle] employees, departments 등의 기본 제공 테이블 사용 방법
·
[DB]/- Oracle
** Oracle 11g를 기준으로 작성되었습니다. **1. HR 계정이란?오라클에는 기본 제공 테이블이 존재한다. 이것들을 사용하여 다양한 실습을 해볼 수 있는데, 이는 HR 계정으로 접속해야 사용할 수 있다. HR 계정 역시 Oracle DB를 설치하면 기본으로 제공되는 계정이다. 2. 사용 방법2-1. HR 계정의 잠금 해제먼저 HR 계정의 잠금을 해제하는 것이 필요하다. sqlplus를 통해 관리자 계정으로 접속한다. Enter password: 에서 아무것도 입력하지 않고 그냥 엔터를 누르면 된다.sqlplus sys as sysdba 접속한 뒤에는 아래 쿼리를 입력해준다.ALTER USER hr ACCOUNT UNLOCK;2-2. HR 계정의 비밀번호 설정다음으로 HR 계정의 비밀번호를 설정해..
[Oracle] 시퀀스(Sequence)란? (feat. auto_increment)
·
[DB]/- Oracle
1. 시퀀스(Sequence)란?ID와 같이 단순 1씩 증가하는 값을 저장할 때 MySQL에서는 auto_increment 옵션을 사용할 수 있지만, Oracle에는 아쉽게도 이 옵션이 존재하지 않는다. 이럴때 대신 사용할 수 있는 것이 시퀀스다. 시퀀스를 통해 특정 값에서 시작하여 일정한 값으로 증가 또는 감소하는 값을 사용할 수 있다. 1-1. 시퀀스 생성 방법CREATE SEQUENCE 스키마명{사용자명}.시퀀스명 INCREMENT BY {a} -- a씩 증가 (a가 음수라면 감소) START WITH {b} -- b에서부터 시작 MINVALUE {c} -- 최솟값 c (단, c는 b보다 클 수 없음) MAXVALUE {d} -- 최댓값 d (단, d는..
[Oracle] 페이징 쿼리(Paging Query) 구현하는 3가지 방법
·
[DB]/- Oracle
1. 페이징 쿼리(Paging Query)란?DB에서 데이터를 가져올 때 사용되지 않을 데이터는 굳이 가져올 필요도 없고, 가져와서도 안된다. 예를 들어 게시판 사이트의 경우 현재 보고있는 페이지 번호, 한 페이지당 표시할 게시글의 수를 설정할 수 있는데, 만약 한 페이지당 10개의 게시글을 보인다고 하면 전체 데이터가 아닌 10개의 데이터만 가져오면 되는 것이다. 이처럼 페이지를 구분하여 필요한 데이터만 가져오는 쿼리를 페이징 쿼리라고 한다. 2. 구현 방법2-1. OFFSET ~ ROWS FETCH NEXT ~ ROWS ONLY이는 Oracle 12c 버전에 등장한 것으로 그 이하 버전에서는 사용할 수 없다. 적는 순서는 ORDER BY절 아래이며, 전체적인 구조는 다음과 같다.SELECT *FROM..
[Oracle] NVL, NVL2 함수
·
[DB]/- Oracle
Oracle DB에서 컬럼 값이 NULL인 경우에 대한 처리를 위해 NVL, NVL2 함수를 사용할 수 있다. NVL은 Null Value의 약자다.1. NVLNVL 함수는 컬럼 값이 NULL인 경우에 대한 값을 설정할 수 있는 함수다. 기본 형태는 다음과 같다.SELECT NVL({컬럼}, {null인 경우 출력할 값}) FROM ...SELECT NVL(null, 'null입니다') FRON dual2. NVL2NVL2 함수는 컬럼 값이 NULL이 아닌 경우에 대한 값도 설정할 수 있는 함수다. 삼항 연산자라고 생각하면 된다. 기본 형태는 다음과 같다.SELECT NVL2({컬럼}, {null이 아닐 경우 출력할 값}, {null일 경우 출력할 값}) FROM ...SELECT NVL2(null, '..