놀코에 오신 것을 환영합니다.

놀아보자 코드랑

KOSTA/ORACLE_SQL

JOIN 기능

놀코 2021. 5. 28. 19:05

다음은 오라클 DB join기능에 대한 설명이다.

--사원의 사번, 이름, 부서번호, 부서명을 출력하시오.
SELECT employee_id, first_name, department_id, department_name
FROM employees, departments;
SELECT employee_id, first_name, employees.department_id, department_name
FROM employees, departments
where employees.department_id = departments.DEPARTMENT_ID;

--표준화된ANSI조인
--JOIN ON
SELECT employee_id, first_name, e.department_id, department_name
FROM employees e JOIN departments d ON (e.department_id = d.DEPARTMENT_ID);

--JOIN USING [조인조건용 컬러명이 동일한 경우]
--주의 테이블명.  또는 테이블 별칭명. 사용불가
SELECT employee_id, first_name,
	department_id, department_name
FROM employees e JOIN departments d USING(department_id);

--NATURAL JOIN [조인조건용 컬럼명이 동일한 경우 자동 조건설정됨]
SELECT employee_id, first_name,
	department_id, department_name
FROM employees e NATURAL JOIN departments;

위의 NATURAL JOIN은 아래 ON과 같은 효과가 남
SELECT employee_id, first_name,
	e.department_id, d.department_name
FROM employees e JOIN departments d ON (e.department_id = d.DEPARTMENT_ID AND e.manager_id = d.manager_id);
--------------------------------------------------------------------------------
--사원사번, 이름, 부서번호, 부서명, 직무명(job_title)을 출력하시오
SELECT employee_id, first_name,
	e.department_id, department_name,
	job_title
FROM employees e JOIN departments d ON ( e.department_id = d.department_id)
		JOIN jobs j ON (e.job_id = j.job_id);

--사원 사번, 이름, 부서번호, 부서명, 부서가 속한 도시명(city)을 출력하시오
SELECT employee_id, first_name,
	e.department_id, department_name,
	city
FROM employees e
JOIN departments d ON ( e.department_id = d.department_id)
JOIN locations l ON (d.location_id = l.location_id);

--사원 사번, 이름, 부서번호, 부서명, 부서가 속한 도시명(city)을 출력하시오
--'s'를 포함한 부서중 'Seattle' 도시에 속한 사원들만 출력한다.
SELECT employee_id, first_name,
	e.department_id, department_name,
	city
FROM employees e
JOIN departments d ON ( e.department_id = d.department_id)
JOIN locations l ON (d.location_id = l.location_id)
where instr(department_name, 's') > 0
--WHERE LOWER(department_name) LIKE '%s%'
AND city = 'Seattle';

--부서번호, 부서명, 부서가 속한 도시명(city), 국가명(country_name)을 출력하시오.
SELECT department_id, department_name,
city, country_name
FROM departments d JOIN location l ON (d.location_id = l.location_id)
JOIN contries c ON (l.country_id = c.country_id);
---------------------------------------------------------------------------------------
--OUTER JOIN
  1)ANSI 표준 방식
  -LEFT OUTER JOIN
  -RIGHT OUTER JOIN
  
2) 오라클 방식:(+) --기준이 되지 않는 쪽에 더하기 기호를 사용

ANSI표준방식
--모든사원의 사번, 이름, 부서번호, 부서명을 출력하시오. 부사가 없는 사원도 출력한다
SELECT employee_id, first_name,
	e.department_id, department_name
FROME employees e JOIN departments d ON (e.department_id = d.department_id)

--부서
--지역
--모든 지역의 지역ID, 도시명, 부서번호, 부서명을 출력하시오. 부서가 없는 지역도 모두 출력한다.
ex)	AA	BB	null	null
	CC	DD	1	F
SELECT l.location_id, city,
	department_id, department_name
FROM departments d RIGHT JOIN locations l ON (d.location_id = l.location_id);

--사원의 사번, 이름, 부서명, 직무명을 출력하시ㅗ. 단 부서가 없는 사원도 출력한다 --107건
SELECT employee_id, first_name,
	e.department_id, department_name,
	job_title
FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id)
			JOIN jobs j ON (e.job_id = j.job_id);

3. FULL OUTER JOIN: 양쪽테이블의 자료를 모두 출력한다 (ANSI)
CREATE TABLE a (a1 number, b1 char(1));
INSERT INTO a VALUES (1, 'A');
INSERT INTO a VALUES (2, 'B');
INSERT INTO a VALUES (3, null);

CREATE TABLE b (b1 char(1), a1 number);
INSERT INTO b VALUES ('A', 1);
INSERT INTO b VALUES ('B', null);
INSERT INTO b VALUES ('C', 2);
commit;

SELECT * 
FROM a JOIN b ON a.b1 = b.b1;

SELECT * 
FROM a LEFT JOIN b ON a.b1 = b.b1;

SELECT * 
FROM a RIGHT JOIN b ON a.b1 = b.b1;

SELECT * 
FROM a FULL JOIN b ON a.b1 = b.b1;
-----------------------------------------------------------
4. SELF JOIN : 자기참조관계에서 사용
--사원의 사번과 이름, 사원의 관리자번호, 관리자 이름을 출력하시오
SELECT e.employee_id 사번, e.first_name 사원이름
	m.employee_id 관리자번호, m.first_name 관리자이름
FROM employees e JOIN employees m ON (e.manager_id = m.employee_id);

--사원의 부서와 사원의 관리자 부서가 서로 다른 사원들의 사원의 사번과 이름, 부서번호, 부서명
사원의 관리자번호, 관리자 이름, 부서번호, 부서명을 출력하시오
SELECT e.employee_id 사번 , e.first_name 사원이름, e.department_id 사원부서번호, d.department_name 사원부서명,
           m.employee_id 관리자번호, m.first_name 관리자이름, 
           m.department_id 관리자부서번호,  md.department_name 관리자부서명
FROM employees  e  JOIN employees m ON ( e.manager_id = m.employee_id )
                             JOIN departments d ON ( e.department_id = d.department_id)
                             JOIN departments md ON (m.department_id = md.department_id)
WHERE  e.department_id <> m.department_id;
---------------------------------------------------------------------------------------------

--subquery : 부분질의, 순차질의
--'IT'부서에 속한 사원 사번, 이름, 급여를 출력하시오
SELECT
FROM employees e JOIN depqrtments d ON (e.department_id = d.department_id)
WHERE department_name = 'IT';

--subquery의 종류
--위치에 따른 구분
	SubQuery : WHERE절
	INLINE View : FROM절
	Scalar Query : SELECT절

--서브쿼리의 결과행수에 따른 구분
	multi Row SubQuery : 메인쿼리의 WHERE절에서 비교연산자 사용불가
				IN, ALL, ANY
	single Row SubQuery : 메인쿼리의 WHERE절에서 비교 연산자(<,>,>=,<=,<>) 사용가능

--사원의 사번, 급여를 출력하시오. 직무명에 대소문자구분 없이 manager가 포함된 사원들만 출력한다
--1)직무명에 manager가 포함된 job_id를 검색한다 
	SELECT job_id FROM jobs WHERE LOWER(job_title) LIKE '%manager%'
--2) 1)과 같은 job_id를 같는 사원의 사번, 급여를 검색한다.
	SELECT employee_id, salary
	FROM employees
	WHERE job_id = (SELECT job_id FROM jobs WHERE LOWER(job_ FROM jobs WHERE LOWER(job_title) LIKE '%manager%');


--subQuery
SELECT employee_id, department_id
FROM employees
WHERE department_id > ALL (10,20,30); --서브쿼리 결과중 최대값보다 크다

SELECT employee_id, department_id
FROM employees
WHERE department_id < ALL (10,20,30); --서브쿼리 결과중 최대값보다 크다

SELECT employee_id, department_id
FROM employees
WHERE department_id > ANY(10,20,30); --서브쿼리 결과중 최대값보다 크다

SELECT employee_id, department_id
FROM employees
WHERE department_id < ANY (10,20,30); --서브쿼리 결과중 최대값보다 크다

SELECT employee_id, department_id
FROM employees
WHERE department_id IN (10,20,NULL,30); --null해당 사원 못찾음

SELECT employee_id, department_id
FROM employees
WHERE NVL(department_id, 0) IN (10, 20, 0, 30);
				(SELECT NVL(department_id,0) FROM ~)

* 참고 깃허브 https://github.com/sblee1031/Kosta/blob/main/ORACLE_DB_THEOTY/join.txt

'KOSTA > ORACLE_SQL' 카테고리의 다른 글

오라클 SQL 사용 문법 정리 (1)  (0) 2021.06.06
PL/SQL 기초 / 블럭이란?  (2) 2021.06.03
SQL 테이블 생성 규칙 / 열 이름 생성규칙  (0) 2021.06.01
오라클 SQL 자료형  (0) 2021.05.27
숫자 처리 함수  (0) 2021.05.27