Introduction

다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾는 방법을 이번 장에서 알아 본다. 책에선 하위 쿼리라고 하는데, 한글로 번역하지 않고, 그냥 서브 쿼리라고 부르는게 더 좋다고 생각한다.(하위 쿼리라고 검색하면 정보가 서브 쿼리보다 적기 때문이다.)

Content

1. 무엇을 SQL 쿼리라고 하는가?

사전전 의미로 쿼리는 질의인데, DB에 "어떤 어떤 것 주세요~" 라고 요청하는 SQL 절을 쿼리라고 한다.

2. 무엇을 서브 쿼 라고 하는가?

쿼리 안에 있는 쿼리를 서브 쿼리 라고 한다. 내가 본 시야가 아닌 다른 사람이 본 시야도 같이 참조 하면 더욱 확실해 질 것이다.(이런 여러 시야로 대상을 바라보면, 3D 처럼 구조화 된다.

관련 링크

  1. http://kukuta.tistory.com/128
  2. http://sql.1keydata.com/kr/sql-subquery.php

3. 언제 서브 쿼리가 필요한가?

DB에 접근하는 속도를 높이기 위해서, 테이블을 다른 테이블과 관계를 맺어 만든다. 왜냐하면 한 테이블에 많은 정보가 들어 있으면, 속도가 느려지기 때문이다. 이 말은 중복 값을 다른 테이블에 빼고 테이블을 참조 한다는 뜻이다. 이렇게 만들어진 테이블들은 원하는 정보를 가져올 때, 원하는 정보를 찾을 수 있도록 해 주는 키워드가 다른 테이블에 저장되어 있다. 그러므로 다른 테이블에 있는 정보를 가져와 현재 테이블에서 찾고자 할 때, 서브 쿼리가 필요하다.

4. 어떻게 서브 쿼리를 사용 하는가?

서브쿼리는 SQL 절에서 계산필드, FROM, WHERE, HAVING에 들어갈 수 있으며, 대개 WHERE 절에서 많이 쓰인다. 사용 방법은 다음과 같다.

4-1 WHERE 절에서 사용 하기

1
2
3
4
5
SELECT *
FROM Orders
WHERE order_num IN (SELECT order_num
                    FROM OrderItems
                    WHERE prod_id = 'RGAN01');

여기서 보면, IN ( 이곳 ) 에 들어 간 것이 서브 쿼리이다. OrderItems 테이블 에서 prod_id = 'RGAN01' 인 것 중 order_num을 가져와 Orders 테이블에서 order_num 에 비교하여 참인것들만 보여라. 란 뜻이다.


4-2 계산 필드에서 사용 하기

보여줄 열이 SELECT의 결과로 쓰이는 형태로, 다음과 같이 사용 한다.

1
2
3
4
5
6
7
8
9
SELECT
cust_name,
cust_state,
(SELECT COUNT(*)
 FROM Orders
 WHERE Orders.cust_id = Customers.cust_id
) AS orders
FROM Customers
ORDER BY cust_name;

결과는 다음과 같다.


4-3 FROM 에서 사용 하기

FROM 에서 사용 할 경우(써본적은 없다.)는 대부분 VIEW 테이블이지 않을까 한다. FROM 절에 있는 서브 쿼리로 결과를 얻은 것이 "테이블" 이라고 생각하고 사용 하면 된다.

마땅히 예자가 떠오르지 않아, 사용하기 위한 코드로써 남겨 둔다.

1
2
3
4
5
SELECT
cust_id
FROM ( SELECT cust_id
       FROM orders ) AS foo
ORDER BY cust_id;

5. 서브 쿼리 사용 규칙

  1. 서브쿼리를 WHERE 절에 사용 할 땐, 출력 결과가 한개 열만 된다. (SELECT * FROM .... 이 안된다는 뜻)
  2. 서브쿼리를 계산 필드에 사용 할 땐, (출력 레코드 갯수 * 서브쿼리) 만큼 쿼리 량이 증가 된다. 이는 성능 정하를 나타낸다.
  3. 서브쿼리 말고 JOIN 으로도 결과를 나타낼 수 있을 땐, 두개의 성능을 비교 해 보는 것이 좋다.

Digression

관련 링크를 찾는 습관을 길러야 겠다고 느낀 장이였다.


출처 - http://ikpil.com/1101



'DB > Common' 카테고리의 다른 글

데이터 입력과 db insert 사이에 버퍼링 방법  (0) 2012.07.13
dbms - join  (0) 2012.07.06
NoSQL 소개  (0) 2012.05.18
SQL 구문 기본 작성 가이드  (0) 2012.05.08
DBCP 소개/설정 및 validationQuery 이슈  (0) 2012.04.30
Posted by linuxism
,