반응형
본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.
INNER JOIN (내부 조인)
더보기
CREATE TABLE ADDR
(
CUST_ID INT NOT NULL,
HOME_ADDR1 CHAR(50) NOT NULL,
HOME_ADDR2 CHAR(50) NOT NULL,
PRIMARY KEY('CUST_ID')
);
INSERT INTO ADDR
VALUES
(5465, '서울시 강남구 역삼동', '111-11'),
(2354, '서울시 종로구 공평', '222-22'),
(5410, '서울시 중구 서소문동', '333-33');
CREATE TABLE MOBILE
(
CUST_ID INT NOT NULL,
MOBILE_NO CHAR(50) NOT NULL,
PRIMARY KEY('CUST_ID')
);
INSERT INTO MOBILE
VALUES
(5465, '010-1111-1111'),
(2354, '010-2222-2222');
- 2개의 테이블을 하나의 테이블로 합치는 방법들 중 하나
- ADDR 테이블에서 CUST_ID, MOBILE 테이블에서 CUST_ID가 공통으로 존재하는 Key
SELECT ADDR.*, MOBILE.MOBILE_NO
FROM ADDR INNER JOIN MOBILE
ON ADDR.CUST_ID = MOBILE.CUST_ID;
- 공통된 키 열을 매칭 시킬 때 ON 키워드를 사용
- 위 코드의 두 번째 줄에서 아래와 같이 ‘ADDR’과 ‘MOBILE’의 위치를 변경해서 작성해도 똑같이 동작함
SELECT ADDR.*, MOBILE.MOBILE_NO
FROM MOBILE INNER JOIN ADDR
ON ADDR.CUST_ID = MOBILE.CUST_ID;
예제
- 총 3가지 테이블을 사용
1. 고객원장 테이블: CUSTOMERS
CUST_ID | CUST_NM | HOME_TEL |
5464 | JH KIM | 02-333-1111 |
6570 | LY KIM | 031-111-1133 |
8780 | AR KIM | 032-998-5555 |
5632 | KK LEE | 02-6677-8888 |
2445 | HJ WANG | 055-4444-5666 |
3210 | HH AN | 031-888-0111 |
2596 | DK SUNG | 02-113-3331 |
더보기
CREATE TABLE CUSTOMERS
(
CUST_ID INT NOT NULL,
CUST_NM CHAR(20) NOT NULL,
HOME_TEL CHAR(20) NOT NULL,
PRIMARY KEY('CUST_ID')
);
INSERT INTO CUSTOMERS
VALUES
(5464, 'JH KIM', '02-333-1111'),
(6570, 'LY KIM', '031-111-1133'),
(8780, 'AR KIM', '032-998-5555'),
(5632, 'KK LEE', '02-6677-8888'),
(2445, 'HJ WANG', '055-4444-5666'),
(3210, 'HH AN', '031-888-0111'),
(2596, 'DK SUNG', '02-113-3331');
2. 주문 테이블: ORDERS
ORDER_ID | CUST_ID | EMP_ID | ORDER_DT |
10000 | 2596 | 23480 | 2013-12-06 |
10001 | 5464 | 16780 | 2013-11-01 |
10002 | 3210 | 63278 | 2014-03-02 |
10003 | 2445 | 15501 | 2014-02-23 |
10004 | 5632 | 15687 | 2013-11-13 |
더보기
CREATE TABLE ORDERS (
ORDER_ID INTEGER NOT NULL,
CUST_ID INTEGER NOT NULL,
EMP_ID INTEGER NOT NULL,
ORDER_DT TEXT NOT NULL,
PRIMARY KEY("ORDER_ID")
);
INSERT INTO ORDERS
VALUES
(10000, 2596, 23480, '2013-12-06'),
(10001, 5464, 16780, '2013-11-01'),
(10002, 3210, 63278, '2014-03-02'),
(10003, 2445, 15501, '2014-02-23'),
(10004, 5632, 15687, '2013-11-13');
3. 직원정보 테이블: EMPLOYEE
EMP_ID | GRADE | NM | TELNO |
15501 | 8 | YK MO | 5740 |
15687 | 8 | SS CHANG | 5547 |
16780 | 5 | HY YOO | 2327 |
63278 | 7 | JW PARK | 2304 |
87871 | 7 | SW HONG | 2367 |
23578 | 6 | JI CHOI | 4654 |
32480 | 6 | JM CHA | 1270 |
23480 | 5 | KE LEE | 5466 |
더보기
CREATE TABLE EMPLOYEE
(
EMP_ID INT NOT NULL,
GRADE INT NOT NULL,
NM CHAR(20) NOT NULL,
TELNO INT NOT NULL,
PRIMARY KEY('EMP_ID'));
INSERT INTO EMPLOYEE
VALUES
(15501, 8, 'YK MO', 5740),
(15687, 8, 'SS CHANG', 5547),
(16780, 5, 'HY YOO', 2327),
(63278, 7, 'JW PARK', 2304),
(87871, 7, 'SW HONG', 2367),
(23578, 6, 'JI CHOI', 4654),
(32480, 6, 'JM CHA', 1270),
(23480, 5, 'KE LEE', 5466);
Q1. CUSTOMERS와 ORDERS 테이블을 이용해 주문 이력이 있는 고객 아이디(CUST_ID), 고객 이름(CUST_NM), 주문번호(ORDER_ID) 출력
CUST_ID | CUST_NM | ORDER_ID |
2596 | DK SUNG | 10000 |
5464 | JH KIM | 10001 |
3210 | HH AN | 10002 |
2445 | HJ WANG | 10003 |
5632 | KK LEE | 10004 |
더보기
SELECT CUSTOMERS.CUST_ID, CUST_NM, ORDER_ID
FROM CUSTOMERS INNER JOIN ORDERS
ON CUSTOMERS.CUST_ID = ORDERS.CUST_ID;
Q2. 위 3개의 테이블을 이용해 주문이력이 있는 고객아이디(CUST_ID), 고객이름(CUST_NM), 주문번호(ORDER_ID), 판매직원 아이디(EMP_ID) 및 직원 이름(NM) 출력 (3개의 테이블을 합치는 문제)
CUST_ID | CUST_NM | ORDER_ID | EMP_ID | NM |
2596 | DK SUNG | 10000 | 23480 | KE LEE |
5464 | JH KIM | 10001 | 16780 | HY YOO |
3210 | HH AN | 10002 | 63278 | JW PARK |
2445 | HJ WANG | 10003 | 15501 | YK MO |
5632 | KK LEE | 10004 | 15687 | SS CHANG |
더보기
SELECT TMP1.CUST_ID, TMP1.CUST_NM, TMP2.ORDER_ID, TMP3.EMP_ID, TMP3.NM
FROM CUSTOMERS TMP1
INNER JOIN ORDERS TMP2 ON TMP1.CUST_ID = TMP2.CUST_ID
INNER JOIN EMPLOYEE TMP3 ON TMP2.EMP_ID = TMP3.EMP_ID;
- 각 테이블에 TMP1, TMP2, TMP3 라는 별칭을 붙여서 쿼리문 작성
참고
- 조인 조건을 지정하지 않은 채 두 테이블을 조인하면 곱집합이 됨
- 위의 Q1 에서 ON 절을 제외하면 조인 조건이 지정되지 않아 두 테이블 각각의 행수를 곱한 7*5 = 35 개의 행이 출력됨
-
SELECT CUSTOMERS.CUST_ID, CUSTOMERS.CUST_NM, ORDERS.ORDER_ID FROM CUSTOMERS INNER JOIN ORDERS;
CUST_ID | CUST_NM | ORDER_ID |
5464 | JH KIM | 10000 |
5464 | JH KIM | 10001 |
5464 | JH KIM | 10002 |
5464 | JH KIM | 10003 |
5464 | JH KIM | 10004 |
6570 | LY KIM | 10000 |
6570 | LY KIM | 10001 |
6570 | LY KIM | 10002 |
6570 | LY KIM | 10003 |
6570 | LY KIM | 10004 |
8780 | AR KIM | 10000 |
8780 | AR KIM | 10001 |
8780 | AR KIM | 10002 |
8780 | AR KIM | 10003 |
8780 | AR KIM | 10004 |
5632 | KK LEE | 10000 |
5632 | KK LEE | 10001 |
5632 | KK LEE | 10002 |
5632 | KK LEE | 10003 |
5632 | KK LEE | 10004 |
2445 | HJ WANG | 10000 |
2445 | HJ WANG | 10001 |
2445 | HJ WANG | 10002 |
2445 | HJ WANG | 10003 |
2445 | HJ WANG | 10004 |
3210 | HH AN | 10000 |
3210 | HH AN | 10001 |
3210 | HH AN | 10002 |
3210 | HH AN | 10003 |
3210 | HH AN | 10004 |
2596 | DK SUNG | 10000 |
2596 | DK SUNG | 10001 |
2596 | DK SUNG | 10002 |
2596 | DK SUNG | 10003 |
2596 | DK SUNG | 10004 |
반응형
'SQL' 카테고리의 다른 글
[SQL] 테이블 합치기 (RIGHT OUTER JOIN) (0) | 2022.02.17 |
---|---|
[SQL] 테이블 합치기 (LEFT OUTER JOIN) (0) | 2022.02.17 |
[SQL] 그룹화된 데이터의 필터링 (HAVING) (0) | 2022.02.17 |
[SQL] 데이터의 그룹화 (GROUP BY) (0) | 2022.02.16 |
[SQL] 숫자 데이터 요약하기 (SUM, AVG, MAX, MIN, STDENV, VARIANCE) (0) | 2022.02.16 |