mysql相關子查詢 SQL子查詢與連線查詢研究

2021-10-18 11:48:38 字數 3403 閱讀 1007

假設有a、b兩張表,其中b表有a表的外來鍵。在sql查詢中,我們經常有這樣的需求,需要根據b表中的條件篩選去查詢a表中的內容,以工作流查詢使用者的已辦流程為例來說明:

1、歷史流程例項表act_hi_procinst:下述用a表代替

create table `act_hi_procinst` (

`id_` varchar(64) collate utf8_bin not null,

`proc_inst_id_` varchar(64) collate utf8_bin not null,

`business_key_` varchar(255) collate utf8_bin default null,

`proc_def_id_` varchar(64) collate utf8_bin not null,

`start_time_` datetime(3) not null,

`end_time_` datetime(3) default null,

`duration_` bigint(20) default null,

`start_user_id_` varchar(255) collate utf8_bin default null,

`start_act_id_` varchar(255) collate utf8_bin default null,

`end_act_id_` varchar(255) collate utf8_bin default null,

`super_process_instance_id_` varchar(64) collate utf8_bin default null,

`delete_reason_` varchar(4000) collate utf8_bin default null,

`tenant_id_` varchar(255) collate utf8_bin default '',

`name_` varchar(255) collate utf8_bin default null,

primary key (`id_`),

unique key `proc_inst_id_` (`proc_inst_id_`),

key `act_idx_hi_pro_inst_end` (`end_time_`),

key `act_idx_hi_pro_i_buskey` (`business_key_`)

) engine=innodb default charset=utf8 collate=utf8_bin;

2、歷史節點許可權辦理表act_hi_identitylink:以下用b表代替

create table `act_hi_identitylink` (

`id_` varchar(64) collate utf8_bin not null default '',

`group_id_` varchar(255) collate utf8_bin default null,

`type_` varchar(255) collate utf8_bin default null,

`user_id_` varchar(255) collate utf8_bin default null,

`task_id_` varchar(64) collate utf8_bin default null,

`proc_inst_id_` varchar(64) collate utf8_bin default null,

primary key (`id_`),

key `act_idx_hi_ident_lnk_user` (`user_id_`),

key `act_idx_hi_ident_lnk_task` (`task_id_`),

key `act_idx_hi_ident_lnk_procinst` (`proc_inst_id_`)

) engine=innodb default charset=utf8 collate=utf8_bin;

3、a、b表關係說明 a表的proc_inst_id_欄位與主鍵id_字段值完全相同,b表的proc_inst_id_欄位作為a表的外來鍵。 乙個流程對應a表的一條資料,但會對應b表的多條資料(每個流程節點在辦理時都會往b表插入資料),b表的user_id_欄位會記錄辦理使用者的id,查詢使用者已辦流程即根據此欄位過濾即可,好了背景介紹完畢。

4、查詢使用者已辦流程sql寫法 1)子查詢(in方法)

select distinct

res.*

from

act_hi_procinst res

where

res.proc_inst_id_ in (

select

link.proc_inst_id_

from

act_hi_identitylink link

where

link.user_id_ = 6742

2)子查詢(exists方法)

select distinct

res.*

from

act_hi_procinst res

where

exists (

select

link.user_id_

from

act_hi_identitylink link

where

user_id_ = 6742

and link.proc_inst_id_ = res.proc_inst_id_

3)連線查詢(join方法)

select distinct

res.*

from

act_hi_procinst res

join act_hi_identitylink link on link.proc_inst_id_ = res.proc_inst_id_

where

link.user_id_ = 6742

以上3種方法查詢結果均一致:

5、sql語句對比

1)查詢速度

當外層查詢結果集的資料量n較小時,優先選用方法2——子查詢(exists方法); 反之,當外層查詢結果集的資料量n較大時,優先推薦方法3——連線查詢(join方法);

2)如何選擇

如果要求查詢的內容包含a、b兩個表的字段,或者外層查詢結果集的資料量n較大時則優先推薦方法3——連線查詢(join方法);

至於方法一——子查詢(in方法)基本不太建議,可讀性和效率均不佳,除非in後面是確定的範圍,如b.status in(1,2,3,4)這種;如果你用了方法一不妨看看能否用其他兩種方法代替,以提公升可讀性和效率。

本文就到這兒了,平時經常用的sql查詢,今天簡單總結了下,希望對讀者有幫助。

mysql 非相關子查詢 相關子查詢一

1 子查詢在查詢語句中可出現的位置 2 子查詢的分類 3 子查詢的優化的思路 3.1 做子查詢優化的原因 3.2 子查詢優化技術 3.3 子查詢展開 4 最常見的子查詢型別的優化 4.1 in型別 4.2 all any some型別 4.3 exists型別 5 例項 二 相關子查詢和非相關子查詢...

sql之獨立子查詢和相關子查詢總結

1 獨立子查詢 顧名思義 就是子查詢和外層查詢不存在任何聯絡,是獨立於外層查詢的 下面就看乙個例子 有一張訂單表 sales.order 和一張 客戶表 sales.customer 下面的sql 語句是為了查詢出sales.customer裡 custid 使用者id 不在 sales.order...

Mysql 非相關子查詢和相關子查詢的執行解析

前段時間有乙個相關子查詢的sql語句,看不太懂他是如何執行的,為什麼會出現那個結果。著實糾結了一把。下面來講一下非相關子查詢和相關子查詢的執行過程是怎樣的。先看乙個非相關子查詢到sql語句。需求 查詢學生表student和學生成績表grade中成績為70分的學生的基本資訊。select t.sno,...