Learning mysql by leetcoe : No. 262 Trips and Users
Leetcode mysql 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
註解
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)
關於引號
- mysql的欄位名、表名通常不需要加任何引號,如果非要加上引號,必須加反引號``(避免與系統關鍵字衝突);
- mysql的別名可以不加引號,如果加引號,單引號和雙引號以及反引號都可以;
- 單引號和雙引號都可以表示字串;
大小寫
linux下mysql安裝完後是預設:區分表名的大小寫,不區分列名的大小寫;
如果有更多的需求, 也可以自己設定是否大小寫敏感.