'회원 테이블'과 '구매 테이블'이 존재할 때 두 테이블을 통해 '배송 정보'를 만들어야 한다.
이러한 상황에서 JOIN을 이용하여 정보를 도출한다.
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색 조건] ;
ex1)
SELECT *
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id
WHERE buy.mem_id = 'GRL';
ex2)
SELECT buy.mem_id, member.mem_name, buy.prod_name, addr, CONCAT(phone1, phone2) AS '연락처'
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id;
이렇게 buy. member. 으로 표시해주는 것이 좋다. but 코드가 길어짐
=> 각 별칭을 부여해서 편하게 사용
SELECT B.mem_id, M.mem_name, B.prod_name, M.addr, CONCAT(M.phone1, M.phone2) AS '연락처'
FROM buy AS B
INNER JOIN member AS M
ON B.mem_id = M.mem_id;
내부 조인의 한계점은 구매한 사람들만 나옴, 구매를 안 했으면 구매하지 않음으로 나타나는 것도 바람직하지 않을까?
=> 따라서 나온 것이 외부 조인
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인될 조건>
[WHERE 검색 조건] ;
ex1)
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM member M
LEFT OUTER JOIN buy B
ON M.mem_id = B.mem_id
ORDER BY M.mem_id;
* RIGHT나 LEFT나 같다. 테이블 위치만 바꾸면 됨
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM buy B
RIGHT OUTER JOIN member M
ON M.mem_id = B.mem_id
ORDER BY M.mem_id;
한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능
내용적인 의미는 없지만, 테스트 대용량 데이터를 만들 때 사용된다.
총 만들어지는 행의 개수 = A테이블 행의 개수 X B테이블 행의 개수
* sakila데이터베이스의 inventory와 world데이터베이스의 city테이블 크로스 조인
SELECT COUNT(*) "데이터 개수"
FROM sakila.inventory # 4,581건
CROSS JOIN world.city; # 4,079건 => 총 18,685,899건 데이터 생성
자기 자신과의 조인
즉, 하나의 테이블을 사용하여 조인 ex) 회사의 조직 관계
(자체 조인 : 혼공SQL 교재)
* 경리부장의 직속상관의 전화번호를 알고 싶을 때?
SELECT A.emp "직원" , B.emp "직속상관", B.phone "직속상관연락처"
FROM emp_table A # emp_table를 A
INNER JOIN emp_table B # emp_table를 B
ON A.manager = B.emp # 직속상관(MANAGER)과 직원(EMP) 연결
WHERE A.emp = '경리부장';