SQL 자주쓰는 쿼리 ! _ 서브쿼리 편

반응형




아헴...
이제는 조인을 포스팅 했으니
굉장히 많이... 어쩌면 조인보다 더 많이 쓰이는 서브쿼리를 포스팅 해보겠다

읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥



우선, 서브쿼리를 살펴보기전에 알아둘점!

DB의 중요한 점은 계속 늘어난다는 점.
크로스 조인은 오래걸린다.
상관 서브 쿼리도 느린편.
조인이 서브쿼리 보다는 빠르다!

음...
상관 서브 쿼리는 밑에서 알아 보기로 하고....
엄청 큰 DB 쿼리를 날리거나 많은 값을 읽어오지 않는 이상
큰 차이는 느끼기 어려울 것 같긴 하다...

어쨋든 서브쿼리, 비상관 서브쿼리, 상관 서브쿼리를 포스팅 해보겠다.

우선 서브 쿼리는 내부쿼리 라고도 불리는데,
서브쿼리 만의 규칙이 있다.

서브 쿼리는 언제나 SELECT 문 하나이다.
서브 쿼리는 항상 괄호 안에 있다.
서브쿼리는 세미콜론이 없다. 세미콜론은 항상 전체 쿼리의 마지막에만 위치한다
서브쿼리는 SELECT 절, 열 리스트를 선택하는 경우 FROM 절, HAVING 절
서브쿼리는 SELECT, UPDATE, INSERT, DELETE 와 함께 사용할 수 있다

정도 되겠고...

그다음으로 서브쿼리는 하나의 값 만을 반환한다
( 즉, 한 행의 한 열 )
그 다음, 외부 쿼리는 그 값을 열의 모든 값과 비교한다.



다음으로 서브쿼리의 IN 연산자...

IN 연산자는 여러 값을 포함하는데 ' = ' 같은 연산자는 한 값만 사용한다.
--> 대부분 하나의 값을 반환하고 , 'IN' 의 경우는 여러값을 반환하므로 예외적이다.

그리고 NOT IN 도 있는데
NOT IN 은 IN 과는 반대로 해당 테이블의 없는 현재 값을 반환한다.




비 상관 서브 쿼리는

서브 쿼리가 우선 실행되고, 그리고 나서 결과가 외부 쿼리의 where 조건으로 이용된다
하지만 서브쿼리는 외부쿼리의 결과와는 상관없이 단독으로 실행될 수 있는 쿼리
외부 쿼리의 어떤 것도 참조하지 않고 단독으로 사용됨

간단하게 쓰는 서브 쿼리는 모두 여기에 해당할 것이다.




상관 서브 쿼리는

내부쿼리의 값이 결정되는데 외부쿼리에 의존한다

주관적인 생각에는 조금 고급 쿼리인듯???ㅋㅋ

상관 서브쿼리를 쓸려면 NOT EXISTS 예약어를 이용한다.


SELECT t.name, t.email
FROM test_table AS t
WHERE NOT EXISTS
( SELECT * FROM best_table as b
WHERE t.id = b.id );


예제에서 보면 WHERE 절 밑에 나오는 또 다른 괄호 안에 있는 SELECT 문이
서브 쿼리이고
이 서브쿼리의 WHERE 절을 보면 괄호 밖에서 이용된 test_table 의 id 칼럼을 이용하도록 되어있다
따라서 상관 서브 쿼리는 서브쿼리의 값이 결정되려면 외부쿼리에 의존하게 된다.

=> 쿼리를 좀 해석해 보자면...
test_table 에 있는 사람들 중 현재 best_table 에 없는 사람들의 이름과 이메일을 찾는다.
여기에서 '없는' 에 주의...
이 '없는'이 어디서 왔냐...........

바로 NOT EXISTS 에서 왔다.

그러면 ' 있는 ' 으로 하려면??
바로 NOT 을 없앤 EXISTS 를 쓰면 된다.

EXISTS 도 좀 보면,

NOT EXISTS 와는 반대로 해당 테이블에서
한번이라도 나오게 되면 값을 반환한다.

정도 되겠다............

간단한 내용이므로 따로 테스트 해보진 않았다...................................

결과가 궁금하시면 직접 테스트 해보시길 ^^;;;;;;;;;
( 절대 귀차니즘 때문 ..............은......... 아닙니다~)

아 배고파.배고파 배고파 라면먹어야지




반응형

댓글

Designed by JB FACTORY