안녕하세요. sql만이 아니라 컴퓨터하면 엑셀 워드만 조금씩 하던 사람입니다.
회사 일중에 SQL로 데이터 불러오고 하는 작업을 하게 되었는데 사수들도 잘몰라서 스스로 배워가느라 질문합니다.
일단 크게 3가지 질문이 있습니다.
먼저 첫째로,
일단 테이블 A와 B에서 특정 칼럼(column이라 하겠습니다)에 대해 공통된 내역을 우선 뽑았습니다.
select * from A
where exists ( select * from B where A.colum = B.column and ~ and ~) 뒤에는 추가 조건 2개가 더 있어서 이렇게 적어서 뽑았습니다.
사실 이렇게 적는것이 맞는지도 의문인데, 혹시 틀렷다면 알려주시면 감사하겠습니다.
두번째로는 일단 저렇게 치고나니 결과값이 나오더군요. 그런데 이제 제가 이 결과값을 이용해서 또 다른 작업을 하려고 합니다.
그럴때는 이 결과를 새로운 테이블로 저장을 해야하나요?
일단 구글링하다가 임시 테이블이란 개념도 보긴했는데 사실 잘 모르겠어서 여기서 막히고 있습니다.
지금 하고자 하는 바는 저렇게 추출된 결과값 중 특정 칼럼(column2라 하겠습니다) 에서 중복된 값을 제외하고 추출하려고 합니다.
그래서 구글링 해보니 count(distinct column2) from ~~ 꼴이 되어야 하는데 저기서 from뒤에 제가 처음 위에 쿼리를 통해서 추출한 결과를 넣고 싶다는게 지금 의도입니다. 알려주신다면 감사하겠습니다.
마지막으로는 join과 where exist의 차이가 궁금합니다.
물론 join을 하면 불러오는 테이블의 칼럼들도 뒤이어 좌르륵 붙기때문에 결과가 다른건 알고있습니다.
그런데 예를 들어 첫번째 질문의 상황에서
select * from A
join B on A.column = B.column where ~ and ~ 이렇게 치면 특정칼럼에서 공통된 내역만을 불러온다는 것은 같지 않나요?
제가 2가지 쿼리를 모두 돌려보니 추출되는 공통내역도 달라서 행의 수도 다르게 나오더군요.
혹시 이렇게 결과가 달리 나오는 이유를 알려주신다면 감사하겠습니다.
Comment 1
-
이리
2018.12.28 10:24
1. exists는 존재 여부를 확인하는 것이기 때문에 A 와 B 테이블에 조건을 주신 컬럼들의 data가 일치하는 것들만 나오는게 맞습니다.
2. 임시테이블에 넣고 작업하셔도 되고 서브쿼리 개념으로 사용하셔도 됩니다.
- SELECT * FROM (SELECT * FROM A .... exists ....) AS A
3. join은 일치하는 컬럼값을 가져오는 것이고 exists는 존재 여부만 확인 합니다. 실행계획은 semi-join으로 나올겁니다.
결과가 다르게 나온다면 조건이 잘못된게 아닌가 싶습니다.