我想面试过软件开发的朋友都会碰到 sql 方面的面试题,这个可以说是面试必考的。这里拿几个例子开拓一下思路。
1. 有这样一张表
教师号 | 星期 | 是否有课 |
1 | 1 | 有 |
2 | 3 | 有 |
1 | 2 | 有 |
1 | 2 | 有 |
要得出这样的数据:
姓名 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 |
1 | 1 | 2 | Null | Null | Null |
2 | Null | Null | 1 | Null | Null |
不用管具体的表结构,我们看看如何得到这样的结果:
首先我们通过 sql 创建一张表,然后插入数据:
create table Course
(
TeacherId int ,
Week int ,
HasCourse varchar ( 2)
)
insert into Course values ( '1' , '1' , ' 有 ' )
我们分析发现 , 在得到的数据中 , 星期一这样的字段在原表中是不存在的 , 所以如何产生这些字段是关键所在 , 估计这个很多初学者也比较少用 , 但是却很有用 . 另外一点就是对于没有课的要显示为空 , 而不是 0.
好了 , 我们看一下如何统计查询:
select distinct TeacherId as 教师号 ,
星期一 =( select case count (*) when 0 then null else count (*) end from Course where TeacherId= b. TeacherId and Week= '1' ),
星期二 =( select case count (*) when 0 then null else count (*) end from Course where TeacherId= b. TeacherId and Week= '2' ),
星期三 =( select case count (*) when 0 then null else count (*) end from Course where TeacherId= b. TeacherId and Week= '3' ),
星期四 =( select case count (*) when 0 then null else count (*) end from Course where TeacherId= b. TeacherId and Week= '4' ),
星期五 =( select case count (*) when 0 then null else count (*) end from Course where TeacherId= b. TeacherId and Week= '5' )
from Course b group by TeacherId
2. 查询表 User 的地 30 到 40 条数据 ,id 主键并且不连续 .
可以说这是老古董了 , 不过看两种方法吧 :
select top 10 * from [User]
where id not in
( select top 30 id from [User])
select top 10 * from [User]
where id>( select max ( id) from ( select top 30 id from [User]) as T)
3. 查询 SaleDetail 表中 GoodsName 重复出现三次及以上的记录 .
select * from ( select goodsName, count ( goodsName) as c from SaleDetail group by goodsName) as t where t. c>= 3
4. 查询 2010 年 4 月份 Sales 表中的记录。
select * from Sales where saleDate>= '2010-4-1' and saleDate<= '2010-4-30'
这个结果很简单,我们扩展一下。现在查询今天的记录:
select * from Sales where datediff ( dd, SaleDate, getdate ())= 0
我们在查询这个月的记录:
select * from Sales where datediff ( mm, SaleDate, getdate ())= 0
或者:
select * from Sales where month ( saleDate)= month ( getdate ())
5. 表中有 a 、 b 、 c 三列,如果 a>b 则选出 a 否则选出 b ,如果 b>c 选出 b 否则选出 c 。
select ( case when a> b then a else b end ),(( case when b> c then b else c end )) from temp
6. 查询 SaleDetail 中 goodsName 重复的第一行。
select ( select top 1 id from SaleDetail as a where a. goodsName= b. goodsName) as id, goodsName from ( select distinct goodsName from SaleDetail) as b