[SQLD] EXISTS 관련 문제 질문이 있습니다. 0 6 1,157

by 부산광어 [2020.05.16 10:11:20]


98번문제.jpg (148,533Bytes)

데이터베이스 전문가 포럼에서 어떤 분이 질문 주신 문제를 풀다가, 의문점이 생겨 질문을 하게 되었습니다. 

(ㄷ)을 보시면, group by 절을 쓰지 않고, having 절만 사용했음에도 불구하고, 가능하다라고 나와있더라구요.  그러면, group by 절을 통해 묶어야 하는 컬럼을 명시하지 않고, having절을 사용하였을 시에는 어떤 컬럼을 기준으로 group by를 수행하는지 궁금합니다. 

[https://cafe.naver.com/sqlpd에서 사진은 퍼왔습니다!] 

by 마농 [2020.05.18 08:11:08]

group by 절이 없는 집계쿼리의 집계 기준은 전체집합 입니다.
SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno; -- 부서별 집계
SELECT COUNT(*) cnt FROM emp; -- 전체 집계
이와 같이 group by 가 없어도 count 가 가능하죠.
마찬가지로 having 절에서 집계함수를 통한 조건 처리가 가능합니다.


by 부산광어 [2020.05.18 09:59:20]

감사합니다.

그러면, 위의 서브쿼리문을 해석해보면,

2014.10.01 이후로 발생한 이벤트 수보다 작은 메일발송 수에 속하는 회원을 찾는건가요?

이 부분이 잘 이해가 안됩니다. 


by 마농 [2020.05.18 10:30:20]

위 쿼리는 3단계 서브쿼리 형태네요.(메인, 서브1(상관), 서브2(비상관))
서브1은 상관서브쿼리로 메인의 회원ID 별로 동작합니다.
서브1은 회원ID별로(상관) 수행되어 이벤트일자 조건을 만족하는 발송메일 건수를 구하네요.
서브2는 독립적으로(비상관) 수행되어 이벤트일자 조건을 만족하는 이벤트 건수를 구하구요.
서브2에서 구한 건수를 서브1에서 조건으로 사용하네요.
서브1의 결과 존재여부를 메인에서 체크합니다.
(회원별 2014.10.01 이후 이벤트 메일 발송 건수)가 (2014.10.01 이후 전체이벤트 건수)보다 작은 경우
즉, 2014.10.01 이후 이벤트에 대한 메일발송이 누락된 회원 구하기


by 부산광어 [2020.05.18 10:46:16]

감사합니다. 그러면 이렇게 순서를 이해해도 되겠습니까?

서브2(비상관) -> 메인 -> 서브1

즉, 다시 말하자면 

메인에서 하나의 회원을 꺼내서 서브1, 2을 만족하는 회원만 반환

 이 과정을 메인의 모든 회원에게 수행


by 마농 [2020.05.18 10:55:52]

글쎄요?
결론은 맞는 듯 한데, 순서가 좀 이상하네요.
서브2 는 서브1에 포함된 쿼리이니 제일 먼저 수행된다는건 이상합니다.


by 부산광어 [2020.05.18 11:01:34]

질문이 이상했네요 ..

쨋든 이해됐습니다!! 감사합니다!!ㅎㅎ

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입