JOIN
💡 조인(Join) 이란? 데이터베이스에서 조인(Join) 은 두 개 이상의 테이블에서 관련된 데이터를 결합하여 새로운 결과를 생성할 때 사용하는 중요한 연산입니다. Join이 필요한 이유? 데이터베이스에서 정보는 중복을 최소화하고 효율적으로 저장하기 위해 여러 테이블에 분산되어 저장. 실제로 정보를 사용할 때는 여러 테이블에 흩어져 있는 데이터를 통합해야 할 필요가 발생. 예를 들면 어떤 학생이 어떤 수업을 듣고 있는지 알고 싶을 때, '학생' 테이블과 '수업' 테이블을 결합해야만 필요한 정보를 얻을 수 있습니다. 복잡한 질의를 수행하기 위해서는 종종 여러 테이블의 데이터를 결합하고 비교해야 합니다. 조인을 사용하면 이러한 요구사항을 효과적으로 처리할 수 있습니다. |
조인은 데이터베이스에서 분산된 정보를 효과적으로 통합하여 사용자가 원하는 특정 정보를 얻기 위한 강력한 도구입니다.
항상 먼저 접근하는 테이블이 기준이 되고, 위의 그림에서 왼쪽 동그라미에 해당한다.
- JOIN은 크게 INNER JOIN과 OUTER JOIN으로 분류된다.
- INNER JOIN은 조건에 해당하는 데이터만 뽑아낸다.
- OUTER JOIN 에는 다음과 같이 분류되지만, MySQL에서는 FULL OUTER JOIN을 지원하지 않는다.
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN (MySQL에서는 지원 X)
시나오리 1
학생 (tb_student)
컬렁명 | 데이터 타입 | 제약사항 | 제약사항 설명 |
no | INT | NOT NULL, PRIMARY KEY | 고유 식별자, NULL 값 불허 |
name | VARCHAR(20) | NOT NULL | 학생 이름, NULL 값 불허 |
gender | ENUM('F', 'M') | NOT NULL | 성별, 'F' 또는 'M'만 가능, NULL 값 불허 |
grade | CHAR(1) | FOREIGN KEY REFERENCES tb_grade(grade) | 다른 테이블의 기본키 참조, 학년 정보 |
성정 등급 (tb_grade)
컬럼명 | 데이터 타입 | 제약사항 | 제약사항 설명 |
grade | CHAR(1) | PRIMARY KEY | 학년, 고유 식별자로 기본키 설정 |
score | INT | 점수, 별도의 제약사항 없음 |
create table tb_student(
no int not null primary key,
name varchar(20) not null,
gender enum('F', 'M') NOT NULL,
grade CHAR(1),
foreign key(grade) REFERENCES tb_grade(grade)
);
CREATE table tb_grade(
grade char(1) primary key,
score int
);
desc tb_student;
desc tb_grade;
select * FROM tb_grade;
select * from tb_student;
-- 테이블은 정보에 최소 단위 이다.
insert into tb_grade
value
('A', 100),
('B', 80),
('C', 60),
('D', 40),
('F', 0);
-- 오류 발생 아래에서 스키마 추가
-- insert into tb_student(no, name, gender, grade, age) values('100', '길동', 'F', 25, 'B');
-- 스키마 구조 변경이 필요하다.
alter table tb_student add age int;
select * from tb_student;
INSERT INTO tb_student(no, name, gender, grade, age) value
('100', '태현','M','B','21');
INSERT INTO tb_student(no, name, gender, grade, age) value
('200', '남철','M','A','28');
INSERT INTO tb_student(no, name, gender, grade, age) value
('300', '효정','F','C','25');
INSERT INTO tb_student(no, name, gender, grade, age) value
('400', '준수','M','F','28');
INSERT INTO tb_student(no, name, gender, grade, age) value
('500', '이제','M','B','30');
💡 주의 MySQL에서 JOIN, CROSS JOIN, INNER JOIN은 구문적으로 동등하다. 결과가 같고, 서로 대체 가능하다. (표준 SQL에서는 동일하지 않다. 보통 INNER JOIN은 ON절과 함께 쓰이고, CROSS JOIN은 다르게 사용된다.CROSS JOIN이란 한 쪽 테이블의 행 하나에 다른 쪽 테이블의 행을 각각 조인시키는 걸 말한다.) ON 조건 없이 사용하게 되면 CROSS JOIN의 결과가 나오고, ON 조건을 사용하게 되면 조건을 건 컬럼의 값이 같은 데이터들을 합친 결과가 나온다. MySQL에서는 JOIN 또는 INNER JOIN을 할 때, ON 으로 조건을 지정해주지 않으면 CROSS JOIN의 결과가 나온다. |
-- JOIN 연산에 ON 절 사용 안해보기 !!!
-- 크로스 조인이 된다. !!!
select *
from tb_student
join tb_grade;
select * from tb_grade
join tb_student;
-- 1 단계 쿼리
select *
from tb_student
join tb_grade on tb_student.grade = tb_grade.grade;
-- 2 단계 쿼리 (필요한 부분만 가져오기)
select s.no, s.name, s.grade, s.age, g.score
from tb_student as s
join tb_grade as g
on s.grade = g.grade;
OUTER JOIN
LEFT JOIN(= LEFT OUTER JOIN)
왼쪽 테이블을 기준으로 합치며, ON 절에 있는 조건 컬럼의 값이 같은 데이터를 합친다. 오른쪽 테이블에 값이 같은 데이터가 없다면, NULL이 삽입된다.
-- 1단계
select *
from tb_student as s
left join tb_grade as g
on s.grade = g.grade;
-- 테이블 기준에 따라 출력되는 데이터가 다르다.
-- 2 단계
select *
from tb_grade as g
left join tb_student as s
on g.grade = s.grade;
LEFT JOIN 먼저 접근하는 테이블이 기준 테이블이 된다 .
RIGHT JOIN(= RIGHT OUTER JOIN)
오른쪽 테이블을 기준으로 합치며, 나머지 부분은 LEFT JOIN과 같다.
-- RIGHT OUTER JOIN
-- 1단계 (left join의 2단계와 같다)
select *
FROM tb_student AS S
RIGHT JOIN tb_grade AS G
on s.grade = g.grade;
-- 2단계 (left join의 1단계와 같다.)
select *
from tb_grade as s
right join tb_student as g
on s.grade = g.grade;
💡 도전 과제 use employees; -- 의미 있는 결과 집합을 만들자 (크로스 조인 사용 x ) -- 단, INNER JOIN, LEFT JOIN, RIGHT JOIN 사용해 쿼리문 만들기 |
-- 1990년 이상 입사자 이름과 급여
select concat( e.last_name,' ',e.first_name) as '이름',
e.hire_date as '입사날짜' , s.salary as '급여', t.title as '직책'
from employees as e
left join salaries as s
on e.emp_no = s.emp_no
left join dept_emp as d
on s.emp_no = d.emp_no
left join titles as t
on d.emp_no = t.emp_no
where s.to_date = '9999-01-01' and d.dept_no = 'd005' and e.hire_date >= '1990-01-01' ;
-- 추후 더 보강
'MySQL > MySQL 기본' 카테고리의 다른 글
MySQL Function - 17 (1) | 2024.06.07 |
---|---|
테이블 복사 및 데이터 추가 - 16 (0) | 2024.06.07 |
관계 차수란? - 14 (0) | 2024.06.04 |
연습 문제 - 13 (1) | 2024.06.04 |
MySQL에서 인덱스(index)란 - 12 (0) | 2024.06.04 |