블로그 이미지
Gap85

calendar

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

Notice

Statistics Graph
2012.04.10 11:03 Programming/JDBC

● JOIN 이란? 

  - 하나의 데이터가 여러 테이블간의 참조 관계를 갖고 있을때 이를 합쳐서 하나의 쿼리문으로 조회를 하는 것.

<Join 전 address 테이블 생성>

CREATE table address (

zipcode char(7) primary key,

si varchar2(30) not null,

dong varchar2(30) not null)

<Join 전 외래키 설정>

-- customer table 에 address_id 컬럼 추가

alter table customer add(address_id char(7));

-- address_id 외래키 설정

alter table customer add

constraint customer_address_fk foreign key(address_id)

references address(zipcode); 

-- customer table에 address 컬럼이 fk로 설정되며 address 테이블에 zipcode를 참조

-- constraint 이름 제약조건(column)


※ 제약 조건들이 저장되는 테이블

select * from user_cons_columns;


-- address 테이블에 데이터 삽입

insert into address values('1111111','서울시','이태원동');

insert into address (zipcode,si,dong) values ('2222222','부산','우동')

insert into address values('3333333','서울시','대치동');

-- customer 테이블에 address_id 셋팅

update customer

set address_id='1111111'

where id in('id-1','id-2','id-5')


< JOIN >

-- join (두 select문을 합친다)

select * from customer 

where id = 'id-1'

                   +

select * from address

where zipcode = '1111111'

                   ∥

select id,name,age,tel,bloodtype,gender,zipcode,si,dong

from customer,address

where id='id-1'

and zipcode=address_id


 ※ 카티션곱 : 검색하고자 했던 데이터 뿐만 아니라 조인되서 사용된 테이블이 모두 리턴되 보이는 상태

select id,name,age,tel,bloodtype,gender,zipcode,si,dong

from customer,address

where id='id-1'

id-1의 데이터들이 나머지 zipcode와 붙어 나온다

    - 발생 요인 : ① 조인 조건을 정의 하지 않은 경우, 조인 조건이 잘못된 경우

                       ② 첫 번째 테이블의 모든 행들이 두 번째 테이블의 모든 행과 조인이 되는 경우

     - 해결방법 : 조인하는 테이블의 수 만큼 연산의 수를 늘려야 카티션곱이 발생 되지 않는다.

 ※  카티션곱 해결

select id,name,age,tel,bloodtype,gender,zipcode,si,dong

from customer,address

where id in('id-1', 'id-5')

and address_id = zipcode


 ■ Join의 종류

  Equi(내부) Join가장 일반적인 join 형태로 WHERE 절에 ' = '를 사용한다.

  Outer(외부) Join : 참조 값이 없는 행들도 보고 싶은 경우

   -- equi join

select id,name,age,tel,bloodtype,gender,zipcode,si,dong

from customer,address

where address_id = zipcode

zipcode가 없는 데이터들은 조회가 되지 않는다.

  -- outer join

select id,name,age,tel,bloodtype,gender,zipcode,si,dong

from customer,address

where address_id = zipcode(+)

zipcode가 없는 데이터들도 조회가 되었다.

 

  ※ 별칭을 부여하여 join 하게 되면 컬럼명의 중복을 피할 수 있다.

select c.id, c.name, c.age, c.tel, c.bloodtype, c.gender, a.zipcode, a.si, a.dong

from customer c ,address a     

where address_id = zipcode(+)

posted by Gap85