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

MySql,数据库 专栏收录该内容
3 篇文章 0 订阅
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搜索函数相比,功能方面会有些限制。

group by 一般与聚合函数结合使用,比如查询name字段一共有几个叫‘没毛病’的 用到count或者sum,而且它本身也包含去重功能,既然分组了,相同的肯定在一组。


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分及格先判断(chinese>=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 表示集合是否存在 而exists 表示后面查询结果是否存在 那么not就是他们的反

on是起连接作用,与join连用。


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压力,两者差别不大。


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


  • 4
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

lnkai7899

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值