1. 程式人生 > >MySQL子查詢(一)—— EXISTS與IN

MySQL子查詢(一)—— EXISTS與IN

原文:http://www.innomysql.net/article/69.html

EXISTS是一個非常強大的謂詞,它允許資料庫高效地檢查指定查詢是否產生某些行。通常EXISTS的輸入是一個子查詢,並關聯到外部查詢,但這並不一定是必須的。根據子查詢是否返回行,該謂詞返回TRUE或FALSE。例如下面的SQL語句:

1 2 3 4 5 6 SELECT customerid,companyname FROM customers AS A WHERE country = 'Spain'
AND EXISTS SELECT FROM orders AS B WHERE A.customerid = B.customerid )

通過下圖的查詢計劃可以發現,SQL優化器首先根據WHERE條件先將country列為Spain的行資料取出,對於每個匹配的customerid,該執行計劃對orders表上customerid索引進行一次查詢,以檢查orders表中是否有customerid的訂單。子查詢中的索引是非常必須的,因為這可以加速對於表orders的訪問。

上述的SQL語句可以重寫為IN子查詢,並且兩者的查詢計劃是相同的:

1 2 3 4 SELECT customerid,companyname FROM customers AS A WHERE country = 'Spain' AND customerid IN SELECT customerid FROM orders );

實際在MySQL 5.6版本之前,其對於IN語句的優化是“LAZY”的。這意味著對於IN子句,如果不是顯示的列表定義,如IN (‘a’,’b‘,’c‘),那麼IN子句都會被轉換為EXISTS的相關子查詢。如下這句獨立子查詢:

1 SELECT ... FROM t1 WHERE t1.a IN (SELECT FROM t2);

優化器會將該語句重寫為如下的相關子查詢:

1 2 SELECT ... FROM t1 

相關推薦

MySQL查詢—— EXISTSIN

原文:http://www.innomysql.net/article/69.html EXISTS是一個非常強大的謂詞,它允許資料庫高效地檢查指定查詢是否產生某些行。通常EXISTS的輸入是一個子查詢,並關聯到外部查詢,但這並不一定是必須的。根據子查詢是否返回

MySQL查詢

一、簡介 開啟慢查詢日誌,可以讓MySQL記錄下查詢超過指定時間的語句,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。 二、引數說明 slow_query_log 慢查詢開啟狀態 slow_query_log_file 慢查詢日誌存放的位置(這個目錄需要M

mysql 查詢之from後面的查詢

員工表中只有3個欄位,員工號、姓名、月薪。要完成示例1,sql為:select * from ( select empno,ename,sal from emp )員工表中沒有年薪,該怎樣完成示例2呢?select * from ( select empno,

mysql 查詢之主查詢查詢的執行順序

那麼,什麼是相關子查詢呢?舉個例子,查詢員工表中薪水大於本部門平均薪水的員工。首先構建思路,說到底還是查詢員工,所以主查詢是查詢員工,然後在where後面增加子查詢,查詢薪水大於本部門平均薪水。開始寫sql,如下:問題來了,查詢某個部門的薪水,公司有很多個部門,所以引數不能寫

MySql資料庫查詢——查詢

1.帶IN關鍵字的子查詢 例如:查詢t_book表和t_booktype表的內容: select * from t_book; select * from t_booktype; 若要查詢bookTypeId在t_booktype表中的資料: select

MySQL優化系列--查詢優化1非索引設計

一、明確搜尋優化的整體思路以及查詢優化的因素: (1)搜尋優化的整體思路: 索引優化,查詢優化,查詢快取,伺服器設定優化,作業系統和硬體優化,應用層面優化(web伺服器,快取)等等。對於一個整體專案而言只有這些齊頭並進,才能實現mysql高效能。 (2)查詢優化的因素思路:

mysql常用語句——多表聯合查詢

學習筆記: 學生選課資料庫SCT 學生表(學號,姓名,性別,年齡,院系編號,班級) Student(S# char(8),Sname char(10),Ssex char(2),Sage integer,D# char(2),Sclass char(6) 院系表(院系編號

【演算法】紅黑樹二叉樹概念查詢

誒,演算法這個東西,其實沒那麼簡單,但是也沒那麼難。 紅黑樹,其實已經有很多大佬都整理過了,而且文章部落格都寫得超好,我寫這篇文章的目的是:自己整理一次,這些知識才是自己的,否則永遠是別人的~   該系列到現在暫只有3篇文章: 【演算法】紅黑樹(二叉樹)概念與查詢(一):h

mysql基礎篇之多表查詢

1、前面的 select * from emp limit 5; 2、Null的用法 0和null是不一樣的,null表示空值,沒有值,0表示一個確定的值 其中null不能參與如下運算:<&g

lamp架構——簡介mysql安裝

11.1 LAMP架構介紹 11.2 MySQL、MariaDB介紹 11.3/11.4/11.5 MySQL安裝 LAMP架構介紹 LAMP是指(Linux+Apache(httpd)+MySQL+PHP)一組通常一起使用來執行動態網站或者伺服器的自由軟體,本

效能測試工具操作資料庫-LoadrunnerMysql

分別庫檔案和程式碼新增到Loadrunner bin目錄和include目錄下 2、vuser_init檔案新增程式碼: #include "Ptt_Mysql.h" #include "mysql

manacher算法處理最長的回文

字母 .cn ddc 還要 自己 它的 nac 回文串 ima 引言 相信大家都玩過折疊紙張,如果把回文串相當於折疊一個A4紙,比如ABCDDCBA就是沿著中軸線(D與D之間)對折重合,那麽這個就是一個回文串。或者是ABCDEDCBA的中軸線就是E,那麽沿著中

MySQL範圍查詢日期

查詢 舉例 jpg 結構 datetime 日期 span mes sta MySQL的時間和日期類型 數據類型 字節數 數據格式 year 1 YYYY date 4 YYYY-MM-DD time 3 HH:MM:SS datetime 8 YY

mysql進階 mysql備份

mysql備份的目的: 實現災難恢復:誤操作、硬件故障、軟件故障、自然災害、黑客攻擊 註意的要點: 1、能夠容忍丟失多少數據 2、恢復數據所用的時間 3、備份需要的時間 4、是否對業務有影響 5、備份時服務器負載 備份類型 完全備份:備份整個

Java加密技術——BASE64單向加密算法MD5&SHA&MAC

sha256 integer 被人 sent 發現 Coding design 如果 targe http://snowolf.iteye.com/blog/379860 加密解密,曾經是我一個畢業設計的重要組件。在工作了多年以後回想當時那個加密、解密算法,實在是太單

Linux下MySQL的基礎

mysql基於解釋MYSQL的基礎1. MySQL服務器中幫助的使用格式: mysql> help command eg: mysql> help create database Name: ‘CREATE DATABASE‘ Description: Sy

.NET中使用Redis之ServiceStack.Redis學習安裝簡單的運行

arraylist write client cli ring blog 控制臺 創建 spa 1.下載ServiceStack.Redis PM> Install-Package ServiceStack.Redis 2.vs中創建一個控制臺程序 class Pro

線特征LSD and 描述LBD

and 0.12 原來 make computer 出現 進行 original -1 最近在看有關特征提取的線特征,暑期就看了相關的論文:《基於點線綜合特征的雙目視覺SLAM方法_謝曉佳》,最近呢,把裏面有關線特征提取LSD和描述子LBD的代碼跑了一遍,記錄如下: [

MySQL 開發技巧

logs 增加 .cn str wid select es2017 使用 idt 一、SQL語句分類 DDL 數據定義語言 TPL 事務處理語言 DCL 數據控制語言 DML 數據操作語言 SELECT INSERT UPDATE DELETE 二、正確使用S

關於MYSQL字符集問題

問題 參數 新的 har 一個數據庫 但是 所有 con 默認   MySQL的字符集支持(Character Set Support)有兩個方面:     字符集(Character set)和排序方式(Collation)。   對於字符集的支持細化到四個層次: