블로그 이미지
가야금마스터

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

Tag

2015. 3. 19. 11:47 DB/오라클 SQL 명령어

My SQL과 다르게 오라클에서는 Auto_Increment 명령어가 없다

그러므로 이 기능을 사용하기 위해서는 시퀀스를 생성해야한다.


Auto_Increment(인서트 자동증가) 시퀀스


CREATE SEQUENCE AAA START WITH 1 INCREMENT BY 1 MAXVALUE 100 CYCLE NOCACHE;

 밑줄 그어진 부분은 시퀀스 명이니 자유롭게 사용해도 된다.


사용방법

CREATE TABLE A (

id number(10),

name VARCHAR2(200)

);

라는 테이블을 만들었고 

이 테이블의 id라는 컬럼이 인서트가 될떄마다 자동 증가 되게 하고 싶다면


INSERT INTO board(id, name) values(AAA.NEXTVAL, 'aaa');

INSERT INTO board(id, name) values(AAA.NEXTVAL, 'bbb');


INSERT 문을 이렇게 구성하면 된다.


* 주의사항 :  시퀀스를 사용할 테이블은 시퀀스 보다 먼저 생성되어 있어야한다.

(시퀀스 생성 후의 시퀀스 사용 테이블을 생성하면 INSERT 시 카운트가 2부터 잡히는 경우가 발생)


초기화 방법


1) 시퀀스의 현재값

SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'AAA';

결과값 : 7


2) 시퀀스의 INCREMENT 를 현재 값만큼 빼도록 설정 (시퀀스의 맥스 값 을 만들어 줘야한다.)

(최대값이 100일 경우 현재 값이 7이 라면 -7을 하여 최대값으로 바꿔준다)

ALTER SEQUENCE AAA INCREMENT BY -7;


3) 시퀀스에서 다음 값을 가져 온다

SELECT AAA.NEXTVAL FROM DUAL;

결과값 : 100


4) 시퀀스 INCREMENT 값을 1로 설정한다.

ALTER SEQUENCE AAA INCREMENT BY 1;


'DB > 오라클 SQL 명령어' 카테고리의 다른 글

오라클 PK 제약조건 만들기  (0) 2015.03.19
오라클 DDL 정의  (0) 2015.03.19
날짜 명령어 사용 예  (0) 2015.03.16
날짜관련 명령어  (0) 2015.03.16
NULL 치환 법 ( NVL & NVL2 ) OR DECODE  (0) 2015.03.16
posted by 가야금마스터
2015. 3. 18. 17:41 카테고리 없음

마이그레이션이란


프로그램이나 데이터의 이행, 변환 작업

* OS, 플랫폼 등의 새로운 환경으로 시스템을 이행하는 작업.


예) UNIX 환경의 시스템을 WINDOWS 환경으로 

posted by 가야금마스터
2015. 3. 17. 17:46 DB/DB용어
트랜잭션 (TRANSACTION)

데이터베이스 내에서 한꺼번에 수행되어야할 일련의 연산들 입니다.
간단하게 말하자면 전부 되거나~~ 전부 안되거나~~

트랙잭션 의 모든 연산은 반드시 한꺼번에 완료가 되야 하며
 그렇지 않은경우에는 한꺼번에 취소되어야 하는 원자성을 가지고 있습니다

한꺼번에 완료가 된경우에는 성공적인 종료 COMMIT 

이 경우에는 작업결과는 데이터베이스에 반영이 되게 됩니다.

취소가 된경우에는 비정상적인 종료 ROLLBACK 

이 경우에 작업결과는 모두 취소되게 되어 데이터베이스에 영향을 미치지 않게 됩니다. 



이 트랙잭션에 성질들을 보게되면 

1. 원자성(Atomicity)

분리 할수 없는 하나의 단위로 작업은 모두 완료되거나 모두 취소 되어야 합니다.

2. 일관성(Consistency)

- 사용되는 모든 데이터는 일관되어야 합니다.

3. 격리성(Isolation)

 - 접근하고 있는 데이터는 다른 트랜잭션으로 부터 격리 되어야 합니다.

트랜잭션이 진행되기전과 완료된 후에 상태를 볼수 있지만

트랜잭션이 진행되는 중간 데이터는 볼수 없습니다.

4. 영속성(Durability)

- 트랙잭션이 정상 종료되면 그 결과는 시스템에 영구적으로 적용되어야 합니다.

5. 순차성(Sequentiality)

- 데이터를 다시 로드하고 트랜잭션을 재생하여 원래 트랜잭션이 수행된 후의 상태로

 데이터를 되돌리는 것을 말합니다.


트랙잭션의 예를 하나 들어 이해를 해볼게요ㅎㅎ


저는 카드하나를 들고서 은행 인출기 앞으로 갑니다.

처음에     카드를 넣습니다

두번째로     어떤거래를 할지 선택을하고

세번째로     비밀번호를 눌러 인증을 받고

네번째로     거래를 완료 하겠죠

이 네가지 과정을 묶어서 트랜잭션이라고 합니다.


거래까지 완료됬으면 COMMIT 

중간에 비밀번호를 틀리거나.. 인증을 받았는데 거래를 취소하거나 하는 일이

 발생해서 처음으로 돌아갈경우에는 ROLLBACK 이라고 합니다.




출처 : http://121202.tistory.com/17


'DB > DB용어' 카테고리의 다른 글

DB 기본 용어 (SQL, DDL, DML, DCL, TCL)  (1) 2015.03.17
posted by 가야금마스터
2015. 3. 17. 17:42 DB/DB용어

SQL

SQL (Structured Query Language) 은 구조적인 질의 언어라는 것이다.

이 SQL 이라는 질의 언어를 통해서 데이터베이스를 제어, 관리한다.


SQL 은 다음 언어로 나눌 수 있다.


⒜ DDL : 데이터 정의 언어 

⒝ DML : 데이터 조작 언어

⒞ DCL : 데이터 제어 언어


DDL

DDL (Data Definition Language) 는 데이터 베이스 스키마를 정의 하거나 조작하기 위해 사용한다.

SCHEMA, DOMAIN, TABLE, VIEW, INDEX 를 다음 명령어로 정의, 변경, 삭제한다.


⒜ CREATE : 정의 

⒝ ALTER: 수정

⒞ DROP : 삭제

⒟ TRUNCATE : DROP 후 CREATE


* Oracle 11g 이전 버전과 MySQL은 DDL에 대해서 트랜잭션을 지원하지 않는다.

(Rollback 할 수 없고 Commit할 필요도 없다.)


DML

DML (Data Manipulation Language) 는 데이터를 조작 (조회, 추가, 변경, 삭제) 하기 위해 사용한다.

사용자가 응용 프로그램과 데이터 베이스 사이에 실질적인 데이터 처리를 위해서 주로 사용한다.


SELECT : 조회

⒝ INSERT : 추가

⒞ DELETE : 삭제

⒟ UPDATE : 변경


기본적인 위의 명령어 외에 LOCK, EXPLAIN, CALL 등도 DML에 포함 된다.


DQL

일부에서는 DML에서 SELECT 만을 따로 분리해서 DQL (Data Query Language) 나 

간단히 QUERY 로 표현하기도 한다.


DCL

DCL (Data Control Language) 는 데이터를 제어하는 언어이다.

데이터의 보안, 무결성, 회복, 병행 수행제어 등을 정의하는데 사용한다.


⒜ COMMIT : 트랜잭션의 작업 결과를 반영 

⒝ ROLLBACK : 트랜잭션의 작업을 취소 및 원래대로 복구

⒞ GRANT : 사용자에게 권한 부여

⒟ REVOKE : 사용자 권한 취소


TCL

일부에서는 DCL 에서 트랜잭션을 제어하는 명령인 COMMIT 과 ROLLBACK 만을 따로 분리해서 TCL (Transaction Control Language) 라고 표현하기도 한다.

'DB > DB용어' 카테고리의 다른 글

트랜잭션(TRANSACTION)  (0) 2015.03.17
posted by 가야금마스터
2015. 3. 17. 10:56 spring



1) Spring Core

 ⒜ 프레임 워크의 가장 기본적인 부분

 ⒝ 컨테이너 기능을 수행하기 위해 의존성 주입 기능을 제공

 ⒞ 스프링의 핵심으로 기능과 스 설정을 분리하기 위한 IOC 기능이 구현된 BeanFactory를 제공한다.

    ① beans : 스프링 컨테이너를 이용해서 객체를 생성하는 기본 기능을 제공한다.  

    ② context : 객체 생성, 라이프 사이클 처리, 스키마 확장 등의 기능을 제공한다.


2) Spring Context

 ⒜ Email, JNDI접근, EJB 연계등과 같은 다수의 엔터프라이즈 서비스 제공

 ⒝ Core 패키지와 마찬가지로 스프링의 기본 기능이다. 이것은 JNDI와 EJB를 비롯한 리소스에 대한 접근 경로를 제공하는 것처럼 스프링 기반에서 구현된 기능 객체(Bean) 들에 대한 접근 방법을 제공한다.


3) Spring DAO

 ⒜ JDBC 에 대한 추상화 계층으로 지루한 JDBC 코딩이나 예외처리를 없애준다 또한 트랜잭션 관리 기능도 제공된다.


4) Spring AOP

 ⒜ AOP 구현 API 제공


5) Spring ORM

 ⒜ 객체/관계 맵핑을 위한 MyBatis, Hibemate, JPA등 과의 통합을 위한 패키지이다. ORM 제품들을 스프링의 기능과 조합해서 사용할 수 있게된다.


6) Spring Web

 ⒜ 일반적인 웹 애플리케이션 개발에 필요한 기본 기능을 제공하고 웹 워크나 스트럿츠와의 통합을 위해 사용되는 패키지이다.


7) Spring MVC 

 ⒜ MVC 구현 API 제공


8) Spring OXM

 ⒜ XML 과 자바 객체 간의 매핑을 처리하기 위한 APO를 제공한다.


9) Spring JMS 

 ⒜ JMS 서버와 메시지를 쉽게 주고 받을 수 있도록 하기 위한 템플릿, 애테이션 등을 제공한다.


10) Spring JDBC

 ⒜ JDBC 프로그래밍을 보다 쉽게 할 수 있는 템플릿을 제공한다.






'spring' 카테고리의 다른 글

maven 에러 Missing artifact com.sun.jdmk:jmxtools:jar:1.2.1  (0) 2015.04.01
Maven pom.xml dependency를 가진 대상의 scope설정  (0) 2015.04.01
Bean 객체 스캔  (0) 2015.03.31
Annotation  (0) 2015.03.31
Spring Framework 특징  (0) 2015.03.17
posted by 가야금마스터
2015. 3. 17. 10:13 spring


1) AOP(기능별 모듈화, 진정한 OOP제공)

 ⒜  컨테이너는 일관성을 유지시켜 주고 투명한 환경 내에서 느슨한 컴포넌트(POJO)의 집합에서 복잡한 시스템을 조립할 수 있는 능력을 제공하여 조직을 해치지 않음

 ⒝ AOP지원을 통해 주요 비즈니스 로직과 시스템 전반에 걸친 기능 모듈을 완벽히 분리해내도록 도와준다.


2) IOC(Inversion of Control : 역제어) 컨테이너

 ⒜ 애플리케이션 객체를 연결해 주고 자동화된 설정 및 집중화된 설정을 제공하는 가장 완전한 경량 컨테이너

 ⒝ 개발자가 직접 객체를 생성을 하지 않고, 객체의 생성에서 소멸까지 컨테이너가 관리.

 ⒞ Dependency Injection 을 통해 객체간의 의존성 주입.

 ⒟ EJB 컨테이너에 비해 가벼운 IOC 컨테이너. (Lightweight 컨테이너)


3) Lightweiht 컨테이너

 ⒜ EJB 컨테이너에 비해 가벼운 IOC 컨테이너.

 ⒝ 컨테이너의 API에 의존적이지 않은 POJO관리.


4) Test Unit (편리한 테스트) 제공

 ⒜ 컨테이너는 민첩함을 제공하고 지렛대 역활을 하며 소프트 웨어 컴포넌트를 먼저 개발하고 고립시켜 테스트할 수 있게 함으로써 테스트와 확장성을 향상시킨다.

 ⒝ 작성괸 코드에 대한 단위 테스트를 쉽게 할 수 있도록 도와준다.


5) 트랜잭션

 ⒜ 트랜잭션 관리를 위한 공통의 추상화된 레이어, 트랜잭션 관리자를 플러그인할 수 있어서 저 수준 트랜잭션을 문제없이 처리한다.

 ⒝ 선언적인 트랜잭션을 지원하여 코드를 수정하지 않고도 트랜잭션을 적용 및 변경 가능하도록 한다.


6) JDBC 추상화 레이어

 ⒜ 중요한 예외 계층을 제공하며 예외처리를 단순화시켜 코드의 양을 덜어준다.


7) ORM 프레임워크 연동 제공

 ⒜ Hibernate, MyBatis, JDO 등과 같은 ORM 프레임워크와 통합되어 있다.


8) 좀더 쉬운 J2EE 개발 지향 (저비용 유연한 코드 유지)

 ⒜ 계층화된 아키텍처를 갖고 있으며, 그 중 어떤 부분도 독립적으로 사용될 수 있도록 모듈화 되어있다.

 ⒝ EJB를 사용하든 하지 않든 관계없이 비즈니스 객체들을 효과적으로 구성하고 관리할 수 있도록 한다.

 ⒞ 컨테이너의 API에 의존적이지 않은 POJO관리.

 ⒟ 자바 이외에 빈쉘, 제이루비, 그루비와 같은 스크립트 언어를 지원한다.

 ⒠ 다른 여러 프레임워크와의 연동을 지원한다.


9) 다양한 프리젠테이션 계층 제공(JSP, Velocity, excel, PDF ...)

 ⒜ 프리젠테이션 계층을 위해 다중 뷰 기술을 지원한다.


10) 좋은 설계(아키텍처) 제공

 ⒜ 서블릿 기반의 MVC 프레임워크를 지원한다.


11) 분산(원격) 서비스

 ⒜ RMI, JAX-RPC 등관 같은 기술을 이용하여 쉽게 원격 서비스 구현이 가능하다.


12) 보안


13) 기타

 ⒜ Timer 클래스나 쿼츠 스케줄링 엔진을 이용하여 JOB 스케줄링을 지원한다.

 ⒝ JavaMail이나 제이슨 헌터의 MailMessage를 이용하여 메일(Email)을 지원한다. 

 ⒞ 다국어를 통한 국제화를 지원한다.



* POJO(Plain Old Java Object)

 특정 인터페이스 또는 클래스를 상속하지 않는 일반 자바 객체를 의미

 cf) Servlet 개체는 HttpServlet 을 반드시 상속, EJB 개체는 SessionBean을 반드시 구현




'spring' 카테고리의 다른 글

maven 에러 Missing artifact com.sun.jdmk:jmxtools:jar:1.2.1  (0) 2015.04.01
Maven pom.xml dependency를 가진 대상의 scope설정  (0) 2015.04.01
Bean 객체 스캔  (0) 2015.03.31
Annotation  (0) 2015.03.31
Spring Framework 모듈  (0) 2015.03.17
posted by 가야금마스터
2015. 3. 16. 15:27 DB/오라클 SQL 명령어

-- 해당일의 주차 구하기 (월~일 체계)

SELECT TO_CHAR(SYSDATE,'IW') FROM DUAL; 

 

-- 당월 첫 주 화요일

SELECT NEXT_DAY((TRUNC(SYSDATE,'MM')-1),'화') FROM DUAL;

SELECT NEXT_DAY((TRUNC(SYSDATE,'MM')-1),'화요일') FROM DUAL;

SELECT NEXT_DAY((TRUNC(SYSDATE,'MM')-1),3) FROM DUAL;

 

-- 당월 마지막 날짜

SELECT LAST_DAY(SYSDATE) FROM DUAL;

 

-- 당월의 첫 날 구하기

SELECT TO_CHAR(TRUNC(SYSDATE,'MM'),'YYYYMMDD') FROM DUAL;

 

-- 당월 첫주 날 수

SELECT TO_NUMBER(TO_CHAR(NEXT_DAY((TRUNC(SYSDATE,'MM')-1),1),'DD')) FROM DUAL;

 

-- 전월의 마지막 날 구하기

SELECT TO_CHAR(TRUNC(SYSDATE,'MM')-1,'YYYYMMDD') FROM DUAL;

 

-- 당월 마지막 주 목요일

SELECT NEXT_DAY((LAST_DAY(SYSDATE)-7),'목') FROM DUAL;

SELECT NEXT_DAY((LAST_DAY(SYSDATE)-7),'목요일') FROM DUAL;

SELECT NEXT_DAY((LAST_DAY(SYSDATE)-7),5) FROM DUAL;

 

-- 당월 마지막주 날 수

SELECT LAST_DAY(SYSDATE) - NEXT_DAY((LAST_DAY(SYSDATE)-7),2) + 1 FROM DUAL;


-- 해당일 포함 된 주의 목요일 날짜

SELECT CASE WHEN TO_CHAR(TO_DATE('20100629','YYYYMMDD'), 'D') < 5 THEN TRUNC(TO_DATE('20100629','YYYYMMDD')-5, 'IW')+3

            ELSE TRUNC(TO_DATE('20100629','YYYYMMDD'), 'IW')+3 END RESULT

  FROM DUAL;

 

-- 해당일 포함 된 주가 속한 년 (년말,년초시)

SELECT CASE WHEN LAST_DAY(SYSDATE) - NEXT_DAY((LAST_DAY(SYSDATE)-7),2) + 1 < 4                                              -- 월 마지막 주의 날수가 4일 미만이면서 

                             AND SYSDATE <= LAST_DAY(SYSDATE) AND SYSDATE >= NEXT_DAY((LAST_DAY(SYSDATE)-7),2)   -- 오늘이 월 마지막 주의 일자에 포함되면

                           THEN TO_CHAR(ADD_MONTHS(SYSDATE,1),'YYYY')||TO_CHAR(SYSDATE, 'IW')                                          -- 차월의 월이 속한 년도 + 주차를 취하고

                          WHEN TO_NUMBER(TO_CHAR(NEXT_DAY((TRUNC(SYSDATE,'MM')-1),1),'DD')) < 4                                   -- 월 첫주의 날수가 4일 미만이면서

                             AND SYSDATE <= NEXT_DAY((TRUNC(SYSDATE,'MM')-1),1)                                                                           -- 오늘이 월 첫 주의 일자에 포함되면

                           THEN TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY')||TO_CHAR(SYSDATE, 'IW')                                        -- 전월의 월이 속한 년도 + 주차를 취하고

                             ELSE TO_CHAR(SYSDATE,'YYYY')||TO_CHAR(SYSDATE, 'IW')                                                                           -- 그외는 당월의 월이 속한 년도 + 주차를 취함.

                              END AS YEAR_WEEK_NO

FROM DUAL;

 

-- 요일 구하기 (1=일 ~ 7=토)

SELECT TO_CHAR(SYSDATE, 'D') FROM DUAL;

 

-- 요일 구하기 (한글로 출력)

SELECT TO_CHAR(SYSDATE, 'DY') FROM DUAL; -- 월

SELECT TO_CHAR(SYSDATE, 'DY', 'NLS_DATE_LANGUAGE=KOREAN') FROM DUAL; -- 월

SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL; -- 월요일

 

-- 해당주 목요일 날짜

SELECT TRUNC(SYSDATE, 'IW')+3 FROM DUAL;

 

-- 당월 마지막 날의 요일 구하기 (1=일 ~ 7=토)

SELECT TO_CHAR(LAST_DAY(SYSDATE),'D') FROM DUAL;

 

-- 마지막주 목요일 (1=일 ~ 7=토)

SELECT NEXT_DAY((LAST_DAY(SYSDATE)-7),5) FROM DUAL;

 

-- 마지막주 월요일 (1=일 ~ 7=토) 바로 전 날짜

SELECT NEXT_DAY((LAST_DAY(SYSDATE)-7),2)-1 FROM DUAL;

'DB > 오라클 SQL 명령어' 카테고리의 다른 글

오라클 DDL 정의  (0) 2015.03.19
오라클 AUTO_INCREMENT (인서트 자동증가)  (0) 2015.03.19
날짜관련 명령어  (0) 2015.03.16
NULL 치환 법 ( NVL & NVL2 ) OR DECODE  (0) 2015.03.16
Decode & Case  (0) 2015.03.16
posted by 가야금마스터
2015. 3. 16. 15:05 DB/오라클 SQL 명령어

날짜 관련된 명령어정리 하기


SYSDATE 


현재 날짜를 가져옴


SELECT 

SYSDATE 

FROM DUAL;


=======================================================================


 

형식에 맞춰서 가져오기 


TO_CHAR


DATE 타입의 데이터를 CHAR타입으로 변환


SELECT

TO_CHAR(SYSDATE, 'YYYY-MM-DD') AS 테스트1,

TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') AS 테스트2,

TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS 테스트2,

TO_CHAR(SYSDATE, 'YYYY') 연도,

TO_CHAR(SYSDATE, 'MM') 월,

TO_CHAR(SYSDATE, 'HH24') 시간

FROM DUAL;


시간 출력 HH <<  기본값이 12 시간 단위이니 24 시간 단위가 필요하면 HH24 <<

TO_CHAR 은 문자형으로 변환시키는 함수이므로 날짜에만 국한되지 않는다.



TO_DATE


CHAR 타입의 데이터를 DATE 타입으로 변환


SELECT

TO

TO_DATE(20150316, 'YYYYMMDD')

FROM DUAL;



=======================================================================


 

ADD_MONTHS


 ± 월 데이터를 변환시 사용되는 함수


SELECT

TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'YYYY-MM-DD') AS "한달 전",

TO_CHAR(ADD_MONTHS(SYSDATE, 0), 'YYYY-MM-DD') AS "이번 달",

TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'YYYY-MM-DD') AS "한달 후",

TO_CHAR(ADD_MONTHS(SYSDATE, 12), 'YYYY-MM-DD') AS "1년 후",

TO_CHAR(ADD_MONTHS(SYSDATE, 120), 'YYYY-MM-DD') AS "10년 후"

FROM DUAL;


* 기준이 되는 날짜가 해당 월의 말일이 되는 경우 변환되는 날짜가 말일로 표시 될수 있다.

 예) 8월 31일을 기준으로 잡아서 한달 후를 출력할수 9월 30일이 나온다.



=======================================================================


 

LAST_DAY


날짜 데이터의 마지막 일을 구해서 출력


SELECT

LAST_DAY(SYSDATE) 테스트1,

TO_CHAR(LAST_DAY(SYSDATE), 'YYYY-MM-DD') 테스트2

FROM DUAL;



=======================================================================


 







'DB > 오라클 SQL 명령어' 카테고리의 다른 글

오라클 AUTO_INCREMENT (인서트 자동증가)  (0) 2015.03.19
날짜 명령어 사용 예  (0) 2015.03.16
NULL 치환 법 ( NVL & NVL2 ) OR DECODE  (0) 2015.03.16
Decode & Case  (0) 2015.03.16
Outer Join  (0) 2015.03.16
posted by 가야금마스터
2015. 3. 16. 14:30 DB/오라클 SQL 명령어

NULL 값을 변환하기


NVL(컬럼명, 반환값)

컬럼 값이 NULL 이면 반환값이 나옴

 예)


SELECT

NVL(COMM, 0)

FROM EMP;


COMM 이 NULL 값이면 0을 반환.



NVL2(컬럼명, 반환값1, 반환값2)

컬럼값이 NULL이면 반환값1 아니면 반환값2

 예)


SELECT

NVL2(COMM, 0, 1)

FROM EMP;


COMM이 NULL 값이면 0을 반환 아닐시 1을 반환



DECODE

SELECT

DECODE(COMM, NULL, '널', 300, '삼백', '조건없음')

FROM EMP;


COMM 이 NULL 이면 널 300 이면 삼백 앞의 조건에 속하지 않다면 조건없음이 출력된다.




NULL 처리를 원할시 NVL, NVL2  OR  DECODE 명령어를 이용하여 NULL값을 치환한다.

'DB > 오라클 SQL 명령어' 카테고리의 다른 글

오라클 AUTO_INCREMENT (인서트 자동증가)  (0) 2015.03.19
날짜 명령어 사용 예  (0) 2015.03.16
날짜관련 명령어  (0) 2015.03.16
Decode & Case  (0) 2015.03.16
Outer Join  (0) 2015.03.16
posted by 가야금마스터
2015. 3. 16. 14:12 DB/오라클 SQL 명령어

DECODE

- DECODE 함수는 조건에 따라 데이터를 다른 값이나 컬럼값으로 추출 할 수 있다.

- DECODE(VALUE, IF1, THEN1, IF2, THEN2...) 형태로 사용 할 수 있다.

- VALUE 값이 IF1일 경우에 THEN1 값을 반환하고, VALUE 값이 IF2일 경우에는 THEN2 값을 반환한다.

- DECODE 함수 안에 DECODE함수를 중첩으로 사용 할 수 있다.


아래는 DECODE 함수의 일반적인 예제이다.


-- 부서번호가 10이면 ACCOUNTING, 20이면 RESEARCH, 30이면 SALES

-- 나머지는 OPERATIONS를 출력하는 예제

SELECT deptno, DECODE(deptno, 10 , 'ACCOUNTING' ,

                              20 , 'RESEARCH' ,

                              30 , 'SALES', 'OPERATIONS') name

  FROM dept;

 

DEPTNO NAME

------ ----------

     10 ACCOUNTING

     20 RESEARCH

     30 SALES

     40 OPERATIONS



=======================================================================



아래는 DECODE 함수에서 집계 함수를 사용한 예제이다


-- 10부서는 급여합계를, 20부서는 최대값을, 30부서는 최소값을 출력하는 예제

SELECT deptno, DECODE(deptno, 10 , SUM(sal),

                              20 , MAX(sal),

                              30 , MIN(sal)) sal

  FROM emp

 GROUP BY deptno; 

 

DEPTNO        SAL

--------- --------

       30      950

       20     3000

       10     8750 

DECODE함수는 집계함수와 함께 통계 데이터를 추출할 때 많이 사용한다. 



=======================================================================


 

아래는 부서별로 급여합계를 조회하는 예이다


-- 부서별로 급여 합계를 출력한다. 

SELECT deptno, NVL(SUM(DECODE(deptno, 10, sal)),0) deptno10, 

               NVL(SUM(DECODE(deptno, 20, sal)),0) deptno20,

               NVL(SUM(DECODE(deptno, 30, sal)),0) deptno30,

               NVL(SUM(DECODE(deptno, 40, sal)),0) deptno40

  FROM emp

 GROUP BY deptno; 

 

DEPTNO   DEPTNO10   DEPTNO20   DEPTNO30   DEPTNO40

------- --------- --------- ---------- ----------

     30         0         0       9400          0

     20         0     10875          0          0

     10      8750         0          0          0 



=======================================================================


 

아래 부서별 급여합계 예를 보면 일반적인 집계함수를 사용할 때는 급여 합계가 행으로 조회가 되지만, DECODE와 MAX함수를 사용하면 열로 값을 표시할 수 있다.



-- 부서별로 급여 합계를 행으로 출력한다. 

SELECT d.deptno, NVL(SUM(e.sal),0) sal

  FROM emp e, dept d

 WHERE e.deptno(+) = d.deptno

 GROUP BY d.deptno; 

 

DEPTNO        SAL

-------- ----------

      10       8750

      20      10875

      30       9400

      40          0

 


=======================================================================


 

-- 부서별로 급여 합계를  열로 출력한다. 

SELECT MAX(NVL(SUM(DECODE(deptno, 10, sal)),0)) deptno10, 

       MAX(NVL(SUM(DECODE(deptno, 20, sal)),0)) deptno20,

       MAX(NVL(SUM(DECODE(deptno, 30, sal)),0)) deptno30,

       MAX(NVL(SUM(DECODE(deptno, 40, sal)),0)) deptno40

  FROM emp

 GROUP BY deptno; 

 

DEPTNO10   DEPTNO20   DEPTNO30   DEPTNO40

--------- ---------- ---------- ----------

    8750      10875       9400          0




=======================================================================


 


CASE

- CASE 함수는 DECODE함수가 제공하지 못하는 비교연산의 단점을 해결할 수 있는 함수이다.

- DECODE함수에서 비교연산을 수행하기 위해서는 GREATEST, LEAST등의 함수를 사용해야 하지만, CASE함수에서는 조건 연산자를 모두 사용 할 수 있다.

- CASE함수는 IF.. THEN .. ELSE 구문과 비슷 하다. WHEN절 다음에 여러 조건이 올 수 있다.


위의 DECODE예제를 CASE함수로 변환한 예이다.


--위의  DECODE예제를 CASE함수로 변환한 예이다. 

SELECT deptno, 

       CASE deptno

         WHEN 10 THEN 'ACCOUNTING'

         WHEN 20 THEN 'RESEARCH'

         WHEN 30 THEN 'SALES'

         ELSE 'OPERATIONS'

       END as "Dept Name"

  FROM dept;

 

DEPTNO Dept Name

------- ----------

     10 ACCOUNTING

     20 RESEARCH

     30 SALES

     40 OPERATIONS 



=======================================================================


 


아래는 WHEN절 다음에 연산자가 오는 예제이다.


--급여별로 인상율을 다르게 계산하였다. 

SELECT ename ,

       CASE

          WHEN sal < 1000  THEN sal+(sal*0.8)

          WHEN sal BETWEEN 1000 AND 2000 THEN sal+(sal*0.5)

          WHEN sal BETWEEN 2001 AND 3000 THEN sal+(sal*0.3)

          ELSE sal+(sal*0.1)

       END sal

  FROM emp; 



출처 : 구루비

'DB > 오라클 SQL 명령어' 카테고리의 다른 글

오라클 AUTO_INCREMENT (인서트 자동증가)  (0) 2015.03.19
날짜 명령어 사용 예  (0) 2015.03.16
날짜관련 명령어  (0) 2015.03.16
NULL 치환 법 ( NVL & NVL2 ) OR DECODE  (0) 2015.03.16
Outer Join  (0) 2015.03.16
posted by 가야금마스터
prev 1 2 3 4 next