서브쿼리는 다른 쿼리에 둘러싸인 쿼리.
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도 있다.
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 |