3. 비등가 조인 .(non equi join)
: 조인 컬럼의 조건이 = 이 아닌 조인
예시 : 고객테이블과 상품테이블을 이용하여, 고객의 포인트로 받을 수 있는 상품을 조회하기.
고객의 이름, 포인트, 상품명을 조회하기.
-- 오라클 방식
select g1.gname, g1.point, g2.gname
from gogak g1,gift g2
where g1.point between g2.g_start and g2.g_end;
-- ansi 방식
select g1.gname, g1.point, g2.gname
from gogak g1 join gift g2
on g1.point between g2.g_start and g2.g_end;
문제 :
1. 학생의 이름, 점수, 학점 조회하기.
-- 오라클 방식
select s.name,e.total,h.grade
from student s,exam_01 e,hakjum h
where s.studno = e.studno
and e.total between h.min_point and max_point
order by 2 desc;
-- ansi 방식
select s.name,e.total,h.grade
from student s join exam_01 e on s.studno = e.studno
join hakjum h on e.total between h.min_point and max_point
order by 2 desc;
문제 :
2. 고객이 자기 포인트보다 낮은 포인트 상품 중 한가지를 선택 할 수 있다고 할때,
산악용 자전거를 선택할 수 있는 고객명,포인트,상품명을 조회하기.
-- 오라클 방식
select g1.gname,g1.point,g2.gname
from gogak g1, gift g2
where g1.point >= g2.g_start
and g2.gname = '산악용자전거';
-- ansi 방식
select g1.gname,g1.point,g2.gname
from gogak g1 join gift g2
on g1.point >= g2.g_start
where g2.gname = '산악용자전거';
문제 :
3. 고객이 자기 포인트보다 낮은 포인트 상품 중 한가지를 선택 할 수 있다고 할때,
고객이 선택할 수 있는 상품의 갯수 출력하기. 고객명과 선택가능한 상품 갯수 출력하기.
select g1.gname,g1.point,g2.gname
from gogak g1, gift g2
where g1.point >= g2.g_start
order by 1
select g1.gname 고객명, count(*) 선택가능한상품갯수
from gogak g1, gift g2
where g1.point >= g2.g_start
group by g1.gname
order by 1
4. outer join
: 조인 조건을 만족하지 않아도 한쪽 테이블의 모든 정보를 조회.
1) left outer join
: 조건이 맞지 않아도 왼쪽 테이블의 모든 정보를 조회 (위치를 가지고 만듬.)
-- 오라클 방식 : join컬럼을 할때 오른쪽에(+) 표시함
-- ansi방식 : 테이블 join시 left outer join 명시
2) right outer join
: 조건이 맞지 않아도 오른쪽 테이블의 모든 정보를 조회
-- 오라클 방식 : join컬럼을 할때 왼쪽에(+) 표시함
-- ansi방식 : 테이블 join시 right outer join 명시
3) full outer join
: 양쪽 테이블의 모든 정보를 조회
-- 오라클 방식 : left outer join 과 right outer join을 union 함
-- ansi방식 : 테이블 join시 full outer join 명시
예시 : 학생의 이름과 지도교수의 이름을 조회하기. 단 지도교수가 없는 학생도 조회하기.
1)left outer join
-- 오라클 방식
select s.name,p.name from student s, professor p
where s.profno = p.profno(+);
-- ansi방식
select s.name,p.name from student s left outer join professor p
on s.profno = p.profno;
2)right outer join
-- 오라클 방식
select s.name,p.name from student s, professor p
where s.profno(+) = p.profno;
-- ansi 방식
select s.name,p.name from student s right outer join professor p
on s.profno = p.profno;
3)full outer join
--오라클 방식 조인 오류 발생 => union 방식 이용
select s.name,p.name from student s, professor p
where s.profno = p.profno(+)
union
select s.name,p.name from student s, professor p
where s.profno(+) = p.profno
-- ansi 방식
select s.name,p.name from student s full outer join professor p
on s.profno = p.profno;
문제 : 교수별로 교수이름과 지도학생수를 출력하기. 지도학생이 없는 교수도 조회하도록 하기.
--오라클 방식 조인
select p.name,count(s.profno+nvl(s.profno,0))지도학생수
from student s,professor p
where p.profno =s.profno(+)
group by p.name
order by 1
--오라클 방식 조인
select p.name,count(s.name)지도학생수
from student s,professor p
where p.profno =s.profno(+)
group by p.name
order by 1
--ansi 방식
select p.name,count(s.profno+nvl(s.profno,0))지도학생수
from student s right outer join professor p
on p.profno =s.profno
group by p.name
order by 1
--ansi 방식
select p.name,count(s.name)지도학생수
from student s right outer join professor p
on p.profno =s.profno(+)
group by p.name
order by 1
4)self join
: join되는 테이블의 같은 경우
: 같은 테이블의 다른 컬럼을 join컬럼으로 설정함.
: 테이블 이름에 반드시 별명을 설정해야 함.
: 조회되는 모든 컬럼에 별명을 붙여야 함.
예시 : dept2 테이블에서 부서코드(dcde), 부서명(dname), 상위부서코드(pdept),
상위부서명을 출력.
-- 오라클 방식
select d1.dcode 부서코드,d1.dname 부서명, d1.pdept 상위부서코드,d2.dname 상위부서명
from dept2 d1, dept2 d2
where d1.pdept= d2.dcode
order by 1
-- ansi 방식
select d1.dcode 부서코드,d1.dname 부서명, d1.pdept 상위부서코드,d2.dname 상위부서명
from dept2 d1 join dept2 d2
on d1.pdept= d2.dcode
order by 1
문제 :
1. dept2 테이블에서 부서코드(dcde), 부서명(dname), 상위부서코드(pdept), 상위부서명을 출력.
모든 부서가 조회하기.
-- 오라클 방식
select d1.dcode 부서코드,d1.dname 부서명, d1.pdept 상위부서코드,d2.dname 상위부서명
from dept2 d1, dept2 d2
where d1.pdept= d2.dcode(+)
order by 1
-- ansi 방식
select d1.dcode 부서코드,d1.dname 부서명, d1.pdept 상위부서코드,d2.dname 상위부서명
from dept2 d1 left outer join dept2 d2
on d1.pdept= d2.dcode
order by 1
문제 :
2. dept2 테이블에서 상위부서명,하위부서의 갯수 출력. 모든 부서가 조회하기.
-- 오라클 방식
select d2.dname 상위부서명,count(d1.dcode) 하위부서수
from dept2 d1, dept2 d2
where d1.pdept(+) = d2.dcode
group by d2.dname
order by 2 desc
-- ansi 방식
select d2.dname 상위부서명,count(d1.dcode) 하위부서수
from dept2 d1 right outer join dept2 d2
on d1.pdept = d2.dcode
group by d2.dname
order by 2 desc
'수업(국비지원) > Oracle' 카테고리의 다른 글
| [Oracle] SQL 명령어들 - DML (insert, update, delete) (0) | 2023.04.14 |
|---|---|
| [Oracle] Sub Query (0) | 2023.04.14 |
| [Oracle] 카티션곱(cross join), 등가 조인(equi jion) (0) | 2023.04.14 |
| [Oracle] SQL 복수행 함수(그룹함수) - rownum, rowid 오라클 예약어 (0) | 2023.04.14 |
| [Oracle] SQL 복수행 함수(그룹함수) - having, group by (0) | 2023.04.14 |