一些sql语句的练习题及解答

来源:互联网 发布:淘宝网店宝贝图片尺寸 编辑:程序博客网 时间:2024/05/22 04:56
1.一道SQL语句面试题,关于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 2                                              

  2005-05-10 1 2                                                                                                                                

 udate是日期,uname是胜负。


case搜索函数

SELECT udate,
SUM(case when uname='胜' then 1 else 0 end)胜,
SUM(case when uname='负' then 1 else 0 end)负  FROM no1 GROUP BY udate


简单case函数

SELECT udate,
SUM(case uname  when '胜' then 1 else 0 end)胜,
SUM(case 
uname  when '负' then 1 else 0 end)负  FROM no1 GROUP BY udate

简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制。


2.请教一个面试中遇到的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 ELSE c END)
FROM no2



3.面试题:一个日期判断的sql语句?

请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)


SELECT * FROM tb_send 

WHERE datediff(date_format(SendTime,'%Y-%m-%d'),curdate())=0

datediff(a,b)返回两个参数之间天数,date_format(c,d)给c初始化定义时间格式d,

curdate()返回当前日期


4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):  
   大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。  
       显示格式:  
       语文              数学                英语  

       及格              优秀                不及格   


SELECT (CASE WHEN chinese>=80 THEN "优秀" WHEN chinese>=60 THEN "及格" ELSE "不及格" END),
(CASE WHEN math>=80 THEN "优秀" WHEN math>=60 THEN "及格" ELSE "不及格" END),
(CASE WHEN english>=80 THEN "优秀" WHEN english>=60 THEN "及格" ELSE "不及格" END)
FROM no4

有一个case问题特意留到这道题来说,

case when then else end SQL语句相当于if(){} else{} ,when条件判断,如果条件成立直接返回结果,比如上题 :

  如果你就想让60分及格先判断,80后判断,那就得让60判断条件写成  

60<=chinese<80   ---->when  60<=chinese<80 then....


5、表形式如下: 
Year      Salary 
2000        1000 
2001        2000 
2002        3000 
2003        4000 
想得到如下形式的查询结果 
Year      Salary 
2000      1000 
2001      3000      
2002      6000 
2003      10000 
sql语句怎么写? 

想SQL语句首先要明白数学原理,这样就事半功倍了。

salary=上面的+本身

上面的怎么拿 :t2.year当前Year ,  t1<=t2。

SELECT t2.`Year`,SUM(t1.Salary) 
FROM no5 t1,no5 t2 WHERE t1.`Year`<=t2.`Year`
GROUP BY t2.`Year`



6.用一条SQL语句查询出每门课都大于80分的学生姓名
name   kecheng   fenshu
张三     语文       81
张三     数学       75
李四     语文       76
李四     数学       90
王五     语文       81
王五     数学       100
王五     英语       90

SELECT DISTINCT `name` FROM no6 GROUP BY `name` HAVING MIN(fenshu>=80)

DISTINCT去重


7、学生表 如下:
自动编号   学号   姓名      课程编号    课程名称    分数
1        2005001    张三         0001          数学          69
2        2005002    李四         0001          数学          89
3        2005001    张三         0001          数学          69

删除除了自动编号不同,其他都相同的学生冗余信息

delete no7 where uid not in(select min(uid) from no7 
group by xuehao,uname,kebian,kecheng,fenshu)


in是在什么什么范围中,on是起连接作用。


8、面试题:怎么把这样一个表儿
year   month amount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4
查成这样一个结果
year m1   m2   m3   m4
1991 1.1 1.2 1.3 1.4

1992 2.1 2.2 2.3 2.4

select `year`,
max(case month when 1 then amount else 0 end) as 'm1' ,
max(case month when 2 then amount else 0 end) as 'm2' ,
max(case month when 3 then amount else 0 end) as 'm3' ,
max(case month when 4 then amount else 0 end) as 'm4'
from no8 
group by `year`


普通查询给内存压力,case查询给CPU压力,两者差别不大。


以上所述,有什么不同的建议可以私信联系,谢谢大家。