Mysql&DBeaver

DBeaver)테이블 2개 합쳐서 출력은 INNER JOIN

연습노트 2024. 9. 6. 13:18

product (2).csv
0.00MB
sales.csv
0.00MB
user_table.csv
0.00MB
card.csv
0.00MB

 

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

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

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

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

 

 

 

 

 

 

다른 테이블에 있는 컬럼도 같이 출력하고 싶습니다

 

 

 

저번 시간에 만들어놨던 이런 테이블이 있다고 합시다. 

 

 

▲ 위 사진처럼 프로그램, 가격, 강사, 출신대학까지 이렇게 4개의 컬럼을 한 번에 출력하고 싶으면

SELECT 문법을 어떻게 써야할까요? 

실은 고민할게 없는 게 SELECT의 비밀 기능이 하나가 있는데

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

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

 

 

 

 

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

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

 

(참고) 컬럼명같은게 겹칠 수 있으니

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

 

 

 

 

SELECT *
FROM program, teacher

저는 컬럼명 쓰기 귀찮아서 별표로 모든컬럼 선택해보겠습니다. 

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

빨리 실행해보십쇼 

 

 

 

 

 

 

▲ 왜 행이 15개나 출력됨? 

 

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

자동으로 가능한 모든 행의 조합을 출력해주려고 합니다. 

원래그럼 

 

 

 

 

 

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

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

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

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

...

 

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

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

그래서 데이터 1억개 있는 큰 테이블 2개 대충 출력하면

컴퓨터가 폭발하고 여러분의 행복했던 SQL 인생도 끝나는 것임 

 

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

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

 

 

 

 

 

▲ 맨 처음에 하려던 것 처럼 이렇게 출력하면 좀 유용해보이지 않겠습니까. 

이렇게 출력하고 싶으면 어떻게 코드를 짜야할까요. 

 

 

 

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

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

 

 

 

 

진짜네요 성공 

 

 

 

 

 

 

 

INNER JOIN

 

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

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

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

 

 

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

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

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

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

 

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

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

그리고 필터링조건은 ON 씁시다. 

 

 

 

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

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

 

 

 

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

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

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

 

(참고)

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

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

 

 

 

 

 

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

 

테이블 2개 합치는건 배웠는데 3개 이상은 어떻게 합치냐고요? 

 

SELECT *
FROM 테이블1, 테이블2, 테이블3
WHERE 조건1 AND 조건2 ...

그냥 이러면 되는 것이지 뭘 고민합니까 

 

 

 

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

INNER JOIN 문법을 쓰고 싶으면 

INNER JOIN 테이블명 ON 조건

이걸 여러번 뒤에 붙이면 됩니다. 

이건 오늘 숙제하면서 직접 써봅시다. 

 

 

 

 

 

 

 

CROSS JOIN 

 

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

자동적으로 CROSS JOIN이 됩니다.

 

 

 

 

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

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

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

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

...

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

 

 

 

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

그 짓거리를 하고 싶으면 CROSS JOIN 문법도 있습니다. 

(WHERE / ON 빼고 INNER JOIN 쓴 것이랑 결과가 같음)

 

 

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

생각해보면 쓸데없지 않습니까 CROSS JOIN같은거 쓸 일이 있습니까 

 

테이블1엔 상의 색상들이 쭉 기록되어있고

테이블2엔 하의 색상들이 쭉 기록되어있을 때 

상의 + 하의 모든 색조합 같은거 출력하고 싶으면 쓸 수 있겠군요. 

아니면 테스트용으로 많은 데이터 생성이 필요할 때도 씁니다. 

그거 말고는 쓸데가 없기 때문에 

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

 

 

 

 

 

오늘의 숙제 : 

 

 

새로운 데이터베이스 만들고 강의하단 CSV 파일 3개를 각 테이블로 가져온 뒤에 시작해봅시다. 

sales는 일별 매출장부

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

user_table은 유저id, 고객명이 들어있습니다. 

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

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

 

 

 

Q1. sales 테이블을 출력하는데 위 사진처럼 product 테이블에 있던 상품명, 가격도 함께 출력해봅시다. 

직접 해보고 눌러야

 

SELECT sales.id, 고객번호, 구매날짜, 상품명, 가격
FROM sales 
  INNER JOIN product 
    ON sales.상품id = product.id  

여러 테이블의 컬럼을 출력하고 싶으면 FROM 테이블1, 테이블2 써도 되고 

FROM 테이블1 INNER JOIN 테이블2 해도 됩니다. 

그 중에 id가 같은 행만 출력하려면 뒤에 조건문을 씁시다.

[collapse]

 

 

 

 

 

Q2. sales 테이블을 출력하는데 위 사진처럼 상품명, 가격, 고객명도 함께 출력해봅시다. 

답 그대로 받아쓰기는 시간낭비임

 

SELECT sales.id, 고객번호, 구매날짜, 상품명, 가격, 고객명
FROM sales 
  INNER JOIN product 
    ON sales.상품id = product.id 
  INNER JOIN user_table 
    ON sales.고객번호 = user_table.id 

테이블 3개를 함께 출력하고 싶으면 이렇게 쓰면 됩니다. 

 

 

SELECT sales.id, 고객번호, 구매날짜, 상품명, 가격, 고객명
FROM sales, product, user_table 
WHERE sales.상품id = product.id 
  AND sales.고객번호 = user_table.id 

당연히 이렇게 써도 같습니다. 

하지만 JOIN 문법이 익숙해지면 더 읽기 쉬울 수도요 

 

[collapse]

 

 

 

 

Q3. 날짜별 매출 합계를 출력하도록 2번에서 작성한 코드를 업그레이드 해봅시다. 

힌트는 그냥 날짜별로 묶으면 됩니다. 

보지마쇼

 

그룹짓고 통계내고 싶으면 GROUP BY, SUM, AVG, MAX 이런거 쓰면 된댔습니다. 

 

 

 

SELECT 구매날짜, SUM(가격)
FROM sales 
  INNER JOIN product 
    ON sales.상품id = product.id 
  INNER JOIN user_table 
    ON sales.고객번호 = user_table.id
GROUP BY 구매날짜 

그래서 2번문제에서 한거 뒤에 GROUP BY만 붙이면 끝인듯요 

그리고 특정 컬럼의 합계를 출력하고 싶으면 SUM() 쓰면 됩니다.