1. 程式人生 > >mysql查詢表中最小可用id值

mysql查詢表中最小可用id值

今天在看實驗室的專案時,碰到了一個讓我“棘手”的問題,其實也是自己太笨了。先把sql語句扔出來

// 這條語句在id沒有1時,不能得到正確的查詢結果。
select min(id+1) from oslist c where not exists (select id from oslist where id = c.id+1);

剛開始看到這條查詢語句,完全是一臉懵X的狀態,可能也是好久沒碰sql了。

1 exists語法

sql語法中,exists用來篩選結果。實際執行過程中,exists語句是對外表作loop迴圈,每次loop迴圈再對內表進行查詢操作。把外表的記錄逐條代入到子查詢,如果子查詢結果集為空,說明不存在,反之,則存在。

此處要注意的是,這裡把外表的記錄代入到子查詢中,只是看得到的查詢結果是否為,而不是做實質性的值比較。

舉個例子吧: 如果表oslist中的id為1,2,3,4,5,6,7,8,9,10,11,14,15。此處採用文章最開始的sql語句,使用自連線。 那麼在查詢過程如下: 取id為1,看oslist中存在id = 2的否?,存在,則不納入結果集; 取id為2,看oslist中存在id = 3的否?,存在,則不納入結果集; 取id為3,看oslist中存在id = 4的否?,存在,則不納入結果集; 取id為4,看oslist中存在id = 5的否?,存在,則不納入結果集; 取id為5,看oslist中存在id = 6的否?,存在,則不納入結果集; 取id為6,看oslist中存在id = 7的否?,存在,則不納入結果集; 取id為7,看oslist中存在id = 8的否?,存在,則不納入結果集; 取id為8,看oslist中存在id = 9的否?,存在,則不納入結果集; 取id為9,看oslist中存在id = 10的否?,存在,則不納入結果集; 取id為10,看oslist中存在id = 11的否?,存在,則不納入結果集; 取id為11,看oslist中存在id = 12的否?,不存在

,則納入結果集; 取id為14,看oslist中存在id = 15的否?,存在,則不納入結果集; 取id為15,看oslist中存在id = 16的否?,不存在,則納入結果集; 取(11+1)與(15+1)中值最小的那個,然後返回結果。 結束查詢。