SQL문에서 like를 이용한 검색..


오라클 WITH문을 이용해서 테스트  해보겠다..

WITH T AS (

SELECT '324324'    COL1, 'ASDDD' COL2 FROM DUAL UNION ALL

SELECT 'AB234C'    COL1, 'AG_%%D' COL2 FROM DUAL UNION ALL

SELECT 'A3424B'    COL1, 'AS_DFD' COL2 FROM DUAL UNION ALL

SELECT 'AB234C'    COL1, 'AS_DDD' COL2 FROM DUAL UNION ALL

SELECT 'A3211C'    COL1, 'AS_DAZ' COL2 FROM DUAL UNION ALL

SELECT 'AB111C'    COL1, 'AG_D%F' COL2 FROM DUAL

)

SELECT * FROM T

WHERE COL1 LIKE 'AB%'


컬럼 COL1 앞 두문자가 AB인 Row를 검색하는 조건이다..

결과는..  

AB234C AG_%%D

AB234C AS_DDD

AB111C AG_D%F


컬럼 COL1 뒤 문자가 4C로 끝나는 Row를 검색하는 조건

SELECT * FROM T

WHERE COL1 LIKE '%4C'

결과는

AB234C AG_%%D

AB234C AS_DDD


컬럼 COL1 두번째  문자가 B로 끝나는 Row를 검색하는 조건

_ : 는 문자 하나를 의미한다.

SELECT * FROM T

WHERE WHERE COL1 LIKE '_B%'

결과는

AB234C AG_%%D

AB234C AS_DDD

AB111C AG_D%F


그런데 COL2 값같이 %, _ 포함되어 있는 컬럼을 검색해야 한다면..  ESCAPE 문을 써주면 된다.

컬럼 COL2 앞문자가 AG_로 끝나는 Row를 검색하는 조건은

SELECT * FROM T

WHERE COL2 LIKE 'AG\_%' ESCAPE '\'

결과는

AB234C AG_%%D

AB111C AG_D%F


ESCAPE 옵션은 백슬래쉬(\)문자를 이스케이프문자로 식별하게 해서 _를 조건으로 인식하게 한다.

Posted by 무세1
,

매월 첫번째 월요일에만 작업이 돌아야 하는 경우가 생겼다..


오라클 SQL에서 매월 첫번째 월요일을 구하는 방법을 알아보자..


일단 

TRUNC(date,char) SYSDATE를 년,월,날  기준으로 잘라버린다..

NEXT_DAY(date,char) 함수는 date로부터 그 다음주 char로 명시한 요일을 출력한다.


이 두함수를 이용해서 날을 구해보았다..


SELECT  TRUNC(SYSDATE,'MONTH') FROM DUAL

UNION ALL

SELECT  TRUNC(SYSDATE,'MONTH')-1 FROM DUAL

UNION ALL

SELECT NEXT_DAY((TRUNC(SYSDATE,'MONTH')-1),'월') FROM DUAL


결과는..

2014/03/01 00:00:00

2014/02/28 00:00:00

2014/03/03 00:00:00


TRUNC함수를 이용해서 당월 1일을 구하고

-1을 해서 전월 마지막 날을 구한후에

NEXT_DAY함수를 이용해서 다음주 월요일을 구하면 당월 첫번째 월요일을 구할 수 있다.

Posted by 무세1
,

오라클 TRUNC 함수..

sql 2014. 3. 17. 19:41

TRUNC 함수는..  

원하는 소수점 자리 만큼만 보여주거나..

또는 날짜의 경우도 잘라 버린다..


아래 SQL을 실행하면...

SELECT  SYSDATE

        , TRUNC(SYSDATE) 

        , TRUNC(SYSDATE,'YEAR')

        , TRUNC(SYSDATE,'MONTH')

        , TRUNC(SYSDATE,'DAY')

        , TRUNC(12543.345,2)

        , TRUNC(12543.345,1)

        , TRUNC(12543.345)

FROM DUAL


결과는..  

2014/03/17 19:38:40

2014/03/17 00:00:00

2014/01/01 00:00:00

2014/03/01 00:00:00

2014/03/16 00:00:00

12543.34

12543.3

12543



'sql' 카테고리의 다른 글

SQL문에서 like 검색.. escape  (0) 2014.03.19
매월 첫번주 월요일 구하기...  (0) 2014.03.17
oracle 분석함수 RANK, DENSE_RANK, ROW_NUMBER 차이..  (0) 2014.03.17
오라클 그룹 함수 over, partition by  (2) 2014.03.14
Join 유형  (0) 2014.03.07
Posted by 무세1
,

오라클함수중에..  랭킹을 메기는 함수를 비교..

굳이 설명 필요없이..  결과를 보면 알수 있다..


부서코드 '30'의 연봉랭킹을 구하는 SQL

with emp  as (

select '7782' EMPNO, 'CLARK' ENAME  , 2450 SAL  ,'10' DEPTNO from dual union all

select '7839', 'KING'    , 5000   ,'10' from dual union all

select '7934', 'MILLER'  , 1300   ,'10' from dual union all

select '7566', 'JONES'   , 2975   ,'20' from dual union all

select '7902', 'FORD'    , 3000   ,'20' from dual union all

select '7876', 'ADAMS'   , 1100   ,'20' from dual union all

select '7369', 'SMITH'   , 800    ,'20' from dual union all

select '7788', 'SCOTT'   , 3000   ,'20' from dual union all

select '7521', 'WARD'    , 1250   ,'30' from dual union all

select '7844', 'TURNER'  , 1500   ,'30' from dual union all

select '7499', 'ALLEN'   , 1600   ,'30' from dual union all

select '7900', 'JAMES'   , 950    ,'30' from dual union all

select '7698', 'BLAKE'   , 2850   ,'30' from dual union all

select '7654', 'MARTIN'  , 1250   ,'30' from dual 

)

SELECT  EMPNO

        , ENAME

        , A.DEPTNO

        , RANK() OVER ( ORDER BY SAL DESC)         RNK

        , DENSE_RANK() OVER ( ORDER BY SAL DESC)   D_RNK

        , ROW_NUMBER() OVER ( ORDER BY SAL DESC)   R_RNK

FROM    EMP A

WHERE   DEPTNO = '30'


결과는...

EMPNO   ENAME   DEPTNO  RNK     D_RNK   R_RNK

7698         BLAKE 30    1           1           1

7499         ALLEN 30    2           2           2

7844         TURNER 30    3           3           3

7654         MARTIN 30    4           4           4

7521         WARD 30    4           4           5

7900         JAMES 30    6           5           6



PARTITION BY 를 이용해서 부서별의 연봉랭킹을 구하는 SQL

SELECT  EMPNO

        , ENAME

        , DEPTNO

        , RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC)         RNK

        , DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC)   D_RNK

        , ROW_NUMBER() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC)   R_RNK

FROM    EMP


결과는...

EMPNO   ENAME   DEPTNO  RNK     D_RNK   R_RNK

7839         KING         10         1 1 1

7782         CLARK 10         2 2 2

7934         MILLER 10         3 3 3

7902         FORD 20         1 1 1

7788         SCOTT 20         1 1 2

7566         JONES 20         3 2 3

7876         ADAMS 20         4 3 4

7369         SMITH 20         5 4 5

7698         BLAKE 30         1 1 1

7499         ALLEN 30         2 2 2

7844         TURNER 30         3 3 3

7521         WARD 30         4 4 4

7654         MARTIN 30         4 4 5

7900         JAMES 30         6 5 6


'sql' 카테고리의 다른 글

매월 첫번주 월요일 구하기...  (0) 2014.03.17
오라클 TRUNC 함수..  (0) 2014.03.17
오라클 그룹 함수 over, partition by  (2) 2014.03.14
Join 유형  (0) 2014.03.07
row의 최소값, 최대값을 구하는 함수 GREATEST, LEAST  (0) 2014.03.07
Posted by 무세1
,

오라클 그룹 함수 정리...


with문을 이용하여 테스트...

with emp  as (

select '7782' EMPNO, 'CLARK' ENAME  , 2450 SAL  ,'10' DEPTNO from dual union all

select '7839', 'KING'    , 5000   ,'10' from dual union all

select '7934', 'MILLER'  , 1300   ,'10' from dual union all

select '7566', 'JONES'   , 2975   ,'20' from dual union all

select '7902', 'FORD'    , 3000   ,'20' from dual union all

select '7876', 'ADAMS'   , 1100   ,'20' from dual union all

select '7369', 'SMITH'   , 800    ,'20' from dual union all

select '7788', 'SCOTT'   , 3000   ,'20' from dual union all

select '7521', 'WARD'    , 1250   ,'30' from dual union all

select '7844', 'TURNER'  , 1500   ,'30' from dual union all

select '7499', 'ALLEN'   , 1600   ,'30' from dual union all

select '7900', 'JAMES'   , 950    ,'30' from dual union all

select '7698', 'BLAKE'   , 2850   ,'30' from dual union all

select '7654', 'MARTIN'  , 1250   ,'30' from dual 

)


전체 평균을 각 행에 붙일때...

over(조건)는 그룹을 묶는다...  조건이 없으면 전체가 묶인다.

select empno, ename, sal,

        avg(sal) over( ) avg_sal

from emp;


결과

empno ename sal avg_sal

7782 CLARK 2450.00000 2073.21429

7839 KING         5000.00000 2073.21429

7934 MILLER 1300.00000 2073.21429

:

:

7900 JAMES 950.00000 2073.21429

7698 BLAKE 2850.00000 2073.21429

7654 MARTIN 1250.00000 2073.21429


부서별 평균을 구할때..

over(조건)  조건에 따라서 그룹을 묶는다..

partiton by deptno -> 부서에 따라 그룹을 묶는거다.

select empno, ename, sal, deptno

        , avg(sal) over(PARTITION BY deptno) avg_sal

from emp ;


결과

7934 MILLER 1300.00000 10 2916.66667

7839 KING         5000.00000 10 2916.66667

7782 CLARK 2450.00000 10 2916.66667

7876 ADAMS 1100.00000 20 2175.00000

:

:

7900 JAMES 950.00000 30 1566.66667

7698 BLAKE 2850.00000 30 1566.66667

7654 MARTIN 1250.00000 30 1566.66667


가벼운 응용

최소, 최대 연봉자 구하기

select  *

from    (

        select empno, ename, sal, deptno

                , count(*) over(PARTITION BY null) cnt 

                , rank() over(order BY sal DESC) col_rank

        from emp

        )

where   col_rank = 1         --최고연봉자

or      ( cnt = col_rank )     --최저연봉자


결과

7369 SMITH 800.00000 20 14.00000 1.00000

7839 KING       5000.00000 10 14.00000 14.00000


Posted by 무세1
,

Join 유형

sql 2014. 3. 7. 10:45



SQL Join 유형..  한눈에 보기쉽게 정리되어 있는거 같다.


아래사이트를 가면 Join SQL 작성 요령이 잘 정리되어 있다.

참조사이트 : http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

Posted by 무세1
,

가끔 ROW의 최대값 또는 최소값을 구해야 하는 경우가 있다.

최대값 : GREATEST(COL1 ,COL2 ,COL3.....)

최소값 : LEAST(COL1 ,COL2 ,COL3.....)


SELECT GREATEST('1','2','4','5') FROM DUAL

> 5


SELECT LEAST('1','2','4','5') FROM DUAL

> 1


--컬럼값이 하나라도 NULL이면 NULL을 리턴한다.

SELECT GREATEST(NULL,'2','4','5') FROM DUAL

> NULL


SELECT LEAST('1','2','4',NULL) FROM DUAL

> NULL


GREASTEST, LEAST 함수는 mysql에서도 지원된다고 한다.

'sql' 카테고리의 다른 글

오라클 그룹 함수 over, partition by  (2) 2014.03.14
Join 유형  (0) 2014.03.07
Full outer join 다중조인해보기..  (0) 2014.03.06
오라클 connect by level 을 이용한 copy_t 테이블  (0) 2014.02.24
오라클 병렬 처리 힌트  (0) 2014.02.12
Posted by 무세1
,

오라클에서는 Full Outer Join을 하기위해 

양쪽 컬럼에  컬럼(+) = 컬럼(+)를 쓰면 오류가 난다..

그러다 보니 ansi-sql 문법으로 Full Outer Join을 해야한다...

with T1 as (

select '1' A1, '12' A2 from dual

union all

select '3' A1, '32' A2 from dual

)

, T2 as (

select '1' A1, '11' B2 from dual

union all

select '2' A1, '21' B2 from dual

)

, T3 as (

select '2' A1, '11' C2 from dual

union all

select '4' A1, '21' C2 from dual

union all

select '1' A1, '24' C2 from dual

)

select coalesce(T1.A1,T2.A1,T3.A1) A1

        , T1.A2

        , T2.B2

        , T3.C2

from T1 full outer join T2 on T1.A1 = T2.A1

        full outer join T3 on T2.A1 = T3.A1  


결과값

A1 

A2

B2 

C2 

 1

12 

11 

24 

 2

NULL 

21 

11 

3

32 

NULL 

 NULL

 4

 NULL

 NULL

 21


with : 오라클은 with문을 이용하여 임시 테이블 같은 기능을 쓸수 있다.

Coalesce : 오라클의 NVL 대용으로 쓸수 있는 ansi-sql 함수다.


'sql' 카테고리의 다른 글

Join 유형  (0) 2014.03.07
row의 최소값, 최대값을 구하는 함수 GREATEST, LEAST  (0) 2014.03.07
오라클 connect by level 을 이용한 copy_t 테이블  (0) 2014.02.24
오라클 병렬 처리 힌트  (0) 2014.02.12
oracle instr() 함수  (0) 2014.02.12
Posted by 무세1
,

가끔 SQL작성시  예전에 쓰던 copy_t 테이블이 필요한 경우가 있다.

connect by level 을 이용해서 copy_t 테이블을 구현할 수 있다.


--최근 한달 일자별 임시 테이블

select  to_char(sysdate-level,'YYYYMMDD') cre_dd

from    dual

connect by level <= 31


'sql' 카테고리의 다른 글

row의 최소값, 최대값을 구하는 함수 GREATEST, LEAST  (0) 2014.03.07
Full outer join 다중조인해보기..  (0) 2014.03.06
오라클 병렬 처리 힌트  (0) 2014.02.12
oracle instr() 함수  (0) 2014.02.12
오라클 aes256 암호화  (0) 2014.01.28
Posted by 무세1
,

오라클 병렬 처리 힌트

sql 2014. 2. 12. 18:54

병렬처리 힌트..

/*+ PARALLEL(테이블명 병렬처리수)*/

/*+ PARALLEL(TAB01 8)*/


한시간 정도 걸리는 쿼리가 10분으로 줄더군요...

하지만 자원을 많이 사용하니..

자원을 많이 사용하지 않는 시간에 새벽정도에 배치로 돌릴시 사용하는게 좋으실듯..


Posted by 무세1
,