반응형

[MariaDB] 마리아DB SQL 쿼리 고급 - JOIN 조인 (MySQL)

 

INNER JOIN(내부 조인)

N:1의 관계인 테이블1:테이블2를 이용하는 조인입니다.

테이블1(N)의 외래키와 테이블2(1)의 기본키를 조인될 조건으로 이용하여 두 테이블을 합칩니다.

예를 들자면 테이블1은 주문테이블, 테이블2는 개인정보(주소)테이블이라고 하면, 테이블1에 테이블2를 조인해서 주문자의 주소를 알아내는 기능을 합니다.

USE 주문판매DB;
SELECT * 
   FROM 주문테이블명
     INNER JOIN 개인정보테이블명	-- 내부조인: 개인정보테이블
        ON 주문테이블명.userID(외래키) = 개인정보테이블명.userID(기본키)	-- 주문테이블 외래키와 개인정보테이블 기본키가 같은 값을 대상으로
   WHERE 주문테이블명.userID = '주문자ID';	-- 주문테이블의 아이디가 '주문자ID'인 사람만

 

전체를 SELECT 하지 않고 일부만 SELECT 하고자 할 경우는 어떤 테이블의 열이름인지를 확실히 해주어야 합니다.

USE 주문판매DB;
SELECT 주문테이블명.userID, 주소	-- userID의 경우 두 테이블 모두에 존재하기에 명확하기 어떤 테이블에서 가져올것인지 명시
   FROM 주문테이블명
     INNER JOIN 개인정보테이블명
        ON 주문테이블명.userID(외래키) = 개인정보테이블명.userID(기본키)
   WHERE 주문테이블명.userID = '주문자ID';

 

각 테이블을 별칭으로 만들어 쓸수도 있습니다.

USE 주문판매DB;
SELECT B.userID, U.주소	-- 아래 설정한 테이블 별칭을 이용해서 열이름을 명시
   FROM 주문테이블명 B	-- 주문테이블 별칭 B
     INNER JOIN 개인정보테이블명 U	-- 개인정보테이블 별칭 U
        ON B.userID(외래키) = U.userID(기본키)	-- 테이블 별칭 사용
   WHERE 주문테이블명.userID = '주문자ID';

 

OUTER JOIN(외부 조인)

외부조인은 테이블1의 모든 행이 조회되는 조인입니다.

예를 들어 개인정보테이블에 주문테이블을 외부조인한다면 주문내역이 없는 개인정보테이블의 행까지 조회 된다는 말입니다.

USE 주문판매DB;
SELECT * 
   FROM 개인정보테이블명
     LEFT OUTER JOIN 주문테이블명	-- 외부조인: 주문테이블 (앞에 LEFT는 RIGHT, FULL로 변경 가능)
        ON 개인정보테이블.userID(기본키) = 주문테이블명.userID(외래키)	-- 개인정보테이블 기본키와 주문테이블 외래키가 같은 값을 대상으로
   ORDER BY 개인정보테이블.userID;	-- userID 순으로 정렬

 

CROSS JOIN(상호 조인)

테이블1의 모든 행들을 테이블2의 모든행들과 조인하는 기능을 합니다.

만약 테이블1의 행이 5개이고, 테이블2의 행이 10개라면 5*10=50개의 행을 가진 상호 조인테이블이 생성됩니다.

보통 큰 샘플 데이터를 생성하고자 할때 사용하는 조인입니다.

USE 주문판매DB;
SELECT * 
   FROM 테이블1
	CROSS JOIN 테이블2;	-- 테이블2를 크로스 조인

 

SELF JOIN(자체 조인)

군대 중대원 테이블1에 행마다 맞선임이 대한 열정보가 있다고 생각해 봅시다. 특정인의 맞선임의 맞선임을 찾고자 할때 사용하는 것 이 셀프 조인입니다.

내부조인을 이용해서 만들지만 별칭을 달리해서 다른 행들의 열값을 SELECT 해서 가져옵니다.

SELECT A.본인이름, A.상사이름, B.상사이름 AS '상사의 상사이름'	-- 상사의 상사이름만 별칭으로 사용
	FROM 중대원테이블 A
		INNER JOIN 중대원테이블 B	-- 같은 테이블을 B라는 별칭으로 사용
        	ON A.상관이름 =	B.본인이름	-- 중대원테이블의 상사이름과 중대원테이블의 본인이름이 같을때
	WHERE A.본인이름 = '이름명';	-- '이름명'을 대상으로 조회

 

UNION / UNION ALL

데이터 형식이 같은 두 테이블이 있다면 UNION시 테이블1 마지막 행 밑에 테이블2가 붙여집니다.

UNION은 중복된 열은 제거되고, UNION ALL은 중복된 열까지 모두 출력됩니다.

USE DB명;
SELECT 열이름1, 열이름2 FROM 테이블1
	UNION ALL
SELECT 열이름1, 열이름2 FROM 테이블2;	-- 위 테이블1의 셀렉터의 열이름1,2와 갯수도 데이터 형식도 같아야 함.

 

NOT IN / IN

NOT IN은 첫번째 쿼리 결과중에서 두번째 쿼리에 해당하는 행을 제외하고 출력합니다.

SELECT * FROM 개인정보테이블
	WHERE 이름열 NOT IN (SELECT 이름열 FROM 개인정보테이블 WHERE 모바일열 IS NULL);
/* 개인정보테이블의 이름열중에 모바일열이 NULL인 이름열들은 제외 */

IN은  첫번째 쿼리 결과중에서 두번째 쿼리에 해당하는 행들만 출력합니다.

SELECT * FROM 개인정보테이블
	WHERE 이름열 IN (SELECT 이름열 FROM 개인정보테이블 WHERE 모바일열 IS NULL);
/* 개인정보테이블의 이름열중에 모바일열이 NULL인 이름열들만 출력 */

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

 

반응형