본문 바로가기

컴퓨터/데이터베이스

2008년 9월 11일

*조인
1. 교차조인(cross join)
   1) ansi-sql
      select
      from 테이블명1 cross join 테이블명2
   2) 다른 방법
      select
      from 테이블명1, 테이블명2
2. 내부조인(inner join)=자연조인=등조인
   1) ansi-sql
      select
      from 테이블명1 [inner] join 테이블명2
           on (테이블명1.컬럼명=테이블명2.컬럼명)
           [inner] join 테이블명3 on (테이블명1.컬럼명=테이블명3.컬럼명)
      where 검색조건
   2) 다른 방법
      select
      from 테이블명1, 테이블명2, 테이블명3
      where 테이블명1.컬럼명=테이블명2.컬럼명
            and 테이블명1.컬럼명=테이블명3.컬럼명
            and 검색조건
3. 외부조인(outer join)
 3.1 좌외부조인(left outer join)
   1) ansi-sql
      select
      from 테이블명1 left [outer] join 테이블명2
           on (테이블명1.컬럼명=테이블명2.컬럼명)
      where 검색조건
   2) 다른 방법
      select
      from 테이블명1, 테이블명2
      where 테이블명1.컬럼명 *= 테이블명2.컬럼명
            and 검색조건
 3.2 우외부조인(right outer join)
 3.3 완전외부조인 (full outer join)
   1) ansi-sql
      select
      from 테이블명1 full [outer] join 테이블명2
           on (테이블명1.컬럼명=테이블명2.컬럼명)
      where 검색조건
   2) 다른 방법
      select
      from 테이블명1, 테이블명2
      where 테이블명1.컬럼명 *=* 테이블명2.컬럼명
            and 검색조건
4. 셀프 조인
   1) ansi-sql
      select
      from 테이블명1 별칭1 [inner] join 테이블명1 별칭2
           on (별칭1.컬럼명=별칭2.컬럼명)
      where 검색조건
   2) 다른 방법
      select
      from 테이블명1 별칭1, 테이블명1 별칭2
      where 별칭1.컬럼명=별칭2.컬럼명
            and 검색조건
p256 <실습9>
use sqldb2b
go
create table stdtbl
(stdname nvarchar(10) not null primary key,
 addr nchar(4) not null)
go
create table clubtbl
(clubname nvarchar(10) not null primary key,
 roomno nchar(4) not null)
go
create table stdclubtbl
(num int identity not null primary key,
 stdname nvarchar(10) not null
         foreign key references stdtbl(stdname),
 clubname nvarchar(10) not null
         foreign key references clubtbl(clubname))
insert into stdtbl values('박지성','서울')
insert into stdtbl values('박주영','경기')
insert into clubtbl values('수영','101호')
insert into clubtbl values('바둑','102호')
insert into clubtbl values('축구','103호')
insert into stdclubtbl values('박지성','바둑')
insert into stdclubtbl values('박지성','축구')
* identity: 자동으로 1부터 증가하는 값을 시스템이 입력하므로
            사용자가 명시적으로 값을 입력할 수 없다.
            identity_insert 환경변수를 on하면 사용자는 명시적으로
            컬럼명을 기술하고 값을 줄 수 있다.
set identity_insert stdclubtbl off
insert into stdclubtbl(num,stdname,clubname) values(12,'박지성','축구')
select * from stdclubtbl
delete from stdclubtbl where num in (11,12)
p257
2.동아리에 가입한 학생을 학생이름,주소,동아리이름,방번호가 나오도록 출력!
select s.stdname, addr,c.clubname,roomno
from stdtbl s join stdclubtbl sc on(s.stdname=sc.stdname)
     join clubtbl c on(sc.clubname=c.clubname)
p262 <실습10>
1.모든 학생의 동아리 가입현황을 보고자
  학생이름,주소,동아리이름,방번호가 나오도록 출력!
select s.stdname, addr,c.clubname,roomno
from stdtbl s left outer join stdclubtbl sc on(s.stdname=sc.stdname)
     left outer join clubtbl c on(sc.clubname=c.clubname)

select s.stdname, addr,c.clubname,roomno
from clubtbl c join stdclubtbl sc on (sc.clubname=c.clubname)
     right outer join stdtbl s on (s.stdname=sc.stdname)
2.모든 동아리의 학생 가입현황을 보고자
  학생이름,주소,동아리이름,방번호가 나오도록 출력!
select s.stdname, addr,c.clubname,roomno
from stdtbl s inner join stdclubtbl sc on(s.stdname=sc.stdname)
--            ----------
--inner join, left outer join, right outer join 모두 답이 같다.
     right outer join clubtbl c on(sc.clubname=c.clubname)

select s.stdname, addr,c.clubname,roomno
from clubtbl c left outer join stdclubtbl sc on (sc.clubname=c.clubname)
     left outer join stdtbl s on (s.stdname=sc.stdname)
3.모든 학생과 모든 동아리의 동아리 가입현황을 보고자
  학생이름,주소,동아리이름,방번호가 나오도록 출력!
select s.stdname, addr,c.clubname,roomno
from stdtbl s full outer join stdclubtbl sc on(s.stdname=sc.stdname)
--            ---------------left outer join이라고 해도 된다.
     full outer join clubtbl c on(sc.clubname=c.clubname)

select s.stdname, addr,c.clubname,roomno
-- outer join시는 기준으로 하는 테이블명을 컬럼명 앞에 써야 내용출력이 된다
from stdclubtbl sc right outer join clubtbl c on(sc.clubname=c.clubname)
     full outer join stdtbl s on (s.stdname=sc.stdname)