Learning mysql by leetcoe : No. 262 Trips and Users

题目

goto: leetcode 262
难度: Hard

解答

SELECT Request_at AS Day, ROUND(COUNT(IF(Status != 'completed', TRUE, NULL)) / COUNT(*), 2) 'cancellation Rate'
FROM Trips WHERE (Request_at BETWEEN '2013-10-01' AND "2013-10-03") AND Client_Id IN
(SELECT Users_Id FROM users WHERE Banned = 'No') GROUP BY Request_at ASC;

FBI Warning

这道题的描述是有问题的,leetcode上的题目也像是被更改过. “Write a SQL query to find the cancellation rate of requests made by unbanned users”, user 应该包含partner, driver,client. 但是好像如果只处理"unbanned client" 也能通过.(提交记录里多数都是处理unbanned users)

注解

enum

类似C的枚举, 但是很多人认为mysql 中最好不要使用enum. 具体原因可baidu 之.

between

expr BETWEEN min AND max

[min,max], 两边都是闭区间

count

count(column) ---- 不统计null;
count(*) -------------- 统计null
count(distinct column) — 返回指定列的不同值的记录数,会忽略列值为NULL的记录(不包括空字符串和0),即列值为NULL的记录不统计在内。
e.g.:
统计sub_type='REFUND_FEE’ 的记录数:

方法一.select count(sub_type) from t where t.sub_type='REFUND_FEE’;
方法二.select sum(if( B.sub_type='REFUND_FEE’ ,1,0)) from t;
方法三.select count(B.sub_type=‘REFUND_FEE’ or null) from t;

if

IF(expr1,expr2,expr3)
如果 expr1 是TRUE, IF()的返回值为expr2; 否则返回值则为 expr3。

IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

round || truncate

在mysql中,round函数用于数据的四舍五入,它有两种形式:

  • round(x,d) ,x指要处理的数,d是指保留几位小数
    TRUNCATE(x,y)函数返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小数部分。若y设为负数,则截去(归零)x小数点左起第y位开始后面所有低位的值。
  • round(x) ,其实就是round(x,0),也就是默认d为0;

ROUND(x,y)函数在截取值的时候会四舍五入,而TRUNCATE(x,y)函数直接截取值,并不进行四舍五入。

in

列表项选择. where column [NOT] in (…)

更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=0)

关于引号

  1. mysql的字段名、表名通常不需要加任何引号,如果非要加上引号,必须加反引号``(避免与系统关键字冲突);
  2. mysql的别名可以不加引号,如果加引号,单引号和双引号以及反引号都可以;
  3. 单引号和双引号都可以表示字符串;

大小写

linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;
如果有更多的需求, 也可以自己设置是否大小写敏感.

猜你喜欢

转载自blog.csdn.net/laodaliubei/article/details/83991641