篩選條件在on和where中的區別(基于hivesql)

理解篩選條件在on和where中的區別,最好先理解sql的執行順序,盡管實際執行時不同的物理執行引擎可能會有特定的優化,但是邏輯執行順序必須遵循:

1)from:確定數據源是什么,from后可以是單表,可以是多表的join操作。
2)where:對from的數據源進行篩選。
3)group by:對where篩選后的結果分組。
4)having:對group by分組后的結果進行過濾(注意此時過濾的數據粒度不是單條記錄,而是整個分組)。
5)select:選擇結果字段(窗口函數的執行時機也在此時)。
6)order by:對select的結果執行排序。
7)limit:限制最終的結果數量。

所以從執行順序可以看出篩選條件放在where和on中,最本質的區別是過濾的時機不同,on中的過濾發生在join的過程中,影響的是匹配邏輯,并不影響參與關聯的數據集本身。而where中的過濾是對join之后的結果集進行過濾。

篩選條件放在on中:

drop view if exists employees;
create temporary view employees as
select 1 as emp_id, '張三' as name, 10 as dept_id
union all
select 2, '李四', 20
union all
select 3, '王五', null;drop view if exists departments;
create temporary view departments as
select 10 as dept_id, '技術部' as dept_name, 'active' as status
union all
select 20, '市場部', 'inactive'
union all
select 30, '財務部', 'active';select *
from employees e
left join departments d on e.dept_id=d.dept_id and d.status='active';

在這里插入圖片描述
保留了左表的全部記錄,邏輯上和先從右表篩選,拿篩選后的結果和左表關聯的效果一樣。

放在where中:

drop view if exists employees;
create temporary view employees as
select 1 as emp_id, '張三' as name, 10 as dept_id
union all
select 2, '李四', 20
union all
select 3, '王五', null;drop view if exists departments;
create temporary view departments as
select 10 as dept_id, '技術部' as dept_name, 'active' as status
union all
select 20, '市場部', 'inactive'
union all
select 30, '財務部', 'active';select *
from employees e
left join departments d on e.dept_id=d.dept_id where d.status='active';

在這里插入圖片描述

tips

執行邏輯上,on只影響匹配邏輯,而不影響參與關聯匹配的數據集本身,因此如果在左連接 left join 中用on對左表進行條件限制,左表依然會全部保留。

drop view if exists employees;
create temporary view employees as
select 1 as emp_id, '張三' as name, 10 as dept_id
union all
select 2, '李四', 20
union all
select 3, '王五', null;drop view if exists departments;
create temporary view departments as
select 10 as dept_id, '技術部' as dept_name, 'active' as status
union all
select 20, '市場部', 'inactive'
union all
select 30, '財務部', 'active';select *
from employees e
left join departments d on e.dept_id=d.dept_id and e.dept_id is not null;

在這里插入圖片描述
實際執行中,物理執行引擎在不影響結果集的前提下也會進行一定的優化,主要優化邏輯就是將參與關聯的數據提早過濾,https://blog.csdn.net/atwdy/article/details/139125669 中對不同情況下的執行計劃進行過詳細的分析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79393.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot 項目 jmeter簡單測試流程

測試內容為 主機地址隨機數 package com.hainiu.example;import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotat…

愛普生FA2016AS晶振在智能家居中的應用

在智能家居設備高速發展的今天,穩定可靠的時鐘信號是確保設備互聯互通、精準執行指令的核心。愛普生(EPSON)推出的FA2016AS內置熱敏電阻晶振,憑借其高精度、小體積和卓越的溫度穩定性,成為智能家居領域的關鍵元件&…

分享一個python啟動文件腳本(django示例)

今天給大家分享一個python啟動文件腳本 在日常開發中,我們常常需要運行多條命令來完成“靜態收集”“數據庫遷移”“啟動服務”……如果把這些命令整合到一個腳本里就好了 一、整體流程概覽 #mermaid-svg-wA6UnfATaUOfJoPn {font-family:"trebuchet ms"…

Kubernetes》》K8S》》Pod的健康檢查

K8s概念總結 》》》Pod的生命周期階段 Pod的生命周期可以簡單描述:首先Pod被創建,緊接著Pod被調度到Node節點進行部署。 Pod是非常忠誠的,一旦被分配到Node節點后,就不會離開這個Node節點,直到它被刪除,刪除…

bininote: 使用AI將視頻轉換了Markdown筆記

GitHub:https://github.com/JefferyHcool/BiliNote 更多AI開源軟件:發現分享好用的AI工具、AI開源軟件、AI模型、AI變現 - 小眾AI BiliNote 是一個開源的 AI 視頻筆記助手,支持通過嗶哩嗶哩、YouTube 等視頻鏈接,自動提取內容并生…

鴻蒙NEXT開發文件預覽工具類(ArkTs)

import { uniformTypeDescriptor } from kit.ArkData; import { filePreview } from kit.PreviewKit; import { FileUtil } from ./FileUtil; import { AppUtil } from ./AppUtil; import { WantUtil } from ./WantUtil;/*** 文件預覽工具類* 提供文件預覽、加載、判斷等功能。…

MySQL常用SQL語句的示例

概述 MySQL 常用 SQL 語句的示例,涵蓋數據定義、操作、查詢等常見場景 一、數據庫操作 創建數據庫 CREATE DATABASE mydb;選擇數據庫 USE mydb;刪除數據庫 DROP DATABASE mydb;二、表操作 創建表 CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VAR…

智算啟新篇 安全筑新基 ——中國移動舉辦智算基礎設施及安全分論壇

4月10日,2025中國移動云智算大會智算基礎設施及安全分論壇在蘇州金雞湖國際會議中心揭幕。 在數字經濟浪潮奔涌向前的時代坐標下,中國移動錨定“創世界一流信息服務科技創新公司”定位,持續推進智算基礎設施建設,持續提升網信安全…

MySQL——游標(cursor)

一、什么是游標? 游標(Cursor) 是MySQL中用于逐行處理查詢結果集的數據庫對象。它類似于指針,允許開發者在結果集中逐行移動,并對每一行數據進行特定操作。游標將傳統的集合操作轉換為面向過程的記錄處理方式&#xf…

異步編程——微信小程序

1. 前言 引用來自:微信小程序開發中的多線程處理與異步編程_微信小程序 多線程-CSDN博客 微信小程序是基于JavaScript開發的,與瀏覽器JavaScript不同,小程序運行在WebView內部,沒有多線程的概念。小程序的 JavaScript 是單線程的…

HarmonyOS-ArkUI V2狀態-PersistenceV2:持久化存儲UI狀態

PersistenceV2類是一個與AppStorageV2類用法非常相似的類。因為它倆是子類和父類的關系。如果不了解AppStorageV2,可以先跳轉至了解一下這個類。 HarmonyOS-ArkUI V2工具類:AppStorageV2:應用全局UI狀態存儲-CSDN博客 PersistenceV2相比于其父類AppStorageV2而言,它存儲的…

《Mycat核心技術》第22章:搭建Mycat+Zookeeper+HAProxy+Keepalived+MySQL高可用架構

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章匯總:https://binghe.gitcode.host/md/all/all.html 星球項目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

Aosp13 文件應用點擊apk無反應的處理

最近遇到一個問題,在A13上,打開文件管理應用時,點擊apk 無反應或者啟動安裝進程后安裝完成或取消安裝進程,再次點擊apk 無反應。在此記錄該問題。 做一下修改:root/package/ providers/DownloadProvider/下 jenkinsdel…

SQL刷題記錄貼

1.題目:現在運營想要對用戶的年齡分布開展分析,在分析時想要剔除沒有獲取到年齡的用戶,請你取出所有年齡值不為空的用戶的設備ID,性別,年齡,學校的信息。 錯誤:select device_id,gender,age,un…

【Windows本地部署n8n工作流自動平臺結合內網穿透遠程在線訪問】

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

python爬蟲降低IP封禁,python爬蟲除了使用代理IP和降低請求頻率,還有哪些方法可以應對IP封禁?

文章目錄 前言1. 利用 CDN 節點2. 模擬真實用戶行為3. 使用 IP 池輪換策略4. 處理 Cookie 和會話信息5. 分布式爬蟲 前言 除了使用代理 IP 和降低請求頻率,以下這些方法也能應對 IP 封禁: Python 3.13.2安裝教程(附安裝包)Python…

光譜相機的成像方式

光譜相機的成像方式決定了其如何獲取物體的空間與光譜信息,核心在于分光技術與掃描模式的結合。以下是主要成像方式的分類解析: ?一、濾光片切換型? ?1. 濾光片輪(Filter Wheel)? ?原理?:通過旋轉裝有多個窄帶…

AI在市場營銷分析中的核心應用及價值,分場景詳細說明

以下是 AI在市場營銷分析中的核心應用及價值,分場景詳細說明: 1. 客戶行為分析與細分 AI技術應用: 機器學習:分析用戶點擊、購買、瀏覽等行為數據,識別消費模式(如高頻購買時段、偏好品類)。聚…

潯川AI翻譯v7.0更新預告

親愛的潯川AI翻譯用戶: 感謝您一直以來的支持!潯川AI翻譯自推出以來,已迭代6個版本,其中**v2.0和v4.0因技術問題(翻譯結果顯示異常、注冊失敗、密碼找回功能失效等)**被迫下架。我們深知這些問題影響了您…

LabVIEW中二維數組轉換為彩色圖

在 LabVIEW 編程環境下,有用戶想把二維數組轉化為彩色圖片。通過附件的程序示例,給出了具體實現方法,包括對數據的處理以及顏色映射的設置等內容,還涉及解決數據范圍與顏色映射不匹配等問題。公司官網有源碼 程序功能及細節 功能&…