Introduction
다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾는 방법을 이번 장에서 알아 본다. 책에선 하위 쿼리라고 하는데, 한글로 번역하지 않고, 그냥 서브 쿼리라고 부르는게 더 좋다고 생각한다.(하위 쿼리라고 검색하면 정보가 서브 쿼리보다 적기 때문이다.)
Content
1. 무엇을 SQL 쿼리라고 하는가?
사전전 의미로 쿼리는 질의인데, DB에 "어떤 어떤 것 주세요~" 라고 요청하는 SQL 절을 쿼리라고 한다.
2. 무엇을 서브 쿼리 라고 하는가?
쿼리 안에 있는 쿼리를 서브 쿼리 라고 한다. 내가 본 시야가 아닌 다른 사람이 본 시야도 같이 참조 하면 더욱 확실해 질 것이다.(이런 여러 시야로 대상을 바라보면, 3D 처럼 구조화 된다.
관련 링크
3. 언제 서브 쿼리가 필요한가?
DB에 접근하는 속도를 높이기 위해서, 테이블을 다른 테이블과 관계를 맺어 만든다. 왜냐하면 한 테이블에 많은 정보가 들어 있으면, 속도가 느려지기 때문이다. 이 말은 중복 값을 다른 테이블에 빼고 테이블을 참조 한다는 뜻이다. 이렇게 만들어진 테이블들은 원하는 정보를 가져올 때, 원하는 정보를 찾을 수 있도록 해 주는 키워드가 다른 테이블에 저장되어 있다. 그러므로 다른 테이블에 있는 정보를 가져와 현재 테이블에서 찾고자 할 때, 서브 쿼리가 필요하다.
서브쿼리는 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. 서브 쿼리 사용 규칙
- 서브쿼리를 WHERE 절에 사용 할 땐, 출력 결과가 한개 열만 된다. (SELECT * FROM .... 이 안된다는 뜻)
- 서브쿼리를 계산 필드에 사용 할 땐, (출력 레코드 갯수 * 서브쿼리) 만큼 쿼리 량이 증가 된다. 이는 성능 정하를 나타낸다.
- 서브쿼리 말고 JOIN 으로도 결과를 나타낼 수 있을 땐, 두개의 성능을 비교 해 보는 것이 좋다.
Digression
관련 링크를 찾는 습관을 길러야 겠다고 느낀 장이였다.
'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 |