조인 개념과 Inner Join

仁惠·2021년 2월 27일
0

DATABASE

목록 보기
10/11
post-thumbnail

조인

회원테이블과 구매테이블의 pk와 fk가 1:N 관계

INNER JOIN(내부 조인)

물건을 배송하기 위해 구매한 회원의 주소와 이 회원의 주소 정보를 알기 위해 주소 정보가 있는 회원 테이블과 결합하는 것 : INNER JOIN

SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블>
    	ON <조인될 조건>
[WHERE 검색조건]
		👇
USE sqldb;
SELECT *
	FROM buytbl
		INNER JOIN usertbl
    		ON buytbl.userID = usertbl.userID
	WHERE buytbl.userID = 'JYP';

구매 테이블의 userID인 'JYP'를 추출하고 'JYP'와 동일한 값을 회원 테이블의 userID열에서 검색한 후 'JYP'라는 아이디를 찾으면 구매 테이블과 회원 테이블의 두 행을 결합(JOIN)한다.

MySQL 8.0.16 버전까지는 맨 아랫줄에 ORDER BY num 구문을 넣지 않아도 buytbl의 num열에 의해서 정렬되었으나 MySQL 8.0.17버전에서는 ORDER BY num 구문을 넣지 않으면 userID열로 정렬된다.

열을 골라와서(아이디/이름/구매물품/주소/연락처 만) 뽑고 싶어서

SELECT userID, name, prodName, addr, CONCAT(mobile, mobile2) AS '연락처'
  FROM buytbl
          INNER JOIN usertbl
              ON buytbl.userID = usertbl.userID
      ORDER BY num;

위처럼 코드를 작성한다면, 에러가 뜬다.

구매테이블열도 userID열이 있고 회원테이블에도 userID열이 있다.
테이블 두 개에 같은 열 이름이 있어서 userID가 어느쪽 열인지 알 수 없다는 오류 메시지가 뜬다.

SELECT buytbl.userID, name, prodName, addr, CONCAT(mobile, mobile2) AS '연락처'
  FROM buytbl
          INNER JOIN usertbl
              ON buytbl.userID = usertbl.userID
      ORDER BY num;

따라서 위처럼 buytbl.userID라 써서 어느 테이블에 있는 userID를 쓰는지 명시해줘야 한다.

테이블 명을 앞에다가 다 붙여주는 것이 더 안전하지만, 코드가 너무 길어질 수 있다.
이를 간편하게 하기 위해서 각 테이블에 별칭을 줄 수 있다.

SELECT B.userID, U.name, B.prodName, U.addr, CONCAT(mobile, mobile2) AS '연락처'
  FROM buytbl B
          INNER JOIN usertbl U
              ON B.userID = U.userID
      ORDER BY num;

table다음에 띄우고 별칭을 써주면 된다.

전체 회원 중 물품을 구매한 회원을 선별해보자.

SELECT DISTINCT U.userID, U.name, U.addr
  FROM usertbl U
          INNER JOIN buytbl B
              ON U.userID = B.userID
      ORDER BY U.userID;

👉DISTINCT를 이용해 중복을 제거한다.

세 개의 테이블의 조인 해보자.

'다대다(many-to-many)'의 관계이다.
다대다 관계는 논리적으로는 구성이 가능하지만 이를 물리적으로 구성하기 위해서는 두 테이블의 사이에 연결 테이블을 둬서 이 연결 테이블과 두 테이블이 일대다 관계를 맺도록 구성해야 한다.

SELECT S.stdName, S.addr, SC.clubName, C.roomNo
	FROM stdtbl S
    		INNER JOIN stdclubtbl SC
        		ON S.stdName = SC.stdName
        	INNER JOIN clubtbl C
        		ON SC.clubName = SC.stdName
	ORDER BY S.stdName;

첫번째 INNER JOIN한 결과를 가지고 다시 두번째 INNER JOIN을 하게 되는 것

profile
ᕕ( ᐛ )ᕗ

0개의 댓글