MySQL 에서 유 니 온 과 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 데이터베이스 시트
표 2 데이터베이스 시트
Table 1 표 와 Table 2 표 는 같은 열 구 조 를 가지 고 있 기 때문에 UNION 연산 자 를 사용 하여 두 표 의 기록 집합 을 연결 할 수 있 으 며,얻 은 연결 결 과 는 다음 표 와 같다.
UNION 을 사용 하여 Table 3 표 와 Table 4 표를 연결 하 는 기록
상기 연결 과정의 실현 코드 는 다음 과 같다.
SELECT *
FROM Table1
UNION
SELECT *
FROM Table2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.