[MySQL] JOIN

Nam Eun-Ji·2020년 11월 27일
0

예제 테이블

테이블명 : products

codenamemakerpricecategory
0001뉴발란스993뉴발란스123,000잡화
0002바리오댕 쉐딩투쿨포스쿨16,000뷰티
0003척테일러 올스타컨버스59,000잡화
0004뉴발란스574뉴발란스89,000잡화

테이블명 : stocks

codeReceiving datestock
00012020-03-02200
00022020-01-10300
00032020-04-1710

테이블명 : table1

x
A
B
C

테이블명 : table2

y
1
2
3

테이블명 : table3

z
3
4
5




합집합 UNION

  • 두개의 SELECT 명령을 하나로 연계해 질의 결과를 얻을 수 있다.
  • 열 개수와 자료형이 서로 같거나 열을 따로 지정해주어야한다.
  • SELECT 명령들은 UNION으로 묶을 때 나열 순서는 합집합의 결과에 영향을 주지 않으나, 결괏값의 나열 순서는 달라질 수도 있다.
SELECT * FROM table2
UNION
SELECT * FROM table3;
y
1
2
3
4
5

ORDER BY를 지정할 때에는 마지막 SELECT 명령에만 지정하도록 하여야한다. ORDER BY 구에 지정하는 열은 별명을 붙여 이름을 일치시킨다.

SELECT y AS a FROM table2
UNION
SELECT z AS a FROM table3 ORDER BY a;

위와 같이 할 경우에는 DISTINCT를 걸어 중복을 제거한 것과 같다. 경우에 따라 중복을 제거하지 않고 그냥 합치고 싶을 때에 UNION ALL을 사용하면 된다.

SELECT y AS a FROM table2
UNION ALL
SELECT z AS a FROM table3 ORDER BY a;
a
1
2
3
3
4
5




내부결합 - 교차결합

  • FROM구에 복수의 테이블을 지정하면 가로방향으로 교차결합을 한다.
  • 교차결합을 하면 곱집합으로 계산된다.
  • WHERE 조건을 지정해 곱집합에서 필요한 조합만 검색할 수 있다.
SELECT * FROM 테이블1, 테이블2

예 1)

SELECT * FROM table1, table2;
xy
A1
B1
C1
A2
B2
C2
A3
B3
C3

예 2)
SELECT * FROM products, stocks WHERE products.code = stocks.code;`
codenamemakerpricecategorycodeReceiving datestock
0001뉴발란스993뉴발란스123,000잡화00012020-03-02200
0002바리오댕 쉐딩투쿨포스쿨16,000뷰티00022020-01-10300
0003척테일러 올스타컨버스59,000잡화00032020-04-1710




내부결합 - INNER JOIN

ON을 사용하여 결합조건을 지정한다.
ON 절에서는 WHERE 절에서 사용할 수 있는 모든 조건을 사용할 수 있다.

SELECT 테이블.조회할칼럼, 테이블.조회할칼럼
FROM 기준테이블
INNER JOIN 조인테이블 ON 기준테이블.기준키 = 조인테이블.기준키
SELECT * FROM A INNER JOIN B ON A.id=B.id


예)

SELECT products.name, stocks.stock 
FROM products 
INNER JOIN stocks 
ON products.code=stocks.code
codenamemakerpricecategorycodeReceiving datestock
0001뉴발란스993뉴발란스123,000잡화00012020-03-02200
0002바리오댕 쉐딩투쿨포스쿨16,000뷰티00022020-01-10300
0003척테일러 올스타컨버스59,000잡화00032020-04-1710




외부결합 LEFT JOIN

기준테이블 기준으로 조인테이블을 조합하는 형태이다.
ON절의 조건을 만족하지 않는 경우에는 기준테이블의 필드값을 그대로 가져온다.
하지만 해당 레코드의 조인테이블 필드 값은 모두 NULL로 표시된다.

SELECT 테이블.조회할칼럼, 테이블.조회할칼럼
FROM 기준테이블
LEFT JOIN 조인테이블 ON 기준테이블.기준키 = 조인테이블.기준키
SELECT * FROM A LEFT JOIN B ON A.id=B.id
// oracle
SELECT * FROM A LEFT OUTER JOIN B ON A.id=B.id

예)

SELECT products.name, stocks.stock
FROM products
LEFT JOIN stocks
ON products.code=stocks.code
namestock
뉴발란스993200
바리오댕 쉐딩300
척테일러 올스타10
뉴발란스574NULL




외부결합 RIGHT JOIN

LEFT JOIN과 반대로 조인테이블 기준으로 기준테이블을 조합하는 형태이다.
ON절의 조건을 만족하지 않는 경우에는 조인테이블의 필드값을 그대로 가져온다.
하지만 해당 레코드의 기준테이블 필드 값은 모두 NULL로 표시된다.

SELECT 테이블.조회할칼럼, 테이블.조회할칼럼
FROM 기준테이블
RIGHT JOIN 조인테이블 ON 기준테이블.기준키 = 조인테이블.기준키
SELECT * FROM A RIGHT JOIN B ON A.id=B.id
// oracle
SELECT * FROM A RIGHT OUTER JOIN B ON A.id=B.id

예)

SELECT products.name, stocks.stock 
FROM products 
RIGHT JOIN stocks 
ON products.code=stocks.code
namestock
뉴발란스993200
바리오댕 쉐딩300
척테일러 올스타10




외부결합 FULL JOIN

테이블에 있는 모든 데이터를 불러온다.

SELECT * FROM A LEFT JOIN B
UNION
SELECT * FROM A RIGHT JOIN B
// oracle
SELECT * FROM A FULL OUTER JOIN B ON A.id=B.id




프로그래머스 문제

없어진 기록 찾기

문제 : https://programmers.co.kr/learn/courses/30/lessons/59042

처음에는 상관 서브쿼리로 풀었으나, 다시 join으로 수정

SELECT
ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE NOT EXISTS (SELECT * FROM ANIMAL_INS WHERE ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMAL_ID)
ORDER BY ANIMAL_ID
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_OUTS A LEFT JOIN ANIMAL_INS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.ANIMAL_ID
profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글