欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql中EXISTS和IN的使用方法比較

 更新時(shí)間:2021年03月12日 09:56:32   作者:槐月十九  
這篇文章主要給大家介紹了關(guān)于mysql中EXISTS和IN使用方法比較的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、使用方式:

(1)EXISTS用法

select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select b.id from ucsc_project b where a.projectId = b.id)

上面這條SQL的意思就是:以u(píng)csc_project_batch為主表查詢(xún)batchName與projectId字段,其中projectId字段存在于ucsc_project表中。

EXISTS 會(huì)對(duì)外表ucsc_project_batch進(jìn)行循環(huán)查詢(xún)匹配,它不在乎后面的內(nèi)表子查詢(xún)的返回值是什么,只在乎有沒(méi)有存在返回值,存在返回值,則條件為真,該條數(shù)據(jù)匹配成功,加入查詢(xún)結(jié)果集中;如果沒(méi)有返回值,條件為假,丟棄該條數(shù)據(jù)。

例如我們這里改變一下子查詢(xún)的查詢(xún)返回字段,并不影響外查詢(xún)的查詢(xún)結(jié)果:

select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select b.companyId,b.name from ucsc_project b where a.projectId = b.id)

(2)IN用法

select a.batchName,a.projectId from ucsc_project_batch a where a.projectId in (select b.id from ucsc_project b)

上面這條SQL的查詢(xún)結(jié)果與剛才的EXISTS的結(jié)果一樣,查詢(xún)的意思也一樣。

2、注意點(diǎn):

(1)EXISTS寫(xiě)法需要注意子查詢(xún)中的條件語(yǔ)句一般需要帶上外查詢(xún)的表做關(guān)聯(lián),不然子查詢(xún)的條件可能會(huì)一直為真,或者一直為假,外查詢(xún)的表進(jìn)行循環(huán)匹配的時(shí)候,要么全部都查詢(xún)出來(lái),要么一條也沒(méi)有。

select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select b.id from ucsc_project b)

比如上述這種寫(xiě)法,由于ucsc_project 表存在值,子查詢(xún)的條件一直為真,ucsc_project_batch 每條數(shù)據(jù)進(jìn)行循環(huán)匹配的時(shí)候,都能匹配成功,查詢(xún)出來(lái)的結(jié)果就成為了ucsc_project_batch整張表數(shù)據(jù)。

select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select b.id from ucsc_project b where b.id is null)

這種寫(xiě)法,子查詢(xún)肯定查不到結(jié)果,所以子查詢(xún)的條件為假,外查詢(xún)的每條數(shù)據(jù)匹配失敗,整個(gè)查詢(xún)結(jié)果為空

(2)IN語(yǔ)句在mysql中沒(méi)有參數(shù)個(gè)數(shù)的限制,但是mysql中SQL語(yǔ)句有長(zhǎng)度大小限制,整段最大為4M

(3)EXISTS的子查詢(xún)語(yǔ)句不在乎查詢(xún)的是什么,只在乎有沒(méi)有結(jié)果集存在,存在則整個(gè)子查詢(xún)可以看作一個(gè)條件為真的語(yǔ)句,不然就是一個(gè)條件為假的語(yǔ)句

(4)IN語(yǔ)句對(duì)于子查詢(xún)的返回字段只能由一個(gè),不然會(huì)報(bào)錯(cuò):

select a.batchName,a.projectId from ucsc_project_batch a where a.projectId in  (select b.id,b.companyId from ucsc_project b)

[Err] 1241 - Operand should contain 1 column(s)

3、場(chǎng)景選擇

外查詢(xún)表大,子查詢(xún)表小,選擇IN;外查詢(xún)表小,子查詢(xún)表大,選擇EXISTS;若兩表差不多大,則差不多。

(1)IN中的SQL查詢(xún)只會(huì)查詢(xún)一次,然后把結(jié)果集存在臨時(shí)文件中,然后再與外層查詢(xún)sql進(jìn)行匹配,其中外查詢(xún)與子查詢(xún)都可以使用索引

select a.batchName,a.projectId from ucsc_project_batch a where a.projectId in (select b.id from ucsc_project b)

等價(jià)于:

$result = [];
$ucsc_project_batch = "select a.batchName,a.projectId from ucsc_project_batch a";
$ucsc_project = "select b.id from ucsc_project b";
for($i = 0;$i < $ucsc_project_batch .length;$i++){
 for($j = 0;$j < $ucsc_project .length;$j++){
  if($ucsc_project_batch [$i].projectId== $ucsc_project [$j].id){
   $result[] = $ucsc_project_batch [$i];
   break;
  }
 }
}

(2)EXISTS會(huì)對(duì)外查詢(xún)的表ucsc_project_batch 進(jìn)行循環(huán)匹配,執(zhí)行ucsc_project_batch.length次,其中子查詢(xún)可以使用索引,外查詢(xún)?nèi)頀呙?/p>

select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select b.id from ucsc_project b where a.projectId = b.id)

等價(jià)于:

$result = [];
$ucsc_project_batch = "select a.batchName,a.projectId from ucsc_project_batch a ";
for ($i = 0; $i < $ucsc_project_batch . length; $i++) {
 if (exists($ucsc_project_batch [$i] . projectId)) {//執(zhí)行select b.id from ucsc_project b where a.projectId=b.id        
  $result[] = $ucsc_project_batch [$i];
 }
}

通過(guò)兩個(gè)的偽代碼分析可知:子查詢(xún)的表大的時(shí)候,使用EXISTS可以有效減少總的循環(huán)次數(shù)來(lái)提升速度;當(dāng)外查詢(xún)的表大的時(shí)候,使用IN可以有效減少對(duì)外查詢(xún)表循環(huán)遍歷來(lái)提升速度。

總結(jié)

到此這篇關(guān)于mysql中EXISTS和IN的使用方法比較的文章就介紹到這了,更多相關(guān)mysql EXISTS和IN比較內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL優(yōu)化之緩存優(yōu)化

    MySQL優(yōu)化之緩存優(yōu)化

    在平時(shí)被問(wèn)及最多的問(wèn)題就是關(guān)于 MySQL 數(shù)據(jù)庫(kù)性能優(yōu)化方面的問(wèn)題,所以最近打算寫(xiě)一個(gè)MySQL數(shù)據(jù)庫(kù)性能優(yōu)化方面的系列文章,希望對(duì)初中級(jí) MySQL DBA 以及其他對(duì) MySQL 性能優(yōu)化感興趣的朋友們有所幫助。
    2017-03-03
  • MySQL優(yōu)化之如何查找SQL效率低的原因

    MySQL優(yōu)化之如何查找SQL效率低的原因

    這篇文章主要介紹了MySQL優(yōu)化之如何查找SQL效率低的原因 ,需要的朋友可以參考下
    2014-05-05
  • mysql中關(guān)于覆蓋索引的知識(shí)點(diǎn)總結(jié)

    mysql中關(guān)于覆蓋索引的知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于mysql中關(guān)于覆蓋索引的知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們學(xué)習(xí)參考下。
    2020-08-08
  • 全面解讀MySQL主從復(fù)制,從原理到安裝配置

    全面解讀MySQL主從復(fù)制,從原理到安裝配置

    這篇文章主要介紹了MySQL主從復(fù)制的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-08-08
  • docker搭建mysql主從同步的全過(guò)程

    docker搭建mysql主從同步的全過(guò)程

    這篇文章主要介紹了docker搭建mysql主從同步的全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 推薦幾款MySQL相關(guān)工具

    推薦幾款MySQL相關(guān)工具

    這篇文章主要介紹了幾款MySQL相關(guān)工具的相關(guān)資料,幫助大家更好的使用和維護(hù)MySQL 數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-11-11
  • MySQL刪除表的時(shí)候忽略外鍵約束的簡(jiǎn)單實(shí)現(xiàn)

    MySQL刪除表的時(shí)候忽略外鍵約束的簡(jiǎn)單實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇MySQL刪除表的時(shí)候忽略外鍵約束的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • 詳解關(guān)于MySQL 8.0走過(guò)的坑

    詳解關(guān)于MySQL 8.0走過(guò)的坑

    這篇文章主要介紹了詳解關(guān)于MySQL 8.0走過(guò)的坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • MySQL產(chǎn)生死鎖原因分析講解

    MySQL產(chǎn)生死鎖原因分析講解

    死鎖指的是在兩個(gè)或兩個(gè)以上不同的進(jìn)程或線程中,由于存在共同資源的競(jìng)爭(zhēng)或進(jìn)程(或線程)間的通訊而導(dǎo)致各個(gè)線程間相互掛起等待,如果沒(méi)有外力作用,最終會(huì)引發(fā)整個(gè)系統(tǒng)崩潰
    2022-12-12
  • MySQL多表鏈接查詢(xún)核心優(yōu)化

    MySQL多表鏈接查詢(xún)核心優(yōu)化

    本篇文章主要介紹了MySQL多表鏈接查詢(xún)核心優(yōu)化,數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)表的多表查詢(xún)是必不可少的,所以涉及到性能優(yōu)化,有需要的可以了解一下。
    2016-11-11

最新評(píng)論