테이블명 : products
code | name | maker | price | category |
---|---|---|---|---|
0001 | 뉴발란스993 | 뉴발란스 | 123,000 | 잡화 |
0002 | 바리오댕 쉐딩 | 투쿨포스쿨 | 16,000 | 뷰티 |
0003 | 척테일러 올스타 | 컨버스 | 59,000 | 잡화 |
0004 | 뉴발란스574 | 뉴발란스 | 89,000 | 잡화 |
테이블명 : stocks
code | Receiving date | stock |
---|---|---|
0001 | 2020-03-02 | 200 |
0002 | 2020-01-10 | 300 |
0003 | 2020-04-17 | 10 |
테이블명 : table1
x |
---|
A |
B |
C |
테이블명 : table2
y |
---|
1 |
2 |
3 |
테이블명 : table3
z |
---|
3 |
4 |
5 |
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 |
SELECT * FROM 테이블1, 테이블2
예 1)
SELECT * FROM table1, table2;
x | y |
---|---|
A | 1 |
B | 1 |
C | 1 |
A | 2 |
B | 2 |
C | 2 |
A | 3 |
B | 3 |
C | 3 |
SELECT * FROM products, stocks WHERE products.code = stocks.code;`
code | name | maker | price | category | code | Receiving date | stock |
---|---|---|---|---|---|---|---|
0001 | 뉴발란스993 | 뉴발란스 | 123,000 | 잡화 | 0001 | 2020-03-02 | 200 |
0002 | 바리오댕 쉐딩 | 투쿨포스쿨 | 16,000 | 뷰티 | 0002 | 2020-01-10 | 300 |
0003 | 척테일러 올스타 | 컨버스 | 59,000 | 잡화 | 0003 | 2020-04-17 | 10 |
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
code | name | maker | price | category | code | Receiving date | stock |
---|---|---|---|---|---|---|---|
0001 | 뉴발란스993 | 뉴발란스 | 123,000 | 잡화 | 0001 | 2020-03-02 | 200 |
0002 | 바리오댕 쉐딩 | 투쿨포스쿨 | 16,000 | 뷰티 | 0002 | 2020-01-10 | 300 |
0003 | 척테일러 올스타 | 컨버스 | 59,000 | 잡화 | 0003 | 2020-04-17 | 10 |
기준테이블 기준으로 조인테이블을 조합하는 형태이다.
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
name | stock |
---|---|
뉴발란스993 | 200 |
바리오댕 쉐딩 | 300 |
척테일러 올스타 | 10 |
뉴발란스574 | NULL |
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
name | stock |
---|---|
뉴발란스993 | 200 |
바리오댕 쉐딩 | 300 |
척테일러 올스타 | 10 |
테이블에 있는 모든 데이터를 불러온다.
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