DB/명령프롬프트 - mysql

[MySQL] join 사용

congs 2023. 3. 28. 16:29

: 여러개의 테이블을 묶어 하나의 테이블로 만들어 사용하는 것

 

원하는 데이터가 다른 테이블에 흩어져 있을 경우 join을 사용

  • 예) A를 받은 학생의 명단 (학번, 이름)
  • attend의 at_score와 student의 std_name, std_num이 필요

 

join의 종류

 : 내부 조인(inner join) / 외부 조인(outer join) /  상호 조인(cross join)

inner join (그냥써도 inner로 간주)

select 열 목록 from 기준 테이블명(관계 테이블=가운데 있는 테이블)
(inner) join 참조테이블명
on 조인조건(fk)
where 조건 
group by
having
order by desc / asc ; 
  1. 기준 테이블 =  보통 묶어주는 중심 테이블 
  2. inner은 기본값, outer은 작성 필요

 

outer join ( left join / right join)

< left join >

-  왼쪽 테이블을 중심으로 오른쪽의 테이블을 매치시킨다.

 - 왼쪽 테이블의 한개의 레코드에 여러개의 오른쪽 테이블 레코드가 일치할 경우, 
   해당 왼쪽 레코드를 여러번 표시하게 된다.

 - 왼쪽은 무조건 표시하고, 매치되는 레코드가 오른쪽에 없으면 NULL을 표시. (왼쪽과 오른쪽에 있는 것만 표시)

<right join>

- 오른쪽 테이블을 중심으로 왼쪽 테이블을 매치시킨다.

- LEFT JOIN에서 방향을 오른쪽으로만 바꾼것이므로, 역시 해당 레코드가 여러번 표시되거나, NULL이 표시된다.

 

select 열 목록 from 기준 테이블명 (left join)
lefr/right join 참조테이블명 (right join)
on 조인조건(fk)
where 조건 
group by
having
order by desc / asc ; 

 

cross join (상호 조인)

: 전체적으로 모두 조인 = on이 없음!

select * from Atable
cross join Btable ;

 


 

join 예시 : a를 받은 학생의 명단 출력

- 한개의 테이블에서만 가져오는 경우

mysql> select at_std_num, std_name from attend ( attend가 관계테이블 )
    -> join student
    -> on at_std_num = std_num
    -> where at_score = 'A';
+------------+----------+
| at_std_num | std_name |
+------------+----------+
| 2020160001 | 강철수   |
| 2020123020 | 박철수   |
+------------+----------+
2 rows in set (0.00 sec)

// 아래는 확인을 위한 a와 s를 넣은 경우!!
// 테이블명.칼럼명 = a.at_score 처럼 확인하기위해 사용

mysql> select a.at_std_num, std_name, a.at_score from attend a
    -> join student s
    -> on at_std_num = s.std_num
    -> where at_score = 'A';
+------------+----------+----------+
| at_std_num | std_name | at_score |
+------------+----------+----------+
| 2020160001 | 강철수   | A        |
| 2020123020 | 박철수   | A        |
+------------+----------+----------+
2 rows in set (0.00 sec)

- 두개이상의 테이블에서 가져오는 경우

mysql> select at_std_num as "학번", std_name as "이름", co_name as "과목", at_score as "성적"  from attend
    -> join student on at_std_num = std_num
    -> join course on at_co_code = co_code
    -> where at_score = 'A';
+------------+--------+--------------+------+
| 학번       | 이름   | 과목         | 성적 |
+------------+--------+--------------+------+
| 2020123020 | 박철수 | 컴퓨터개론   | A    |
| 2020160001 | 강철수 | 대학수학기초 | A    |
+------------+--------+--------------+------+
2 rows in set (0.00 sec)

// 아래는 a,c,s를 넣어서 하는 경우

mysql> select a.at_std_num as "학번", s.std_name as "이름", c.co_name as "과목", a.at_score as "성적"  from attend a
    -> join student s on at_std_num = s.std_num // at_std_num과 s.std_num의 적는 순서는 관계X
    -> join course c on at_co_code = c.co_code
    -> where at_score = 'A';
+------------+--------+--------------+------+
| 학번       | 이름   | 과목         | 성적 |
+------------+--------+--------------+------+
| 2020123020 | 박철수 | 컴퓨터개론   | A    |
| 2020160001 | 강철수 | 대학수학기초 | A    |
+------------+--------+--------------+------+
2 rows in set (0.00 sec)