# Sub Query

SELECT 문법안에 SELECT 이런걸 또 사용할 수 있습니다.&#x20;

서브쿼리라고 하는데 언제 어떻게 쓰는지 알아봅시다.&#x20;

#### Q.  card테이블에서 **사용금액의 평균**보다 더 큰 사용금액을 가진 사람만 출력하고 싶으면 어떻게할까요?

#### &#x20;

&#x20;1\. 컬럼에 있는 값을 평균내고 싶으면 AVG() 쓰면 된다고 했습니다.

그걸 써서 평균을 구합니다. 대충 245000원이 나옵니다.

```sql
SELECT AVG(사용금액) FROM card 
```

2\. 그 다음에 평균 245000보다 높은 것들만 출력하라고 조건문 쓰면 됩니다. &#x20;

&#x20;이걸 수동으로 2번 입력하는건 너무 귀찮습니다

&#x20;그래서 하나로 합쳐보았습니다.



```sql
SELECT * 
  FROM card 
 WHERE 사용금액 > (SELECT AVG(사용금액) FROM card)
```



SELECT 쿼리안에 다른 SELECT 쿼리를 자유롭게 넣을 수 있습니다.

저렇게 다른 쿼리 안에 들어가는 쿼리를 서브쿼리라고 합니다.&#x20;



그럼 소괄호에 있는 쿼리먼저 실행하고 결과를 뱉고 다음 쿼리를 실행해줍니다.&#x20;

그래서 위 코드는 소괄호 안에 있는 SELECT 어쩌구가 먼저 실행되어 평균값 245000 을 그 자리에 남겨줄거고 그 다음에 사용금액 > 245000 인 행만 출력해줍니다. &#x20;





(참고)

\- **문자나 숫자 들어갈 곳에** 서브쿼리를 대신 넣을 수 있습니다.

\- 그래서 1개의 문자나 숫자를 뱉는 SELECT문만 서브쿼리로 넣을 수 있음&#x20;

(여러개의 행을 뱉는 SELECT는 서브쿼리 역할을 할 수 없습니다)

\- 서브쿼리 넣을 때 ( ) 소괄호 까먹으면 안됩니다.&#x20;



```sql
SELECT 사용금액 / (SELECT AVG(사용금액) FROM card) 
  FROM card 
```



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2Fhu5gzF42YEKDf6bDoJhu%2FScreenshot_25.png?alt=media&#x26;token=f0eaa937-21d5-4b24-94cc-b175eba59189" alt=""><figcaption></figcaption></figure>

조건절 WHERE 에서뿐만아니라 SELECT 안에서도 사용할 수 있습니다.





### **IN( ) 안에 서브쿼리**



카드회사에서 카드값 제때 안값는 블랙리스트를 만들어 봅시다.

테이블 blacklist 를 만들고 그곳에 이름 컬럼 VARCHAR(100)으로 만들어봅시다.

그리고 아래처럼 데이터를 넣어줍시다.



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FU7NU1gfgfZVJldlfo0EQ%2FScreenshot_26.png?alt=media&#x26;token=5a1c8729-27f3-4e4d-ba6f-ae7897c221b3" alt=""><figcaption></figcaption></figure>

**Q. card 테이블에서 블랙리스트 회원들의 사용금액을 출력하려면 어떻게 코드를 짜야할까요?**

👍hint WHERE IN 조건문 사용하면 가능할듯?

























```sql
SELECT 사용금액 FROM card
WHERE 고객명 IN ('Pristine', 'George', 'Amy')

SELECT 사용금액 FROM card 
WHERE 고객명 IN (SELECT 이름 FROM blacklist) 
```

IN () 안에 문자나 숫자가 여러개 넣을 수 있는데

그 자리에 서브쿼리를 넣을 수도 있습니다.&#x20;

그래서 위 2개 코드는 똑같은 결과가 출력됩니다.&#x20;

&#x20;

그럼 서브쿼리가 먼저 실행되어서 'Pristine', 'George', 'Amy' 이런 값들을 가져오고

WHERE 고객명 IN ('Pristine', 'George', 'Amy') 이걸 연산해주겠군요.&#x20;



Q. 문자나 숫자를 1개만 뱉는 SELECT문만 서브쿼리역할을 할 수 있다면서요???

\- IN() 안에선 예외임 ㅅㄱㅇ





결론은 여러 SELECT 문장을 서브쿼리 형태로 하나로 합칠 수 있습니다.

&#x20;

심지어 위의 예제 잘 보면 다른 테이블을 SELECT한 결과도 서브쿼리로 넣을 수 있음을 알 수 있는데&#x20;

테이블을 2개 이상 사용해서 결과를 뽑을 땐 대부분 서브쿼리말고 나중에 배울 JOIN 문법을 사용합니다.&#x20;

그래도 대부분 동일한 결과를 얻을 수 있고 처리속도도 더 빠르고 문법도 약간 더 이해가 쉽습니다.&#x20;





Q1. **"고객등급이 패밀리인 사람들의 평균 연체횟수"**&#xBCF4;다 **연체횟수**가 높은 사람은 몇명일까요?

Q2. 개인의 사용금액이 **평균사용금액**과 얼마나 차이가 나는지 출력해봅시다.



