JOIN, Sub Query를 사용한 여러 테이블 표시
1. JOIN 이란
- 서로 다른 두 개 이상의 테이블을 합칠 때 사용하는 구문
- 조건절에 두 테이블의 적절한 조회 조건식이 없다면 두 테이블 간의 모든 경우의 수의 행의 개수가 출력 됨
- 동일한 값으로 하는 조인을 Equijoin, 다른 값으로 하는 조인을 Nonequijoin이라 함
- 거의 대부분의 조인은 같은 값을 가지고 조인을 진행 하게 됨
예)
-> emp테이블에서 empno가 7788인 사원의 deptno의 부서 번호와 부서 명을 표시하는 SQL문
-- 아래 두 SQL문을 합치는 작업 필요
SELECT *
FROM emp
WHERE empno = 7788;
SELECT *
FROM dept
WHERE deptno = 20;
-- 실행은 되지만 원하는 결과가 아닌 다른 결과가 출력 됨
-- 4개 행의 결과가 출력 됨
SELECT *
FROM
emp, dept
WHERE
empno = 7788;
-- 2차원 구조의 표집합이 만들어 져야 하기 때문에,
-- emp테이블이 dept테이블에 대응되어서 출력 됨
-- 올바른 결과를 위한 SQL JOIN문
SELECT *
FROM
emp, dept
WHERE
empno = 7788
AND
emp.deptno = dept.deptno;
-- emp 테이블에서 empno가 7788인 값을 가져와서 dept테이블과 연결 시키는데,
-- emp 테이블의 deptno와 dept 테이블의 deptno가 동일한 값 즉, 20인 컬럼의 정보를
-- 합쳐서 출력 하라는 의미
2. ANSI-JOIN, ORACLE-JOIN
- ANSI-JOIN : 각 테이블을 JOIN 키워드로 구분 함
-> 서로 다른 DB(mysql, oracle-db, mssql등)에서 통상적으로 사용되는 SQL 명령어
-> Natural Join과 Outer Join이 있음
-> JOIN 내에서 조건 식은 WHERE대신 ON절을 이용
- ORACLE-JOIN : 각 테이블을 ,(콤마)로 구분 함
예)
->
-- ANSI-JOIN
SELECT *
FROM
emp JOIN dept
ON
emp.deptno = dept.deptno
WHERE
emp.empno = 7788;
-- 3가지 employees, departments, locations 테이블을 JOIN 시키기
-- ON절을 사용 할 때에는 한 번의 JOIN을 완료 하고 그 다음에 ON절을 다시 사용
SELECT *
FROM
employees E
JOIN departments D
ON E.department_id = D.department_id
JOIN locations L
ON D.location_id = L.location_id;
-- ORACLE-JOIN
SELECT *
FROM
emp, dept
WHERE
emp.deptno = dept.deptno
AND
emp.empno = 7788;
3. 모호한 열 이름 한정
- 테이블 접두어를 사용하여 여러 테이블에 있는 열 이름을 한정
- 테이블 접두어를 사용하여 성능을 향상 시킴
- 전체 테이블 이름 접두어 대신 테이블 Alias를 사용
- 테이블 Alias로 테이블에 짧은 이름을 지정
- 열 Alias를 사용하여 이름은 같지만 서로 다른 테이블에 상주하는 열을 구분
4. Natural Join 생성
- 두 테이블의 모든 행을 기반으로 진행
- 두 테이블에서 대응되는 모든 열의 값이 동일한 행을 선택 하여 출력
- 동일한 이름을 가진 열이 서로 다른 데이터 유형을 가지면 오류 반환
- 실제로 사용하지 않음
- 동일한 이름이 같은 컬럼이 중복 되면 원하지 않는 결과가 출력 됨
예)
->
-- 동일한 조건으로 JOIN을 진행하는 JOIN(Equijoin)
-- 동일한 컬럼의 명이 같은 것을 기중으로 JOIN
SELECT
*
FROM
emp
NATURAL JOIN
dept;
5. USING 절로 조인 생성
- 여러 열이 이름은 같지만 데이터 유형이 다른 경우 USING 절을 사용하여 Equijoin에 대한 열을 지정할 수 있음
- USING절을 사용하면 두 개 이상의 열이 일치하는 경우 하나의 열만 일치하도록 지정할 수 있음
- NATURAL JOIN과 USING절은 상호 배타적
- 암시적인 형 변환도 이루어 지기도 함
- Alias를 사용하여 조건절에서 접두어를 붙히면 에러 발생
- 실제로 사용하지 않음.
예)
-> 컬럼의 이름을 한정이어서 해당 컬럼 으로만 Equijoin 진행
-- USING
SELECT
*
FROM
employees E
JOIN
departments D
USING
(department_id);
6. ON절로 JOIN 생성
- Natural Join의 조인 조건은 기본적으로 이름이 같은 모든 컬럼의 Equijoin
- ON 절을 사용하여 임의 조건을 지정하거나 조인할 열을 지정 함
- 조인 조건은 다른 검색 조건과는 별개
- ON 절을 사용하면 코드를 이해하기 쉬움
예)
->
SELECT
e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM
employees e
JOIN
departments d
ON
(e.department_id = d.department_id);
7. Self JOIN
- FROM 절에서 테이블 명에 별칭을 주면 모든 SQL문에서는 그 별칭을 사용해야 함
- 동일한 테이블이라도 별칭만 다르게 주면 다른 테이블로 인식 시킬 수 있음
예)
->
-- 누가 누구의 메니저인지 확인하는 SQL문
SELECT
W.ename, M.ename
FROM
emp W
JOIN
emp M
ON
W.mgr = M.empno;
8. Nonequijoin
- 값이 다른 두 컬럼에 조건에 따른 조인을 시킬 수 있음
예)
->
-- emp 테이블의 sal에 따른 급여에 salgrade 테이블의 grade 조인 시키기
SELECT
E.ename, E.sal, S.grade
FROM
emp E JOIN salgrade S
ON
E.sal BETWEEN S.losal AND S.hisal;
-- JONES(ename)보다 sal이 더 큰 행만 출력
SELECT
*
FROM
emp a
JOIN
emp b
ON
b.ename = 'JONES'
AND
a.sal > b.sal;
'Database - Oracle DB > 1주차(Database - Oracle DB)' 카테고리의 다른 글
[SQL] DB 스터디 - 06 (0) | 2019.01.03 |
---|---|
[SQL] DB 스터디 - 05 (0) | 2019.01.03 |
[SQL] Advanced SQL - 기본적인 SELECT 명령문 작성 (0) | 2019.01.02 |
[SQL] DB스터디 - 03 (0) | 2018.12.28 |
[SQL] DB스터디 - 02 (0) | 2018.12.27 |