欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql查询表中最小可用id值

程序员文章站 2022-03-11 08:52:16
mysql使用自连接与exists语法,在查询表中最小可用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)中值最小的那个,然后返回结果。
结束查询。