INNER JOIN : 교집합
OUTER JOIN : 합집합
LEFT OUTER JOIN
SELECT *
from A LEFT OUTER JOIN B on A.a = B.b;
A의 모든 행과 B의 A와 공통인 행을 뽑는다.
RIGHT OUTER JOIN
SELECT *
from A RIGHT OUTER JOIN B on A.a = B.b;
A에서 B와 공통된 부분과 B의 모든 정보가 포함된다.
FULL OUTER JOIN
MYSQL에서는 지원하지 않는다. UNION으로 공통되지 않은 행은 NULL 처리를 해서 이용해보자.
별칭 지정하기
FROM에서 테이블명1 별칭1 JOIN 테이블명2 별칭2 ON 별칭1.속성1=별칭2.속성2으로 지정한다.
SELECT A.TITLE, B.CONTENTS,DATE_FORMAT(B.CREATED_DATE,"%Y-%m-%d") AS CREATED_DATE
FROM USED_GOODS_BOARD A
INNER JOIN USED_GOODS_REPLY B
ON A.BOARD_ID = B.BOARD_ID
WHERE A.CREATED_DATE LIKE "%-10-%"
ORDER BY B.CREATED_DATE, A.TITLE
USED_GOODS_BOARD
USED_GOODS_REPLY
문제: 위와 같을 때 USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.
SELECT USED_GOODS_BOARD.TITLE, USED_GOODS_BOARD.BOARD_ID, USED_GOODS_REPLY.REPLY_ID,
USED_GOODS_REPLY.WRITER_ID, USED_GOODS_REPLY.CONTENTS,
DATE_FORMAT(USED_GOODS_REPLY.CREATED_DATE,"%Y-%m-%d") AS CREATED_DATE
FROM USED_GOODS_BOARD
INNER JOIN USED_GOODS_REPLY
ON USED_GOODS_BOARD.BOARD_ID = USED_GOODS_REPLY.BOARD_ID
WHERE USED_GOODS_BOARD.CREATED_DATE LIKE "%-10-%"
ORDER BY USED_GOODS_REPLY.CREATED_DATE, USED_GOODS_BOARD.TITLE
위와 같이 긴 코드가 나온다. 너무 길어서 별칭을 지정해서 코드를 짰고, 조금 짧아진다. 구분하기도 더 쉬운 것 같으니 자주 사용해야겠다.
SELECT A.TITLE, A.BOARD_ID, B.REPLY_ID, B.WRITER_ID, B.CONTENTS,DATE_FORMAT(B.CREATED_DATE,"%Y-%m-%d") AS CREATED_DATE
FROM USED_GOODS_BOARD A
INNER JOIN USED_GOODS_REPLY B
ON A.BOARD_ID = B.BOARD_ID
WHERE A.CREATED_DATE LIKE "%-10-%"
ORDER BY B.CREATED_DATE, A.TITLE
GROUP BY와 함께 이용하기 (JOIN 후에)
SELECT A.REST_ID,A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS, ROUND(AVG(B.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO A
JOIN REST_REVIEW B
ON A.REST_ID=B.REST_ID
GROUP BY A.REST_ID
HAVING A.ADDRESS LIKE "서울%"
ORDER BY AVG(B.REVIEW_SCORE) DESC, A.FAVORITES DESC
JOIN이 된 후 만들어진 결과에 GROUP BY가 적용되며, 이를 이용해 평균을 내거나 합을 구하는 등의 집계함수를 사용할 수 있다.
GROUP BY 와 함께 사용하기 (JOIN에서, JOIN 후에)
SELECT ICECREAM_INFO.INGREDIENT_TYPE, SUM(A.PRICE) AS "TOTAL_ORDER"
FROM ICECREAM_INFO
JOIN (SELECT FLAVOR, SUM(TOTAL_ORDER) AS PRICE
FROM FIRST_HALF
GROUP BY FLAVOR
) A
ON ICECREAM_INFO.FLAVOR=A.FLAVOR
GROUP BY INGREDIENT_TYPE
'MYSQL' 카테고리의 다른 글
[MYSQL] 가격이 제일 비싼 식품의 정보 출력하기 - 프로그래머스 (0) | 2023.11.01 |
---|---|
[MYSQL] 중복 제거하기 - 중복 제거하고 수 세기 (0) | 2023.11.01 |
[MYSQL] 반올림과 버림 - ROUND, TRUNCATE (0) | 2023.10.20 |
[MYSQL] 상위 N개 보여주기 (1) | 2023.10.20 |
[MYSQL] UNION, LIKE (0) | 2023.10.20 |