几个sql题目,可能对学习sql有用处,感兴趣的朋友也可以试试看能不能写出来
经沧海(qq179889551)出的sql题目(纯属原创,若有转贴请注明出处)
感兴趣的朋友可以相互交流,我不提供答案,若有疑问可以通过我的qq询问,但我只会给出sql写法的思路,直接给出答案可能你就失去了学习提高的机会
1、无中生有
表内有若干记录,要求写出这样一个查询语句:对于给定的条件,若表内存在相应的记录,要求查询结果是空;若表内不存在相应的记录,要求查询结果非空。
提示:
count(*)=0是一条记录,记录的内容是0,这不是空;count(*)=2也是一条记录,记录的内容是2,也不是空
例如有表t的列c是整数类型,表内记录举例如下:
select * from t;
c
------
1
3
------
共有2条记录
若给定的条件是1,要求查询的结果是空,也就是一条记录也查不出来;若给定的条件是2,要求查询的结果是非空,查询的结果可以是任意条的任何记录,只要结果不是空就可以。
2、波动率分析
现有居民用电情况表结构如下:
表名:yd
列名:yh(字符类型,记录用户名称),ssny(日期时间类型,记录用户电费的所属年月),df(数值类型,记录用户ssny所属年月的电费金额)
表内记录举例如下:
select * from yd;
yh ssny df
-------------------
张三 200501 100.00
张三 200502 200.00
张三 200503 300.00
李四 200501 100.00
李四 200502 200.00
李四 200503 50.00
-------------------
共有6条记录
要求写出这样一个查询语句:查询出所有用户当月电费比上月电费波动大于50%的用电情况记录。波动率公式:(本月电费 - 上月电费)/上月电费
查询结果举例如下:
yh ssny df sydf(上月电费) bdl(波动率)
---------------------------------------------------------
张三 200502 200.00 100.00 |(200-100)|/100
李四 200502 200.00 100.00 |(200-100)|/100
李四 200503 50.00 200.00 |( 50-200)|/200
提示:
日期时间相关函数(oracle语法):add_months(日期时间,整数数值)
200502=add_months(200501,1)
200501=add_months(200503,-2)
也可是使用其他数据库系统相关日期时间函数,用的时候请注释说明
3、分组后的组内排序号
现有表t记录举例如下:
select * from t;
a b
-----
a1 c
a1 d
b2 g
b2 f
b2 e
------
共有5条记录
要求写出这样一个查询语句:查询表t的所有记录,查询结果中增加按照a分组后按照b排序的组内排序号。
查询结果举例如下:
a b xh
--------
a1 c 1
a1 d 2
b2 e 1
b2 f 2
b2 g 3
--------
4、qq号码回收
qq号码本来是从10000不断加1增长的,但是由于各种原因,造成qq号码中有断号现象,腾讯老板马化腾希望找出这些不存在号码,以便回收卖钱。qq号码表名是t,表内记录举例如下:
select * from txqq;
qq
----------
10000
10001
...
10000000
10000002 (缺少10000001这个号码)
...
300000000
500000000 (缺少300000001~499999999之间的号码)
...
----------
要求:请分析该需求,并说明如何用一个sql查询实现的思路