공부/데이터베이스2011. 7. 19. 16:12


서브쿼리는 다른 쿼리에 둘러싸인 쿼리.
inner query라고도 함.

outer query, inner query
SELECT mc.first_name, mc.last_name, mc.phone, jc.title
FROM job_current AS jc NATURAL JOIN my_contacts AS mc
WHERE jc.title IN
(SELECT title FROM job_listings); 

SELECT last_name, first_name
FROM my_contacts
WHERE zip_code =
(SELECT zip_code FROM zip_code WHERE city = 'Memphis' AND state = 'TN'); 

위 코드는 다음 조인으로 표현한 쿼리랑 같다.
SELECT last_name, first_name
FROM my_contacts mc NATURAL JOIN zip_code zc
WHERE zc.city = 'MEMPHIS'
AND zc.state = 'TN';

내부 쿼리는 하나의 값만을 반환한다. IN은 예외.
 
Select 열에서 서브 쿼리 사용.
SELECT mc.first_name, mc.last_name
(SELECT state
FROM zip_code
WHERE mc.zip_code = zip_code
) AS state
FROM my_contacts mc; 
한 열에서 하나의 값만을 반환할 수 있다.

Noncorrelated subquery(비상관 서브쿼리)
서브 쿼리가 외부 쿼리를 참조하지 않고 독립적으로 사용되는 것.

SELECT mc.first_name, mc.last_name, jc.salary
FROM
my_contacts AS mc NATURAL JOIN job_current AS jc
WHERE
jc.salary > (SELECT jc.salary
FROM my_contacts mc NATURAL JOIN job_current jc
WHERE email='andy@weatherorama.com');

여러값을 반환하는 비상관 서브트리 (IN, NOT IN)
회원들의 현재 직업 중에서 구직란에 있는 직업이 있는지, 있으면 회원 정보 출력.
SELECT mc.first_name, mc.last_name, mc.phone, jc.title
FROM job_current AS jc NATURAL JOIN my_contacts AS mc
WHERE jc.title IN (SELECT title FROM job_listings);

Correlated subquery(상관 서브쿼리)
서브쿼리가 외부쿼리에 의존
같은 별명을 사용.
SELECT mc.first_name, mc.last_name
FROM my_contact AS mc
WHERE 3 = (SELECT COUNT(*) FROM contact_interest WHERE contact_id = mc.contact_id);

NOT EXISTS를 사용한 상관 서브 쿼리

my_contacts 테이블에서 job current테이블에 없는 사람들의 이름, 성, 이메일 주소 찾기
SELECT mc.first_name firstname, mc.last_name lastname, mc.email email
FROM my_contacts mc
WHERE NOT EXISTS
(SELECT * FROM job_current jc
WHERE mc.contact_id = jc.contact_id)

EXISTS도 있다.

 

'공부 > 데이터베이스' 카테고리의 다른 글

5장 SQL  (0) 2011.08.09
2장 introduction to Database Design  (0) 2011.08.06
8 조인과 다중테이블 연산  (0) 2011.07.19
7. 테이블이 여러개인 데이터베이스 설계  (0) 2011.07.17
6. 고급 SELECT문  (0) 2011.07.17


Posted by skyjumps