정보처리기사 공부하는데 좀 이해가 안돼서..
[도서가격 테이블]
책번호 가격 대여자
111 20000 홍길동
222 25000 김길식
333 10000 조광훈
444 15000 조원식
555 20000 허준
[결과]
책번호 가격 대여자
111 20000 홍길동
555 20000 허준
위 결과를 내기위해서 책에서는 EXISTS 연산자로 아래와 같이 쿼리했다고 함.
SELECT A.책번호, A.가격, A.대여자
FROM 도서가격 A
WHERE EXISTS
(SELECT 1
FROM 도서가격 B
WHERE A.가격 = B.가격 AND B.대여자 = '홍길동');
여기서 궁금한게
서브쿼리는 A.가격 = B.가격 그리고 B.대여자 = '홍길동' 인 행을 반환해야 하잖음
근데 이렇게 되면 서브쿼리에서 나오는 행은 한 개 아닌가?
즉, A.가격 = B.가격 조건은 어차피 같은 테이블이니 모든 행을 반환할거고
B.대여자 = '홍길동' 이니, 홍길동이 대여한 행만 '1'로 나올거라고 생각했는데
실제로 MySQL로 실행해보니 또 결과처럼 나오대... 대체 무슨 개념을 놓치고 있는건지 모르겠다
홍길동이가 가진 가격 2만원을 충족하는지 체크하는 로직임 - dc App
이렇게 생각하는 과정에 도달하지 못하는거 같음.. 다른 예를 들어서 IN 연산자 안의 서브쿼리 값은 그 결과값이 직관적으로 눈에 보여서 이해가 쉬운데 이건 아니라고 해야하나. 예를 들어 WHERE 책번호 IN(SELECT 책번호 FROM 구매내역) 해놓고 책번호를 외래키로 쓰는 [구매내역 테이블]에서 쿼리한다고 치면 구매내역에 있는 책번호들의 결과값이 IN 연산자 안에 있잖어.
걍 실무는 in 쓰면 됨 - dc App
그러네 아리송하다 - dc App
exist앞에 비교할 컬럼이 없어서 1로 존재하는 20000 홍길동에 대한걸 만족하는걸 다보여준거아닐까? - dc App
A테이블에서 가격이 동일히고, B테이블에서 대여자가 홍길동인 행이 존재 > 서브쿼리가 true 반환> 메인쿼리는 서브쿼리의 조건에 맞는 행을 A에서 반환
그니까 '메인쿼리는 서브쿼리의 조건에 맞는 행을 A에서 반환' 이 부분이 이해가 안돼... 서브쿼리 조건은 A.가격 = B.가격 이면서 B.대여자 = '홍길동'이잖아. 그럼 홍길동 관련된 행만 반환되어야 하는게 아닌가??? 하 ㄹㅇ 바보된 기분이다 이거
기준이 a이기 때문에 a가격으로 보는거지 - dc App
1. A에서 한 행씩 뽑아다가 서브쿼리의 조건과 비교 2. 서브쿼리의 조건은 A와 B의 가격이 같고, 가격 = '홍길동이 대여한 도서의 가격'인 행이 있는지 따짐 3. 2번 조건에 맞는 행은 홍길동, 허준 B.대여자 = 홍길동 조건은 가격(2만원)을 필터링하려고 있는거임
이해하기 쉽게 b는 이름이 홍길동인 데이터만 있는 테이블이라고 생각하면됨 그래서 20000만 남아있는거임 b는 a기준에서는 b랑 가격만 비교한거임 - dc App
네 말 보면서 한참을 또 찾아봤는데... 2번이 아직 이해가 완벽하게 안돼. 다들 계속 대답해주는거 미안해서 뭐라도 주고 싶네 ㄹㅇ 2번에서 왜 서브쿼리 조건이 [가격 = '홍길동이 대여한 도서의 가격'인 행이 있는지]로 해석되는거임??
홍길동이 빌린 책 목록과 같은 가격인 책목록을 전부 출력 - dc App
지금 A랑 B를 같은 테이블이라고 하는 거 보니 너가 지금 셀프조인 하는 거라 생각하는 것 같은데 셀프조인이라 생각해서 A.가격 = B.가격이 모든 행 출력 그 뒤 홍길동 조건 만족 이렇게 생각하는 듯 B.대여자 = 홍길동 조건을 만족하면 B.가격은 2만이 되고 A는 다른 테이블로 봐야해 조인이 아니기 때문에 그럼 A 테이블에서 2만인 건 홍길동 허준
둘이니 exists 를 했을 때 2개가 나오는 거 A랑 B가 다른 테이블이라 생각하면 이해 될 거다
아 그니까 and 까지 적용된걸 B.가격에 대입해서 봐야한단 말인거지?? 너 말대로 셀프조인 개념으로 생각하고 있던거 맞는거 같다.
해결 됐으면 됐다 열공해 ㅎㅎ