最近经常看到一些关于一些sql面试题的博客,如果站在初学者的角度来看的话,发现大有不足之处,
1.没有对各个关键字详细的介绍;
2.没有解题思路;
接下来我对最近常见的几个sql题的解题思路以及所用关键字做一个详细的介绍,希望能帮助到大家!
一、已知有如下表内容
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
这里就用到了case when then 关键字
SELECT datatime 日期,
SUM(CASE sta WHEN “胜” THEN 1 ELSE 0 END) 胜,
SUM(CASE sta WHEN “负” THEN 1 ELSE 0 END) 负
FROM table
GROUP BY datatime;
在这里 CASE WHEN THEN 关键字就特别像java中的switch循环,请往下看:
CASE 字段 WHEN 要对比的值 THEN 如果匹配就返回THEN里的值 WHEN…THEN…****ELSE 否则返回ELSE的值 END
WHEN可以有一个或多个,是不是很像switch;刚才这种写法更倾向于判断固定的值,其实还有另一种写法,请往下看:
二、一个面试中遇到的SQL语句的查询问题
表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
SELECT (CASE WHEN a>b THEN a
WHEN a>c THEN a
WHEN b>c THEN b ELSE c END) 结果
FROM table
CASE WHEN 字段>=0 THEN 符合调价返回THEN里的值 WHEN…THEN…****ELSE 否则返回ELSE的值 END
这种写法是不是神似java中的for循环+if语句 ,值得注意的是:不管哪种写法,最后都要加END,否则报错
三、一个日期判断的sql语句?
请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期 与时间)
SELECT * FROM tb_send
WHERE DATEDIFF(SendTime,CURDATE())=0
DATEDIFF(a,b) 该关键字是返回两个datatime类型的参数之间相隔的天数,
CURDATE() 这个关键字是返回当前时间的datatime数据,
明白了关键字的作用后,是不是豁然开朗,所以说平时还是得多读书,多看报,少吃零食多睡觉!(╯▽╰)。
四、有一张表,里面有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 table
CASE关键字的作用,上边都有说,这个sql相信大家一看就明白了。(#^.^#)
五、怎么把这样一个表儿
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 ThisTable
group by year
②
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