Data Base_Oracle/SQL
SQL_Join 개요 & Cross Join
pathas
2020. 1. 6. 21:51
JOIN
두 개 이상의 테이블에서 원하는 데이터들을
중복된 데이터가 없도록 조회하는 방법
JOIN 종류
종류 | 설명 |
---|---|
inner join | 검색하고자 하는 두 테이블의 레코드 총량이 비슷할 때 사용 주로 많이 사용됨 |
equi join | inner join에 포함되며, 연관된 테이블에 동일한 칼럼이 있을 때 사용 |
self join | inner join에 포함되며, 자기 자신의 table 내의 필드를 참조해서 데이터를 조회할 때 사용 |
non-equi join | 조회하려는 테이블 간에 동일한 칼럼이 없을 때 사용 |
outer join | 두 테이블의 레코드 총량이 비대칭일 때 사용 |
cross join | 조회하려는 복수의 테이블 내 필드들을 단순히 나열 |
ansi join | 표준 SQL인 Ansi를 이용한 Join으로 Inner/Outer Join이 있음 |
Cross Join
보고자 하는 필드들을 단순히 나열하는 것
§ 형식
[ SQL> select 필드명1, 필드명2,,,,
from 테이블명1, 테이블명2,,,, ]
# 예제
▷ ALLEN의 부서명을 조회, emp테이블에서는 확인할 수 없음 (부서명 필드 X)
dept테이블(부서 : 부서번호, 부서이름, 위치)을 조회해야 함
▶ [ SQL> select ename, dname from emp, dept where ename=upper('allen'); ]
# 에러
▷ ALLEN의 부서명을 조회, emp테이블에서는 확인할 수 없음 (부서명 필드 X)
dept테이블(부서 : 부서번호, 부서이름, 위치)을 조회해야 함
사원번호, 이름, 부서번호, 부서이름, 위치를 조회
▶ [ SQL> select empno, ename, deptno, dname, loc from emp, dept;
1행에 오류:ORA-00918: 열의 정의가 애매합니다 ]
※ 'deptno'가 emp테이블과 dept테이블에 모두 있기 때문에 발생하는 에러
∴ 테이블명.공통필드 로 명확하게 필드를 지정해야 함
# 풀이
▶▶ [ SQL> select empno, ename, emp.deptno, dname, loc from emp, dept
where ename=upper('allen'); ]
EMPNO | ENAME | DEPTNO | DNAME | LOC |
---|---|---|---|---|
7499 | ALLEN | 30 | ACCOUNTING | NEW YORK |
7499 | ALLEN | 30 | OPERATIONS | BOSTON |
7499 | ALLEN | 30 | SALES | CHICAGO |
7499 | ALLEN | 30 | RESEARCH | DALLAS |
# 단점
중복된 데이터가 많아짐 → 찾고자하는 데이터를 검색하기 어려움
Cross Join은 중복된 데이터가 많아서 원하는 데이터를 정확하게 조회한 결과라고 할 수 없습니다.