오늘은 join 문법을 파헤쳐보도록 하겠습니다.
SQL 실력자들은 보통 join을 자유자재로 하는데요. 제가 스승으로 모시고 있는 용xx준 님도 스승님 이거 테이블 join 어떻게 해요 물어보면 ‘아 이거 별거 아니자나 이거 쉬움ㅋㅋ’ 이라고 하십니다.
누군가 일을 쉽게 한다? 그 분은 이미 전문가이십니다.
그럼 저희도 전문가로 가기위한 첫 발걸음을 떼 보도록 하겠습니다.
ㄹㅊㄱㄹ
제 n정규형이 된 테이블을 만드는 것까지는 좋은데, 그거 한다고 해서 테이블을 다 쪼개 놓는다면 나중에 출력은 어떡할까요.
실은 SELECT, JOIN 문법으로 요리조리 잘 쓰면 되기 때문에 걱정할 필요 없습니다.
JOIN을 쉽게 이해하려면 테이블을 합치는 방법부터 알아야합니다. 알아보시죠.
다른 테이블에 있는 컬럼도 한꺼번에 출력하고 싶어요.
[program table]
id | 프로그램 | 가격 | 강사 |
1 | 스쿼시 | 5000 | 1 |
2 | 헬스 | 6000 | 2 |
3 | 골프 | 8000 | 3 |
4 | 골프 중급 | 9000 | 3 |
5 | 개인피티 | 6000 | 2 |
[teacher table]
id | 강사 | 출신대학 |
1 | 팜하니 | 서울대 |
2 | 손흥민 | 연세대 |
3 | 덱스 | 고려대 |
저번 시간에 저희는 이런 테이블을 만들었습니다.
⬆️ 위 사진처럼 프로그램, 가격, 강사, 출신대학까지 이렇게 한번에 4개의 컬럼을 출력하고 싶으면 select 문법을 어떻게 써야할까요?
사실 select 문법에는 비밀이 있습니다.
select from 문법을 쓸때 from 뒤에 두개의 테이블을 적을 수 있습니다.(모르셨죵?ㅎㅎ 알았다면 유감입니다.)
그럼 하나의 테이블로 합쳐서 출력해줍니다. 컬럼도 자유롭게 선택 ㄱㄴ
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개 있다고 한다면…?
인생의 종소리가 들리겠죠.
물론 전부 출력안하고 조건에만 맞게 출력하고 싶다하면 WHERE 필터링 걸으셔도 됩니다.
SELECT 프로그램, 가격, 강사, 출신대학
FROM program, teacher
WHERE program.강사id = teacher.id
wow… 진짜네여..
성공
INNER JOIN
방금처럼 구현하려면 INNER JOIN 으로도 구현이 가능합니다.
테이블 2개를 출력할때 select/from/where 써도 되는데여
저희는 이제 조인 마스터가 될 예정이기 때문에 select/ from/inner join(default)/on 문법 써도 똑같습니다.
SELECT 출력할컬럼들
FROM 테이블1 INNER JOIN 테이블2
ON 조건문
이렇게 작성하면 위 와 똑같은 결과를 출력해줍니다. 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개 이상인경우
테이블 세개 합치면 어떡할거냐구요?
SELECT *
FROM 테이블1, 테이블2, 테이블3
WHERE 조건1 AND 조건2 ...
그냥 이렇게 하면 되죠.
SELECT *
FROM 테이블1
INNER JOIN 테이블2 ON 조건1
INNER JOIN 테이블3 ON 조건2
는 구라ㅋ
저희는 JOIN을 배웠으니까여
INNER JOIN 테이블명 ON 조건
이걸 여러분 뒤에 붙이면 됩니다.
CROSS JOIN
저희가 위에 있자나여
테이블A의 1번째 행 + 테이블B의 1번째 행
테이블A의 1번째 행 + 테이블B의 2번째 행
테이블A의 1번째 행 + 테이블B의 3번째 행
테이블A의 2번째 행 + 테이블B의 1번째 행
...
이렇게 나왔지 않습니까?
이것은 실제로 따로 JOIN 문법이 존재하는데요. 이것을 CROSS JOIN 이라고 합니다.
SELECT 프로그램, 가격, 강사, 출신대학
FROM program CROSS JOIN teac
(WHERE/ON 빼고 INNER JOIN 쓴 것이랑 똑같음)
高… 과연 크로스 조인을 쓸 일이 있을까요? 싶은데…
전 딱 한번 회사에서 봤는데요.
테스트용으로
- 허브가 몇 속 기어인지 적혀있는 테이블과
- 엔진의 종류가 적혀있는 테이블이 있었는데요.
엔진종류+몇속기어허브
같은 거 출력할때 썼습니다. 근데 이게 테스트용으로 써본거구요. 딱히 쓸데가 없어서 그냥 알아만 둡시다.
실전😤
sales - 일별 매출장부
product - 상품id, 상품명, 가격
user_table - 유저id, 고객명
Q1. sales 테이블을 출력하는데 위 사진처럼 product 테이블에 있던 상품명, 가격도 함께 출력하기
SELECT s.id, 고객번호, 구매날짜, 상품명, 가격
FROM sales s
JOIN product p
ON s.상품id = p.id
Q2. sales 테이블을 출력하는데 아래처럼 상품명, 가격, 고객명도 함께 출력하기
SELECT s.id, s.고객번호, s.구매날짜, s.상품명, u.가격, u.고객명
FROM sales s
JOIN product p
ON s.상품id = p.id
JOIN user_table u
ON s.고객번호 = u.id
Q3. 날짜별 매출 합계를 출력하도록 2번에서 작성한 코드를 업그레이드 해보기
SELECT s.id, 구매날짜, SUM(가격) 일별합계
FROM sales s
JOIN product p
ON s.상품id = p.id
JOIN user_table u
ON s.고객번호 = u.id
GROUP BY 구매날짜
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
데이터 넣거나 복사하려면 INSERT (5) | 2024.03.14 |
---|---|
LEFT AND RIGHT(feat. jungkook of BTS) JOIN (1) | 2024.03.14 |
국나뇽이 말아주는 엔티티관계도(ERD) (3) | 2024.03.07 |
제 3정규형 차렷 (0) | 2024.02.27 |
2NF 완벽 이해 MASTER (0) | 2024.02.23 |