sql join

2015.06.08 17:53

소울 조회 수:5366

member 테이블 정보

id 

 passwd

 sex

age 

 hg

address 

abc1111

1111

m

20

101

경북 경산시 백천동 

abc1112

2222

m

22

101

 대구광역시 동구

abc1113

3333

w

14

102

 부산광역시 북구

abc1114

4444

w

30

104

 경북 영천시 시림동

 

테이블 생성

create table member id varchar(20) not null, passwd varchar(16) not null, sex char(1), age varchar(3),

                                hg char(3) not null, address varchar(100) );

 

                                          참고: 테이블 생성방법 http://kch1183.blog.me/50100276235

 

정보입력

insert into member values( 'abc1111', 1111, 'm', 20, 101, '경북 경산시 백천동' );

insert into member values( 'abc1112', 2222, 'm', 22, 101, '대구광역시 동구' );

insert into member values( 'abc1113', 3333, 'w', 24, 102, '부산광역시 북구' );

insert into member values( 'abc1114', 4444, 'w', 30, 104, '경북 영천시 시림동' );

         

                                         참고: 테이블 정보입력 방법 http://kch1183.blog.me/50100289490

 

subinfo 테이블 정보

subnum

subname 

profname 

101

컴퓨터공학과 

우용태 

102

디자인학과

문현정

103

전자공학과

김영지

104

간호사학과

이슬기

 

테이블 생성

create table subinfo subnum char(3), subname varchar(20), profname varchar(8) );

 

정보 입력

insert into subinfo values( 101, '컴퓨터공학과', '우용태' );

insert into subinfo values( 102, '디자인학과', '문현정' );

insert into subinfo values( 103, '전자공학과', '김영지' );

insert into subinfo values( 104, '간호사학과', '이슬기' );

 

 

문제 1) member테이블과 subinfo 테이블을 이용하여id, passwd, sex, age, address, subname, profname

          정보를 출력하시오.

 

member 테이블과 subinfo 테이블을  LEFT OUTER JOIN을 이용한 출력정보

id 

passwd 

sex 

age

address

subname

profname

abc1111

1111

m

20

경북 경산시 백천동

컴퓨터공학과 

우용태 

abc1112

2222

m

22

대구광역시 동구

컴퓨터공학과

우용태

abc1113

3333

w

24

부산광역시 북구 

디자인학과

문현정

abc1114

4444

w

30

경북 영천시 시림동

간호사학과

이슬기

 

조인(JOIN) 명령문

select member.id, member.passwd, member.sex, member.age, member.address, subinfo.subname, subinfo.profname

from member left outer join subinfo on member.hg = subinfo.subnum ;

 

                                              참고: 조인(JOIN) 명령문 사용방법 http://kch1183.blog.me/50100333015

 

문제 2) member테이블과 subinfo 테이블을 이용하여, 컴퓨터공학과 학생의 id, 성별, 나이, 학과이름, 담당교수

         정보를 출력하시오

 

member 테이블과 subinfo 테이블을  inner join을 이용한 출력정보

 id

sex

age

subname

profname

abc1111

m

20

컴퓨터공학과

우용태

abc1112

m

22

컴퓨터공학과

우용태

 

조인(JOIN) 명령문

select member.id, member.sex, member.age, subinfo.subname, subinfo.profname from member inner join subinfo on

                                                             member.hg subinfo.subnum where subinfo.subname = '컴퓨터공학과';


-------------------------------------



우선 조인(JOIN)에서 사용할 테이블 생성부터 하겠습니다.

 

mysql> create table a(a char(2), b char(2) );

 

a테이블을 생성하고 desc a;로 필드 형식을 확인합니다.


mysql> create table b(a char(2), c char(2) );

 

b테이블을 생성하고 desc b;로 필드 형식을 확인합니다.

 

 

두개의 테이블에 내용도 넣어보겠습니다.

 


우선 위의 그림처럼 a테이블에 내용을 넣습니다.

 

insert문을 다음과 같습니다. 

mysql> insert into a values(1, 'a');


mysql> insert into a values(2, 'b');


mysql> insert into a values(3, 'c');


내용을 저장한 뒤, 확인을 합니다.

mysql> select * from a;

 

 

 


 b테이블 역시 내용을 넣습니다.

 

insert문을 다음과 같습니다. 

mysql> insert into a values(2, 'b');


mysql> insert into a values(3, 'e');


내용을 저장한 뒤, 확인을 합니다.

mysql> select * from b;


 

1. INNER JOIN

 

INNER JOIN의 형식은 다음과 같습니다.

 

select [테이블명].[필드명][테이블명].[필드명], ... from [테이블명] inner join

                                                                      [테이블명] where [조건절];

 

JOIN에서는 필드명 앞에 위의 형식과 같이 테이블명으로 별칭을 붙이게됩니다. 이유는 여러개의 테이블을

이용하기 때문에, 필드명이 같은 부분은 테이블명으로 별칭 구분하기 위해서입니다.

조건절 역시 테이블명으로 별칭을 사용합니다.

 

 

a테이블과 b테이블을 이용하여, inner join을 해 보겠습니다.


mysql> select a.a, a.b, b.c from inner join where a.a=b.a;


 
앞장에서 말 했듯이 INNER JOIN은 테이블간의 교집합입니다. 즉, 두 테이블간에 같은 값만을 불러와 출력합니다.

 

예) A 테이블 [a] [b]        B 테이블 [a] [c]

                  1    a                      2    b

                  2    b                      3   e

                     c

 

조건을 a테이블의 a값과 b테이블의 a 값이 같은 정보를 출력하려고 합니다.

그럼으로, a테이블의 a값과 b테이블의 a 값이 같은 정보는 필드명 a에서 2, 3이 됨으로,

첫번째 그림과 같은 출력값이 나타나게됩니다.

 

 2. LEFT OUTER JOIN

 

LEFT OUTER JOIN의 형식은 다음과 같습니다.

 

select [테이블명].[필드명][테이블명].[필드명], ... from [테이블명] LEFT OUTER

                                                JOIN [테이블명] on [조건절];

 

 

mysql> select a.a, a.b, b.c from left outer join on a.a=b.a;

 

예) A 테이블 [a] [b]        B 테이블 [a] [c]

                  1    a                      null  null     <------  실제로는 없는 공간입니다. 이해를 돕기위해

                  2    b                        2    b                    임의로 null값으로 표현한 것입니다.

                     c                        3    e

 

A 테이블과 B 테이블의 정보를 하나의 정보로 불러오기위해

a, b, c의 필드명을 입력했고, 조건을 A 테이블과 B 테이블의 연결고리인 A 테이블의 a와

B 테이블의 a로 조건을 걸었습니다.

 

앞장에서 말 했듯이 LEFT  OUTER JOIN은 왼쪽테이블을 우선으로 불러들이고, 그다음 b 테이블과 비교해서 같은값은

그대로 적용하고, 서로 다른 값은 A테이블의 정보를 적용합니다. 양쪽 다 정보가 없을 땐 NULL로 표시하게 됩니다.

즉 위의 예를 보면 A테이블과 B테이블의 c에 대한 정보값이 없음으로, null로 표현이됩니다.

 

 

3. RIGHT OUTER JOIN

 

RIGHT OUTER JOIN의 형식은 다음과 같습니다.

 

select A.[필드명]B.[필드명], ... from [테이블명] RIGHTOUTER JOIN [테이블명] 

                                                                                                 on [조건절];

 


 

mysql> select a.a, a.b, b.c from rightouter join on a.a=b.a;


예) A 테이블 [a] [b]        B 테이블 [a] [c]

                  1    a                       2    b

                  2    b                       3    e

                     c

 

RIGHT OUTER JOIN은 오른쪽 테이블을 우선으로 불러들이고, A테이블과 비교하여, 같은값은 그대로 넘어오고,

다른 값은 오른쪽 테이블을 우선으로 불러들이게 됩니다. A테이블의 1, a를 불러들이지 않는 이유는 

B 테이블에서는 1, a의 정보가 없어서 서로 비교를 하지 않기 때문입니다.

 

OUTER JOIN은 정확한 정보가 있는 테이블을 우선으로해서 비교 출력하기 때문에, LEFT와 RIGHT 같은 

방향성이 있는 것입니다.


[출처] MYSQL 조인(JOIN) 활용|작성자 KCH

번호 제목 글쓴이 날짜 조회 수
89 mysql status 설명 소울 2016.09.12 4556
88 CREATE TABLE 구문 보기 / 테이블 / 컬럼 정보보기 소울 2016.06.20 4057
87 mysql my.cnf - character-set-client-handshake = FALSE 소울 2016.05.12 4422
86 rename 소울 2016.01.19 5070
85 delete 소울 2016.01.19 4802
84 MariaDB YUM Repository 소울 2015.07.22 5877
83 SORT_BUFFER_SIZE 조절 명령 소울 2015.07.08 7070
» sql join 소울 2015.06.08 5366
81 DISTINCT (중복제거) 소울 2015.06.08 6570
80 DDL/DML/DCL 소울 2015.04.23 6830
79 테이블 복사 소울 2015.01.06 6739
78 mysql 엔진 간단설명 소울 2014.09.19 6902
77 back_log 소울 2014.08.18 7266
76 mysql my.cnf 간단튜닝 옵션들 소울 2014.07.08 7782
75 skip-name-resolve 소울 2014.07.04 6693
74 skip-networking 소울 2014.07.04 8223
73 이노디비 my.cnf 기본옵션 소울 2014.06.27 7108
72 리플리케이션시 해당디비만 리플리케이션 소울 2014.06.27 6721
71 db 재생성 소울 2014.06.27 7146
70 mysqldump 옵션추가 소울 2014.06.27 6811