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

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. 20. 14:57 DB/오라클 SQL 명령어

예제 테이블


CREATE TABLE TEST(

A VARCHAR2(10),

B VARCHAR2(10)

);


INSERT INTO TEST VALUES ('2','516958');

INSERT INTO TEST VALUES ('1','123458');

INSERT INTO TEST VALUES ('1','123458');

INSERT INTO TEST VALUES ('1','458512');

INSERT INTO TEST VALUES ('2','468521');

INSERT INTO TEST VALUES ('2','735196');

INSERT INTO TEST VALUES ('1','794528');




RANK() 함수와 ROW_NUMBER() 함수 정의


RANK() 정의

RANK() 함수는 레코드 단위로 순차적으로 순위 (1부터 출력)를 부여하고 

레코드 단위로 같은 값에 대해서는 동일한 순위를 부여한다.

PARTIRION BY 를 사용하면 전체를 한 그룹으로 보는것이 아니라 PARTITION  BY 에 사용된

컬럼을 지준으로 다르게 그룹을 나누어 순위를 부여한다.

오라클 8i 부터 지원하는 분석함수


공동순위가 있으므로 순위에 비는 숫자가 생깁니다.

중복 값을 허용 하면서 비는 숫자를 없애려면

DENSE_RANK() 사용하면 된다.


RANK() 사용 예제


SELECT A, B, RANK() OVER(ORDER BY A, B) 순위 FROM TEST;

전체

A           B         순위

1     123458      1

1   123458      1

1   458512      3

1   794528      4

2   468521      5

2   516958      6

2   735196      7




SELECT A, B, RANK() OVER(PARTITION BY A ORDER BY A, B) 순위 FROM TEST;

PARTITION BY  적용  A 컬럼을 기준으로 그룹을 나눔

A           B         순위

1   123458      1

1   123458      1

1   458512      3

1   794528      4

2   468521      1

2   516958      2

2   735196      3




ROW_NUMBER() 정의

ROW_NUMBER() 는 레코드 단위로 동일한 값이라도 매번 새로운  순위를 부여한다.

ROW_NUMBER() 함수는 각 PARTITION 내에서 ORDER BY 절에 의해 

정렬된 순서로 유일한 값을 돌려주는 함수이면 ROWNUM 과는 관계가 없습니다.

오라클 8i 부터 지원하는 분석 함수


중복 순위가 없고 모든 값은 유일값을 가지게 된다.


SELECT A, B, ROW_NUMBER () OVER (ORDER BY A, B) 순번 FROM TEST;

전체

A           B         순번

1   123458     1

1   123458     2

1   458512     3

1   794528     4

2   468521     5

2   516958     6

2   735196     7




SELECT A, B, ROW_NUMBER() OVER(PARTITION BY A ORDER BY A, B) 순번 FROM TEST;

PARTITION BY  적용  A 컬럼을 기준으로 그룹을 나눔

A           B         순번

1   123458     1

1   123458     2

1   458512     3

1   794528     4

2   468521     1

2   516958     2

2   735196     3




NTILE () 정의

NTILE 함수는 쿼리의 결과를 N개의 그룹으로 분류하는 기능을 제공


SELECT A, B,

NTILE(2) OVER (ORDER BY A) 그룹1,

NTILE(3) OVER (ORDER BY A) 그룹2,

NTILE(5) OVER (ORDER BY A) 그룹3

FROM TEST;

결과 값 : 

A

그룹1 

그룹2 

그룹3 

1

794528

1

1

1

123458

1

1

1

458512

1

2

1

123458

2

2

2

735196

2

3

2

516958

3

4

2

468521

3

5




* OVER() 함수는 필수 입니다.

* OVER() 함수안의 PARTITION BY 는 미필수 이지만 ORDER BY는 필수 이다.

* PARTITION BY 를 사용하면 출력결과를 하나의 그룹으로 보는것이 아니라

PARTITION BY 에 사용된 컬럼을 기준으로 그룹을 나누어지게 된다.

(순위도 그룹별로 별개로 1부터 부여된다.)



ROW_NUMBER() 응용 예제


A, B 그룹별 A, B 의 출력을 상위 2개만 출력하기


SELECT A, B FROM(

SELECT A, B, ROW_NUMBER() OVER (PARTITION BY A ORDER BY B) 전체 FROM TEST) 

WHERE 전체 <= 2;

결과 값 :

A        B

1 123458

1 123458

2 468521

2 516958




SELECT A, B FROM (

SELECT A, B, ROW_NUMBER() OVER (PARTITION BY A ORDER BY A, B) "중복 제외"

FROM TEST GROUP BY A, B) WHERE "중복 제외" <= 2;

결과 값 :

A        B

1 123458

1 458512

2 468521

2 516958




ROW_NUMBER  응용예제 2

직업별로 급여 합계를 계산해서 급여 합계가 많은 순으로 가장 많은 직업 3개만 출력하기


ROW_NUMBER 사용 안할시

SELECT JOB, "급여 합계" FROM 

(

SELECT JOB, SUM(SAL) "급여 합계" FROM EMP

GROUP BY JOB

ORDER BY "급여 합계" DESC

WHERE ROWNUM < 4;


ROW_NUMBER  사용


SELECT JOB, "급여 합계" FROM

(

SELECT JOB, SUM(SAL) "급여 합계", 

ROW_NUMBER() OVER (ORDER BY SUM(SAL) DESC) NUM

FROM EMP

GROUP BY JOB

)

WHERE NUM < 4;


결과 값 : 

    JOB          결과 합계

MANAGER        8275

ANALYST        6000

SALESMAN        5600




PARTITION BY

PARTITION BY는 select한 결과를 특정 column을 기준으로 나누는 역할을 한다. 여기서는 userid를 기준으로 partition을 나눴다. 그리고 나뉜 partition은 score column을 기준으로 내림차순으로 정렬을 하고, 정렬된 내용을 RANK() OVER를 통해 순서를 매긴다. 마지막으로 한 번 더 select하여 상위 3개를 가져온다






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

오라클 PK 제약조건 만들기  (0) 2015.03.19
오라클 DDL 정의  (0) 2015.03.19
오라클 AUTO_INCREMENT (인서트 자동증가)  (0) 2015.03.19
날짜 명령어 사용 예  (0) 2015.03.16
날짜관련 명령어  (0) 2015.03.16
posted by 가야금마스터
2015. 3. 19. 15:43 DB/오라클 SQL 명령어

테스트 환경


CREATE TABLE STUDENT (

"SID" NUMBER,

"NAME" VARCHAR2(32),

"EMAIL" VARCHAR2(32)

);


INSERT INTO STUDENT VALUES (582812, '한놈', 'a@a.a');

INSERT INTO STUDENT VALUES (582812, '한놈', 'hannom@example.com');

INSERT INTO STUDENT VALUES (582812, '한놈', 'b@b.b');

INSERT INTO STUDENT VALUES (241234, '두식이', 'dusigi@example.com');

INSERT INTO STUDENT VALUES (241234, '두식이', '');

INSERT INTO STUDENT VALUES (372342, '석삼', 'seoksam@example.com');




문제 상황


기본키가 없는 테이블 STUDENT 에서 SID 를 기본키로 하고 싶다.


ALTER TABLE STUDENT ADD CONSTRAINT SID_PK PRIMARY KEY (SID);

SQL 오류: ORA-02437: (SCOTT.SID_PK)을 검증할 수 없습니다 - 잘못된 기본 키입니다.




중복값 확인


SELECT * 

FROM (SELECT SID, COUNT(SID) CNT FROM STUDENT GROUP BY SID)

A WHERE CNT >1;


  SID       CNT

582812      3

241234      2


* SID 에 중복 값이 있다.




중복값 제거


방법 1) 최근 것을 남김

SID 별 입력 역순 조회


SELECT ROWID, 

RANK() OVER(PARTITION BY SID ORDER BY ROWID DESC) RNK,

STUDENT.* 

FROM STUDENT;

 

      ROWID                RNK      SID       NAME           EMAIL

AAASSdAAEAAAAKtAAE 1 241234 두식이 NULL

AAASSdAAEAAAAKtAAD 2 241234 두식이 dusigi@example.com

AAASSdAAEAAAAKtAAF 1 372342 석삼         seoksam@example.com

AAASSdAAEAAAAKtAAC 1 582812 한놈        b@b.b

AAASSdAAEAAAAKtAAB 2 582812 한놈        hannom@example.com

AAASSdAAEAAAAKtAAA 3 582812 한놈        a@a.a


RNK 가 2이상인 것듯을 삭제할 것이다.




삭제 대상 확인


SELECT * FROM STUDENT

WHERE ROWID IN 

(SELECT ROWID FROM(SELECT ROWID, 

  RANK() OVER (PARTITION BY SID ORDER BY ROWID DESC)RNK, 

  STUDENT.* FROM STUDENT)

  WHERE RNK > 1);


   SID      NAME            EMAIL

241234 두식이 dusigi@example.com

582812 한놈      hannom@example.com

582812 한놈       a@a.a




삭제 후 결과 확인


DELETE FROM STUDENT

WHERE ROWID IN 

(SELECT ROWID FROM(SELECT ROWID, 

  RANK() OVER(PARTITION BY SID ORDER BY ROWID DESC) RNK,

  STUDENT.* FROM STUDENT)

  WHERE RNK > 1);

* 3개행이 삭제 되었습니다.


SELECT * FROM STUDENT;


  SID       NAME         EMAIL

582812 한놈       b@b.b

241234 두식이      NULL

372342 석삼       seoksam@example.com




방법2) 잘  입력된 것을 남김

EMAIL 이 잘 입력된 순으로 조회


SELECT ROWID,

RANK() OVER(PARTITION BY SID ORDER BY LENGTH(EMAIL) DESC NULLS LAST,

ROWID DESC) RNK, STUDENT.* FROM STUDENT;


      ROWID                RNK      SID       NAME           EMAIL

AAASSfAAEAAAAK1AAD 1 241234 두식이 dusigi@example.com

AAASSfAAEAAAAK1AAE 2 241234 두식이 NULL

AAASSfAAEAAAAK1AAF 1 372342 석삼    seoksam@example.com

AAASSfAAEAAAAK1AAB 1 582812 한놈       hannom@example.com

AAASSfAAEAAAAK1AAC 2 582812 한놈       b@b.b

AAASSfAAEAAAAK1AAA 3 582812 한놈       a@a.a

RNK 가 2이상인 것들을 삭제할 것이다.




삭제 대상 확인

SELECT * FROM STUDENT

WHERE ROWID IN (SELECT ROWID FROM(SELECT ROWID,

  RANK() OVER(PARTITION BY SID ORDER BY LENGTH(EMAIL) DESC NULLS LAST,

  ROWID DESC) RNK, STUDENT.* FROM STUDENT)

  WHERE RNK > 1);


  SID       NAME       EMAIL

582812 한놈        a@a.a

241234 두식이      NULL

582812 한놈        b@b.b




삭제 후 결과 확인


DELETE FROM STUDENT

WHERE ROWID IN (SELECT ROWID FROM(SELECT ROWID,

  RANK() OVER(PARTITION BY SID ORDER BY LENGTH(EMAIL) DESC NULLS LAST,

  ROWID DESC) RNK, STUDENT.* FROM STUDENT)

  WHERE RNK >1 );

*3개 행이 삭제 되었습니다.


SELECT * FROM STUDENT;


  SID       NAME         EMAIL

582812 한놈    hannom@example.com

241234 두식이 dusigi@example.com

372342 석삼       seoksam@example.com




PK 제약조건 생성 테스트

이제 중복값이 없어 아래 SQL 문을 오류없이 실행할수 있다.

ALTER TABLE STUDENT ADD CONSTRAINT SID_PK PRIMARY KEY (SID);

* table STUDENT이(가) 변경되었습니다.




출처 : http://zetawiki.com/






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

오라클 분석함수 -- 순위함수  (0) 2015.03.20
오라클 DDL 정의  (0) 2015.03.19
오라클 AUTO_INCREMENT (인서트 자동증가)  (0) 2015.03.19
날짜 명령어 사용 예  (0) 2015.03.16
날짜관련 명령어  (0) 2015.03.16
posted by 가야금마스터
2015. 3. 19. 15:40 DB/오라클 SQL 명령어

DDL (Data Definition Language) : 데이터와 그 구조 정의 = 테이터 정의어

TABLE 정의


행과 열로 구성된 기본적인 저장매체의 단위


TABLE CREATE 주의사항


1. 테이블 이름을 지정하고 각 컬럼들은 괄호 ( ) 로 묶어 지정합니다.

2. 컬럼뒤에 데이터 타입은 꼭 지정되어야 합니다.

3. 각 컬럼들은 콤마  , 로 구분되고, 항상 끝은 세미콜론 ; 으로 끝납니다.

4. 한 테이블 안에서 컬럼이름은 같을 수  없을며 다른 테이블에서의 컬럼 이름과는 같을수 있습니다.

5. 테이블명을 쌍따옴표 " " 로 감싸지 않으면 기본적으로 대문자로 생성되며 

감싸면 입력한 그대로 생성이 된다.


TABLE CREATE 특이사항


1. 오라클에서는 테이블 생성시 컬럼을 1000개까지 생성이 가능하다.

2. 오라클에서는 테이블 생성 후 커밋 커리된다.


TABLE CREATE 명령


CHECK 제약 조건 : 컬럼에 입력되는 값을 체크함


컬럼 CHAR(1) CHECK (컬럼 = '0' OR 컬럼 = '1') ;

-- 데이터 삽입시 값을 체크해서 거짓이면 에러 발생


예제1)

CREATE TABLE TEST1

(AA CHAR(1) CHECK (AA = '0' OR AA = '1'));

-- 테이블 생성후 AA 컬럼에 문자열 2를 입력하면 에러 발생


예제2)

A CHAR(13) CHECK (컬럼 LIKE '____-__-__')

-- A 컬럼에 'YYYY-MM-DD' 형식으로만 입력가능


DEFAULT 제약조건 : 컬럼에 값이 입력 안될떄 자동으로 입력되는 값


예제1)

CREATE TABLE TEST3

(

A DATE DEFAULT SYSDATE,

B CHAR(10)

);


COMMIT;

INSERT INTO TEST3 (B) VALUES ('A') --날짜, A 입력됨

INSERT INTO TEST3 (A, B) VALUES (NULL, 'A') -- NULL 값, A 입력됨

INSERT INTO TEST3 (A, B) VALUES ('', 'A') -- NULL값, A 입력됨


TABLE CREATE EXAMPLE


예제1) PRIMARY KEY 생성 하지 않을시


CREATE TABLE A(

ID NUMBER(10),

NAME VARCHAR2(30)

);


예제2) PRIMARY KEY 생성 


CREATE TABLE B(

ID NUMBER(10) CONSTRAINT B_ID PRIMARY KEY,

NAME VARCHAR(30)

);

-- CONSTRAINT 이용해서 PRIMARY KEY 이름을 정할수 있다.

이름을 임으로 정하고 싶다면 적지 않아도 된다.


예제3) 제약 조건을 이용하지 않고 PRIMARY KEY 생성


CREATE TABLE C(

ID NUMBER(10),

NAME VARCHAR(30),

CONSTRAINT C_ID PRIMARY KEY (ID)

);




TABLE COPY


같은 계정에서의 TABLE COPY

TABLE A 가 있고 TABLE  B 를 생성하면서 복사하는 방법, 

하지만 제약조건(PRIMARY KEY, UNIQUE) 등은 별도로 해줘야 한다.

CREATE TABLE B AS SELECT * FROM A;

* B TABLE 을 만든 후 A TABLE 의 모든 데이터를 B TABLE 에 입력한다.


같은 서버에서 다른 계정으로 TABLE COPY (SYSTEM 계정에서 실행해야 한다.)

제약조건(PRIMARY KEYUNIQUE) 등은 별도로 해줘야 한다.

CREATE TABLE SCOTT.B AS SELECT * FROM SC.A;








posted by 가야금마스터
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. 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 가야금마스터
2015. 3. 16. 13:34 DB/오라클 SQL 명령어

Outer Join 이란?

- Equi Join은 조인을 생성하려는 두 개의 테이블의 한쪽 컬럼에서 값이 없다면 테이터를 반환하지 못한다.

- 동일 조건에서 조인 조건을 만족하는 값이 없는 행들을 조회하기 위해 Outer Join을 사용 한다.

- Outer Join 연산자는 "(+)" 이다.

- 조인시 값이 없는 조인측에 "(+)"를 위치 시킨다.

- Outer Join 연산자는 표현식의 한 편에만 올 수 있다.

Outer Join 예제

Equi Join과 Outer Join의 비교.


-- Equi Join 으로 부서 번호를 조회하는 예제

SELECT DISTINCT(e.deptno), d.deptno, d.dname

  FROM emp e, dept d

 WHERE e.deptno = d.deptno;

 DEPTNO     DEPTNO

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

    10         10

    20         20

    30         30

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

-- Outer Join 으로 부서 번호를 조회하는 예제

SELECT DISTINCT(e.deptno), d.deptno

  FROM emp e, dept d

 WHERE e.deptno(+) = d.deptno;

 

DEPTNO  DEPTNO

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

     10       10

     20       20

     30       30

              40

Outer Join을 사용하는 테이블에 추가로 조건절이 있다면 (+)연산자를 모두 해야 한다.


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


-- ename LIKE 조건절에 (+)연산자가 누락된 경우

SELECT DISTINCT(a.deptno), b.deptno

  FROM emp a, dept b

 WHERE a.deptno(+) = b.deptno

   AND a.ename LIKE '%';

 

DEPTNO     DEPTNO

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

        10         10

        20         20

        30         30


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


-- ename LIKE 조건절에 (+)연산자를 추가해야 정상적으로 데이터가 조회 된다. 

SELECT DISTINCT(a.deptno), b.deptno

  FROM emp a, dept b

 WHERE a.deptno(+) = b.deptno

   AND a.ename(+) LIKE '%';

 

DEPTNO  DEPTNO

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

     10       10

     20       20

     30       30

              40


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



LEFT, RIGHT, FULL Outer Join

Oracle9i 부터는 ANSI/ISO SQL 표준인 LEFT OUTER JOIN , RIGHT OUTER JOIN, FULL OUTER JOIN를 지원 한다.


LEFT OUTER JOIN

LEFT OUTERL JOIN은 오른쪽 테이블(아래 예제에서 emp테이블)에 조인시킬 컬럼의 값이 없는 경우 사용한다.



-- LEFT OUTER JOIN 조인 예제

SELECT DISTINCT(e.deptno), d.deptno

  FROM dept d 

  LEFT OUTER JOIN emp e

  ON d.deptno = e.deptno;  

RIGHT OUTER JOIN

RIGHT OUTERL JOIN은 왼쪽 테이블(아래 예제에서 emp테이블)에 조인시킬 컬럼의 값이 없는 경우 사용한다.


DEPTNO  DEPTNO

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

     10       10

     20       20

     30       30

              40


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


-- RIGHT OUTER JOIN 조인 예제

SELECT DISTINCT(e.deptno), d.deptno

  FROM emp e 

 RIGHT OUTER JOIN dept d

    ON e.deptno = d.deptno;

FULL OUTER JOIN

FULL OUTERL JOIN은 양쪽 테이블 모두 Outer Join걸어야 하는 경우 사용 한다.


DEPTNO  DEPTNO

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

     10       10

     20       20

     30       30

              40

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


-- FULL OUTER JOIN 조인 예제

SELECT DISTINCT(e.deptno), d.deptno

  FROM emp e 

  FULL OUTER JOIN dept d

    ON e.deptno = d.deptno;


DEPTNO  DEPTNO

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

     10       10

     20       20

     30       30

              40


출처 : 구루비

'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
Decode & Case  (0) 2015.03.16
posted by 가야금마스터
prev 1 next