SQL 구문 에서 JOIN 의 용법 장면 분석

10913 단어 SQLJOIN
레코드:256
SQL 최고 경계 쓰기:SELECT*FROM 표 이름.물론 자조 다.SQL 구문 에서 JOIN 의 용법 을 탐구 하고 이 장면 을 겪 을 때 까지 끝까지 검증 하고 싶 어 진다.
장면
관계 형 데이터베이스 A 에서 표 TESTTB 01 과 TESTTB 02 는 빅 데이터 플랫폼 M(MaxCompute 빅 데이터 플랫폼)으로 이전 한다.TEST_TB 01 표 1000 만 개 기록,TESTTB 02 표 80 만 건 기록.
관계 형 데이터베이스 에서 TESTTB 01 과 TESTTB 02 에는 메 인 키 제약 이 있 습 니 다.추가 업무 데이터 가 생 겼 을 때 중복 데이터 삽입 이 존재 하지 않 습 니 다.그러나 데이터 가 빅 데이터 플랫폼 으로 이전 되면 빅 데이터 플랫폼 에서 메 인 키 제약 기능 이 없 기 때문이다.신규 업무 데이터 생 성 시 TESTTB 01 과 TESTTB 02 는 모두 중복 데 이 터 를 삽입 했다.
하나의 계산 임무 에서 TESTTB 01 과 TESTTB 02 는 한 필드 의 JOIN 연결 에 따라 결과 데 이 터 를 계 산 했 고 데 이 터 는 사용자 의 관계 형 데이터베이스 C 로 전송 되 었 다.C 데이터베이스 에 대응 하 는 표 의 공간 이 폭발 하고 경 보 를 감시 하 게 만 들 었 다.
이유:TESTTB 01 과 TESTTB 02 는 중복 데이터 가 있어 JOIN 으로 연결 한 후 10 억+개의 데 이 터 를 생 성 해 총 200 G+데 이 터 를 C 데이터베이스 로 직접 전송 했다.
그 때 는 사려 깊 지 못 해 순간 멍 해 졌 고,SQL 문장 속 조인 이 낯 설 어 졌 다.그래서 탐구 해서 기록 하려 고 합 니 다.
건축 표
TEST_TB 01 탭 문:

create table TEST_TB01
(
  sensor_id   BIGINT,
  part_id     BIGINT
 )
COMMENT '    ';
TEST_TB 02 탭 문:

create table TEST_TB02
(
  part_id    BIGINT,
  elem_id    BIGINT
 )
 COMMENT '    ';
3.SQL 구문 에서 JOIN 을 사용 하여 중복 되 지 않 는 데이터 상황
SQL 구문 에서 JOIN 을 사용 하여 중복 되 지 않 은 데이터 상황,즉 TESTTB 01 과 TESTTB 02 표 에는 중복 데이터 상황 이 없습니다.각각 JOIN,INNER JOIN,LEFT JOIN,LEFT OUTER JOIN,Right JOIN,FULL JOIN 검증 을 사용한다.
TEST 에서TB 01 데이터 삽입:

insert into TEST_TB01 (sensor_id,part_id) values(2101,9911);
insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);
insert into TEST_TB01 (sensor_id,part_id) values(2104,9914);
insert into TEST_TB01 (sensor_id,part_id) values(2105,9915);
TEST 에서TB 02 데이터 삽입:

insert into TEST_TB02 (part_id,elem_id) values(9911,8901);
insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
insert into TEST_TB02 (part_id,elem_id) values(9913,8903);
insert into TEST_TB02 (part_id,elem_id) values(9916,8906);
TEST 보기TB 01 데이터:

TEST 보기TB 02 데이터:

1.SQL 에 조인 사용
TEST_TB 01 과 TESTTB 02 partid JOIN 연결 을 사용 하여 시계 두 개 만 되 돌려 줍 니 다(TESTTB 01 과 TESTTB 02)에서 연결 필드 가 같은 기록.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

2.SQL 에서 INNER JOIN 사용
TEST_TB 01 과 TESTTB 02 partid INNER JOIN 연결 을 사용 하여 시계 두 개 만 되 돌려 줍 니 다(TESTTB 01 과 TESTTB 02)에서 연결 필드 가 같은 기록.인 너 존 과 존 효 과 는 등가 다.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
INNER JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

3.SQL 에서 LEFT JOIN 사용
TEST_TB 01 과 TESTTB 02 partid 왼쪽 JOIN 으로 연결,왼쪽 연결,왼쪽 테이블 되 돌리 기(TESTTB 01)의 모든 기록 및 오른쪽 표(TESTTB 02)에서 연결 필드 가 같은 기록.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
LEFT JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

4.SQL 에서 LEFT OUTER JOIN 사용
TEST_TB 01 과 TESTTB 02 partid 왼쪽 OUTER JOIN 연결,왼쪽 외부 연결 을 사용 하여 왼쪽 테이블 로 돌아 가기(TESTTB 01)의 모든 기록 및 오른쪽 표(TESTTB 02)에서 연결 필드 가 같은 기록.LEFT OUTER JOIN
레프 트 존 과 등가.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
LEFT OUTER JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

5.SQL 에서 Right JOIN 사용 하기
TEST_TB 01 과 TESTTB 02 partid 오른쪽 JOIN 으로 연결,오른쪽 연결,오른쪽 테이블 되 돌리 기(TESTTB 02)의 모든 기록 및 왼쪽 표(TESTTB 01)에서 연결 필드 가 같은 기록
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
RIGHT JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

6.SQL 에서 FULL JOIN 사용
TEST_TB 01 과 TESTTB 02 partid 는 FULL JOIN 연결,외부 연결 을 사용 하여 두 표 의 줄 을 되 돌려 줍 니 다:LEFT JOIN+Right JOIN 모든 줄 기록.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
FULL JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

4.SQL 구문 에서 JOIN 을 사용 하면 중복 데이터 상황 이 있 습 니 다.
SQL 구문 에서 JOIN 을 사용 하면 반복 되 는 데이터 가 있 습 니 다.즉,TEST 입 니 다.TB 01 과 TESTTB 02 표 에는 중복 데이터 상황 이 있 습 니 다.각각 JOIN,INNER JOIN,LEFT JOIN,LEFT OUTER JOIN,Right JOIN,FULL JOIN 검증 을 사용한다.
TEST 에서TB 01 데이터 삽입:

insert into TEST_TB01 (sensor_id,part_id) values(2101,9911);
insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);
insert into TEST_TB01 (sensor_id,part_id) values(2104,9914);
insert into TEST_TB01 (sensor_id,part_id) values(2105,9915);
--     
insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);
TEST 에서TB 02 데이터 삽입:

insert into TEST_TB02 (part_id,elem_id) values(9911,8901);
insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
insert into TEST_TB02 (part_id,elem_id) values(9913,8903);
insert into TEST_TB02 (part_id,elem_id) values(9916,8906);
--     
insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
insert into TEST_TB02 (part_id,elem_id) values(9913,8903);
TEST 보기TB 01 데이터:

TEST 보기TB 02 데이터:

1.SQL 에 조인 사용
TEST_TB 01 과 TESTTB 02 partid JOIN 연결 을 사용 하여 시계 두 개 만 되 돌려 줍 니 다(TESTTB 01 과 TESTTB 02)에서 연결 필드 가 같은 기록.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

2.SQL 에서 INNER JOIN 사용
TEST_TB 01 과 TESTTB 02 partid INNER JOIN 연결 을 사용 하여 시계 두 개 만 되 돌려 줍 니 다(TESTTB 01 과 TESTTB 02)에서 연결 필드 가 같은 기록.인 너 존 과 존 효 과 는 등가 다.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
INNER JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

3.SQL 에서 LEFT JOIN 사용
TEST_TB 01 과 TESTTB 02 partid 왼쪽 JOIN 으로 연결,왼쪽 연결,왼쪽 테이블 되 돌리 기(TESTTB 01)의 모든 기록 및 오른쪽 표(TESTTB 02)에서 연결 필드 가 같은 기록.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
LEFT JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

4.SQL 에서 LEFT OUTER JOIN 사용
TEST_TB 01 과 TESTTB 02 partid 왼쪽 OUTER JOIN 연결,왼쪽 외부 연결 을 사용 하여 왼쪽 테이블 로 돌아 가기(TESTTB 01)의 모든 기록 및 오른쪽 표(TESTTB 02)에서 연결 필드 가 같은 기록.LEFT OUTER JOIN
레프 트 존 과 등가.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
LEFT OUTER JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

5.SQL 에서 Right JOIN 사용 하기
TEST_TB 01 과 TESTTB 02 partid 오른쪽 JOIN 으로 연결,오른쪽 연결,오른쪽 테이블 되 돌리 기(TESTTB 02)의 모든 기록 및 왼쪽 표(TESTTB 01)에서 연결 필드 가 같은 기록
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
RIGHT JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

6.SQL 에서 FULL JOIN 사용
TEST_TB 01 과 TESTTB 02 partid 는 FULL JOIN 연결,외부 연결 을 사용 하여 두 표 의 줄 을 되 돌려 줍 니 다:LEFT JOIN+Right JOIN 모든 줄 기록.
SQL 구문:

SELECT
  *
FROM
  TEST_TB01 aa
FULL JOIN TEST_TB02 bb
    ON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;
실행 결과:

5.SQL 에서 JOIN 을 사용 하면 중복 과 중복 되 지 않 는 데이터 의 차이 가 있 습 니 다.
SQL 구문 에서 JOIN 을 사용 하면 중복 데이터 상황 이 있 고 JOIN 을 사용 하여 연결 필드 와 같은 기록 에 부합 하 는 결과 집합 은 피리 칼 적 이 며 첫 번 째 표 의 줄 수 는 두 번 째 표 의 줄 수 를 곱 합 니 다.
해결 방법
1.먼저 가서 다시 조인 으로 연결
업무 규칙 에 따라 TESTTB 01 과 TESTTB 02 는 각각 제 인 연결 을 다시 사용 합 니 다.
2.조인 으로 연결 하고 무 게 를 빼 기
업무 규칙 에 따라 TESTTB 01 과 TESTTB 02 는 JOIN 연결 을 사용 하여 결과 집합 을 만 들 고 결과 집합 을 다시 만 듭 니 다.
3.건의
생산 환경,특히 데 이 터 량 이 많은 장면 에 서 는 첫 번 째 방식 을 추천 합 니 다.먼저 시 계 를 하나하나 재 구성 한 다음 에 JOIN 연결 을 사용 합 니 다.
7.관계 형 데이터베이스 검증 표 구조
이 예 는 DataWorks 환경(즉,MaxCompute 빅 데이터 플랫폼)에서 검 증 된 것 이다.즉,관계 형 데이터 베이스 에서 표 구조 차 이 를 제외 하고 모두 같다.
ORACLE 데이터베이스 에 표 문 구 를 만 듭 니 다:

create table TEST_TB01
(
  sensor_id  NUMBER(16),
  part_id  NUMBER(16)
 );
 
 create table TEST_TB02
(
  part_id  NUMBER(16),
  elem_id  NUMBER(16) 
 );
MySQL 데이터베이스 에 표 문 구 를 만 듭 니 다:

CREATE TABLE TEST_TB01
(
  sensor_id  BIGINT,
  part_id  BIGINT
 );
 
 CREATE TABLE TEST_TB02
(
  part_id  BIGINT,
  elem_id  BIGINT 
 );
이상
SQL 구문 에 있 는 JOIN 의 용법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 SQL JOIN 의 용법 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기