DEPTNO 는 EMP 와 DEPT 양쪽에 있다. 어느 테이블 것인지 밝히지 않으면 Oracle 이 고를 수 없다.
SELECT ENAME, DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
SELECT ENAME, DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO *ERROR at line 1:ORA-00918: DEPTNO: column ambiguously specified - appears in DEPT and EMP
ENAME 과 DNAME 은 한 테이블에만 있어 접두사 없이도 된다.
한쪽에만 있는 열이라도 접두사를 붙이면 읽기 쉽고, 나중에 같은 이름 열이 생겨도 깨지지 않는다.
조건을 하나씩 늘리면 테이블을 계속 이을 수 있다. 관리자(MANAGER)의 이름, 부서 이름, 급여 등급을 한 번에 본다.
SELECT E.ENAME, D.DNAME, S.GRADEFROM EMP E, DEPT D, SALGRADE SWHERE E.DEPTNO = D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL AND E.JOB = 'MANAGER'ORDER BY E.ENAME;
SELECT D.DNAME, E.ENAMEFROM EMP E, DEPT DWHERE E.DEPTNO(+) = D.DEPTNO AND E.SAL > 2900ORDER BY D.DNAME, E.ENAME;
DNAME ENAME-------------- ----------ACCOUNTING KINGRESEARCH FORDRESEARCH JONESRESEARCH SCOTT
E.SAL(+) > 2900: 급여 조건을 짝짓는 단계에 넣는다. 조건에 맞는 사원이 없는 SALES·OPERATIONS 도 NULL 과 함께 남는다.
E.SAL > 2900: 외부 조인으로 만든 NULL 행에 이 조건을 적용하면 NULL > 2900은 참이 아니라 떨어진다. 결과는 EQUI 조인과 같아진다.
⚠️ 함정: (+)는 한쪽에만 붙일 수 있다. E.DEPTNO(+) = D.DEPTNO(+)처럼 양쪽에 붙이면 ORA-01468(a predicate may reference only one outer-joined table) 오류다. 양쪽을 모두 남기는 FULL OUTER JOIN 은 내일 볼 ANSI 표기로만 쓸 수 있다.
내일은 같은 조인을 JOIN ... ON 같은 ANSI 표준 표기로 쓰고, ON 과 WHERE 의 차이를 본다.
카테시안 곱 : 조인 조건 없이 모든 행끼리 짝지은 결과. 행 수는 두 테이블 행 수의 곱이다.
테이블 별칭 : FROM 에서 테이블에 붙이는 짧은 이름. 붙이면 그 쿼리에서는 별칭으로만 부른다.
외부 조인 : 짝이 없는 행도 버리지 않고 반대편을 NULL 로 채워 남기는 조인.
(+) : Oracle 외부 조인 표기. NULL 로 채워질 쪽 열에 붙인다.
ORA-00918 : 여러 테이블에 있는 같은 이름의 열을 접두사 없이 썼을 때의 오류.
📝 연습 문제
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
EMP 는 14행, DEPT 는 4행이다. 다음 SQL 의 결과는?
```sql
SELECT COUNT(*) FROM EMP, DEPT;
```
문제 2
SALGRADE 는 1등급 700~1200, 2등급 1201~1400, 3등급 1401~2000, 4등급 2001~3000, 5등급 3001~9999 다. EMP 에서 급여가 2001~3000 인 사원은 JONES 2975, BLAKE 2850, CLARK 2450, SCOTT 3000, FORD 3000 이다. 다음 SQL 의 결과는?
```sql
SELECT COUNT(*) FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL AND S.GRADE = 4;
```
문제 3
다음 SQL 을 Oracle 에서 실행한 결과로 알맞은 것은?
```sql
SELECT ENAME, DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
```
문제 4
DEPT 에는 10·20·30·40번 부서가 있고, 40번 부서에는 사원이 없다. EMP 의 14명은 모두 10·20·30번 중 한 부서에 속한다. 다음 SQL 의 결과는?
```sql
SELECT COUNT(*) FROM EMP E, DEPT D WHERE E.DEPTNO(+) = D.DEPTNO;
```
문제 5
EMP 14행, DEPT 4행, SALGRADE 5행이다. 다음 SQL 의 결과는?
```sql
SELECT COUNT(*) FROM EMP E, DEPT D, SALGRADE S WHERE E.DEPTNO = D.DEPTNO;
```