我先标明下面题目的转载地址:原题目地址, 还有就是我所使用的数据库是MySQL,但是SQL语法大部分相同,只有少部分与Oracle、SQL Server不同。
之前因为面试中吃了很多SQL 语法的亏了,决定真的要把这个玩会了,之前确实一直因为使用的都是hibernate框架,对数据库原生SQL的操作太少了,所以现在对基本的查询方式特别陌生。看到这套题目之后我还是觉得挺好的,最好是自己亲自写,不会的可以先看一下资料,了解基本的SQL 92 与 SQL 99语法以及数据库分组和组函数之后再开始做题。如果一上来就直接看我的步骤和答案,可能没效果,因为你可能过两天就还给我了。好了,不说那么多了,直接上菜吧:
1、
教师号 星期号 是否有课
1 2 有
1 3 有
2 1 有
3 2 有`
1 2 有
写一条sql语句让你变为这样的表
教师号 星期一 星期二 星期三
1 2 1
2 1
3 1
解析步骤:首先建表,这里是我建的表:
然后也可看到我图中后面的步骤(以teacher_id列进行升序排序),其实mysql自动就是升序排列。再对比题目要求,我们还需要对calendar列进行操作,对相同数值的行进行count(*)操作,但是要注意的是这个count操作是在我们现有执行上面这样操作之后的数据表,也就是要用到子查询。所以接下来执行如下(这里只是对calendar进行count操作):
仔细看这张表发现在calendar=2时总共有3节课,但是显示的全是teacher_id为1的老师,显然这个是错误的。这是因为我们需要的结果是:哪个老师在哪一天有几节课,而上面只有参数哪一天而忽略了哪个老师这个条件,所以这里对后面group by新增一个条件:
这个看起来差不多了,但是看起来还是乱糟糟的,感觉还是以老师(teacher_id)来排序比较好,所以这里再新增一个条件:
嗯!这个看起来还不错的样子。我觉得这个应该也是答案吧。
因为昨天晚上想着第二道题都到两点了,所以没继续写下去,今天补充上来。
2、
两个表情况
表名:wu_plan
ID plan model corp_code plannum prixis
1 00001 exx22 nokia 2000 0
2 00002 lc001 sony 3000 0
表名:wu_bom
ID plan pact amount
1 00001 aa1 300
2 00001 aa2 200
3 00002 bb1 500
4 00002 bb2 800
5 00002 bb3 400
查询这两个表中plan唯一,每一个plan中,amount最少的,plannum大于prixis的记录
结果是:
ID plan model corp_code plannum prixis pact amount
1 00001 exx22 nokia 2000 0 a2 200
2 00002 lc001 sony 3000 0 bb3 400
mysql> select min(b.amount) as min_amount, b.plan from wu_bom b group by b.plan;
结果如下图:
select p.*,y.min_amount from wu_plan p right join (select min(b.amount) as min_amount, b.plan from wu_bom b group by b.plan) y on p.plan = y.plan and p.plannum > p.prixis;
真相就出来了吧。结果如下图: