Inner Join(내부 조인)
-- JYP라는 아이디를 가진 사람이 구매한 물건을 발송하기 위해 이름/주소/연락처 검색
USE sqlDB;
SELECT * FROM buyTbl
INNER JOIN userTbl
ON buyTbl.userid = userTbl.userid -- 테이블 이름.열이름 형식 !!
WHERE buyTbl.userid = 'JYP';

↑On 구문과 where 구문에는 ‘테이블이름.열이름’의 형식으로 써야 한다. where가 없다면 buyTbl의 모든 행에 대하여 userTbl과 결합하게 됨.
-- INNER JOIN의 다른 형태
SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid;
SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid
INNER JOIN profile ON profile.pid = author.profile_id;

-- 아이디/이름/구매/물품/주소/연락처만 출력
SELECT userid, name, prodName, addr, mobile1 + mobile2 AS [연락처] FROM buyTbl
INNER JOIN userTbl ON buyTbl.userid = userTbl.userid;
오류 내용 : 열 이름 'userid'이(가) 불확실합니다.
해결 : select 구문의 userid가 두 테이블 모두에 들어 있어서 어느 테이블의 userid를 추출할지 명시해야 한다.
SELECT buyTbl.userid, name, prodName, addr, mobile1 + mobile2 as [연락처]FROM buyTbl
INNER JOIN userTbl ON buyTbl.userid = userTbl.userid;

-- 코드를 명확히 하기 위해 모든 필드명에 '테이블이름.열이름' 형식으로 입력
SELECT buyTbl.userid, userTbl.name, buyTbl.prodName, userTbl.addr, userTbl.mobile1
+ userTbl.mobile2 AS [연락처] FROM buyTbl INNER JOIN userTbl
ON buyTbl.userid = userTbl.userid;
-- 각 열이 어느 테이블에 속한 것인지는 명확해졌지만 코드가 복잡해짐.
-- 이 때 각 테이블에 별칭을 주어 간결하게 만듦.
SELECT B.userid, U.name, B.prodName, U.addr, U.mobile1 + U.mobile2
AS [연락처] FROM buyTbl B INNER JOIN userTbl U ON B.userid = U.userid;
↑두 문장의 결과는 위 사진과 같음
-- 회원 테이블(userTbl)을 기준으로 ‘SSK’이라는 아이디가 구매한 물건의 목 록 출력.
SELECT U.userid, U.name, B.prodName, U.addr, U.mobile1 + U.mobile2
AS [연락처] FROM userTbl U INNER JOIN buyTbl B ON U.userid = B.userid WHERE B.userid = 'SSK';

-- AdventureWorks의 HumanResources.Employee와 Person.Person을 조인하라
USE AdventureWorks
SELECT E.BusinessEntityID, P.FirstName, P.MiddleName, P.LastName
FROM AdventureWorks.HumanResources.Employee E
INNER JOIN AdventureWorks.Person.Person P ON E.BusinessEntityID = P.BusinessEntityID;

-- 쇼핑몰에서 한번이라도 구매한 기록이 있는 회원들만 추출(중복제거), (아이디, 이름, 주소)
USE sqlDB
SELECT DISTINCT U.userid, U.name, U.addr FROM userTbl U
INNER JOIN buyTbl B ON U.userID = B.userid ORDER BY U.userID;

-- [전체 회원]들이 구매한 목록을 모두 출력. ID순으로 정렬
SELECT DISTINCT U.userid, U.name, U.addr FROM userTbl U
INNER JOIN buyTbl B ON U.userid = B.userid ORDER BY U.userid;

-- [전체 회원]들이 구매한 목록을 모두 출력, ID순으로 정렬.
SELECT U.userid, U.name, B.prodName, U.addr, U.mobile1 + U.mobile2 AS [연락처]
FROM userTbl U INNER JOIN buyTbl B ON U.userID = B.userid ORDER BY U.userID;

/* 결과는 전체 회원들의 목록이 아닌 구매한 기록이 있는 회원들에 대한 결과
- 구매 내역이 있는 회원의 목록 및 구매 내역이 없는 회원의 목록까지 나오도록 하려면 OUTER JOIN
- INNER JOIN은 양쪽 테이블에 모두 내용이 있는 것만 조인되는 방식 |
*/
-- 전체 회원의 구매 기록(구매 기록이 없는 회원도 출력)
SELECT U.userID, U.name, B.prodName, U.addr, U.mobile1+U.mobile2 '연락처'
FROM userTbl U LEFT OUTER JOIN buyTbl B -- LEFT(왼쪽)테이블_userTbl의 내용 모두 출력
ON U.userID = B.userId ORDER BY U.userID;

↓아래 문장들도 위 사진과 같은 결과 나옴
SELECT U.userID, U.name, B.prodName, U.addr, U.mobile1+U.mobile2 '연락처'
FROM userTbl U LEFT JOIN buyTbl B -- LEFT OUTER JOIN
ON U.userID = B.userId ORDER BY U.userID;
-- 전체 회원의 구매 기록(구매 기록이 없는 회원도 출력) ROGHT OUTER JOIN
SELECT U.userID, U.name, B.prodname, U.addr, U.mobile1+U.mobile2 '연락처'
FROM buyTbl B RIGHT OUTER JOIN userTbl U
ON U.userID = B.userid ORDER BY U.userID;
-- 구매내역이 한번도 없는 유령 회원(아이디, 이름, 물품명, 주소, 연락처)
SELECT U.userID, U.name, B.prodName, U.addr, U.mobile1+U.mobile2 '연락처'
FROM userTbl U LEFT OUTER JOIN buyTbl B
ON U.userID = B.userid WHERE B.prodname IS NULL ORDER BY U.userID;
