# Inner Join



제X 정규형 테이블 만드는 것 까지는 좋은데

그거한다고 테이블을 다 쪼개놓으면 나중에 출력은 어떻게 할 것입니까.

SELECT와 JOIN문법 잘 쓰면 해결되기 때문에 별로 걱정은 안해도 됩니다.&#x20;

JOIN 쉽게 이해하려면 테이블 합치는 방법부터 알아야하는데 그것부터 알아봅시다.&#x20;



### 다른 테이블 컬럼도 같이 출력하기



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2Ft5nyESIIfqOGml3sGu4X%2FScreenshot_41.png?alt=media&#x26;token=ecc2b3c0-c464-47b7-ae45-0f31373383ec" alt=""><figcaption></figcaption></figure>

지난시간에이만들었던   program 테이블과이 teacher 테이블에서 위 이미지 처럼 프로그램,가격,강사,출신대학까지 4개의 컬럼을 한 번에 출력하고 싶으면 어떻게 쿼리문을 작성해야 할까?



SELECT FROM 문법쓸 때 **2개 이상의 테이블을** 적을 수 있습니다.&#x20;

그럼 하나의 테이블로 합쳐서 출력해줍니다. 컬럼도 자유롭게 선택가능



```sql
SELECT 프로그램, 가격, 강사, 출신대학
FROM program, teacher

SELECT *
FROM program, teacher
```

이러면 여러 테이블과 컬럼을 **하나의 테이블로** 출력해줍니다.&#x20;

&#x20;

(참고) 컬럼명이 겹칠 수 있으니

달랑 컬럼명대신 **테이블명.컬럼명** 이렇게 점찍어서 쓰는게 더 좋은 습관입니다.&#x20;

근데 실행해보면 뭔가 이상한 점이 있습니다.



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FetQKEJN7ppSePxOuqQcX%2FScreenshot_42.png?alt=media&#x26;token=33198024-f818-4f7a-a07f-0e440b70496b" alt=""><figcaption></figcaption></figure>

테이블 2개 이상 출력시 WHERE 조건이 없는 경우

자동으로 <mark style="color:yellow;">**가능한 모든 행의 조합을 출력**</mark>해주려고 합니다.&#x20;



테이블A의 1번째 행 + 테이블B의 1번째 행

테이블A의 1번째 행 + 테이블B의 2번째 행

테이블A의 1번째 행 + 테이블B의 3번째 행

테이블A의 2번째 행 + 테이블B의 1번째 행

...

&#x20;

이렇게 1. 가능한 모든 조합을 시도해서 행을 구성한 다음 2. 전부 출력해줍니다. &#x20;

그래서 테이블의 행이 각각 5개, 3개 있으면 사진처럼 총 15개의 행이 출력되는 겁니다.&#x20;



\
전부 출력 하는게 싫다면 언제나 WHERE 조건을주면 됩니다.

WHERE 조건으로 언제나 내가 원하는 행만 필터링할 수 있다고 하지 않았습니까.&#x20;

```sql
SELECT 프로그램, 가격, 강사, 출신대학
FROM program, teacher
WHERE program.강사id = teacher.id
```

이러면 program.강사id = teacher.id 인 행만 필터링  해줍니다.





### **INNER JOIN**



방금 내용은 INNER JOIN 문법을 써도 구현 가능합니다.&#x20;

테이블 2개를 출력할 때 SELECT / FROM / WHERE 써도 되는데&#x20;

SELECT  / FROM / INNER JOIN / ON 문법 써도 똑같습니다.&#x20;



```sql
SELECT 출력할컬럼들
FROM 테이블1 INNER JOIN 테이블2
ON 조건문 
```

이렇게 작성하면 테이블 2개를 합해서 출력해줍니다.&#x20;

INNER JOIN은 "공통점을 기반으로 테이블 2개를 붙여서 출력해주세요\~" 라는 뜻이라&#x20;

더 읽기 쉬워서 권장되는 방식입니다.&#x20;

&#x20;

용도를 더 쉽게 표현하자면 그냥 **테이블1 오른쪽에 테이블2를 붙이고 싶으면**

테이블1 INNER JOIN 테이블2 쓰면 됩니다.

그리고 필터링조건은 ON 씁시다.&#x20;



```sql
SELECT 프로그램, 가격, 강사, 출신대학
FROM program INNER JOIN teacher
ON program.강사id = teacher.id 
```

아까 예시를 이렇게 작성해도 결과는 같습니다.



그래서 결론은 테이블 2개 있는 컬럼들을 합해서 출력하고 싶으면

테이블1 INNER JOIN 테이블2 쓰면 됩니다.

그리고 INNER JOIN 결과를 조건에 맞는 행만 필터링하고 싶은 경우 ON 조건문을 사용합시다.

&#x20;

(참고)

\- JOIN 문법뒤엔 ON 빼먹으면 에러남 (MySQL은 빼먹어도 됩니다)

\- ON 뒤의 조건식엔 당연히 = 말고 > < 같은 다른 조건도 다 들어갈 수 있습니다.&#x20;





### **출력하고 싶은 테이블이 3개 이상인 경우**



```sql
-- 기본 SELECT
SELECT *
FROM 테이블1, 테이블2, 테이블3
WHERE 조건1 AND 조건2 ...

-- Inner JOIN
SELECT *
FROM 테이블1 
INNER JOIN 테이블2 ON 조건1
INNER JOIN 테이블3 ON 조건2 
```





### **CROSS JOIN**&#x20;

테이블2개 이상을 출력할 때 WHERE / ON 조건문을 넣지 않으면

자동적으로 CROSS JOIN이 됩니다. (Oracle은 ON 조건문 안쓰면 오류남)





```sql
SELECT *
FROM program, teacher
 
SELECT * FROM PROGRAM p CROSS JOIN TEACHER t 
```

테이블A의 1번째 행 + 테이블B의 1번째 행

테이블A의 1번째 행 + 테이블B의 2번째 행

테이블A의 1번째 행 + 테이블B의 3번째 행

테이블A의 2번째 행 + 테이블B의 1번째 행

...

이렇게 행의 모든 조합을 출력해주는걸 CROSS JOIN이라고 합니다.&#x20;

문법을 배웠으면 언제나 용도를 생각해보는게 좋습니다.

근데 CROSS JOIN은 딱히 쓸일이 없습니다.



테스트용으로 많은 데이터가 필요할 때 데이터 생성용으로 쓴다거나 할때는 쓸 수도 있겟네요.

CROSS JOIN 문법이 있다는건 참고로만 알아둡시다.



✨ 실습. 아래 CSV 파일로 데이터를 밀어넣고 시작합니다.

{% file src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FzAULpkFBx15rw0qZcUlC%2Fuser_table.csv?alt=media&token=214ae118-bff9-43fa-b3f5-edf21eb9b8a7" %}

{% file src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FPSEseb0cJbVxxDRrt8Z3%2Fsales.csv?alt=media&token=78815d1c-52ae-486e-b5f9-8905517fc2bd" %}

{% file src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FTXebUGhklfaxal4gZ9EI%2Fitem.csv?alt=media&token=0bfe521f-cdc8-4316-9af2-68588c3db459" %}

sales는 일별 매출장부

product는 상품id, 상품명, 가격

user\_table은 유저id, 고객명이 들어있습니다.&#x20;

무슨 데이터가 들어있는지 시간쏟아서 살펴본 뒤에 문제 풀어봅시다.&#x20;

언제나 테이블 데이터들 감상부터 해야 코드짜기 쉬워집니다.&#x20;



#### Q1. sales 테이블을 출력하는데 item 테이블에 있는 상품명과 가격도 함께 출력해봅시다.

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2Fsy9vaCP1p4Fa0lfWDrQj%2FScreenshot_43.png?alt=media&#x26;token=94c31648-94fc-400f-8feb-518da52775b5" alt=""><figcaption><p>출력 예시</p></figcaption></figure>

#### Q2. sales 테이블을 출력하는데 item 테이블에 있는 상품명과 가격, user\_table에 있는 고객명까지 함께 출력해봅시다.

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2F5GAA8CjNNotOn8VUMa5H%2FScreenshot_44.png?alt=media&#x26;token=69799158-d529-402b-bedf-c43b0a56238b" alt=""><figcaption><p>출력 예시</p></figcaption></figure>

#### **Q3. 날짜별 매출 합계를 출력해봅시다**

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FnAYPrKjIA4IY1x4rdXmA%2FScreenshot_45.png?alt=media&#x26;token=c54e4cce-c601-4ac4-a804-98f232da5c40" alt=""><figcaption><p>출력예시</p></figcaption></figure>





