[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] 마리아DB SQL 쿼리 고급 - SQL 프로그래밍 (MySQL) (0) | 2020.08.30 |
---|---|
[MariaDB] 마리아DB SQL 쿼리 고급 - LONGTEXT (MySQL) (0) | 2020.08.30 |
[MariaDB] 마리아DB SQL 쿼리 고급 - 내장 함수 (MySQL) (0) | 2020.08.29 |