亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL中in與exists的使用及區別介紹

2024-07-25 19:09:24
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了MySQL中in與exists的使用及區別介紹,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
 

先放一段代碼

for(int i=0;i<1000;i++){ for(int j=0;j<5;j++){ System.out.println("hello"); }} for(int i=0;i<5;i++){ for(int j=0;j<1000;j++){ System.out.println("hello"); }}

分析以上代碼可以看到兩行代碼除了循環的次序不一致意外,其他并無區別,在實際執行時兩者所消耗的時間和空間應該也是一致的。但是這僅僅是在Java中,現在我們轉化一下情景,最外層循環是數據庫中的連接操作,內層循環為查找操作,那么現在兩次的結果將相差巨大。

之所以出現這樣的原因是數據庫的特點決定的,數據庫中相比較于查詢操作而言,建立連接是更消耗資源的。第一段代碼建立了1000次連接,每一次連接卻只做了5次查詢,顯然是很浪費的。

因此在我們對數據庫進行操作時需要遵循的操作應當是小表驅動大表(小的數據集驅動大的數據集)。

in與exists

表結構

tbl_emp為員工表,deptld為部門id。tbl_dept為部門表。員工表中含有客人,其deptld字段為-1

mysql> desc tbl_emp;+--------+-------------+------+-----+---------+----------------+| Field | Type  | Null | Key | Default | Extra   |+--------+-------------+------+-----+---------+----------------+| id  | int(11)  | NO | PRI | NULL | auto_increment || name | varchar(20) | YES |  | NULL |    || deptld | int(11)  | YES | MUL | NULL |    |+--------+-------------+------+-----+---------+----------------+3 rows in set (0.00 sec)mysql> desc tbl_dept;+----------+-------------+------+-----+---------+----------------+| Field | Type  | Null | Key | Default | Extra   |+----------+-------------+------+-----+---------+----------------+| id  | int(11)  | NO | PRI | NULL | auto_increment || deptName | varchar(30) | YES | MUL | NULL |    || locAdd | varchar(40) | YES |  | NULL |    |+----------+-------------+------+-----+---------+----------------+3 rows in set (0.01 sec)

我們知道對于一個公司而言相對于部門來說員工數要多得多。現在我們有這樣一個需求:查詢屬于這個公司的員工(不含來訪客人),我們可以用以下代碼解決

利用in

# 先查詢部門表中所有的id,然后拿員工表中的deptld字段與之對比,若含有則保留。

mysql> select * from tbl_emp a where a.deptld in (select id from tbl_dept);

in關鍵字就像or的拼接,例如上述sql雨中子查詢查出的結果為1,2,3。則sql語句等價于以下形式

mysql> select * from tbl_emp a where a.deptld=1 or a.deptld=2 or a.deptld=3

總的來說in關鍵字就是將子查詢中的所有結果都查出來,假設結果集為B,共有m條記錄,然后在將子查詢條件的結果集分解成m個,再進行m次查詢。可以看到這里主要是用到了A的索引,B表如何對查詢影響不大

利用exists

mysql> select * from tbl_emp a where exists (select 1 from tbl_dept b where a.deptld = b.id );

exits:將主查詢的數據放到子查詢中做條件驗證,根據驗證結果(True或False)來判斷是否保留主查詢中的記錄。

for (i = 0; i < count(A); i++) { //遍歷A的總記錄數  a = get_record(A, i); //從A表逐條獲取記錄  if (B.id = a[id]) //如果子條件成立    result[] = a;}return result;

可以看到:exists主要是用到了B表的索引,A表如何對查詢的效率影響不大

結論

mysql> select * from tbl_emp a where a.deptld in (select id from tbl_dept);

若tbl_dept的記錄數少余tbl_emp則使用in效率比較高

mysql> select * from tbl_emp a where exists (select 1 from tbl_dept b where a.deptld = b.id );

若tbl_dept的記錄數多余tbl_emp則使用in效率比較高

下面給大家介紹IN與EXISTS的區別

1、IN查詢分析

SELECT * FROM A WHERE id IN (SELECT id FROM B);

等價于:1、SELECT id FROM B ----->先執行in中的查詢

              2、SELECT *  FROM A  WHERE A.id = B.id

以上in()中的查詢只執行一次,它查詢出B中的所有的id并緩存起來,然后檢查A表中查詢出的id在緩存中是否存在,如果存在則將A的查詢數據加入到結果集中,直到遍歷完A表中所有的結果集為止。

以下用遍歷結果集的方式來分析IN查詢

MySQL,in,exists,區別

通過以上程序可以看出,當B表的數據較大時不適合使用in()查詢,因為它會將B表中的數據全部遍歷一次

例如:

1、A表中有100條記錄,B表中有1000條記錄,那么最多可能遍歷100*1000次,效率很差

2、A表中有1000條記錄,B表中有100條記錄,那么最多可遍歷1000*100此,內循環次數減少,效率大大提升

結論:IN()查詢適合B表數據比A表數據小的情況,IN()查詢是從緩存中取數據

2、EXISTS查詢分析

語法:SELECT  字段 FROM  table WHERE EXISTS(subquery);

SELECT * FROM a WHERE EXISTS(SELECT 1 FROM b WHERE B.id = A.id);

以上查詢等價于:

SELECT * FROM A;SELECT I FROM B WHERE B.id = A.id;

EXISTS()查詢會執行SELECT * FROM A查詢,執行A.length次,并不會將EXISTS()查詢結果結果進行緩存,因為EXISTS()查詢返回一個布爾值true或flase,它只在乎EXISTS()的查詢中是否有記錄,與具體的結果集無關。

EXISTS()查詢是將主查詢的結果集放到子查詢中做驗證,根據驗證結果是true或false來決定主查詢數據結果是否得以保存。

總結

以上所述是小編給大家介紹的MySQL中in與exists的使用及區別介紹,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!

 


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲免费电影| 亚洲精品在线视频| 久久久91精品| 精品在线观看国产| 国产精品福利在线观看网址| 亚洲国产精品久久久久秋霞蜜臀| 久久精视频免费在线久久完整在线看| 2019国产精品自在线拍国产不卡| 欧美一级bbbbb性bbbb喷潮片| 久久综合久中文字幕青草| 亚洲剧情一区二区| 日韩高清免费观看| 国产精品久久久久久亚洲影视| 成人亚洲综合色就1024| 68精品国产免费久久久久久婷婷| 色99之美女主播在线视频| 久热国产精品视频| 欧美怡红院视频一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 国模私拍一区二区三区| 国产精品成人观看视频国产奇米| 久久国产加勒比精品无码| 中文字幕日韩av| 在线精品高清中文字幕| 亚洲网站在线观看| 91在线免费视频| 亚洲精品国产精品国产自| 亚洲一区二区久久久久久| 国产不卡精品视男人的天堂| 欧美电影免费观看大全| 7777精品视频| 国产999精品久久久影片官网| 国产精品一区二区三区免费视频| 亚洲国产精品一区二区三区| 亚洲男人天堂网| 久久久久久成人精品| 欧美成人剧情片在线观看| 色99之美女主播在线视频| 国产精品亚洲第一区| 97超碰蝌蚪网人人做人人爽| 日韩中文av在线| 92国产精品久久久久首页| 国产日韩精品综合网站| 国产精品福利小视频| 欧美成人在线影院| 日韩av免费在线| 日韩av网站电影| 色悠久久久久综合先锋影音下载| 国产乱人伦真实精品视频| 97成人精品区在线播放| 福利视频导航一区| 午夜欧美大片免费观看| 亚洲a级在线播放观看| 国产福利精品在线| 久久99久国产精品黄毛片入口| 日韩动漫免费观看电视剧高清| 在线视频免费一区二区| 欧美日韩国产在线看| 亚洲japanese制服美女| 欧洲美女7788成人免费视频| 日韩精品在线观| 日本高清+成人网在线观看| 久久久久久中文字幕| 日韩成人xxxx| 国内外成人免费激情在线视频网站| 国产美女精品免费电影| 久久久久久久久国产精品| 亚洲乱码国产乱码精品精天堂| 高跟丝袜一区二区三区| 精品国产依人香蕉在线精品| 热99久久精品| 日韩中文字幕在线视频播放| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品成av人在线视午夜片| 欧美xxxx做受欧美.88| 亚洲国产成人精品久久久国产成人一区| 精品综合久久久久久97| 午夜精品一区二区三区av| 亚洲男人天堂2019| 亚洲精品第一页| 国产成人福利视频| 国产精品男女猛烈高潮激情| 国产成人精品综合| 国产精品久久久久久久av电影| 亚洲精品国产精品国自产在线| 中文字幕国内精品| 色综合色综合网色综合| 国产一区二区三区视频在线观看| 在线电影欧美日韩一区二区私密| 国产日韩一区在线| 日本三级久久久| 国产精品美女久久久久久免费| 91免费的视频在线播放| 色吧影院999| 色噜噜久久综合伊人一本| 97人人爽人人喊人人模波多| 国产精品91视频| 日韩中文字幕免费| 久久久91精品国产| 欧美日本黄视频| 亚洲国产精品推荐| 精品久久久久久久久久ntr影视| 欧美人成在线视频| 91精品久久久久久久久久| 成人在线免费观看视视频| 久色乳综合思思在线视频| 超碰91人人草人人干| 亚洲男人的天堂在线| 日韩麻豆第一页| 成人天堂噜噜噜| 中文字幕一区二区三区电影| 亚洲白拍色综合图区| 国内精品在线一区| 国产精品美乳一区二区免费| 亚洲天堂av在线播放| 亚洲毛片一区二区| 国产亚洲视频在线观看| 欧美国产在线视频| 国产日韩在线观看av| 日韩精品中文字幕视频在线| 色综合久久久久久中文网| 欧美老肥婆性猛交视频| 亚洲人成电影网站色www| 97超碰蝌蚪网人人做人人爽| 久久久久久久999| 亚洲欧美成人网| 亚洲xxxxx性| 俺去亚洲欧洲欧美日韩| 91精品国产综合久久香蕉| 国产精品成av人在线视午夜片| 中文字幕视频一区二区在线有码| 91爱视频在线| 久久久久久久久91| 久久伊人91精品综合网站| 欧美日产国产成人免费图片| 欧洲美女免费图片一区| 亚洲电影免费观看高清完整版| 亚洲第一网中文字幕| 欧美精品制服第一页| 国产亚洲人成网站在线观看| 日本成人激情视频| 国产久一一精品| 日本久久久久亚洲中字幕| 2018中文字幕一区二区三区| 欧美激情影音先锋| 69国产精品成人在线播放| 国产精品高精视频免费| 欧美黑人狂野猛交老妇| 色偷偷9999www| 日韩在线视频网站| 亚洲va久久久噜噜噜久久天堂| 97超级碰碰碰| 亚洲精品一区中文| 91在线视频导航| 日韩中文在线不卡| 久久国产一区二区三区| 欧美一级片免费在线| 国产欧美va欧美va香蕉在线| 国产黑人绿帽在线第一区| 日韩va亚洲va欧洲va国产| 国产精品18久久久久久麻辣| 欧美影院成年免费版| 麻豆国产va免费精品高清在线| 激情成人中文字幕|