관리 메뉴

IT 쟁이

SQL 쿼리 잘짜는 방법 (펌) 본문

Oracle10g/SQL

SQL 쿼리 잘짜는 방법 (펌)

꾸준한 사람이 되자 클라인STR 2011.11.03 23:35

우선 저도 비전공자 입니다.
개발자체를 늦게 시작한 편이구요

강정식 님의 말씀도 맞습니다만..
좀더 부연설명을 하자면

저도 잘 못합니다. 맨날 주변에 물어보곤 하지요...
그래도 그 막연한(?) 답답함에서는 다소 벗어 났다고 생각하기에
어줍잖게 적어 봅니다.


우선 내가 원하는 최종 결과를 엑셀 등에 적어 놓으세요.
그리고 아래 순서대로 해봅시다.



1. 순서를 생각하자.
    우선 순서를 생각해야 합니다.
    어떤 순서인고 하니.. 하나의 쿼리를 짜내기 위한 순서 말이죠.
    sql 은 집합적 언어라고 하지만 제가 느끼기엔 집합적(+ 절차적) 이라고 생각합니다.
    순차적으로 생각할수도 있어야 한다는거죠.
    볼까요?
    편의상 내가 조회해 오려는 결과 데이터를 "결과" 라고 표현 하도록 하죠.
    1) 내가 보여주려는 결과는 어느 테이블에 있는지 생각해봅니다.
    2) 결과를 뽑기위해 하나의 테이블을 사용하지 않으므로 내가 원하는 결과를 가지고 있는
    테이블들을 나열해 봅니다.
    3) 이제 나열된 테이블중 주테이블이 무엇인지 생각해 봅니다.
    4) 마지막으로 원하는 결과의 값들은 무었이 있는지 생각해 봅니다.
    만약 , 가공이 필요한 컬럼이라면 가공 방법은 제외하고 가공된 값만 생각합니다.



2. From 부터 풀어보자
이제 대략적인 순서를 생각 했으므로 쿼리를 만들어 가보도록 하죠

1) select 절은 SELECT * 딱 한줄이면 됩니다. 에러방지용 이죠.

2) FROM 부터 들어가 봅니다. 주테이블의 순서대로
MAIN_T(주테이블) , TABLE1, TABLE2 , TABLE3 , CODE 테이블이 있다고 쳤을때 
코드 테이블을 제외한 나머지만 적어 봅니다.
여기까지 완성된 SQL 은 
SELECT *
FROM MAIN_T A 
, TABLE1 B
, TABLE2 C
, TABLE3 D
이겠죠....

3) 이제 조건을 걸어봅니다.
JOIN 도 걸고 상수조건도 걸고 ... 상수라면 AND A.PK_COL = '23' 과 같이 텍스트가 빡! 
박혀 있는 조건 입니다. 
변수로 들어오는 조건도 걸어봅니다.

4) 근데 위 3) 의 작업을 하다보면 이제 테이블의 연결이 좀 애매하고..
생각하지 않으려 해도 SELECT 절을 생각하게 되고 그러죠 그러다 보면 
'음...이부분은 INLINE VIEW 로 해야 겠군'
'음...이건 이쪽에서 가져와서 SUBQUERY 로 IN 조건을 줘야 겠군...'
'음...이건 어쩌구...저건 어쩌구...' 이런 고민 하게 되죠....그럼 점심 시간입니다. ㅋㅋ

5) 밥먹고 왔으니 SELECT 를 고민할 시간이죠 
SELECT 에 표현될 결과는 어떤거였나요? 맨처음 엑셀등에 적어 두셨죠? 
내가 조인한 테이블들이 그 바로 그 결과를 표현 할 수 있나요? 
아니라면 그담은 기술적인 문제일 뿐입니다.
예를 들어 
가로를 세로로 ... 또는 세로를 가로로... 또는 구성비를 어쩌구 저쩌구 
계층구조가 어쩌구....소계는 이러쿵 총계는 저러쿵 
그룹핑은 이렇게.. 데이터가 없는 테이블도 있으니 이런건 아웃조인 ... 
다 기술적인 부분이죠...이런건 검색해서 물어물어 찾으면 찾아집니다.


대략 이런식이죠...
기술적인 부분은 밥 짓는것과 같아요.
문제는
밥을 쌀로 만드는지 .... 밀가루로 만드는지
물을 부어야 하는지 우유를 부어야 하는지
소금간을 해야 하는지 말아야 하는지 ... 를 알아야 하는거죠 
기술은
'물을 손등까지 오게 붓는다' 를 아는것과 같아요
한번도 밥을 안지어 본사람은 모르는거죠.

하다보면
밥을 쌀로 만든다는것 , 물을 부어야 한다는 것 , 소금간은 안한다는것 ...
물은 손등까지 오게 붓는다.....등을 알게 되죠
이제 그러다 보면 
'아...밥은 쌀로만 하는게 아니군 ... 콩,보리,팥,...'
'어라..오곡밥은 소금간을 좀 해야 하는군...'
'오잉...물대신 우유를 넣어도 되는군..'
뭐 점점 이렇게 알아가는거죠 

뭐 힌트를 쓰니...튜닝을 어떻게 하니...
몇시간 짜리가 몇분에 나오니...이런것들은 다 잊으세요..
24시간이 걸려 한줄이 나와도 내가 원하는 결과를 만드는거에 집.중. 하세요.
지금은 그래도 되는 때입니다.

그리고
조급하게 생각하지 마세요.
뭐든지 단계가 있고 노력이 있어야 합니다.

다만..."sql문 잘짜는 방법없을까요???" 라는
다소 황당하고 어의없는 (나중에 보시면..^^)
그 질문을 지금 이곳에 했었다는 것만 절대 잊지 마세요.

창피함이 실력을 만듭니다.


보니까 상당히 절차적인거 같죠?
근데 왜 SQL은 집합적 사고를 가져야 한다...고 할까요?
아마도 저 각 순서 또는 순서 전체를 집합적으로 생각 하라는 뜻일꺼에요 ...
그러니 결국 저 순서도 집합의 순서? ㅋㅋㅋ
뭔소린지....저도 뭐라고 딱 ! 정의 하기가 좀 ㅎㅎ

뭐 예전 생각도 나고 해서 주저리 주저리 글을 썼네요...ㅎㅎ

근데 이렇게 글쓰고 있는 저는 얼만큼 잘하느냐 궁금하시죠? 
제가 개인적으로 알고있는 오라클클럽 멤버들중 최하위 입니다. 

음...쓰고 보니...좀...^^ 
저것이 정답은 아닐꺼에요...정답 알려드릴 실력도 아니고..
그냥 저는 그렇다는 거니....참고 정도 하시면 되겠네요..


출처 : 오라클클럽 http://www.oracleclub.com/article/53260

0 Comments
댓글쓰기 폼