💡 서브쿼리
하나의
쿼리
안에 포함된 또 하나의쿼리
이며, 메인 쿼리가 서브쿼리를 포함하는종속적
인 관계이다. 서브쿼리를 통해 필터링, 정렬, 집계 등을 위해 사용할 수 있다.
복잡한 논리로 데이터를 추출하고 싶을 때, 여러 테이블을 연결하면 데이터가 꼬일 수도 있다. 그럴 때 서브쿼리를 사용하면 직관적으로 데이터를 사용하기 좋다.
예시) 연봉 A를 받고 있는 여자가 어떤 책을 읽는지 궁금한데 이걸 매년 읽는지 올해만 읽는지 궁금한 경우
SELECT *
FROM orders
WHERE customer_id IN
(SELECT customer_id
FROM customers
WHERE country = 'USA');
-- 괄호의 전체가 서브쿼리
❗ 주의사항
괄호와 함께
사용되어야 한다.ORDER BY 절
은 사용할 수 없다.연산자의 오른쪽
에 사용되어야 한다.SELECT문으로만
작성 할 수 있다.💡 단일 행 서브쿼리
결과가 한 행만 나오는 서브쿼리이다. 서브쿼리가 결과를
1개
의 값만 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리이다.
SELECT *
FROM products
WHERE price >
(SELECT AVG(price) FROM products);
-- 괄호의 전체가 서브쿼리
💡 다중 행 서브쿼리
결과가 한 행만 나오는 단일 행 서브쿼리와는 다르게 서브쿼리가 결과를
2개 이상
반환하고, 이 결과를 메인쿼리로 전달하는 쿼리이다.
SELECT *
FROM employee
WHERE 급여 IN
(SELECT max(급여) FROM employee GROUP BY 부서번호);
// 괄호의 전체가 서브쿼리
기호 | 뜻 |
---|---|
IN | 하나라도 만족하면 반환 |
ANY | 하나라도 만족하면 반환, 비교 연산 가능 |
ALL | 모두 만족하면 반환, 비교 연산 가능 |
🐢 스칼라 서브쿼리
SELECT
절에서 사용하는 서브쿼리- 스칼라 서브쿼리는 오로지 한 행만 반환해 마치 JOIN을 사용한 것과 같은 결과를 나타냄
SELECT students.name, (
SELECT math
FROM middle_test as m
WHERE m.student_id = students.student_id
) AS middle_avg
FROM students;
💡 서브쿼리
하나의
쿼리
안에 포함된 또 하나의쿼리
이며, 메인 쿼리가 서브쿼리를 포함하는종속적
인 관계이다. 서브쿼리를 통해 필터링, 정렬, 집계 등을 위해 사용할 수 있다.
복잡한 논리로 데이터를 추출하고 싶을 때, 여러 테이블을 연결하면 데이터가 꼬일 수도 있다. 그럴 때 서브쿼리를 사용하면 직관적으로 데이터를 사용하기 좋다.
예시) 연봉 A를 받고 있는 여자가 어떤 책을 읽는지 궁금한데 이걸 매년 읽는지 올해만 읽는지 궁금한 경우
SELECT *
FROM orders
WHERE customer_id IN
(SELECT customer_id
FROM customers
WHERE country = 'USA');
-- 괄호의 전체가 서브쿼리
❗ 주의사항
괄호와 함께
사용되어야 한다.ORDER BY 절
은 사용할 수 없다.연산자의 오른쪽
에 사용되어야 한다.SELECT문으로만
작성 할 수 있다.💡 단일 행 서브쿼리
결과가 한 행만 나오는 서브쿼리이다. 서브쿼리가 결과를
1개
의 값만 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리이다.
SELECT *
FROM products
WHERE price >
(SELECT AVG(price) FROM products);
-- 괄호의 전체가 서브쿼리
💡 다중 행 서브쿼리
결과가 한 행만 나오는 단일 행 서브쿼리와는 다르게 서브쿼리가 결과를
2개 이상
반환하고, 이 결과를 메인쿼리로 전달하는 쿼리이다.
SELECT *
FROM employee
WHERE 급여 IN
(SELECT max(급여) FROM employee GROUP BY 부서번호);
// 괄호의 전체가 서브쿼리
기호 | 뜻 |
---|---|
IN | 하나라도 만족하면 반환 |
ANY | 하나라도 만족하면 반환, 비교 연산 가능 |
ALL | 모두 만족하면 반환, 비교 연산 가능 |
🐢 스칼라 서브쿼리
SELECT
절에서 사용하는 서브쿼리- 스칼라 서브쿼리는 오로지 한 행만 반환해 마치 JOIN을 사용한 것과 같은 결과를 나타냄
SELECT students.name, (
SELECT math
FROM middle_test as m
WHERE m.student_id = students.student_id
) AS middle_avg
FROM students;