안규 공부방

MS-SQL > SubQuery - Select 예제

등록일 : 2017-07-03 19:08 조회수 : 92,670

어줍잖은 강좌를 올린다구 오늘도 여전히 컴퓨터 앞에서 고민에 빠져 있는 안규랍니다.

어차피 제가 참고하기 위해서 만든 홈페이지 인데,, 많은 분들이 사랑해 주셔서 너무나 행복한 안규랍니다. ^^

오늘은 서브쿼리 두 번째 내용입니다.... SELECT 문에 대해서 아주 중요한 예제를 놓고 고민해 보고자 합니다.

아마 여러분들은 여론조사 관련 싸이트를 많이 만들어 봤을 줄 압니다.

오늘은 그거에 대해서 간단하게 이야기를 해 볼까 합니다.....

여러분 이라면 테이블을 어떻게 설계를 할까요?

전 아주 간단히 아래처럼 설계를 해 보았답니다.


Research 테이블 (여론조사 테이블)

 

번호(idx)

질문(question)

답변1(answer1)

답변2(answer2)

답변3(answer3)

답변(answer4)

날짜(writeday)

1

안규의 나이는?

26

27

28

29

2001-04-20

2

안규의 외모는?

잘생겼음.

엄청 잘생겼음.

아주 잘생겼음.

너무 잘생겼음.

2001-04-20



Reply 테이블 (여론조사 결과 테이블)
 
일련번호(idx)

여론조사 번호(idx_num)

답변 번호(answer)

1

1

1

2

1

2

3

1

3

4

1

4

5

1

1

6

1

2

7

1

2

8

1

3

9

1

4



어때요?? 테이블에 대해서 이해 하시겠어요?

research 테이블은 여론조사가 들어가 있는 테이블입니다. 그리구, reply 테이블은 여론조사에 해한 (idx_num) 인덱스

번호와 답변을 한 번호가 들어가 있지요?

굳히 이렇게 까지 테이블까지 들먹이 면서 할필요가 있을까 하지만,,,,

그래두 이렇게 예문을 통해서 공부를 하면 더욱 오랜동안 기억에 남을 수 있겠지요?

만약 여러분이라면 아래처럼 여론조사와 그의 투표수를 뽑기 위해서 어떠한 쿼리를 사용하시겠습니까?

 

번호

여론조사 제목

투 표 수

날짜

1

안규의 나이는?

9

2001-04-20

2

안규의 외모는?

0

2001-04-20


저의 경우라면 아래의 쿼리를 사용했습니다. 여러분도 확인해 보시지요.

select A.idx , A.question , A.writeday , isnull(b.ss,0) from research A, (SELECT idx_num,count(idx_num) as ss FROM reply GROUP BY idx_num) B where a.idx*=b.idx_num ORDER BY board_idx DESC

이것 또한 그리 대단하지는 않은 쿼리 이지요?

여기에서 주목해야 할 점은 두가지가 있습니다. 앞에서 배운 outer join(T-SQL에서는 (*=)) 과 isnull 함수를 사용했지요?

일단 reply 테이블에서 여론조사의 idx_num을 기준으로해서 Group by를 했답니다.

그리구, 이것에 대한 count를 뽑았답니다.

research 와 replay 의 idx 와 idx_num 이 같은 값(여론조사와 그 참조 번호) 을 비교해서 취하게 됩니다.

여기에서 중요한 것은 reply 테이블보다는 research 테이블이 주체가 되니까,,, 조인은 left outer join( *= )을

해 주었습니다.

그리구 여기에서 isnull(b.ss,0) 함수를 보면 b.ss (여론조사 갯수) 가 없을때,,, 위와 같은 경우도 2번에 해당하는

여론조사 참여자가 없기 때문에,,,, 이런 경우는 0을 출력해야 되겠지요?

그래서 위처럼 isnull 함수를 사용했답니다.


어떠신가요? 어렵지 않지요?

이렇듯 서브쿼리와 간단한 함수, 그리구, join이라는 명령의 개념을 조금이라도 가지고 계신다면,,,, 이런 복잡한(?)

쿼리문도 아주 쉽게,, 그리구, 강력하게 사용할 수 있습니다.

만약 이런 기능들을 모르고 있다면??? 아마 열라 삽질하며,, 어렵게 어렵게 프로그래밍을 하겠지요?

그럼,,,, 서버 퍼포먼스도 떨어지고,,, 프로그램도 지져분해 질 수 있습니다.


그럼, 오늘도 건강하세요..... ^^
 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.