MySQL DBMS는 관계형 데이터베이스
중복과 공간의 낭비를 피하고 데이터 무결성을 위해서 여러 개의 테이블에 데이터를 나누어서 저장합니다.
분리된 테이블은 서로 Relation을 가지고 있다!
Jonin은 크게 2가지로 나누어 진다.
SELECT <열목록>
FROM <첫번째 테이블>
INNER JOIN <두번째 테이블>
ON <조인 조건>
WHERE <검색조건>
GROUP BY
HAVING
ORDER BY
-- 다음과 같이 구성된다! 참고하고 사용하도록 하자 --
- 모호한 표현은 사용하면 안됨! 똑같은 컬럼명이 2개이상 있을때 반드시 테이블명도 같이 명시해야함!
SELECT * FROM buyTBL INNER JOIN userTBL ON buyTBL.userID = userTBL.userID WHERE buyTBL.userID = 'JYP'; SELECT * FROM buyTBL INNER JOIN userTBL ON buyTBL.userID = userTBL.userID WHERE productName = '운동화';
- 필요한 컬럼만 추출
SELECT buyTBL.userID, buyTBL.productName, userTBL.userName, userTBL.userHeight FROM buyTBL INNER JOIN userTBL ON buyTBL.userID = userTBL.userID; -- 너무 길기 때문에 Table이름에 alias를 사용하면 좋다! SELECT B.userID, B.productName, U.userName, U.userHeight FROM buyTBL B INNER JOIN userTBL U ON B.userID = U.userID;
- 예제를 위한테이블 생성과 데이터 입력
CREATE TABLE stdTBL ( stdName VARCHAR(10) PRIMARY KEY, -- 학생 이름 stdAddr VARCHAR(4) NOT NULL -- 학생 주소 ); -- 동아리테이블 생성(clubTBL) CREATE TABLE clubTBL ( clubName VARCHAR(10) PRIMARY KEY, -- 동아리 이름 clubRoom VARCHAR(4) NOT NULL -- 동아리 방 번호 ); -- 학생동아리 테이블 생성(stdclubTBL) CREATE TABLE stdclubTBL ( num INT AUTO_INCREMENT PRIMARY KEY, -- 일련번호 stdName VARCHAR(10) NOT NULL, clubName VARCHAR(10) NOT NULL, FOREIGN KEY(stdName) REFERENCES stdTBL(stdName), FOREIGN KEY(clubName) REFERENCES clubTBL(clubName) ); -- 데이터를 입력해야 해요!( 순서에 조심해서 입력해야 해요! ) INSERT INTO stdTBL VALUES ('김범수','경남'); INSERT INTO stdTBL VALUES ('성시경','서울'); INSERT INTO stdTBL VALUES ('조용필','경기'); INSERT INTO stdTBL VALUES ('은지원','경북'); INSERT INTO stdTBL VALUES ('바비킴','서울'); SELECT * FROM stdTBL; INSERT INTO clubTBL VALUES ('수영','101호'); INSERT INTO clubTBL VALUES ('바둑','102호'); INSERT INTO clubTBL VALUES ('축구','103호'); INSERT INTO clubTBL VALUES ('봉사','104호'); SELECT * FROM clubTBL; INSERT INTO stdclubTBL VALUES (NULL, '김범수','바둑'); INSERT INTO stdclubTBL VALUES (NULL, '김범수','축구'); INSERT INTO stdclubTBL VALUES (NULL, '조용필','축구'); INSERT INTO stdclubTBL VALUES (NULL, '은지원','축구'); INSERT INTO stdclubTBL VALUES (NULL, '은지원','봉사'); INSERT INTO stdclubTBL VALUES (NULL, '바비킴','봉사'); SELECT * FROM stdclubTBL;
- 학생을 기준으로 학생이름, 지역, 가입한 동아리, 동아리방을 출력
SELECT S.stdName, S.stdAddr, SC.clubName, C.clubRoom FROM stdTBL S INNER JOIN stdclubTBL SC ON S.stdName = SC.stdName INNER JOIN clubTBL C ON SC.clubName = C.clubName;
- 동아리를 기준으로 가입한 학생의 목록을 출력
-- clubName, clubRoom, stdName, stdAddr SELECT C.clubName, C.clubRoom, SC.stdName, S.stdAddr FROM stdTBL S INNER JOIN stdclubTBL SC ON C.clubName = SC.clubName INNER JOIN stdTBL S ON SC.stdName = S.stdName;
SELECT <컬럼>
FROM <왼쪽(LEFT) 테이블>
<LEFT|RIGHT|FULL> OUTER JOIN <두번째 테이블(오른쪽 테이블)>
ON <조인 조건>
-- OUTER JOIN은 INNER JOIN에 포함되지 못한 데이터를 포함해주는 기능.
- 전체회원의 구매내역을 조회하세요. 단, 구매 기록이 없는 회원도 출력하세요
SELECT * FROM userTBL U LEFT OUTER JOIN buyTBL B ON U.userID = B.userID ORDER BY U.userID;
- 한번도 구매한 적이 없는 회원의 목록을 출력하세요
SELECT * FROM userTBL U LEFT OUTER JOIN buyTBL B ON U.userID = B.userID WHERE B.productName IS NULL -- = 기호를 사용하면 안되요! ORDER BY U.userID; -- NULL은 특수한 의미를 가지는 값. -- = 기호로 비교할 수없어요! -- 그렇기 때문에 IS키워드를 이용한다.
UNION의 기본 조건은.. 컬럼의 개수가 같아야해요!
즉, 컬럼의 개수가 같고 데이터 타입이 같아야해요!
형식
(SELECT stdName, stdAddr
FROM stdTBL)
UNION
(SELECT clubName
FROM clubTBL);
- 그러면 UNION과 UNION ALL은 무슨 차이가 있나여?
- UNION은 중복을 배제하고 합침!
- UNION ALL은 중복에 상관없이 무조건 합쳐요!
- usertbl에 대해
모든 회원을 조회하되 전화가 없는 사람을 제외하고 출력하세요!SELECT * FROM userTBL; -- 이렇게 하면 되네!! SELECT * FROM userTBL WHERE mobile1 IS NOT NULL; -- 다른 방법을 알아보아요! SELECT userID, userName, CONCAT(mobile1,mobile2) FROM userTBL WHERE userName NOT IN ( SELECT userName FROM userTBL WHERE mobile1 IS NULL );