SQL查询技巧:主键不连续数据检索与删除操作解析

创始人
2024-12-27 21:09:34
0 次浏览
0 评论

在SQL中如果主键字段是不连续的如何查出表中的第三四条数据

selecttop2*fromexloginrecordwhereidnotin(selecttop2idfromexloginrecordorderbyid)orderbyid写一条Sql语句:删除A表中的31到40条记录(SQLServer,使用自动增长ID为主键,注意:ID不能连续。
答案:解决方案一:selecttop10*fromtsmordermanagewhereidnotin(selecttop30idfromtsmordermanageorderbyid)orderbyid解决方案2:selecttop10*fromtsmordermanagewhereid>(selectmax(id)from(selecttop30idfromtsmordermanageorderbyid)astsmordermanage)orderbyid根据您的表结构,其中一些不需要orderby我昨天在采访中刚刚读到这个问题。

要查数据表中第30到40条记录,有字段ID,但是ID并不连续,如何写SQL语句?

示例:select*fromemployeesewhererownumbetwon30and40;Explanation:rownum-数据库对查询结果中出现的记录进行编号,从1开始。
--请打印表中记录的前5行。
选择*fromemployeeswhererownum<=5;--请打印出表中第6行至第10行记录。
select*fromemployees其中rownum介于6和10之间;到rownum,>=,=,XXX和XXX之间

用SQL写出分页查询

SELECT*FROM(SELECTA.*,ROWNUMRNFROM(SELECT*FROMTABLE_NAME)A--不排序WHEREROWNUM<=40)WHERERN>=21;SELECT*FROM(SELECTa.*,row_number()over(ORDERBY1)rn--错误排序,与FRO速度相同mt1a)WHERErnBETWEEN21AND40;SELECT*FROM(SELECTa.*,row_number()over(ORDERBYc1)rn--实际排序,速度无法比较FROMt1a)WHERErnBETWEEN21AND40;Oracle分页查询语句按照本文给出的格式基本可以应用。
分页查询格式:SELECT*FROM(SELECTA.*,ROWNUMRNFROM(SELECT*FROMTABLE_NAME)AWHEREROWNUM<=40)WHERERN>=21最里面的查询SELECT*FROMTABLE_NAME表示不翻页的原始查询语句。
ROWNUM<=40且RN>=21控制分页查询中每页的范围。
上面给出的分页查询语句在大多数情况下都是非常有效的。
分页的目的是控制输出结果集的大小并尽快返回结果。
在上面的分页查询语句中,这种考虑主要体现在WHEREROWNUM<=40这句话上。
选择21到40条记录有两种方法。
一种是如上例所示在查询的第二层通过ROWNUM<=40检查最大值,在查询的最外层检查最小值。

另一种方法是去掉查询第二层中的WHEREROWNUM<=40语句,在查询的最外层控制最小和最大分页值。
即查询语句为:SELECT*FROM(SELECTA.*,ROWNUMRNFROM(SELECT*FROMTABLE_NAME)A)WHERERNBETWEEN21AND40对比这两种写法,大多数情况下第一个查询比第二个查询有效得多。
确实,在CBO优化模式下,Oracle可以将外部查询条件融入到内部查询中,以提高内部查询的执行效率。
对于第一条查询语句,二级查询条件WHEREROWNUM<=40可以由Oracle插入到内部查询中。
这样,一旦Oracle查询结果超过ROWNUM限制,查询就会终止,结果也会终止。
将被退回。
至于第二条查询语句,由于查询条件BETWEEN21AND40存在于查询的第三层中,因此Oracle无法将查询条件从第三层推送到最内层(即使推送到最内层,这也不行)有意义,因为最内层查询不知道RN的含义)。
因此,对于第二条查询语句,Oracle最内层将所有符合条件的数据返回给中间层,中间层将所有数据返回给最外层。
数据过滤是在最外层完成的,显然比第一个查询效率低很多。
上面分析的查询不仅是简单的单表查询,对于最内层查询是复杂的多表联合查询或者最内层查询包含排序的情况也同样有效。
包含排序的查询这里不再解释。
下一篇文章会通过例子来详细讲解。
我们简单讨论一下多表联合的情况。
对于最常见的等价表连接查询,CBO一般可以使用两种连接方式:NESTEDLOOP和HASHJOIN(MERGEJOIN较少比HASHJOIN有效,并且一般不被CBO考虑)。
这里,由于使用了分页,所以指定了要返回的最大记录数。
NESTEDLOOP可以在返回的记录数超过最大值时立即停止并将结果返回给中间层,而HASHJOIN必须处理所有结果集。
(对于MERGEJOIN也是如此)。
所以,大多数情况下,选择NESTEDLOOP作为分页查询的查询连接方式是比较高效的(分页查询时,大多数时候都是查询前几页数据,后面的页距离越远,越高因此,如果不介意在系统中使用HINT,可以将分页查询语句重写如下:SELECT*FROM(SELECTA.*,ROWNUMRNFROM(SELECT*FROMTABLE_NAME)AWHEREROWNUM<=40)WHERERN>=21

如果你有三张表第一张有30条记录,第二张有40,第三张有50条,怎么样用一条sql语句查询出来!

select1asflag,count(*)fromT1unionallselect2asflag,count(*)fromt2unionallselect3asflag,count(*)fromt3结果是flagcount130240350
文章标签:
SQL 分页查询
热门文章
1
Redisson分布式锁深度解析:Red... Redis实现分布式锁+Redisson源码解析在某些场景下,多个进程需要以互斥...

2
深度解析Docker:容器技术提升应用部... docker是什么Docker是一种强大的开源容器技术,它将应用程序及其所有依赖...

3
C语言实现:如何判断一个整数是否为质数? C语言输入一个整数,判断是否是质数?#include//头文件intmain()...

4
K8s弃用Docker背后的故事及Doc... K8s为什么要弃用Docker?在讨论K8s抛弃Docker的话题时,我们首先需...

5
C语言文本输入输出教程:安全高效处理字符... C语言怎么变成文字?如果你想用C语言输入输出文本,其实很简单。您必须首先定义一个...

6
深入解析Java:面向对象编程特性与实现... Java语言的特点,实现机制和体系结构。中的任何实体都可以被视为一个对象。对象通...

7
三款免费Docker管理工具,提升您的可... 3款免费又好用的Docker可视化管理工具在Docker的世界里,命令行工具无疑...

8
C语言期末编程题解析:完整程序代码分享 C语言期末考试编程代码函数题?按照题目要求编写的完整程序如下(见图,图中重复的部...

9
轻松掌握:Redis键值查看技巧,两种方... 如何读取redis中的key值中的结果我们希望它能帮助您使用它。怎么查看redi...

10
SQL DELETE语句:详解及不同删除... 请问Sql的DELETE语句怎么写delete表示删除表中的数据示例:delet...