반응형

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(3) NOT NULL, birthYear INT NOT NULL, addr CHAR(2) NOT NULL, mobile CHAR(10) NOT NULL, PRIMARY KEY(username) ); -- 전화번호 형식을 01012341234에서 010-1234-1234 형식으로 수정하기 위해 스키마 변경 ALTER TABLE userTBL mobile VARCHAR(13); CREATE TABLE buyTBL( username CHAR(3) NOT NULL, prodName CHAR(3) NOT 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('이승기', '운동화', 50, 1); insert into buyTBL values('이승기', '노트북', 150, 1); insert into buyTBL values('홍길동', '책', 10, 5); insert into buyTBL values('홍길동', '모니터', 200, 2); insert into buyTBL values('이순신', '청바지', 40, 1); insert into buyTBL values('이순신', '책', 10, 3); -- 에러 발생 -- 부모 테이블 현재 userTBL에 야스오는 없는 사람이기 때문에 존재할 수 없음. INSERT INTO buyTBL VALUES('야스오', '책', 10, 3); | 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 출력하기

반응형
'프로그래밍 > Database' 카테고리의 다른 글
MySQL_N : M 관계 (0) | 2023.03.10 |
---|---|
MySQL_MySQL FUNCTION (0) | 2023.03.10 |
MySQL_preparedstatement LIKE 쓰는 법 (0) | 2023.03.10 |
MySQL_관계 차수 1 : N 차수, 1 : 1 차수 (0) | 2023.03.08 |
MySQL_UPDATE 구문과 WHERE 조건절, UNIQUE 제약 (0) | 2023.03.08 |