Upload
hoyoung-jung
View
619
Download
6
Embed Size (px)
DESCRIPTION
MySQL JOIN
Citation preview
데이터베이스개론
ALTER, FOREIGN KEY, JOIN
NHN NEXT 정호영
나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.
목표
- ALTER 명령을사용할 수 있다.
- 테이블에외래키제약조건을추가할수 있다.
-여러가지 JOIN에 대해 이해한다.
테이블을만들어 봅시다.
user
name (varCHAR 32) money (dec 10,2)
CREATE TABLE user (name VARCHAR(32),money DEC(10,2)
);
uid CHAR(8)을 추가해 봅시다.
user
uid (CHAR 8) name (VARCHAR 32) money (DEC 10,2) score (INT)
DROP TABLE IF EXISTS user;CREATE TABLE user (
uid CHAR(8),name VARCHAR(32),money DEC(10,2),score INT
);
테이블을삭제하지않고 스키마를변경하고싶다면?
ALTER 명령으로테이블 스키마를변경할수 있습니다.
user
uid (CHAR 8) name (VARCHAR 32) money (INT) score (INT)
DROP TABLE IF EXISTS user;CREATE TABLE user (
name VARCHAR(32),money INT,score INT
);
ALTER TABLE userADD COLUMN uid CHAR(8) FIRST;
추가적인 ALTER 명령들을 실행해봅시다.
-- ALTER TABLE user-- ADD COLUMN uid CHAR(8) first;ALTER TABLE user
ADD COLUMN birth date AFTER name;ALTER TABLE user
ADD PRIMARY KEY (uid);ALTER TABLE user
DROP COLUMN score;ALTER TABLE user
CHANGE COLUMN money money dec(10,2);ALTER TABLE user
DROP COLUMN score;
테이블을하나 더 추가합니다.
CREATE TABLE trade(tid INT,item VARCHAR(32),price DEC(10,2),seller_id (CHAR),PRIMARY KEY(tid)
);
trade
tid (int) item (varCHAR 32) price (dec 10, 2) seller_id (CHAR 8)
외래키에대해 외래키제약조건을추가해봅시다.
ALTER TABLE tradeADD FOREIGN KEY (seller_id) REFERENCES user(uid);
trade
tid (int) item (varCHAR 32) price (dec 10, 2) seller_id (CHAR 8)
user
uid (CHAR 8) name (VARCHAR 32) money (INT) score (INT)
처음부터외래키 컬럼을지정할수도 있습니다.
trade
tid (int) item (varCHAR 32) price (dec 10, 2) seller_id (CHAR 8)
user
uid (CHAR 8) name (VARCHAR 32) money (INT) score (INT)
CREATE TABLE trade(tid INT,item VARCHAR(32),price DEC(10,2),seller_id (CHAR),PRIMARY KEY(tid),FOREIGN KEY(seller_id) REFERENCES user(uid)
);
외래키제약조건을삭제하려면?
SHOW CREATE TABLE trade\G
ALTER TABLE tradeDROP FOREIGN_KEY 'trade_ibfk_1';
오늘의실습 테이블 만들기
팁: db 백업하기
$ mysqldump -u popi -p popidb > backup.sql
스크립트로부터직접 넣기
$ mysql -u popi -p popidb < backup.sql
JOIN
두 테이블을합쳐서하나로 보여주는기능
* 참고: 유니온이란?
유니온 = 합집합
조인
유니온 : 속성들의순서와자료형이같을 때만 가능
JOIN =
UNION =
유니온(Union)
학생과교수의 이름을출력하세요.
SELECT name FROM stuUNIONSELECT name FROM prof
SELECT name FROM stuUNIONSELECT name FROM prof
카테시안곱
이름의유래? René Descartes = Renatus Cartesius
크로스조인(Cross Join)
크로스조인
= 두 테이블의카테시안곱
SELECT * FROM stuCROSS JOIN prof;
크로스조인에 WHERE 문을추가해 봅시다.
학생과지도 교수 정보를출력하세요.
SELECT * FROM stuCROSS JOIN profWHERE stu.pid = prof.pid;
내부 조인(Inner Join)
내부 조인
= 크로스조인 + 조건필터링
INNER 는 생략가능
SELECT * FROM stuINNER JOIN profON stu.pid = prof.pid;
그런데사라진 정보가있습니다.
SELECT * FROM stuINNER JOIN profON stu.pid = prof.pid;
조인의형식
INNER JOIN 중에서
가장 많이사용하는 ‘=’을 조인조건으로사용하는경우
동등 조인(EQI – JOIN)이라고 합니다.
SELECT 컬럼이름,...FROM 테이블이름[INNER] JOIN 조인 테이블ON 조인조건;
세타 조인
내부 조인중 동등 조인을제외한 나머지들
"지도교수가구승모가아닌 학생의정보를 보여주세요."
SELECT * FROM stu sJOIN prof pON s.pid <> p.pidWHERE p.name = '구승모';
여러 테이블조인
JOIN도 닫힌연산이라 여러번 조인이됩니다.
1번학생이 듣고있는 수업과담당 교수 이름을표시해보세요.
여러 테이블조인
1번 학생의 이름, 수강 수업명, 강의교수 이름을 표시해 보세요.
SELECTs.id, s.name as sname, c.name as cname, p.name as pname
FROM stu sJOIN sugang gON s.id = g.uidJOIN class cON g.cid = c.cidJOIN prof pON c.pid = p.pidWHERE s.id = 1;
외부 조인(Outer Join)
내부 조인을 할 때 조인 조건에 맞지 않는 레코드가 사라집니다.
사라진레코드를 보려면외부 조인을사용합니다.
외부 조인에는 LEFT, RIGHT, FULL 의 3종류가있습니다.
MySQL은 FULL OUTER JOIN을 지원하지않습니다.
Left Join
왼쪽 테이블의조건에맞지 않는레코드도 보여줍니다.
SELECT * FROM stu sLEFT JOIN prof pON s.pid = p.pid;
Right Join
오른쪽테이블의 레코드를보여줍니다.
INSERT INTO prof values(3, '정호영');SELECT *
FROM stu sRIGHT JOIN prof pON s.pid = p.pid;
Full Outer Join
양쪽 다 보여줘야하는데 MySQL에 없습니다.
어떻게해야 할까요?
THANK YOU!!!