常用SQL系列之(九):日期计算、分页、跳行与分级等查询
ccwgpt 2024-11-30 19:29 22 浏览 0 评论
本系列为@牛旦教育IT课堂在微头条上发布的内容,
为便于查阅,特辑录于此,都是常用SQL基本用法。
前两篇连接:
(四):常用SQL系列之:Null值、插入方式、默认值及复制等
(六):常用SQL系列之:删除方式、数据库、表及索引元信息查询等
(七):常用SQL系列之:表约束、最大/小值、非null数、平均值等
(八):常用SQL系列之:列值累计、占比、平均值以及日期运算等
SQL点滴(51):如何计算两个日期之间相差的月数或年数?
也就是确定两个日期间的月份数或年份数,计算其间差。比如计算第一个员工和最后一个员工聘用日期相差的月份数,以及这些月折合的年数。首先来看——
1)MySQL的实现示例参考:
SELECT
mnth,mnth / 12
FROM
(
SELECT
(YEAR( max_hd ) - YEAR ( min_hd ))*12 +
MONTH ( max_hd ) - MONTH ( min_hd ) AS mnth
FROM
( SELECT min( hiredate ) AS min_hd, max( hiredate ) AS max_hd FROM employee ) x
) y
注意这个写法,使用了函数Year和Month为给定的日期返回4位数年份和两位数月份。这个写法,也适用DB2。
2)MS SQL中的计算参考:
select datediff(month,min_hd,max_hd),datediff(month,min_hd,max_hd)/12
from( SELECT min( hiredate ) AS min_hd, max( hiredate ) AS max_hd FROM employee )x
若是Oracle中,其写法与此类似,只是所有内部函数不同,如下所示:
select months_between(min_hd,max_hd),months_between(min_hd,max_hd)/12
from( SELECT min( hiredate ) AS min_hd, max( hiredate ) AS max_hd FROM employee )x
这种计算,主要要想清楚他们的关系机理,你可以分别显示年份和月份以作对比,比如:
SELECT
YEAR( max_hd ), YEAR( min_hd ),
MONTH ( max_hd ),MONTH ( min_hd )
FROM
( SELECT min( hiredate ) AS min_hd, max( hiredate ) AS max_hd FROM employee ) x
好了,动手试试吧。
SQL点滴(52):如何实现对查询结果集的分页操作?
进一步讲,就是给查询结果分页,或者“滚动显示”所查询的结果。比如针对人员信息表有500条记录,希望每次显示10行,那么酱油50页可以“翻阅”,从第1页到第50页,在操作页面上,体现为1-50页,可以一页页“点击翻页”,顺序查看每一页,如何在SQL中实现呢?首先,我们来看:
1)在MySQL中的实现:
select id,col01,col02,col03,coln from sometable order by id limit 10 offset 0
上面的意思为我们以id为主键排序 ,第一次从第一条记录开始,一次查看前10条记录。需要注意的是,关键字limit 后的数值,指定要查看多少记录,offerset定义了返回结果的第一条记录的偏移位置(就是从排序集中哪条记录开始依次返回10条记录,或跳过哪些记录),如果体现在页面上,那么offer 0可以看做从头显示第一页10条记录,那么第二页的偏移量offset就是从(2-1)*10,以此类推。当然,具体返回那些字段,根据需要指定。
这种SQL的写法,也适合PostgreSQL。
2)在Oracle中的实现:
select col1,col2,coln
from(
select row_number() over (order by id) as rn,col1,col2,coln from sometable
) x where rn between 1 and 10 .
在where子句的between 和and后的数字,就是表示要返回从那条记录到哪条记录的返回值返回。
此写法同样适用DB2和MS SQL Server。row_number()给每行记录非配唯一序号,以便可以明确返回需要的页记录。
另外,对于Oracle,还有另外一种 方式,使用rownum来生成唯一记录号。
Oracle的ROWNUM的具体SQL实现,自己动手实现一下吧。
SQL点滴(53):小花招—怎样使用SQL语句来跳过表中的指定n行返回所有结果?
比如说,从employee表中每隔一行返回一名员工,或者查找第1、3、5等以此类推的记录,如何实现?其实这个实现可以基于我前面介绍的翻页模式来实现。具体来参考如下实现:
1)MySQL间隔模式返回结果:
SELECT
x.ename
FROM
(
SELECT
a.ename,
( SELECT count( * ) FROM employee b WHERE b.ename <= a.ename ) AS rn
FROM
employee a
) x
WHERE
MOD ( x.rn, 2 ) =1
由于MySQL没有为行分等级或给行编号的函数,所以需要用子查询给行分顺序等级(作为行编号,本查询中用名字来进行分级实现记录的行编号),然后使用求模操作来跳过行。
上面的SQL语句也适用PostgreSQL。
2)在Oracle中的实现:
select ename from (
select row_number() over (order by ename) rn,ename from employee
) x
where mod(rn,2) = 1
关于求模,上面的写法也适用DB2,若在MS SQL中,则用%运算符。上面的语句将跳过偶数行号。
自己动手试试吧。
SQL点滴(54):如何查询指定部门的员工和部门名称信息,而其余部门只显示部门名称而无员工信息?
比如说,只返回部门编号为2和3的部门员工信息以及部门信息,而编号为1和4的只返回部门信息,如何实现。其实,这个用外连接并在连接中用or逻辑即可。参考SQL如下:
SELECT
e.ename,
d.dpid,
d.dpname,
d.dpaddress
FROM
department d
LEFT JOIN employee e ON ( d.dpid = e.departid AND ( e.departid = 2 OR e.departid = 3 ) )
ORDER BY 1
注意,order by 1,是指按ename进行默认升序排序,如果是2,则指定位dpid升序排序。
这个写法适合MySQL、DB2、PostgreSQL以及SQL Server。也适用Oracle9i及以上版本。
另外,上面的语句还可以用e.departid进行筛选,然后进行外部链接,如下所示:
SELECT
e.ename,
d.dpid,
d.dpname,
d.dpaddress
FROM
department d
LEFT JOIN
( select ename,departid from employee where departid in(2,3)
) e on (e.departid = d.dpid )
order by 1
自己动手试试吧。如果有错,记得找找原因哦 ^_^
SQL点滴(55):如何通过查询语句为返回结果分级并返回感兴趣的结果?
比如说,对employee表的工资进行分级,然后返回想要的等级的相关数据。比如薪资一样的为同级别,不同的为不同级别。如果有10条记录,那分出来级别是小于等于10的。
在MySQL中,我使用了子查询,为每个工资创建了一个等级,然后利用等级做条件返回结果,参考语句如下:
第一步,可以查分级结果;
SELECT
( SELECT count( DISTINCT b.salary ) FROM employee b WHERE a.salary <= b.salary ) AS rnk,
a.salary,
a.ename
FROM
employee a order by 1
第二步,把分级结果作为查询对象,添加where子句来返回感兴趣的结果:
select * from x where rnk<=3
x指代第一步的查询语句(作为第二步的子查询),试试吧。我这里演示的两步结果如图所示。
另外,可以看看本号@牛旦教育IT课堂 中关于JPA学习文章:系列总结:JPA核心接口综合实战案例
相关推荐
- 自己动手写Android数据库框架_android开发数据库搭建
-
http://blog.csdn.net/feiduclear_up/article/details/50557590推荐理由关于Android数据库操作,由于每次都要自己写数据库操作,每次还得去...
- 谷歌开源大模型评测工具LMEval,打通谷歌、OpenAI、Anthropic
-
智东西编译|金碧辉编辑|程茜智东西5月28日消息,据科技媒体TheDecoder5月26日报道,当天,谷歌正式发布开源大模型评测框架LMEval,支持对GPT-4o、Claude3.7...
- 工信部:着力推动大模型算法、框架等基础性原创性的技术突破
-
工信部新闻发言人今日在发布会上表示,下一步,我们将坚持突出重点领域,大力推动制造业数字化转型,推动人工智能创新应用。主要从以下四个方面着力。一是夯实人工智能技术底座。通过科技创新重大项目,着力推动大模...
- 乒乓反复纠结“框架不稳定”的三个小误区
-
很多球友由于对框架的认知不清晰,往往会把“框架不稳定”当成一种心理负担,从而影响学球进度,其典型状态就是训练中有模有样,一旦进入实战,就像被捆住了手脚。通过训练和学习,结合“基本功打卡群”球友们交流发...
- 前AMD、英特尔显卡架构师Raja再战GPU,号称要全面重构堆栈
-
IT之家8月5日消息,知名GPU架构师拉贾科杜里(RajaKoduri)此前曾先后在AMD和英特尔的显卡部门担任要职。而在今日,由Raja创立的GPU软件与IP初创企...
- 三种必须掌握的嵌入式开发程序架构
-
前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。我相...
- 怪不得别人3秒就知道软考案例怎么做能50+
-
软考高级统一合格标准必须三科都达到45分,案例分析也一直是考生头疼的一门,但是掌握到得分点,案例能不能50+还不是你们说了算吗?今天就结合架构案例考点,分享实用的备考攻略~一、吃透考点,搭建知识框架从...
- UML统一建模常用图有哪些,各自的作用是什么?一篇文章彻底讲透
-
10万+爆款解析:9大UML图实战案例,小白也能秒懂!为什么需要UML?UML(统一建模语言)是软件开发的“蓝图”,用图形化语言描述系统结构、行为和交互,让复杂需求一目了然。它能:降低沟通成本避...
- 勒索软件转向云原生架构,直指备份基础设施
-
勒索软件组织和其他网络犯罪分子正越来越多地将目标对准基于云的备份系统,对久已确立的灾难恢复方法构成了挑战。谷歌安全研究人员在一份关于云安全威胁演变的报告中警告称,随着攻击者不断改进数据窃取、身份泄露和...
- ConceptDraw DIAGRAM:释放创意,绘就高效办公新未来
-
在当今数字化时代,可视化工具已成为提升工作效率和激发创意的关键。ConceptDrawDIAGRAM,作为一款世界顶级的商业绘图软件,凭借其强大的功能和用户友好的界面,正逐渐成为众多专业人士的首选绘...
- APP 制作界面设计教程:一步到位_app界面设计模板一套
-
想让APP界面设计高效落地,无需繁琐流程,掌握“框架搭建—细节填充—体验优化”三步法,即可一步到位完成专业级设计。黄金框架搭建是基础。采用“三三制布局”:将屏幕横向三等分,纵向保留三...
- MCP 的工作原理:关键组件_mcp部件
-
以下是MCP架构的关键组件:MCP主机:像ClaudeDesktop、GitHubCopilot或旅行助手这样的AI智能体,它们希望通过MCP协议访问工具、资源等。MCP主机会...
- 软件架构_软件架构师工资一般多少
-
软件架构师自身需要是程序员,并且必须一直坚持做一线程序员。软件架构应该是能力最强的一群程序员,他们通常会在自身承接编程任务的同时,逐渐引导整个团队向一个能够最大化生产力的系统设计方向前进。软件系统的架...
- 不知不觉将手机字体调大!老花眼是因为“老了吗”?
-
现在不管是联系、交友,还是购物,都离不开手机。中老年人使用手机的时间也在逐渐加长,刷抖音、看短视频、发朋友圈……看手机的同时,人们也不得不面对“视力危机”——老花眼,习惯眯眼看、凑近看、瞪眼看,不少人...
- 8000通用汉字学习系列讲座(第046讲)
-
[表声母字]加(续)[从声汉字]伽茄泇迦枷痂袈笳嘉驾架咖贺瘸(计14字)嘉[正音]标准音读jiā。[辨形]上下结构,十四画。会意形声字,从壴从加,加也表声。注:从壴,字义与鼓乐有关;从加,字义与...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- 知识框架图 (52)
- ppt框架 (55)
- 框架图模板 (59)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)