[SQL]JOIN 명령어 및 실습1(CROSS JOIN, EQUAL JOIN)

건너별·2021년 11월 23일
0

SQL

목록 보기
9/14

지난 groupby 실습에서 사용된 haksa_db 데이터베이스를 이용해서 실습이 진행됩니다.

JOIN이란

  • 두 테이블 연결 또는 결합하여 데이터 출력
  • 일반적인 경우 PRIMARY KEY(PK) 나 FOREIGN KEY(FK) 값의 연관에 의해 JOIN이 성립


[https://opentutorials.org/course/195/1409]

1. INNER JOIN : 겹치는 값만 선택! 데이터가 없는 쪽에 맞춘다.
2. OUTER JOIN : 한쪽에는 있고, 한쪽에는 없는경우, 데이터가 있는 쪽에 맞춘다.

- LEFT OUTER JOIN : A를 기준으로 B도 가져옴. B 테이블에 A 테이블과 같은 값이 없으면 NULL로 채워 반환
- RIGHT OUTER JOIN : 반대
- FULL OUTER JOIN : 두 테이블 모든 값을 반환한다. 중복되는 데이터는 삭제한다. 

JOIN의 종류

1. CROSS JOIN (where 활용되기도)

  • 가장 간단한 방법

  • 통합된 모든 행을 출력하고 중복되는 행은 제거

  • 모든 행을 가져오기 때문에 정규화된 DB에서는 사용 잘 안함

  • 반환 행 수 : (A table 행 수) * (B table 행 수)

1) student 테이블과 score 테이블을 cross join 하여 stu_no, stu_name , sco_year , sco_term 을 출력하라.

select s.stu_no, s.stu_name, sc.sco_year, sc.sco_term from student s inner join score sc;

## 또는!
select s.stu_no, s.stu_name, sc.sco_year, sc.sco_term from student s, score sc;

2) student 테이블과 score 테이블을 cross join 하여 stu_no, stu_name, sco_year, sco_term 을 출력하라. (단, student 테이블에 존재하는 "20061011" 학생만을 출력하라)

## on, inner join 사용
select s.stu_no, s.stu_name, sc.sco_year, sc.sco_term from student s inner join score sc **on** s.stu_no = '20061011';

## where, inner join 사용
select s.stu_no, s.stu_name, sc.sco_year, sc.sco_term from student s inner join score sc **where** s.stu_no = '20061011';

## where 만 사용
select s.stu_no, s.stu_name, sc.sco_year, sc.sco_term from student s, score sc where s.stu_no = '20061011';

WHERE VS ON

  • ON : JOIN 을 하기 전 필터링을 한다 (=ON 조건으로 필터링이 된 레코들간 JOIN이 이뤄진다)
  • WHERE : JOIN 을 한 후 필터링을 한다 (=JOIN을 한 결과에서 WHERE 조건절로 필터링이 이뤄진다)

2. Equal join : where {}={} and {}={} ...

1) student 테이블에 존재하는 학생들 중에서 등록한 학생의 학번(stu_no), 이름(stu_name), 반(class), 등록년도(fee_year), 학기(fee_term), 등록금 총액(fee_pay)를 출력하라.

select s.stu_no, s.stu_name, s.class, f.fee_year, f.fee_term, f.fee_pay from student s, fee f where s.stu_no=f.stu_no; 

WHERE절의 조건 연산자가 = 인 경우에 FROM 절에 나오는 STUDENT 테이블의 모집단이 FEE 테이블의 모집단을 전부 포함하고 있다면 INNER EQUI JOIN 이라고 한다. 만약 FEE 테이블의 모집단이 STUDENT 의 모집단을 포함하고 있다면 OUTER EQUI JOIN 이라고 한다.

  1. 재학생이면서 attend테이블에 존재하는 학생의 학번(stu_no), 이름(stu_name), 수강신청년도(att_year), 학기(att_term), 과목코드(sub_code), 과목명(sub_name), 교수코드(prof_code), 교수명(prof_name) 를 출력하라. ( 출력 순서는 학번, 수강년도, 수강학기, 수강코드순이다.)
select s.stu_no, s.stu_name, a.att_year,a.att_term, a.sub_code, su.sub_name, a.prof_code, p.prof_name
from student s, attend a, subject su, professor p
where s.stu_no=a.stu_no and a.sub_code=su.sub_code and a.prof_code=p.prof_code
order by s.stu_no, a.att_year, a.att_term, a.sub_code; 

다음 시간에는 OUTER JOIN과 그 명령어를 활용힌 실습을 진행해 볼게요!

profile
romantic ai developer

0개의 댓글