1.in和existsin是把外表和內錶作hash連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢,一直以來認為exists比in效率高的說法是不準確的。
如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中乙個較小乙個較大,則子查詢表大的用exists,子查詢錶小的用in。
一般情況下,主表中的資料要少,從表的資料要多。
例:table a(小表) 、table b(大表)
select * from a where id in(select in from b) -->效率低,用到了a表上id列的索引;與之相反:select * from a where exists(select id from b where id=a.id) -->效率高,用到了b表上id列的索引。
select * from b where id in(select id from a) -->效率高,用到了b表上id列的索引select * from b where exists(select id from a where id=b.id) -->效率低,用到了a表上id列的索引。
(1)效能的考慮此時就按子表大主表小用exist,子表小主表大用in的原則就可以.
(2)寫法的不同, exist的where條件是: "...... where exist (..... where a.id=b.id)"
in的where條件是: " ...... where id in ( select id from......)"
2.not in和not exists
在做查詢時,想要查詢有聯絡的兩張表,想得到結果是一張表有而另外一張表沒有的資料時,我們通常會用not in:
select * from a where a.id not in (select id from b)
通常,我們會習慣性的使用not in,在資料比較少的時候是可以的,但是一旦資料量大了,not in的效率就會顯得差了點。
因為not in 和not exists如果查詢語句使用了not in 那麼內外表都進行全表掃瞄,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。
所以無論那個表大,用not exists都比not in要快。
select * from a where not exists(select id from b where id=a.id)或者
select * from a left join b on a.id = b.id where b.id is null;
MySQL 七 條件查詢(in,not in)
3.not in in等同於or 方式1 使用or關鍵字 select ename,job from emp where job manager or salesman 方式2 使用in關鍵字 select ename,job from emp where job in manager salesm...
Flask Web中用MySQL代替SQLite
由於.sqlite檔案操作的諸多不便,決定常識用mysql代替書上的sqlite作為資料庫。1.在虛擬環境中安裝mysql python具體步驟為 1 安裝python dev sudo apt get install python dev 2 安裝libmysqlclient dev sudo a...
mysql 高效模糊查詢 代替like
使用下面的函式來進行模糊查詢,如果出現的位置 0,表示包含該字元串。查詢效率比like要高。如果 table.field like aaa 可以改為 locate aaa table.field 0 locate substr,str position substr in str 返回子串subst...