04. 다중 테이블 제어

01. 데이터 그룹화
– GROUP BY 절의 기본 구문

SELECT user_id, COUNT(*) --검색할 컬럼
FROM rental
GROUP BY user_id; --그룹의 기준 컬럼

* 쿼리 끝에 나타나는 구문
– 한계
– 주문하다
– 그룹화

– 그룹 기능을 활용하세요

SELECT user_id, SUM(컬럼명) FROM rental GROUP BY user_id; 
--user_id가 같은 열에서 컬럼의 내용을 다 더한 값 출력
SELECT user_id, AVG(컬럼명) FROM rental GROUP BY user_id;
--user_id 가 같은 열의 컬럼의 평균을 출력
SELECT user_id, MAX(컬럼명) FROM rental GROUP BY user_id;
--user_id가 같은 열중에서 해당 컬럼명이 가장 큰 값 출력
SELECT user_id, MIN(컬럼명) FROM rental GROUP BY user_id;
--user_id가 같ㅇ느 열중에서 해당 컬럼명이 가장 작은 값을 출력​

** 문제를 해결하려고

-- rental테이블의 구조를 조회합니다.

DESC rental; -- 누가 몇권의 책을 빌려갔는지 조회해 봅시다.

select * from rental; select user_id, count(*) from rental group by user_id;​


결과로 그룹화

02. 데이터 그룹에 조건 적용
– GROUP BY / HAVING 절의 기본 구문

--rental 테이블에서 user_id가 같은 데이터가 2개 이상인 것만 검색
SELECT user_id, COUNT(*)
FROM rental
GROUP BY user_id --그룹기준 컬럼
HAVING COUNT(user_id) > 1; --조건​

– 문제를 풀다
: 급여 테이블에서 HAVING을 사용하여 연봉을 10회 이상 받은 직원만 검색합니다.

select emp_no, count(*) 
from salaries
group by emp_no    --직원번호 기준 그룹화
having count(salary)>=10;  --연봉을 10번 이상 받은 직원 검색

03. 한 번에 두 개의 테이블 검색
– 테이블을 섹션으로 나누는 이유:
1> 테이블의 용량이 크면 관리가 어려우므로 기능별, 특징별로 나누어서 테이블의 크기를 줄인다.


2> 데이터관리법상 개인을 식별할 수 있는 모든 데이터를 하나의 테이블에 두어서는 안 된다.

(개인정보 해킹 이슈)
JOIN: 여러 테이블을 함께 조인합니다.


– 내부 조인
– 왼쪽 조인
– 올바르게 가입
– INNER JOIN 문의 기본 구문:

--rental 테이블과  user테이블 연결
SELECT *
FROM rental
INNER JOIN user; --연결할 테이블

04. 두 테이블 모두에 조건부 조회 적용
– 조건을 적용하여 테이블 조인
– 참조 임대 테이블과 사용자 테이블의 정보에서 user_id는 동일하며 연결
– INNER JOIN / ON 문의 기본 구문:

SELECT *
FROM rental --테이블
INNER JOIN user --연결할 테이블
ON user.id = rental.user_id; --연결한 조건 컬럼
--user table의 id column과 rental table의 user_id column이 동일하다는 조건
--"테이블. 컬럼"

– 조건을 작성하는 이유: 열 이름을 명확히 하여 열 정의가 명확하지 않은 오류를 방지합니다.


두 개의 테이블이 조인되어 하나의 테이블로 병합됩니다.

05. 왼쪽 조인
– 조인은 테이블의 모든 값을 포함합니다(NULL 값 포함).
– 왼쪽 조인 구문:

--모든 user테이블의 id와 rental 테이블의 user_id가 겹치도록 합치기
SELECT *
FROM user --중심이 되는 쪽 table
LEFT JOIN rental
ON user.id = rental.user_id;

– 오류: 왼쪽 조인에 조건문이 첨부되지 않은 경우 오류 코드가 나타납니다.

select *
from rental
left join user --error 1064

– 왼쪽 테이블에는 있지만 오른쪽 테이블에는 없는 값은 NULL 값으로 표시됩니다.


차이점.

06. 제대로 해봐
– 오른쪽에 있는 모든 값을 포함한 모든 값을 포함하여 연결(오른쪽 표에 따라 병합됨)
– 회원정보 없이 대여내역 등의 데이터를 출력합니다.

(LEFT JOIN에 NULL 값이 나오는 등)
– LEFT JOIN 기본 구문:

--rental 테이블을 모두 출력하되, 모든 rental 테이블의 user_id와 user테이블의 id가 겹치도록 함.
SELECT *
FROM user
RIGHT JOIN rental
ON user.id = rental.user_id;

– 문제 해결(매우 지저분한 부분)
지침:
1. 오른쪽 부분 사용자모든 테이블을 쿼리하려면 올바르게 가입를 사용하여 연결하자
2. 대여서식 모든 열찾다 사용자 테이블에 가입하고 찾아보십시오.
3. 접속 시 사용자 테이블 신분증으로 렌탈 테이블 user_id를 기반으로 연결을 시도합니다.


4. 이때 사용자 테이블 모든 아이디 찾기 RIGHT JOIN 연결을 사용하십시오.

**저를 혼란스럽게 하는 것들:
생각해보면 from 옆에 가장 중요한 테이블, 가장 중심에 있는 테이블을 놓으라고 하는데,
user 테이블이 배치되고, 갑자기 from이 아닌 next right join이 중심이 된다고 합니다.


오른쪽 오른쪽 결합
실무자들은 혼란스러워서 주로 Left Join을 사용하지만 실제로는 혼란스럽습니다.

SELECT *
FROM rental
RIGHT JOIN user
on rental.user_id = user.id;

간단한 요약
1. 그룹 데이터: 그룹 기준
2. + 조건 추가: 보유
3. 두 개의 테이블 쿼리: 내부 조인, 왼쪽 조인, 오른쪽 조인
4. + 조건 추가: 켜짐
테이블에. 열 = Btable.column