: 여러개의 테이블을 묶어 하나의 테이블로 만들어 사용하는 것
⭐ 원하는 데이터가 다른 테이블에 흩어져 있을 경우 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 ;
- 기준 테이블 = 보통 묶어주는 중심 테이블
- 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)
'DB > 명령프롬프트 - mysql' 카테고리의 다른 글
[MySQL] SQL 내장함수 : 논리함수 ( if , case ~ when ~then ) (0) | 2023.03.28 |
---|---|
[MySQL] ERD 수강관리 프로그램 4. join을 이용한 검색 (0) | 2023.03.28 |
[MySQL] ERD 수강관리프로그램 3.업데이트 (update, if, case) (0) | 2023.03.28 |
[MySQL] ERD 수강관리프로그램 2. 내부 데이터 삽입 (0) | 2023.03.28 |
[MySQL] ERD 수강관리 프로그램 1. 생성 (속성) (0) | 2023.03.28 |