MySQL 代替in not in 的sql語句

2021-08-02 17:13:13 字數 1431 閱讀 5782

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...