1.构造数据插入方案表t_project_finish表
a)将addtime更新为当前时间的前一天
首先想到的是addtime=addtime-1,然后就开始验证这个想法。
插入一行数据,包括主键和addtime列.

insert into t_project_finish (lotid,pid,addtime) values (1,2,to_date('20130901 12:09:47','YYMMDD HH24:MI:SS'));

然后更改这一行。

update t_project_finish set addtime = addtime-1 where lotid=1 and pid=2

提交事务。查询验证结果:

这说明oracle会自动计算date类型值的加减。

b)比较allmoney和facemoney字段,将较小的一个更新到partlyreturnmoney中
这一题使人联想到?:三元运算符,google之,原来oracle中也有类似功能的函数decode。

DECODE(value,if1,then1,if2,then2,if3,then3,...,else)

表示:如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。

构造decode(sign(变量1-变量2),-1,变量1,变量2),如果变量1小于变量2,那么sign(变量1-变量2)=-1,所以decode返回变量1。

故所求SQL语句如下:

update t_project_finish set partlyreturnmoney =decode(sign(allmoney-factmoney),-1,allmoney,factmoney);

后来发现least函数,那么答案就更简单了。

update t_project_finish set partlyreturnmoney=least(allmoney,factmoney);

2.取出认购表t_prouser_finish中lotid为46、按addtime升序排列后的第6到10条记录

此题初看很简单,其实很繁琐。

select * from (
select A.*, rownum rn from
(select * from t_prouser_finish where lotid = 46 order by addtime) A where rownum <= 10 ))
where rn >= 6;

这条sql语句有三层嵌套,最内层查询t_prouser_finish中lotid为46、按addtime升序排列后的所有记录,次内层查询了前十条记录,并加了一列行号RN,最外层查询行号大于等于六的记录,从而达到最终目的。

本题有两个陷阱:

  1. 是排列后选择6-10行,而不是选择6-10行后排列。
  2. 关键字rownum虽然表示行号,但是只能用其记录某行之前的数据。(不明白为什么)所以,要查询某行之后的数据目前只能增加一列专门记录行号,再用where子句进行筛选。

3.查询lotid为9,pid为161935 的方案的所有认购信息 返回字段:认购表rgid,username,paymoney,以及方案的suctime

典型的左连查询。

select A.rgid,A.username,A.paymoney,B.suctime
from (select * from t_prouser_finish where lotid=9 and pid=161935) A
left join t_project_finish B
on A.lotid=B.lotid and A.pid=B.pid;

这个语句是对的,但是条件很冗余,应该可以用其他关键字获得更高效更简洁的语句。

【改】取消了一层嵌套,原因在于on where的配合使用是我开始不知道的,而两者的运行效率是一样的,显然后者更好。

select A.rgid,A.username,A.paymoney,B.suctime from t_prouser_finish A
left join t_project_finish B
on A.lotid=B.lotid and A.pid=B.pid
where A.lotid=9 and A.pid=161935;

4.根据addtime,按天统计认购表的paymoney总和 返回:日期,paymoney总和,按日期升序排列

这个题目加深了我对group以及嵌套查询的理解。

select day,sum(paymoney) from (select to_char(addtime,'YY-MM-DD') as day,paymoney from t_prouser_finish) group by day order by day;

【改】同样取消了一层嵌套,因为group by可以接列名及其计算表达式,但是不能跟别名,之所以开始使用嵌套查询就是因为我使用group by day报错。

select to_char(addtime,'YY-MM-DD') as day,sum(paymoney) from t_prouser_finish group by to_char(addtime,'YY-MM-DD') order by day;

5.查出方案表的每个方案的allmoney与该方案认购表所有paymoney总和不相等的记录 返回 lotid,pid

select A.lotid,A.pid from t_project_finish A,
(select lotid,pid,sum(paymoney) as allmoney from t_prouser_finish group by lotid,pid) B
where A.lotid = B.lotid and A.pid = B.pid and A.allmoney != B.allmoney
order by lotid;

效率很低,暂时只想到这个办法了。

【改】多表查询改连接查询,一般情况下连接查询性能优于多表。

select A.lotid,A.pid from t_project_finish A
join (select lotid,pid,sum(paymoney) as allmoney from t_prouser_finish group by lotid,pid) B
on A.lotid = B.lotid and A.pid = B.pid and A.allmoney != B.allmoney
order by lotid;

通过这几道SQL的基础题,自觉SQL基础薄弱,不过学习的过程很快乐,希望能够越学越好。

SQL的几道题目的更多相关文章

  1. 学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  2. 小白欢乐多——记ssctf的几道题目

    小白欢乐多--记ssctf的几道题目 二哥说过来自乌云,回归乌云.Web400来源于此,应当回归于此,有不足的地方欢迎指出. 0x00 Web200 先不急着提web400,让我们先来看看web200 ...

  3. 关于SQL的几道小题详解

    关于SQL的几道小题详解 当我们拿到题目的时候,并不是急于作答,那样会得不偿失的,而是分析思路,采用什么方法,达到什么目的,还要思考有没有简单的方法或者通用的方法等等,这样才会达到以一当十的效果,这样 ...

  4. C语言超级经典400道题目

    C语言超级经典400道题目 1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____构A.顺序结构,选择结构,循环结 B.递 ...

  5. hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)

    HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包 ...

  6. 在 n 道题目中挑选一些使得所有人对题目的掌握情况不超过一半。

    Snark and Philip are preparing the problemset for the upcoming pre-qualification round for semi-quar ...

  7. SQL练习题-50道SQL练习题及答案与详细分析

    网上流传较广的50道SQL训练,奋斗了不知道多久终于写完了.前18道题的难度依次递增,从19题开始的后半部分算是循环练习和额外function的附加练习,难度恢复到普通状态.第9题非常难,我反正没有写 ...

  8. SQL 查找 45道练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  9. SQL数据库语句练习题目

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

随机推荐

  1. HDU 1024 Max Sum Plus Plus 简单DP

    这题的意思就是取m个连续的区间,使它们的和最大,下面就是建立状态转移方程 dp[i][j]表示已经有 i 个区间,最后一个区间的末尾是a[j] 那么dp[i][j]=max(dp[i][j-1]+a[ ...

  2. 【暑假】[深入动态规划]UVa 12170 Easy Climb

    UVa 12170 Easy Climb 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24844 思路:  引别人一 ...

  3. HTML5学习之FileReader接口

    http://blog.csdn.net/zk437092645/article/details/8745647 用来把文件读入内存,并且读取文件中的数据.FileReader接口提供了一个异步API ...

  4. Sort--冒泡排序

    冒泡排序 public class BubbleSort { public static void bubblesort(int[] a){ for(int i=0;i<a.length-1;i ...

  5. Hadoop概念学习系列之hadoop、spark常备查询网址(二十九)

    http://archive.apache.org/dist

  6. nyoj 236 心急的C小加

    心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的 ...

  7. poj 4045 (树形DP)

    先选一点为根节点找出所有父节点i到下面所有点距离和dp[i],该父节点下面有多少个点Node[i]. 然后求出所有节点的所有非子节点到该点的距离dp1[v]+=(dp1[u]+(dp[u]-dp[v] ...

  8. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

  9. Struts中文件的上传与下载

    前面学到的用组件去上传 前台: 1.post表单提交 2.表单类型 multipart/form-data 3.intput type=file 后台: Apach提供的FileUpload组件 核心 ...

  10. 一个实际的sonar代码检查的配置文件

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...