最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談mysql雙層not exists查詢執(zhí)行流程

 更新時(shí)間:2023年06月13日 11:14:20   作者:lanren312  
本文主要介紹了淺談mysql雙層not?exists查詢執(zhí)行流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、單個(gè)EXISTS、NOT EXISTS用法

DROP TABLE IF EXISTS `t_staff`;
CREATE TABLE `t_staff` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='人員表';
DROP TABLE IF EXISTS `t_major`;
CREATE TABLE `t_major` (
  `id` int(11) NOT NULL,
  `staff_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='技能表';
INSERT INTO `t_staff` VALUES ('1', '張遼');
INSERT INTO `t_staff` VALUES ('2', '趙云');
INSERT INTO `t_staff` VALUES ('3', '夏侯淵');
INSERT INTO `t_major` VALUES ('1', '2', '大鵬展翅');
INSERT INTO `t_major` VALUES ('2', '2', '無敵風(fēng)火輪');
INSERT INTO `t_major` VALUES ('3', '3', '橫掃千軍');

 EXISTS內(nèi)層查詢【非空】外層的where返回【真值】;內(nèi)層查詢【為空】外層的where返回【假值】
NOT EXISTS內(nèi)層查詢【非空】外層的where返回【假值】;內(nèi)層查詢【為空】外層的where返回【真值】

SELECT * FROM t_student_course WHERE TRUE;     --  能查出數(shù)據(jù)
SELECT * FROM t_student_course WHERE FALSE;    -- 不能查出數(shù)據(jù)

1、查詢至少有一個(gè)技能的人員信息(in、EXISTS)

SELECT * FROM t_staff where id in (SELECT staff_id FROM t_major);
SELECT * FROM t_staff where EXISTS (
    SELECT 1 from t_major where t_staff.id = t_major.staff_id
);
-- 趙云、夏侯淵

2、查詢一個(gè)技能都沒有的人員信息(in、EXISTS)

SELECT * FROM t_staff where id not in (SELECT staff_id FROM t_major);
SELECT * FROM t_staff where NOT EXISTS (
    SELECT 1 from t_major where t_staff.id = t_major.staff_id
);
-- 張遼

二、EXISTS、NOT EXISTS(3張表)

DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DROP TABLE IF EXISTS `t_course`;
CREATE TABLE `t_course` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL COMMENT '課程名稱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DROP TABLE IF EXISTS `t_student_course`;
CREATE TABLE `t_student_course` (
  `id` int(11) NOT NULL,
  `sid` varchar(255) NOT NULL,
  `cid` varchar(255) NOT NULL,
  `score` decimal(10,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `t_student` VALUES (1, '趙子龍');
INSERT INTO `t_student` VALUES (2, '關(guān)羽');
INSERT INTO `t_student` VALUES (3, '張飛');
INSERT INTO `t_student` VALUES (4, '黃忠');
INSERT INTO `t_student` VALUES (5, '馬超');
INSERT INTO `t_course` VALUES (1, '語文');
INSERT INTO `t_course` VALUES (2, '數(shù)學(xué)');
INSERT INTO `t_course` VALUES (3, '英語');
INSERT INTO `t_student_course` VALUES (1, 1, 1, 95);
INSERT INTO `t_student_course` VALUES (2, 1, 2, 99);
INSERT INTO `t_student_course` VALUES (3, 1, 3, 100);
INSERT INTO `t_student_course` VALUES (4, 2, 1, 99);
INSERT INTO `t_student_course` VALUES (5, 2, 2, 100);
INSERT INTO `t_student_course` VALUES (6, 3, 2, 100);
INSERT INTO `t_student_course` VALUES (7, 3, 3, 95);
INSERT INTO `t_student_course` VALUES (8, 4, 1, 100);

EXISTS和NOT EXISTS相關(guān)子查詢什么時(shí)候返回,返回有兩個(gè)條件(很重要)。

1、子查詢找到一個(gè)匹配的立即返回;
2、子查詢遍歷所有,沒有找到一個(gè)匹配的返回為空。

 1、查詢出選修了全部課程的學(xué)生姓名

SELECT name from t_student where id in(
    SELECT sid FROM t_student_course GROUP BY sid 
        HAVING (count(sid)) = (SELECT count(*) from t_course)
)  -- 記錄一般寫法
SELECT name from t_student s where NOT EXISTS (
    SELECT 1 from t_course c where NOT EXISTS (
        SELECT 1 from t_student_course sc 
            where sc.sid = s.id and sc.cid = c.id
    )
)
-- 趙子龍

 子查詢只會(huì)返回true、false,select后面寫1就行了。將查詢語句定義成三個(gè)變量,后面好解釋。

let a1 = SELECT 1 from t_student_course sc 
            where sc.sid = s.id and sc.cid = c.id
let b1 = SELECT 1 FROM t_role WHERE NOT EXISTS (a1)
let c1 = SELECT * FROM t_account WHERE NOT EXISTS (b1);

1  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
1  2 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
1  3 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
一個(gè)都沒找就返回空,最外層的NOT EXISTS就為真,輸出

2  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
2  2 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
2  3 遍歷sc表沒有找到一個(gè)匹配的返回空(假),最內(nèi)層的NOT EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的NOT EXISTS就為假,不輸出

3  1 遍歷sc表沒有找到一個(gè)匹配的返回空(假),最內(nèi)層的NOT EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的NOT EXISTS就為假,不輸出

4  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
4  2 遍歷sc表沒有找到一個(gè)匹配的返回空(假),最內(nèi)層的NOT EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的NOT EXISTS就為假,不輸出

5  1 遍歷sc表沒有找到一個(gè)匹配的返回空(假),最內(nèi)層的NOT EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的NOT EXISTS就為假,不輸出

2、查詢至少選修了一門課程的學(xué)生

SELECT name from t_student s where EXISTS (
    SELECT 1 from t_course c where EXISTS (
        SELECT 1 from t_student_course sc 
              where sc.sid = s.id and sc.cid = c.id
    )
)
-- 趙子龍、關(guān)羽、張飛、黃忠

1  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的EXISTS就為真,輸出

2  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的EXISTS就為真,輸出

3  1 遍歷sc表沒有找到一個(gè)匹配的返回空,最內(nèi)層的EXISTS就為假,b1為空,不能返回
3  2 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的EXISTS就為真,輸出

4  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的EXISTS就為真,輸出

5  1 遍歷sc表沒有找到一個(gè)匹配的返回空,最內(nèi)層的EXISTS就為假,b1為空,不能返回
5  2 遍歷sc表沒有找到一個(gè)匹配的返回空,最內(nèi)層的EXISTS就為假,b1為空,不能返回
5  3 遍歷sc表沒有找到一個(gè)匹配的返回空,最內(nèi)層的EXISTS就為假,b1為空,不能返回

一個(gè)都沒找就返回空,最外層的EXISTS就為假,不輸出

3、查詢沒有選擇所有課程的學(xué)生

SELECT name from t_student s where EXISTS (
    SELECT 1 from t_course c where NOT EXISTS (
        SELECT 1 from t_student_course sc 
            where sc.sid = s.id and sc.cid = c.id
    )
)
-- 關(guān)羽、張飛、黃忠、馬超

1  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
1  2 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
1  3 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
一個(gè)都沒找就返回空,最外層的EXISTS就為假,不輸出

2  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
2  2 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
2  3 遍歷sc表沒有找到一個(gè)匹配的返回空(假),最內(nèi)層的NOT EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的EXISTS就為真,輸出

3  1 遍歷sc表沒有找到一個(gè)匹配的返回空(假),最內(nèi)層的NOT EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的EXISTS就為真,輸出

4  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的NOT EXISTS就為假,b1為空,不能返回
4  2 遍歷sc表沒有找到一個(gè)匹配的返回空(假),最內(nèi)層的NOT EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的EXISTS就為真,輸出

5  1 遍歷sc表沒有找到一個(gè)匹配的返回空(假),最內(nèi)層的NOT EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的EXISTS就為假,不輸出

4、查詢一門課也沒有選的學(xué)生

SELECT name FROM t_student s where NOT EXISTS (
    SELECT 1 from t_course c where EXISTS (
        SELECT 1 from t_student_course sc 
            where sc.sid = s.id and sc.cid = c.id
    )
)
-- 馬超

1  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的NOT EXISTS就為假,不輸出

2  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的NOT EXISTS就為假,不輸出

3  1 遍歷sc表沒有找到一個(gè)匹配的返回空,最內(nèi)層的EXISTS就為假,b1為空,不能返回
3  2 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的NOT EXISTS就為假,不輸出

4  1 遍歷sc表找到一個(gè)匹配的立即返回真,最內(nèi)層的EXISTS就為真,b1不為空,立即返回
找到一個(gè)匹配的立即返回真,最外層的NOT EXISTS就為假,不輸出

5  1 遍歷sc表沒有找到一個(gè)匹配的返回空,最內(nèi)層的EXISTS就為假,b1為空,不能返回
5  2 遍歷sc表沒有找到一個(gè)匹配的返回空,最內(nèi)層的EXISTS就為假,b1為空,不能返回
5  3 遍歷sc表沒有找到一個(gè)匹配的返回空,最內(nèi)層的EXISTS就為假,b1為空,不能返回

一個(gè)都沒找就返回空,最外層的NOT EXISTS就為真,輸出

5、查詢至少選修了學(xué)生2選修的全部課程的學(xué)生名單

select * from t_student s where id != 2 and NOT EXISTS ( 
    select 1 from t_student_course sc where sid = 2 and NOT EXISTS ( 
        select 1 from t_student_course sc2 
            where sc2.cid = sc.cid and sc2.sid = s.id 
    ) 
)
-- 趙子龍

6、選出每門課程中成績最高的學(xué)生

SELECT * FROM t_student_course sc 
    where sc.score = (SELECT max(score) FROM t_student_course sc2 
                        where sc2.cid = sc.cid)
SELECT * FROM t_student_course sc where NOT EXISTS (
    SELECT 1 FROM t_student_course sc2 
        where sc2.cid = sc.cid and sc2.score > sc.score
)

id sid cid score
3    1    3    100
4    1    4    97
7    2    2    100
8    2    3    100
9    3    1    100
11    4    5    100

最后來說說EXISTS、IN用法
EXISTS查詢:先執(zhí)行一次外部查詢,然后為外部查詢返回的每一行執(zhí)行一次子查詢,如果外部查詢返回100行記錄,sql就將執(zhí)行101次查詢。
IN查詢:先查詢子查詢,然后把子查詢的結(jié)果放到外部查詢中進(jìn)行查詢。IN語句在mysql中沒有參數(shù)個(gè)數(shù)的限制,但是mysql中sql語句有長度大小限制,整段最大為4M。IN引導(dǎo)的子查詢只能返回一個(gè)字段。

EXISTS、IN怎么用
當(dāng)子查詢的表大的時(shí)候,使用EXISTS可以有效減少總的循環(huán)次數(shù)來提升速度,當(dāng)外查詢的表大的時(shí)候,使用IN可以有效減少對(duì)外查詢表循環(huán)遍歷來提升速度,
顯然,外表大而子表小時(shí),IN的效率更高,而外表小,子表大時(shí),EXISTS的效率更高,若兩表差不多大,則差不多。

到此這篇關(guān)于淺談mysql雙層not exists查詢執(zhí)行流程的文章就介紹到這了,更多相關(guān)mysql雙層not exists內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Windows下Mysql啟動(dòng)報(bào)1067的解決方法

    Windows下Mysql啟動(dòng)報(bào)1067的解決方法

    這篇文章主要為大家詳細(xì)介紹了Windows下Mysql啟動(dòng)報(bào)1067的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • MySQL建表語句中反引號(hào)``和單引號(hào)''的正確使用全解

    MySQL建表語句中反引號(hào)``和單引號(hào)''的正確使用全解

    這篇文章主要為大家詳細(xì)介紹了MySQL建表語句中反引號(hào)(``)和單引號(hào)('')的正確使用場景,反引號(hào)用于包裹數(shù)據(jù)庫標(biāo)識(shí)符,而單引號(hào)用于包裹字符串常量等方面,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-04-04
  • Mysql鎖之共享鎖(讀鎖)和排他鎖(寫鎖)詳解

    Mysql鎖之共享鎖(讀鎖)和排他鎖(寫鎖)詳解

    這篇文章主要介紹了Mysql鎖之共享鎖(讀鎖)和排他鎖(寫鎖),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解windows下mysql的主從同步

    詳解windows下mysql的主從同步

    本文主要對(duì)windows下的mysql主從同步進(jìn)行詳細(xì)介紹。具有很好的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12
  • 一次MySQL慢查詢導(dǎo)致的故障

    一次MySQL慢查詢導(dǎo)致的故障

    這篇文章主要介紹了如何對(duì)MySQL慢查詢導(dǎo)致的故障進(jìn)行處理,慢查詢是我們?cè)趍ysql中經(jīng)常需要使用到的一個(gè)很方便的功能,慢查詢對(duì)于跟蹤有問題的查詢很有用,需要的朋友可以參考下
    2015-08-08
  • MySQL無法啟動(dòng)的解決辦法

    MySQL無法啟動(dòng)的解決辦法

    這篇文章主要介紹了MySQL無法啟動(dòng)的解決辦法的相關(guān)資料,希望通過本文大家能解決數(shù)據(jù)庫不能啟動(dòng)的問題,需要的朋友可以參考下
    2017-09-09
  • 一篇文章看懂MySQL主從復(fù)制與讀寫分離

    一篇文章看懂MySQL主從復(fù)制與讀寫分離

    在實(shí)際的生產(chǎn)環(huán)境中,由單臺(tái)Mysql作為獨(dú)立的數(shù)據(jù)庫是完全不能滿足實(shí)際需求的,一般都是通過主從復(fù)制的方式來同步數(shù)據(jù),再通過讀寫分離(來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力,這篇文章主要給大家介紹了關(guān)于MySQL主從復(fù)制與讀寫分離的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • MySQL數(shù)據(jù)庫分組查詢group by語句詳解

    MySQL數(shù)據(jù)庫分組查詢group by語句詳解

    這篇文章主要介紹了MySQL數(shù)據(jù)庫分組查詢group by語句詳解,文中含有詳細(xì)示例代碼說明解析,有需要的朋友可以借鑒參考想=下,希望能夠有所幫助
    2021-09-09
  • MySQL EXPLAIN輸出列的詳細(xì)解釋

    MySQL EXPLAIN輸出列的詳細(xì)解釋

    這篇文章主要給大家介紹了關(guān)于MySQL EXPLAIN輸出列的詳細(xì)解釋,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 大批量數(shù)據(jù)用mysql批量更新數(shù)據(jù)的4種方法總結(jié)

    大批量數(shù)據(jù)用mysql批量更新數(shù)據(jù)的4種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于大批量數(shù)據(jù)用mysql批量更新數(shù)據(jù)的4種方法,要在MySQL中新增大批量數(shù)據(jù),可以通過以下幾種方法來實(shí)現(xiàn),文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

乐安县| 镇坪县| 察隅县| 合阳县| 水富县| 泰兴市| 景德镇市| 河曲县| 宁波市| 洞口县| 鲜城| 和林格尔县| 新田县| 云龙县| 弥渡县| 九龙县| 平远县| 德保县| 水富县| 湛江市| 黄梅县| 苍山县| 林甸县| 平陆县| 卢龙县| 甘洛县| 信阳市| 玉环县| 河西区| 丹寨县| 宣城市| 开化县| 融水| 怀来县| 牟定县| 漯河市| 乳源| 岑巩县| 桦甸市| 吴堡县| 大石桥市|