본문 바로가기
공부기록/MySQL

4월 4일 (2) DB - Join, DB 백업/복구

by project100 2023. 4. 4.

조인(Join)

테이블을 결합하여 결과를 조회하자. 둘 이상의 테이블을 하나로 묶어서 조회하는 방법

기준이 되는 테이블에 다른 테이블의 정보(컬럼)을 붙이는 형태

붙게 되는 테이블의 데이터는 반복적으로 나타날 수 있음.

 

테이블 결합 후 검색을 수행

결합의 조건은 기본키와 외래키 중심

(두 테이블에 같은 값을 갖는 컬럼이 존재해야만 함)

 

1) 내부 조인 (INNER JOIN, 등가조인)

기준이 되는 테이블에 존재하는 데이터에 매치되는 다른 테이블의 정보가 붙는 형태

조인 시 컬럼명을 사용할 때에느 앞에 테이블명을 붙인다. 예) 사원번호 : emp.empno, 부서정보 전체 : dept.*

 

형식) 

SELECT  < 컬럼목록>

FROM  <기준 테이블>

            [INNER] JOIN <참조할(붙는) 테이블>

            ON <조인 조건>

[WHERE  검색조건];

 

예_내부조인

 

내부 조인은 WHERE 절에서 조건으로 처리 가능함.

테이블을 쉼표로 나열하여 작성

FROM절에서 JOIN없이 테이블을 , 로 구분하여 나열

FROM employees e, titles t

 

-- 테이블명에 별칭 사용
-- 사원별 급여 출력(처음 10개만 출력), employees 테이블과 salories 테이블 조인
SELECT * FROM employees.salaries;

SELECT e.emp_no, e.first_name, e.last_name, s.salary
FROM employees e
	JOIN salaries s 
    ON e.emp_no =  s.emp_no
	WHERE s.to_date LIKE '9999%'
    LIMIT 10
;

-- 사원별 직함을 조회하시오.
-- 사번, 이름(성 제외), 직함(titles)만 출력, 최초 100명만 출력
SELECT * FROM employees.titles;
SELECT e.emp_no, e.last_name, t.title
FROM employees e
		JOIN titles t 
		ON e.emp_no =  t.emp_no
		WHERE t.to_date LIKE '9999%'
LIMIT 100;
    
--  WHERE절에서 조건처리 가능
SELECT e.emp_no, e.last_name, t.title
FROM employees e, titles t
WHERE e.emp_no = t.emp_no
		AND t.to_date LIKE '9999%'
LIMIT 100;

 

 

+ DB 백업/복구하기
Administration 탭으로 이동.
Data Export (백업)
백업할 스키마 선택(체크) 
-> 저장위치 선택(Export to Dump Project Folder )
-> Start Export

 

-- Data Import/Restore(복구)
먼저 기존에 있는 같은 테이블과 뷰 삭제(DROP)
-> 읽어올 폴더 선택(Import from Dump Project Folder)
-> Start Import

 

+ 도스? 버전에서 SQL열기 - 비밀번호입력 

 

+ 데이터 베이스 설치

+ 백업 DB 만들기

+ 에러, 같은 컬럼명을 쓸 경우 어느 테이블의 컬럼명을 가지고 올 것인지 확실하게 써야 오류가 나지 않는다.

 

2) 외부 조인 (OUTER JOIN)

기준이 되는 테이블에 존재하지 않는 다른 테이블의 정보도 붙는 형태 (NULL 값이 포함된다.)

 

형식) 

SELECT <컬럼 목록>

FROM <첫번째 테이블(LEFT)>

            <LEFT | RIGHT> [OUTER] JOIN<두번째 테이블(RIGHT)>

LEFT, RIGHT 둘 중 하나는 기준테이블, FULL은 MYSQL에서 사용불가

            ON <조인 검색>

[WHERE 검색 조건];

CROSS 조인은 쓰지 않는다. 성능 테스트용

 

-- 외부 조인
-- 소속이 없는 사원을 조회하시오.
SELECT * FROM emp;
SELECT * FROM dept;

SELECT DISTINCT d.deptno 부서, e.deptno 사원
FROM dept d LEFT OUTER JOIN emp e
	ON d.deptno = e.deptno;


SELECT DISTINCT d.deptno 부서, e.deptno 사원
FROM dept d RIGHT JOIN emp e
	ON d.deptno = e.deptno;
    
-- 사원별 부서명을 조회하시오.
USE employees;
SELECT * FROM employees;
SELECT * FROM departments;
SELECT * FROM dept_emp;

SELECT e.emp_no, e.last_name, d.dept_name
FROM employees e JOIN dept_emp de
	 ON e.emp_no = de.emp_no
     JOIN departments d
     ON de.dept_no = d.dept_no
WHERE de.to_date LIKE '9999%';

SELECT e.emp_no, e.last_name, d.dept_name
FROM employees e JOIN dept_emp de
	 ON e.emp_no = de.emp_no
     JOIN departments d
     ON de.dept_no = d.dept_no
WHERE de.to_date LIKE '9999%'
AND  dept_name ='sales';


SELECT e.emp_no, e.last_name, d.dept_name
FROM employees e JOIN dept_emp de
	 ON e.emp_no = de.emp_no
     JOIN departments d
     ON de.dept_no = d.dept_no
     JOIN salaries s
     ON e.emp_no = s.emp_no
WHERE de.to_date LIKE '9999%'
	AND s.to_date LIKE '9999%';

 

연습문제)

-- 부서장의 정보(이름, 사번, 부서명)를 조회하시오.
SELECT e.emp_no, e.first_name, e.last_name, d.dept_name
FROM employees e 
	JOIN dept_manager dm
	ON e.emp_no = dm.emp_no
    JOIN departments d    
    ON dm.dept_no = d.dept_no
WHERE dm.to_date LIKE '9999%';