일단위 테이블 이 있을때 찾고 싶은 정보는 판매 데이터베이스에서 banana 고객이 주문한 제품의 제품명과 제조업체를 검색해보자. 이거 였습니다. 그래서 저는 select 제품명, 제품번호 from 제품 where exists (select 주문제품 from 주문 where 주문고객 = 'banana' ); 이렇게 짜엿는데 결과 값이 제대로 안나와서 질문 드렷는데 ㅅㅅㅅ님이 Subquery에서 Main query의 Column을 참조하지 않으니 따로 놀지. 너가 한 방식대로 짠다고 했을 때 제대로 된 답은 SELECT 제품명, 제조업체 FROM 제품 WHERE EXISTS (SELECT 주문제품 FROM 주문 WHERE 주문고객 = 'banana' AND 주문제품 = 제품.제품번호) 처럼 짜야 됨 |
이라고 답변달아 주었습니다
일단 이해가 안가느게
subquery 문에서
where 주문고객 = 'banana' and 주문제품 = 제품번호
이쪽이 이해가 안갑니다
주문테이블에는 제품번호라는 속성이 없는데 어떻게 검색이 되는 것입니까?
제가 생각하기로는 subquery문을 먼저 실행하여 결과값을 출력한후 그결과값을 토대로
main query문을 실행한다고 생각하였는데 이게 틀린 것인지도 궁금합니다.
니가 맞아 sub쿼리가 먼저 그 후에 메인 쿼리다.
조인을 건것도 아닌데, 검색이 될리가 없겠지
SELECT 제품명, 제조업체 FROM 제품 WHERE EXISTS (SELECT 주문제품 FROM 주문 WHERE 주문고객 = 'banana' AND 주문제품 = 제품.제품번호) 오라클에서 ㅅㅅㅅ님이 달아주신 이문장 으로 해야지 제대로된 결과가 출력됩니다. ㅠㅠ 그래서 이상해서 다시 질문드린겁니다 분명히 subquery 부터 실행할텐데 서브쿼리에선 주문 테이플에서 검색하는데 제품번호를 불러올수없는데 왜 되는지 ㅠㅠ
너가 알고 있던 대로 본래 Subquery가 SQL 문에 있으면 서브 쿼리가 먼저 실행되고 그 다음 그 결과 레코드들을 인풋으로 Main Query가 수행된다. 하지만 이 경우는 Subquery 내에서 Main Query의 Column을 참조하고 있지. 자세히 보면 그냥 '제품번호'가 아니라 '제품.제품번호'라고 적었다. 이 때의 '제품'은 Main Query에서 로드한 그 테이블이지. 이렇게 적을 경우 Main Query와 Subquery는 서로 상호작용해서 쿼리를 수행하게 된다. 이런 서브쿼리를 Correlated subquery라고 불러.
일단 차이라 하면,
http://sjs0270.tistory.com/50
이걸 먼저 읽어봐라 나도 오라클 안써서 몰라서 좀 찾아봤어.
Correlated subquery의 옵티마이저 플랜까지는 내가 알진 못하지만 궁금하긴 하네 내부에서 어떻게 도는지.
ㅅㅅㅅ님 그럼 exists 사용할경우 서브쿼리에서 나온 결과가 main 쿼리에서의 속성을 포함하지 않는다면 조인 연산 쓰는것처럼 같이 연결해줘야 한다는 건가용??
이거 보면 이해 될거다.
http://blog.naver.com/zeekil/40158934794
젭알 // 그 말대로임. 그냥 SELECT A FROM B WHERE EXISTS (SELECT C FROM D WHERE E = F) 라고 하면 B 테이블의 모든 레코드가 출력되는 이유가 B와 D의 데이터가 연결되지 않아서 저 쿼리는 SELECT C FROM D WHERE E = F라는 쿼리를 B의 각 레코드들마다 돌려서 "결과값이 존재하는" 모든 레코드를 찾는 거니까 B 테이블과 상관없이 D 테이블에 E = F를 만족하는 레코드가 하나라도 있으면 SELECT A FROM B WHERE TRUE의 의미가 되어버림.
ㄹ // 원칙대로라면 각 레코드들에 대해서 Subquery를 반복적으로 수행하겠지만 단순한 Subquery는 알아서 JOIN 연산으로 최적화시키는 것으로 알고 있음.
(Correlated Subquery의 Optimization 부분 말한 거)
좋은거 배웠네 ㄳㄳ
역시 뭐니뭐니해도 디비는 오라클이야
오라클 미만 잡임. 진짜 오라클써보면 다른 DBMS는 개허접들...
오라클이 괜히 RDBMS 시장 1위가 아님... 괴물같은 최적화 수준을 보여주니깐 결론은 오라클의 SQL 문법 기준으로 공부해도 충분하고(SQL + PL/SQL), 여유가 되면 추가로 MS-SQL 문법(T-SQL)까지 익혀두면 떡을 친다.