MySQL 에서 유 니 온 과 join 문 구 는 서로 다른 분석 튜 토리 얼 을 사용 합 니 다.

5817 단어 MySQLunionjoin
유 니 온 과 join 은 여러 장의 표를 연합 해 야 할 때 흔히 볼 수 있 는 연관 어 입 니 다.구체 적 인 개념 은 말 하지 않 겠 습 니 다.인터넷 검색 을 알 고 싶 으 면 됩 니 다.저도 정확하게 기억 하지 못 하기 때 문 입 니 다.
먼저 차이 점 을 말 합 니 다.유 니 온 은 두 장의 표 에 대한 조작 은 데이터 바 수 를 합병 하 는 것 입 니 다.수직 과 같 습 니 다.두 장의 표 필드 는 반드시 같 아야 합 니 다(Schema of both sides of union should match.).즉,A 표 에 세 개의 데이터 가 있 고 B 표 에 두 개의 데이터 가 있다 면 A union B 는 다섯 개의 데이터 가 있 을 것 이다.유 니 온 과 유 니 온 all 의 차 이 를 설명 하 자 면 유 니 온 에 같은 데이터 기록 이 있 으 면 합 쳐 지고 유 니 온 all 은 같은 데이터 기록 을 합 치지 않 으 며 몇 개의 기록 이 있 으 면 몇 개의 기록 이 있 는 지 설명 한다.예 를 들 어 mysql 에서 다음 문장 을 실행 합 니 다.

select * from tmp_libingxue_a;
name number
libingxue 1001
yuwen 1002
select * from tmp_libingxue_b;
name number
libingxue 1001
feiyao 1003
select * from tmp_libingxue_a union select * from tmp_libingxue_b;
libingxue 1001
yuwen 1002
feiyao 1003
select * from tmp_libingxue_a union all select * from tmp_libingxue_b;
libingxue 1001
yuwen 1002
libingxue 1001
feiyao 1003
하지만 이렇게 hiv 에 서 는 실행 할 수 없습니다.select*from tmp 를 실행 합 니 다.libingxue_a union all select * from tmp_libingxue_b;failed,hive 에서 유 니 온 은 하위 조회 에서 진행 해 야 합 니 다....와 같다

select * from (select * from tmp_yuwen_a union all select * from tmp_yuwen_b) t1;
유 니 온 all 이 어야 합 니 다.유 니 온 을 단독으로 사용 하면 ALL 이 부족 하 다 는 것 을 알 릴 수 있 습 니 다.그리고 뒤의 t1 은 반드시 써 야 합 니 다.a 나 b 로 쓸 수 있 지만 꼭 써 야 합 니 다.쓰 지 않 으 면 오류 가 발생 할 수 있 습 니 다.
한편,join 은 가로 에 치 우 친 연합 으로 편향 적 이 며 상세 한 설명 을 기다 리 고 있다.join 은 유 니 온 에 비해 더 느슨 해 보이 고 두 표 의 필드 에 대해 요구 하지 않 습 니 다.제한 조건 이 없 는 join 은 두 표 의 피리 칼 곱 하기 와 같 습 니 다.모든 join 은 제한 조건 으로 제약 을 받 아야 합 니 다.제 한 된 join 은 가로 확장 입 니 다.제한 조건 을 만족 시 키 는 join 은 추출 되 고 만족 하지 않 는 것 은 직접 걸 러 냅 니 다.용법 은 매우 유연 할 수 있다.다음은 두 가지 간단 한 예 가 있다.

select * from (select * from tmp_yuwen_a)t1 join (select * from tmp_yuwen_b) t2;
select * from tmp_yuwen_a t1 join (select * from tmp_yuwen_b) t2; 
left outer join 은 right outer join 의 용법 과 유사 합 니 다.차이 점 은 left outer join 은 왼쪽 표 의 필드 를 모두 선택 하고 오른쪽 표 의 필드 는 조건 에 맞 는 것 도 선택 하 며 만족 하지 않 는 것 은 모두 비 워 두 는 것 입 니 다.즉,왼쪽 표를 참조 하 는 것 입 니 다.right outer join 동 리 는 오른쪽 표를 참조 합 니 다.이 세 join 간 의 차 이 는 여러 번 말 했 고 인터넷 에서 도 더 상세 한 설명 이 있어 더 이상 군말 하지 않 았 다.
공통점:특정한 상황 에서 join 으로 유 니 온 all 의 기능 을 실현 할 수 있 습 니 다.이런 상황 은 조건 이 있 습 니 다.이런 상황 이 발생 했 을 때 유 니 온 all 인지 group by 인지 선택 하면 상황 을 보 거나 이들 의 소 모 를 보고 결정 할 수 있 습 니 다.sql 은 몇 개의 키워드 에 있 지만 변화 가 많 고 기능 이 강하 기 때문에 원 하 는 기능 을 실현 할 수 있다 면 어떻게 사용 하 든 마음대로 하 세 요.필요 한 상황 sql 간단 한 재현 은 다음 과 같 습 니 다.

drop table tmp_libingxue_resource;
create external table if not exists tmp_libingxue_resource(
  user_id string,
  shop_id string,
  auction_id  string,
  search_time  string
)partitioned by (pt string)
row format delimited fields terminated by '\t'
lines terminated by '
' stored as sequencefile; drop table tmp_libingxue_result; create external table if not exists tmp_libingxue_result( user_id string, shop_id string, auction_id string, search_time string )partitioned by (pt string) row format delimited fields terminated by '\t' lines terminated by '
' stored as sequencefile; insert overwrite table tmp_libingxue_result where(pt=20041104) select * from tmp_libingxue_resource;

sudo -u taobao hadoop dfs -rmr /group/tbads/warehouse/tmp_libingxue_result/pt=20041104
sudo -u taobao hadoop jar /home/taobao/dataqa/framework/DailyReport.jar com.alimama.loganalyzer.tool.SeqFileLoader tmp_libingxue_resource.txt hdfs://v039182.sqa.cm4:54310/group/tbads/warehouse/tmp_libingxue_result/pt=20041104/part-00000 


hive> select * from tmp_libingxue_resource;

OK
2001 0  11  101  20041104
2002 0  11  102  20041104

hive> select * from tmp_libingxue_result;

OK
2001 0  12  103  20041104
2002 0  12  104  20041104


select user_id,shop_id,max(auction_id),max(search_time)
from
(select * from tmp_libingxue_resource 
union all
select * from tmp_libingxue_result )t1
group by user_id,shop_id;

2001 0  12  103
2002 0  12  104


select t1.user_id,t1.shop_id,t2.auction_id,t2.search_time
from
(select * from tmp_libingxue_resource) t1
join
(select * from tmp_libingxue_result) t2
on t1.user_id=t2.user_id and t1.shop_id=t2.shop_id;

2001 0  12  103
2002 0  12  104

앞의 소 개 를 통 해 UNION 을 사용 하여 표 의 결과 집합 을 진행 하고 연산 하 는 것 은 JOIN 을 사용 하여 여러 표를 연결 하 는 것 과 본질 적 으로 다르다.
다음은 UNION 연산 자 를 사용 하여 2 표 기록 을 연결 하 는 연산 인 스 턴 스 를 드 립 니 다.
전형 적 인 이 표 기록 의 UNION 연산
표 Table 3 과 Table 4 가 두 개 있다 고 가정 하면 그 안에 포 함 된 열 과 데 이 터 는 각각 다음 과 같다.
표 1 데이터베이스 시트
20151216110017983.png (591×135)
표 2 데이터베이스 시트
20151216110102452.png (582×131)
Table 1 표 와 Table 2 표 는 같은 열 구 조 를 가지 고 있 기 때문에 UNION 연산 자 를 사용 하여 두 표 의 기록 집합 을 연결 할 수 있 으 며,얻 은 연결 결 과 는 다음 표 와 같다.
UNION 을 사용 하여 Table 3 표 와 Table 4 표를 연결 하 는 기록
20151216110125850.png (589×272)
상기 연결 과정의 실현 코드 는 다음 과 같다.

SELECT *
FROM Table1
UNION
SELECT *
FROM Table2

좋은 웹페이지 즐겨찾기