조인에는 여러가지 종류가 있다.
SELECT jikwon_name, buser_name FROM jikwon,buser; -- 직원 한명마다 모든 부서가 나옴
SELECT jikwon_name, buser_name FROM jikwon cross join buser; -- 위와 같은 방법
SELECT a.jikwon_name, b.jikwon_jik FROM jikwon a, jikwonb; -- self 조인 (cross join의 일종)
먼저 조인을 하기 위해 테이블을 하나 만들어 주었다.
CREATE TABLE paygrade(grade INT PRIMARY KEY, lpay INT, hpay INT);
INSERT INTO paygrade VALUES(1,0,1999);
INSERT INTO paygrade VALUES(2,2000,2999);
INSERT INTO paygrade VALUES(3,3000,3999);
INSERT INTO paygrade VALUES(4,4000,4999);
INSERT INTO paygrade VALUES(5,5000,5999);
SELECT j.jikwon_name,j.jikwon_pay, p.grade FROM jikwon j, paygrade p
WHERE j.jikwon_pay >= p.lpay AND j.jikwon_pay <= p.hpay ; -- j,p는 테이블의 별명
SELECT FROM jikwon WHERE jikwon_no=1;
SELECT FROM buser WHERE buser_no=10; -- 직원 테이블의 buser_num과 부서 테이블의 buser_no은 공통칼럼
SELECT jikwon_name, buser_name FROM jikwon,buser WHERE buser_num = buser_no;
SELECT test.jikwon.jikwon_name, test.buser.buser_name FROM jikwon,buser WHERE jikwon.buser_num = buser.buser_no;
SELECT jikwon_no, jikwon_name, jikwon_jik, buser_name FROM jikwon, buser WHERE buser_num = buser_no;
-- 마지막 문장 출력
inner join : 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
조건에 맞는 자료가 한 테이블에만 있는 경우에는 출력에 참여하지 않는다.
방법1)
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon, buser WHERE buser_num=buser_no; -- 6번 직원은 부서가 없기 때문에 제외 / oracle join 여기서도 가능하긴 함
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon, buser WHERE buser_num=buser_no AND jikwon_gen = '남';
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon INNER JOIN buser ON buser_num=buser_no; -- ANSI JOIN (표준)
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon INNER JOIN buser ON buser_num=buser_no WHERE jikwon_gen = '남';
inner join 출력
null인 값은 빼고 출력
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon, buser WHERE buser_num=buser_no(+); -- oracle 에서만 쓸 수 있음
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon LEFT OUTER JOIN buser ON buser_num=buser_no; -- ANSI JOIN (표준)
-- 오른쪽이 null인 값은 그냥 출력
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon, buser WHERE buser_num(+)=buser_no; -- oracle 에서만 쓸 수 있음
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon RIGHT OUTER JOIN buser ON buser_num=buser_no; -- ANSI JOIN (표준)
-- 왼쪽이 null인 값은 그냥 출력
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon FULL OUTER JOIN buser ON buser_num=buser_no; -- oracle join
-- full outer join은 union을 이용
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon LEFT OUTER JOIN buser ON buser_num=buser_no
UNION SELECT jikwon_no, jikwon_name, buser_name FROM jikwon RIGHT OUTER JOIN buser ON buser_num=buser_no;
-- 각 부서 내 근무자 목록 (부서가없는 직원은 제외)
SELECT buser_name, jikwon_name, jikwon_jik, buser_tel FROM jikwon INNER JOIN buser ON jikwon.buser_num=buser.buser_no ORDER BY buser_name asc;
SELECT FROM gogoek WHERE gogek_no = 1; -- gogek.gogek_dasamo 와jikwon.jikwon_no 공통칼럼
-- 관리 고객이 있는 직원만 출럭
SELECT jikwon_no, jikwon_name, jikwon_jik, gogek_name, gogek_tel FROM jikwon INNER JOIN gogek ON jikwon.jikwon_no=gogek.gogek_damsano ORDER BY jikwon_name;
-- 관리 고객에 상관없이 모든 직원 출력
SELECT jikwon_no, jikwon_name, jikwon_jik, gogek_name, gogek_tel FROM jikwon left OUTER join gogek
on jikwon.jikwon_no = gogek.gogek_damsano ORDER BY jikwon_name;
-- 부서별 급여합, 급여 평균, 인원수(부서가 없는 직원은 계약직으로 출력)
SELECT nvl(buser_name, '계약직') AS 부서, SUM(jikwon_pay) AS 합, AVG(jikwon_pay) AS 평균,
COUNT() AS 인원수 FROM jikwon LEFT OUTER JOIN buser
ON jikwon.buser_num = buser.buser_no GROUP BY 부서;