SQL笔试题1.统计查询SQL练习数据库中表结构如下,字段分别任rg(日期),shengfu(胜负),考察group by 语句的使用:2005-05-09 胜2005-05-09 胜2005-05-09 负2005-05-09 负2005-05-10 胜2005-05-10 负2005-05-10 负如果要生成下列结果, 该如何写sql 语句?胜负2005-05-09 2 22005-05-10 1 2答案:1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负'then 1 else 0 end)'负' from #tmp group by rq2) select N.rq,N.胜,M.负from (select rq,胜=count(*) from #tmp where shengfu='胜'group by rq)N inner join(select rq,负=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq3)select a.col001,a.a1 胜,b.b1 负from(select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,(select col001,count(col001) b1 from temp1 where col002='负' group by col001) bwhere a.col001=b.col0012.条件判断SQL练习表中有A B C 三列,用SQL 语句实现:当A 列大于B 列时选择A 列否则选择B 列,当B 列大于C 列时选择B 列否则选择C 列答案:select (case when a>b then a else b end ),(case when b>c then b esle c end)from table_name3.日期统计SQL练习请取出tb_send 表中日期(SendTime 字段) 为当天的所有记录?(SendTime 字段为datetime 型,包含日期与时间)答案:select * from tb where datediff(dd,SendTime,getdate())=04.统计查询SQL练习有一张表,里面有3 个字段:语文,数学,英语。
其中有3 条记录分别表示语文70分,数学80 分,英语58 分,请用一条sql 语句查询出这三条记录并按以下条件显示出来(并写出您的思路):大于或等于80 表示优秀,大于或等于60 表示及格,小于60 分表示不及格。
显示格式:语文数学英语及格优秀不及格答案:select(case when 语文>=80 then '优秀'when 语文>=60 then '及格'else '不及格') as 语文,(case when 数学>=80 then '优秀'when 数学>=60 then '及格'else '不及格') as 数学,(case when 英语>=80 then '优秀'when 英语>=60 then '及格'else '不及格') as 英语,from table7.请用一个sql 语句得出结果,从table1,table2 中取出如table3 所列格式数据table1月份mon 部门dep 业绩yj答案:-------------一月份01 10一月份02 10一月份03 5二月份02 8二月份04 9三月份03 8table2部门dep 部门名称dname答案:--------------01 国内业务一部02 国内业务二部03 国内业务三部04 国际业务部table3 (result)部门dep 一月份二月份三月份答案:答案:--01 10 null null02 10 8 null03 null 5 804 null null 9答案:1)select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份'from table1 a,table2 b,table2 c,table2 dwhere a.部门dep = b.部门dep and b.月份mon = '一月份' anda.部门dep = c.部门dep and c.月份mon = '二月份' anda.部门dep = d.部门dep and d.月份mon = '三月份' and2)select a.dep,sum(case when b.mon=1 then b.yj else 0 end) as '一月份',sum(case when b.mon=2 then b.yj else 0 end) as '二月份',sum(case when b.mon=3 then b.yj else 0 end) as '三月份',sum(case when b.mon=4 then b.yj else 0 end) as '四月份',sum(case when b.mon=5 then b.yj else 0 end) as '五月份',sum(case when b.mon=6 then b.yj else 0 end) as '六月份',sum(case when b.mon=7 then b.yj else 0 end) as '七月份',sum(case when b.mon=8 then b.yj else 0 end) as '八月份',sum(case when b.mon=9 then b.yj else 0 end) as '九月份',sum(case when b.mon=10 then b.yj else 0 end) as '十月份',sum(case when b.mon=11 then b.yj else 0 end) as '十一月份',sum(case when b.mon=12 then b.yj else 0 end) as '十二月份',from table2 a left join table1 b on a.dep=b.dep8.华为一道面试题一个表中的Id 有多个记录,把所有这个id 的记录查出来,并显示共有多少条记录数。
答案:select id, Count(*) from tb group by id having count(*)>1select * from(select count(ID) as count from table group by ID)T where T.count>19.统计查询SQL练习用一条SQL 语句查询出每门课都大于80 分的学生姓名name kecheng fenshu张三语文81张三数学75李四语文76李四数学90王五语文81王五数学100王五英语90A: select distinct name from table where name not in (select distinct name from tablewhere fenshu<=80)10.常规删除查询SQL练习表中数据如下:1 2005001 张三0001 数学692 2005002 李四0001 数学893 2005001 张三0001 数学69删除除了自动编号不同,其他都相同的学生冗余信息A: delete tablename where 自动编号not in(select min(自动编号) from tablename groupby 学号,姓名,课程编号,课程名称,分数)11.行列转换问题year month amount1991 1 1.11991 2 1.21991 3 1.31991 4 1.41992 1 2.11992 2 2.21992 3 2.31992 4 2.4查成这样一个结果year m1 m2 m3 m41991 1.1 1.2 1.3 1.41992 2.1 2.2 2.3 2.4答案一、select year,(select amount from aaa m where month=1 and m.year=aaa.year) as m1, (select amount from aaa m where month=2 and m.year=aaa.year) as m2, (select amount from aaa m where month=3 and m.year=aaa.year) as m3, (select amount from aaa m where month=4 and m.year=aaa.year) as m4 from aaa group by year这个是ORACLE 中做的:select * from (select name, year b1, lead(year) over(partition by name order by year) b2, lead(m,2) over(partition by name order by year)b3,rank()over(partition by name order by year) rk from t) where rk=1;12.行列转换SQL考核原表:courseid coursename score1 java 702 oracle 903 xml 404 jsp 305 servlet 80答案:为了便于阅读,查询此表后的结果显式如下(及格分数为60):courseid coursename score mark答案:1 java 70 pass2 oracle 90 pass3 xml 40 fail4 jsp 30 fail5 servlet 80 pass答案:答案:select courseid, coursename ,score ,decode (sign(score-60),-1,'fail','pass') as mark from course;13.SQL练习(1)表名:购物信息购物人商品名称数量A 甲 2B 乙 4C 丙 1A 丁 2B 丙 5给出所有购入商品为两种或两种以上的购物人记录答:select * from 购物信息 where 购物人 in (select 购物人 from 购物信息 group by 购物人 having count(*) >= 2);(2)表名:成绩表姓名课程分数张三语文81张三数学75李四语文56李四数学90王五语文81王五数学100王五英语49给出成绩全部合格的学生信息(包含姓名、课程、分数),注:分数在60以上评为合格答:select * from 成绩表 where 姓名 not in (select distinct 姓名 from 成绩表 where 分数 < 60)或者:select * from 成绩表 where 姓名 in (select 姓名 from 成绩表 group by 姓名 having min(分数) >=60)(3)表名:商品表名称产地进价苹果烟台 2.5苹果云南 1.9苹果四川 3西瓜江西 1.5西瓜北京 2.4给出平均进价在2元以下的商品名称答:select 名称 from 商品表 group by 名称 having avg(进价) < 2(4)表名:高考信息表准考证号科目成绩2006001 语文1192006001 数学1082006002 物理1422006001 化学1362006001 物理1272006002 数学1492006002 英语1102006002 语文1052006001 英语 982006002 化学129给出高考总分在600以上的学生准考证号答:select 准考证号 from 高考信息表 group by 准考证号 having sum(成绩) > 600(5)表名:高考信息表准考证号数学语文英语物理化学2006001 108 119 98 127 136 2006002 149 105 110 142 129给出高考总分在600以上的学生准考证号答:select 准考证号 from 高考信息表 where (数学+语文+英语+物理+化学) >600(6)表名:clubid gender age67 M 1968 F 3069 F 2770 F 1671 M 32查询出该俱乐部里男性会员和女性会员的总数答:select gender,count(id) from club group by gender(7)表名:teamID(number型) Name(varchar2型)1 a2 b3 b4 a5 c6 c要求:执行一个删除语句,当Name列上有相同时,只保留ID这列上值小的例如:删除后的结果应如下:ID(number型) Name(varchar2型)1 a2 b5 c请写出SQL语句。