목차
서브쿼리
- 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 말합니다.
- 서브쿼리는 필수 문법이 아닙니다. 그냥 쿼리문 2개 각각 실행 귀찮을 때 사용할 수 있습니다. (선택사항일 뿐)
- 서브쿼리 사용 시 주의 사항
- 문자나 숫자 들어갈 수 있는 자리에 해당 데이터 대신 서브쿼리 넣기 가능합니다.
- 1개의 데이터만 뱉는 쿼리문만 서브쿼리역할 가능합니다.
- 서브쿼리는 소괄호를 꼭 넣어주어야 합니다.
- 서브쿼리문만 따로 실행하고 싶을 때는 해당 문법을 드래그하고 실행버튼을 눌러보면 됩니다.
- 예시
- 사용금액이 평균보다 높은 사람만 출력하기
- 서브쿼리를 사용하지 않는다고 할 경우에는 다음과 같이 두 단계를 진행해야 합니다.
- 사용금액 평균 구하기
-
SELECT AVG(사용금액) FROM card
-
- 평균보다 큰 사람만 필터링하기
-
SELECT * FROM card WHERE 사용금액 > 245766.6667
-
- 사용금액 평균 구하기
- 이 2개의 쿼리문을 한 개로 합칠 수 있습니다.(서브쿼리)
-
SELECT * FROM card WHERE 사용금액 > (SELECT AVG(사용금액) FROM card)
- 소괄호 안의 쿼리먼저 실행되고 그 후에 전체 쿼리문을 실행해 줍니다.
-
- 서브쿼리를 사용하지 않는다고 할 경우에는 다음과 같이 두 단계를 진행해야 합니다.
- 사용금액/평균사용금액을 출력하기
-
SELECT 사용금액/(SELECT AVG(사용금액) FROM card) FROM card
-
- 사용금액이 평균보다 높은 사람만 출력하기
IN 문법 안에서의 서브쿼리
- IN 문법 안에서도 서브쿼리 넣기 가능합니다. 원래는 데이터 1개만 반환하는 쿼리문만 서브쿼리 역할이 가능하다고 했는데, IN 안에서는 예외적으로 여러개의 데이터를 반환하는 쿼리문을 사용가능합니다.
- 예시
- 블랙리스트 테이블
- 블랙리스트에 있는 회원들의 사용금액 출력해 보기
- 만약 블랙리스트 회원이 적을 경우에는 단순히 아래처럼 작성해 줄 수도 있습니다.
-
SELECT 사용금액 FROM card WHERE 고객명 IN ('Pristine','George','Amy')
-
- 하지만 블랙리스트 회원이 많게 될 경우에는 위와 같이 지정하게 되면 너무나도 많기 때문에 불편하게 됩니다.
- 만약 블랙리스트 회원이 적을 경우에는 단순히 아래처럼 작성해 줄 수도 있습니다.
- IN 안에 서브쿼리를 사용하여 블랙리스트에 있는 회원들의 사용금액 출력해 보기
-
SELECT 사용금액 FROM card WHERE 고객명 IN (SELECT 이름 FROM blacklist)
- 원래 서브쿼리문은 하나의 결과만을 반환해야 한다고 했습니다. 하지만 위처럼 IN안에서는 예외적으로 여러 개의 결과를 반환하더라도 사용이 가능합니다.
-
- 블랙리스트 테이블
예제
- 고객등급이 패밀리인 사람들의 평균 연체횟수보다 연체횟수가 높은 사람은 몇명일까요?
-
SELECT count(*) FROM card WHERE 연체횟수 > (SELECT AVG(연체횟수) FROM card WHERE 고객등급='패밀리');
-
- 개인의 사용금액이 평균사용금액과 얼마나 차이가 나는지 출력해보기
-
SELECT 고객명,사용금액,사용금액-(SELECT avg(사용금액) FROM card) AS DIFF FROM card
-
출처
'Database > MySQL' 카테고리의 다른 글
IF / CASE (0) | 2024.03.02 |
---|---|
그룹지어 통계내기 (GROUP BY) (0) | 2024.03.02 |
컬럼 출력시 사칙연산 넣기 / 문자,숫자 다루는 함수 (1) | 2024.02.29 |
MIN, MAX, AVG, SUM, COUNT 집계함수로 통계내기 (0) | 2024.02.28 |
WHERE로 데이터 필터링하기 (1) | 2024.02.27 |