혼공 SQL(Oracle) - JOIN

Jobmania·2023년 2월 7일
0

SQL 잘쓰기

목록 보기
4/16
post-thumbnail

Join 이란?

  • 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법 이다.

  • 보통 둘 이상의 행들의 공통된 값 기본키(Primary Key) 및 외래키(Foreign Key) 값을 사용하여 조인

  • 두 개의 테이블을 SELECT문장 안에서 조인 하려면 적어도 하나의 컬럼이 그 두 테이블 사이에서 공유 되어야 한다.

Join 방법과 방식

  • 조인의 방법 : Equi Join (동등조인) , Non-Equi Join(비동등조인) , Self Join(자체조인) , Outer Join(외부조인)

조인(JOIN) 구문 형태
※ 조인 문법은 명시적 표현법과 묵시적 표현법이 있습니다.

A )명시적 표현법은 명시적으로 어떤 조인을 사용할 것인지, ON키워드로 어떤 구문을 조인할 것인지 지정해줍니다.
SELECT table1.colum1[,table2.colum2...]
FROM table1 JOIN table2
ON table1.column1 = talbe2.column2;
[ USING (column) ]

B )묵시적 표현법은 SELECT 절의 FROM 구문에서 단순히 ,(콤마)를 사용하여 조인을 할 여러 테이블들을 나열하면 됩니다.
SELECT table1.colum1[, table2.column2 ...]
FROM table1​,​ table2
WHERE table1.colum1 = table2.column2;

동등조인.

해당 테이블의 공통된 열을 이용해 테이블 JOIN

-- 조인(JOIN) 묵시적
SELECT employee_id, first_name, job_id, job_title
FROM employees
NATURAL JOIN jobs;

-- ON 을 사용 ,기본 조인   // 특수문자 들어갈시 "(){}" 표현
SELECT e.employee_id 직원번호, e.last_name 이름, d.department_name 부서이름,
        d.department_id "부서번호(공통)"
FROM employees e JOIN departments d
ON e.department_id = d.department_id;

-- 3개의 테이블 JOIN
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d 
    ON e.department_id = d.department_id
JOIN locations l
    ON d.location_id = l.location_id;

-- WHERE 사용..
SELECT e.employee_id 직원번호, e.last_name 이름, d.department_name 부서이름,
        d.department_id "부서번호(공통)"
FROM employees e JOIN departments d
    ON e.department_id = d.department_id
WHERE d.department_id=50 AND e.salary > 5000;  

--예제)부서명(department_name) , 시티명(city), 국가명(country_name)을 나타내는 테이블을 출력합니다.
--테이블들은 countries 와 departments와 locations를 조인 합니다. 
--조건은, 시티가 'Seattle' 혹은 'London' 이어야 하고 국가명은 앞쪽에 'United' 가 들어가야 합니다.
SELECT department_name 부서명, city 시티명, country_name 국가명
FROM locations l 
JOIN departments d ON l.location_id = d.location_id
JOIN countries c ON l.country_id = c.country_id
WHERE (l.city='Seattle' OR l.city='London') AND c.country_name LIKE 'United%';

자체 조인. (셀프조인)

한테이블 내에서 참조가 일어날 때


--- 자체조인
SELECT e.last_name 직원이름, m.last_name 매니저
FROM employees e
JOIN employees m
    ON e.manager_id = m.employee_id;

외부 조인

--외부조인
--- 기본조인 (부서번호가 null인 직원은 제외했음) -> 교집합..
SELECT e.employee_id 직원번호, e.last_name 이름, d.department_name 부서이름,
        d.department_id "부서번호(공통)"
FROM employees e JOIN departments d
    ON e.department_id = d.department_id;

--    레프트 외부 조인, 직원은 있지만 department_id가 없어도 조인됨.
SELECT e.employee_id 직원번호, e.last_name 이름, d.department_name 부서이름,
        d.department_id "부서번호(공통)"
FROM employees e LEFT OUTER JOIN departments d
    ON e.department_id = d.department_id;
   

--    라이트 외부 조인, 부서테이블에 있지만 직원은 없는 부서도 전부 출력
SELECT e.employee_id 직원번호, e.last_name 이름, d.department_name 부서이름,
        d.department_id "부서번호(공통)"
FROM employees e RIGHT OUTER JOIN departments d
    ON e.department_id = d.department_id;

--    FULL 외부 조인, 부서테이블에 있지만 직원은 없는 부서도 전부 출력
SELECT e.employee_id 직원번호, e.last_name 이름, d.department_name 부서이름,
        d.department_id "부서번호(공통)"
FROM employees e FULL OUTER JOIN departments d
    ON e.department_id = d.department_id;    

-- 예제) countries , locations 테이블을 조인하여 아래와 같이 출력하시오.
--(지역번호로 DESC 정렬)
--country_name 국가, country_id 국가번호,
--location_id 지역번호, city 도시
SELECT c.country_name 국가, c.country_id 국가번호,
l.location_id 지역번호, l.city 도시 
FROM countries c LEFT OUTER JOIN locations l
    ON c.country_id = l.country_id
    ORDER BY l.location_id DESC;

교차조인

  • CROSS JOIN은 상호 조인이라고도 불리며,
    한 쪽 테이블의 모든 행들과 다른 테이블의 모든 행을 연결시키는 기능을 한다.
    그래서, CROSS JOIN의 결과 개수는 두 테이블의 행의 개수를 곱한 개수가 된다.
    CROSS JOIN을 카티션 곱 (Cartesian Product)라고도 한다.
--   크로스 조인 테이블1과 테이블2를 교차 조인하면 각 테이블의 행의 수를 곱한 것과 같은 개수의 결과 행이 생긴다.
-- 예제 ) countries , regions 테이블을 크로스 조인하여 아래와 같이  각각의 테이블의     25행 X 4행 => 100행의 결과가 나오도록 하세요.
SELECT c.country_name 국가이름, r.region_name 지역이름 
FROM countries c 
CROSS JOIN regions r;

비동등 조인

SELECT employee_id, first_name, salary, grade
FROM  
	employees 
JOIN
	salarygrade
ON salary 
BETWEEN losalary AND hisalary;

profile
HelloWorld에서 RealWorld로

0개의 댓글