본문 바로가기

프로그래밍/Database

MySQL_JOIN 구문 INNER JOIN, LEFT JOIN, RIGHT JOIN

반응형

 

INNER JOIN 

SELECT 열 목록
  FROM 기준 테이블
  INNER JOIN 참조할 테이블
  ON 조인 조건
  WHERE 검색조건

→ ID값이 서로 중복되는 값만 리턴한다.
 

LEFT JOIN 또는 RIGHT JOIN

SELECT 열 목록
  FROM 기준 테이블
  LEFT JOIN(or RIGHT JOIN) 참조할 테이블
  ON 조인 조건
  WHERE 검색조건

→ 기준 테이블 값의 전체와 기준 테이블의 KEY값과 참조할 테이블의 KEY값이 같은 결과를 리턴한다.
 

userTBL, buyTBL 테이블 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
CREATE DATABASE shopdb;
USE shopdb;
 
CREATE TABLE userTBL(
    username CHAR(3NOT NULL,
    birthYear INT NOT NULL,
    addr CHAR(2NOT NULL,
    mobile CHAR(10NOT NULL,
    PRIMARY KEY(username)
);
 
-- 전화번호 형식을 01012341234에서 010-1234-1234 형식으로 수정하기 위해 스키마 변경
ALTER TABLE userTBL mobile VARCHAR(13);
 
CREATE TABLE buyTBL(
    username CHAR(3NOT NULL,
    prodName CHAR(3NOT NULL,
    price INT NOT NULL,
    amount INT NOT NULL,
    FOREIGN KEY(username) REFERENCES userTBL(username)
);
 
insert into userTBL values('이승기'1987'서울''010-1234-1234');
insert into userTBL values('홍길동'1911'부산''010-2222-3333');
insert into userTBL values('이순신'1999'대구''010-3333-4444');
 
insert into buyTBL values('이승기''운동화'501);
insert into buyTBL values('이승기''노트북'1501);
insert into buyTBL values('홍길동''책'105);
insert into buyTBL values('홍길동''모니터'2002);
insert into buyTBL values('이순신''청바지'401);
insert into buyTBL values('이순신''책'103);
 
-- 에러 발생
-- 부모 테이블 현재 userTBL에 야스오는 없는 사람이기 때문에 존재할 수 없음.
INSERT INTO buyTBL VALUES('야스오''책'103);
cs

userTBL 테이블

buyTBL 테이블

 

INNER JOIN, LEFT JOIN, RIGHT JOIN사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
-- inner join
SELECT *
    FROM userTBL
    INNER JOIN buyTBL
    ON userTBL.username = buyTBL.userName;
 
-- left join
SELECT *
    FROM userTBL
    LEFT JOIN buyTBL
    ON userTBL.username = buyTBL.username;
 
SELECT *
FROM userTBL;
 
-- 야스오 회원가입 함
INSERT INTO userTBL(username, birthYear, addr, mobile)
VALUES('야스오'2020'부산''010-1234-1234');
 
SELECT * 
    FROM userTBL
    LEFT JOIN buyTBL
    ON userTBL.username = buyTBL.username
    WHERE buyTBL.username IS NOT NULL;
 
-- AS(별칭) 사용해서 inner join
SELECT *
    FROM userTBL AS U
    INNER JOIN buyTBL AS B
    ON U.username = B.username;
 
-- 별칭 사용 left join, left join is not null 사용해보기
SELECT *
    FROM userTBL AS U
    LFFT JOIN buyTBL AS B
    ON U.username = B.username
    WHERE B.username IS NOT NULL;
 
-- LEFT JOIN 기준 테이블 선정
-- 기준 테이블 선정에 따라 결과집합이 다를 수 있다.
-- 기준 테이블 선정 기준은 작은 데이터를 기준으로 하는 것이 좋다.
SELECT *
    FROM buyTBL as b
    LEFT JOIN userTBL as u
    ON b.username = u.username;
 
-- RIGHT JOIN
SELECT u.username, b.prodName, b.price, b.amount
    FROM userTBL AS u
    RIGHT JOIN buyTBL as b
    ON u.username = b.username;
 
-- 연산자 사용해보기 
SELECT u.username, b.prodName, b.price, b.amount, (b.price * b.amount) AS 'sum'
    FROM userTBL as u
    RIGHT JOIN buyTBL as b
    ON u.username = b.username;
cs

→ 테이블 이름이 길거나 복잡한 경우 AS를 사용하여 별칭을 정하여 sql 구문을 간략하게 할 수 있다.
 

INNER JOIN

 

LEFT JOIN

 

userTBL 중에서 buyTBL과 겹치고 NULL이 아닌 것

 

연산자 사용하여 sum 출력하기

 

반응형