728x90

Join

  • 두 개 이상의 테이블을 서로 묶어서 새로운 테이블로 만들어 내는것

Cross join (교차조인)

-- 교차 조인(cross join)
-- 두 개 이상의 테이블에서 가능한 모든 조합을 만들어내는 조인 방식
select student.*, enrol.*
from student
cross join enrol;

 

 

Inner join (이너조인 = equi join 이퀴조인))

  • inner join = 두 테이블 간에 중복되는 데이터, 즉 양쪽 테이블 모두에 존재하는 데이터만을 결과로 반환하는 조인 방식
  • equi join = 조인 조건이 등호(=)를 사용하는 경우
  • where절에서 = 연산자 사용
-- inner join(equi join)
select stu.stu_no, stu_name, stu_dept, enr_grade
from student stu, enrol en
where stu.stu_no = en.stu_no;
-- 점수가 70점 이상인 학생 이름 검색
SELECT 
    stu_name
FROM
    student s,
    enrol e
WHERE
    s.stu_no = e.stu_no AND enr_grade >= 70;
-- 점수가 70점 이상인 학생 이름 검색(equi-join)
SELECT 
    stu_name
FROM
    student s,
    enrol e
WHERE
    s.stu_no = e.stu_no AND enr_grade >= 70;
-- 강종영 교수가 강의하는 과목을 수강하는 학생의 이름을 검색 (equi join)
SELECT 
    stu_name
FROM
    student s,
    enrol e,
    subject su
WHERE
    su.sub_no = e.sub_no
        AND e.stu_no = s.stu_no
        AND sub_prof = '강종영';
-- 컴퓨터개론을 수강하는 학생들의 학번과 이름을 검색해라(equi join)
SELECT 
    stu_name, s.stu_no
FROM
    student s,
    enrol e,
    subject su
WHERE
    su.sub_no = e.sub_no
        AND e.stu_no = s.stu_no
        AND sub_name = '컴퓨터개론';

 

 

 

Natural join (내추럴 조인)

  • 이너조인보다 편리함 / 네추럴조인 앞뒤로 합치고 싶은 테이블 입력
-- natural join
select stu.stu_no, stu_name, stu_dept, enr_grade
from student stu natural join enrol en;
-- 학생테이블과 수강테이블을 natural join
SELECT 
    *
FROM
    student natual
        JOIN
    enrol;
-- 과목이름과 학번, 점수를 검색 natural join
SELECT 
    sub_name, enrol.stu_no, enr_grade
FROM
    subject
        NATURAL JOIN
    enrol;
-- 점수가 70점 이하인학색 이름 검색(natural join)
SELECT 
    stu_name
FROM
    student
        NATURAL JOIN
    enrol
WHERE
    enr_grade <= 70;

 

 

 

join~using

  • 조인하려는 두 테이블에서 기준 열의 이름이 정확히 일치할 때 사용할 수 있으며, 쿼리를 간결하게 만들고 싶을 때
    유용합니다. 단, 단일 열에 대한 동등 비교만 가능합니다.
select stu.stu_no, stu_name, stu_dept, enr_grade
from student stu join enrol using(stu_no);
-- 과목이름과 학번, 점수를 검색해라(join using)
SELECT 
    sub_name, enrol.stu_no, enr_grade
FROM
    subject
        JOIN
    enrol USING (sub_no);
SELECT 
    stu_name, enr_grade
FROM
    student s
        JOIN
    enrol e USING (stu_no)
WHERE
    enr_grade >= 60;

 

 

join~on

  • 두 테이블 간의 조인 조건을 자유롭게 지정할 수 있으며, 열 이름이 다르거나 복잡한 조건을 사용해야 하는 경우에
    적합
select stu.stu_no, stu_name, stu_dept, enr_grade
from student stu join enrol en on stu.stu_no = en.stu_no;

 

 

 

Outer join(외부조인)

  • 한 쪽에는 데이터가 있지만, 다른 한 쪽에는 데이터가 없는경우 데이터가 있는 쪽 테이블의 내용을 모두 출력
  • left outer join  - 왼쪽에 있는 테이블의 모든 결과를 가져온 후 오른쪽 테이블의 데이터를 매칭
  • right outer join  - 오른쪽에 있는 테이블의 모든 결과를 가져온 후 왼쪽 테이블의 데이터를 매칭
select*
from subject natural join enrol;

select a.*, sub_name
from enrol a right outer join subject b
on a.sub_no = b.sub_no;

select a.*, sub_name
from enrol a left outer join subject b
on a.sub_no = b.sub_no;

 

 

Self join

-- self join
select a.empno as 사원번호, a.ename as 사원이름,
b.empno as 상급자사원번호, b.ename as 상급자이름 
from emp a join emp b on a.mgr=b.empno;

 

728x90

'DBMS > MySQL' 카테고리의 다른 글

[MySQL] 스토어드 프로시저  (0) 2024.03.18
[MySQL] 뷰(View)  (0) 2024.03.18
[MySQL] Top N 질의문  (0) 2024.03.18
[MySQL] DB 언어 분류(DML/DDL/DCL)  (0) 2024.03.15
[MySQL] MySQL Grammar 모음(계속 업데이트)  (0) 2024.03.14

+ Recent posts