[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

레이블이 Query인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Query인 게시물을 표시합니다. 모든 게시물 표시

2016년 7월 4일 월요일

[DB] SQL JOIN 을 알아보자..

일전에 SELECT 쿼리문에 대한 정리를 한 글아웃사이더 햄 블로그에서 가져온 적이 있었다.. 해당 글에는 SELECT 쿼리에 대한 내용이 전반적으로 정리 되어 있었는데..

얼마전 JOIN 에 대해서 조금 더 알아야되고, 설명해야 될 상황을 직면하게 되었는데.. 단순히 어떻게 쓴다 말고는 좀 세부적인(?) 풀어서 설명하는 것에 한계를 느꼈다.. 이래서 기초가 개념이 중요한가보다.. 제길슨.. ㅠㅜ

무튼 소 잃고 외양간 고치는 상황스럽긴 하지만 그래서 이번 기회에 조금 더 확실하게 설명을 하면서 나 스스로도 정리하고 넘어가고자.. 해당 포스팅을 하기로 마음 먹게 되었으며, 포스팅 하고자 하는 해당 JOIN 쿼리는 INNER JOIN[이너 조인]과 OUTER JOIN[아우터 조인] 이 두가지다..

그럼 JOIN 이란 무엇이냐.. JOIN 은 두 개 이상의 테이블이 존재하고 있을 때 연관관계를 연결하여 원하는 결과값을 가져오고자 할 때 사용하게 된다..

INNER JOIN..
JOIN 하려는 테이블 대상의 쿼리문에 ON 절 조건이 일치하는 데이터들만 출력을 한다.. 즉, 수학에서 배우는 교집합이라고 생각하면 조금 더 오래 기억할 수 있을 듯 하다..

실제 예제 쿼리는 아래와 같다..

SELECT * FROM TAB_A AS TA INNER JOIN TAB_B AS TB
ON TA.CASE = TB.CASE

위와 같이 하면 결과는 TAB_A, TAB_B 두 테이블에서 ON 절에 코딩한것처럼 두 테이블의 CASE 가 일치하는 데이터만 출력하게 되는 것이다..

OUTER JOIN..
JOIN 하려는 테이블 대상 중 한쪽의 데이터만 모두 출력하는 것이다.. 그래서 OUTER JOIN 에는 LEFT, RIGHT 가 대표적으로 존재한다.. 여기서는 개념 자체를 잡는 것이 중요하기 때문에 우선은 LEFT OUTER JOIN 을 토대로 설명하려고 한다..

실제 예제 쿼리는 아래와 같다..

SELECT * FROM TBLE_A AS TA LEFT OUTER JOIN
TBLE_B AS TB ON TA.CASE = TB.CASE

위와 같이 하면 결과는 두 테이블 중 좌측 테이블인 TBLE_A 의 데이터가 모두 출력되며, ON 절의 조건에 해당하는 TBLE_B 의 데이터가 같이 출력된다.. 단, 조건에 해당하지 않는 TBLE_B 데이터는 NULL 로 표시가 된다..

음 원래는 여기서 마무리를 하려고 하였다.. 위에 도입부 글을 봐도 그렇게 느낄 것이다.. 근데 교집합과 합집합의 개념이 될 수 있는 JOIN 을 하다보니 전형적인 합집합 개념의 구문도 올리는 것이 왠쥐.. 좋을듯 해보였다.. 그래서 UNION ALL 도 마지막으로 얘기를 하고서 마무리 하려고 한다..

UNION ALL..
해당 쿼리는 말 그대로 딱!!! 수학의 합집합니다.. 양 테이블의 데이터를 모두 보여주는 것이다.. 단, 유의할 사항이 두가지가 있는데..

첫째는 두 테이블의 컬럼 수가 동일해야 된다..
둘째는 두 테이블의 컬럼 Data Type 이 일치해야 된다..

위 사항을 숙지하면서 예제를 보자..

SELECT A.VAL1, A.VAL2, FROM (
       SELECT A1.VAL1, A1.VAL2 FROM TBLE_A AS A1
    UNION ALL
       SELECT B1.VAL1, B1.VAL2 FROM TBLE_B AS B1
) A

이러한 패턴이 되겠다.. 저렇게 하면 TBLE_A 와 TBLE_B 데이터의 값들을 모두 출력하게 되는 것이다.. 출력에 대한 소팅이나 기타 조건은 본인이 상황에 따라 조절하면 되겠다..

2016년 6월 22일 수요일

[DB] RTRIM 을 써보자..

이번 포스팅은 프로젝트 수행 중 사용하게 된 RTRIM 에 대해서 얘기를 해보고자 한다.. 보통 인터넷에서 검색을 해보면 RTRIM LTRIM 은 아주 간단한 함수 예제 중 하나이다..

R 과 L 은 Right 와 Left 의 약자로 각각 오른쪽에 있는 공백 그리고 왼쪽에 있는 공백을 삭제하는 함수라고 보면 된다..

난 쿼리문에서 해당 부분을 사용하게 되었는데 사용하게 된 계기는 함수 정의와는 약간 틀리다고 봐야된다.. 보통은 순수하게 공백을 삭제하기 위해서 쓰는 듯 하다.. 설명들도 그렇고 말이지..

나는 프로젝트 수행 중 SELECT Query 를 코딩하고 있었고, 해당 쿼리문의 WHERE 절에 조건이 세개가 들어갔다.. 그런데 거기서 유독 두개의 조건이 적용이 안되는 것이다.. 아래가 그 쿼리의 일부분인데.. 앞부분이야 머 뻔하게 데이터를 가져오는 부분이라 생략했다..

WHERE ColumnA LIKE ? AND ColumnB = ? AND Column C = ?

그런데 저 조건에서 ColumnA 와 ColumnB 에 대한 쿼리가 제대로 적용이 안되더란 말이지.. 명확히 얘기하면 SQL Tool 에서는 돌아가지만, Java 에서 해당 쿼리 수행 후 while(rs.next()) 를 하면 계속 false 가 나오는 것이다..[다들 알겠지만 혹시 모르니.. false 면 데이터가 현재 없다는 것이고, true 면 데이터가 존재한다는 것이다..] 한마디로 저 세가지 조건에 대해서 데이터가 없다는 것이지.. 그런데 막상 돌리면 위에 말한것처럼 SQL Tool 에서는 쿼리 결과가 잘보인다.. ㅋㅋ.. -_-;;;

이것저것 바꿔봐도 지속적으로 그러한 문제가 생겨서 혹시나 하는?? 그냥?? 별 생각없는?? 마음에 테이블 속성을 살펴봤다..

DESC TableName

속성을 보니 ColumnA 와 ColumnB 는 CHAR 타입이고, ColumnC 는 VARCHAR 타입이었던 것.. CHAR 타입은 사이즈를 정해두기 때문에 내가 검색하는 데이터가 사이즈보다 작게되면 자연스럽게 공백이 생기는 것이 이유였다..

예를 들면 CHAR(8) 인데.. 내가 검색하려는 문구가 820207 이라면, 실제 받아들이기는 '820207  ' 이렇게 되는 것이다.. 뒤에 공백이 나머지 길이만큼 생성이 된다는 것..

아뿔싸!!! 그래서 쿼리를 바꿔봤다.. 어떻게..?? 검색 조건이 안되는 부분에만 RTRIM 을 걸어줬다..

WHERE RTRIM(ColumnA) LIKE ? AND RTRIM(ColumnB) = ? AND Column C = ?

위와 같이 빨강색 표시된 부분처럼 해주니 바로 나오더란 SQL Tool 에서야 WHERE 절에 조건이 '820207' 이런식으로 공백이 없었으니 당연히 잘 나오고, Java 를 통해서 데이터 확인을 해보니 드디어 while(rs.next()) 가 true 였다..

별거 아닌 것으로 삽질을 좀 했는데 어찌보면 내가 기초가 부족해서 그런것일지도 모르겠다.. RTRIM LTRIM 자체는 알고 있고 들어도 봤지만, Oracle 에서의 테이블 내 속성 타입에 대한 정의나 개념을 100% 숙지하지 못했기에 해당 오류를 수정하는데 조금 시간이 걸린 것이라고 보여진다.. 그래도 이렇게 포스팅을 하고 하면서 나 스스로 또 한번 정리를 하기에 오늘도 이렇게 난 배워간다.. 무엇보다 문제 해결에 약간의 어드바이스를 해주신 동료 C 과장님에게 감사드린다..

아!! 그리고 나 스스로에게 짤막하게 충고를 하고자 한다.. 나의 능력 이상의 것을 탐하려고만 하지말고, 나 스스로 능력을 키우거나 그게 힘들거나 귀찮고 싫다면, 나에게 주어진 업무 혹은 공간에서 그에 맞도록 최선을 다하도록 하자.. 언제나 남의 떡이 커보이는 것이니..

명심하자.. 노력은 하되..
서두르지 말고, 시샘하지 말자..