我的2020
我的2020,一直陪伴著的可能就是不斷更新迭代的機器人開發(fā)了。
每個河粉的群里都要必備的機器人,用來搬運口袋消息,及時更新各類消息。
一年來的開發(fā)讓我熟悉了Python的用法和一些高級特性,也讓我真正體會到 The Art of Python,如何寫出優(yōu)美自然的代碼。
一年來的開發(fā)讓我熟悉了SQL的進階用法,聯(lián)合查詢、表的權(quán)限控制等等。
對于2020年的回顧,就用SQL來展示吧!

權(quán)限控制
privileges
:用戶的操作權(quán)限,如SELECT
,INSERT
,UPDATE
等,若要所有的權(quán)限則使用ALL
databasename
:數(shù)據(jù)庫名tablename
:表名,如果要授予該用戶對所有數(shù)據(jù)庫或?qū)?yīng)所有表的相應(yīng)操作權(quán)限則可用*
表示,如*.*
如
另外每當調(diào)整權(quán)限后,通常需要執(zhí)行以下語句刷新權(quán)限:
查看用戶權(quán)限
撤銷用戶權(quán)限
將 GROUP 分組后的多條數(shù)據(jù)的單個字段合并為一條數(shù)據(jù)
用 GROUP_CONCAT 函數(shù)合并
GROUP_CONCAT([DISTINCT] 要連接的字段 [ORDER BY ASC/DESC 排序字段] [separator '分隔符'])
數(shù)據(jù)分組并按字段分列查詢
如何查詢數(shù)據(jù)并根據(jù)兩個字段分行分列統(tǒng)計數(shù)目,類似于 Excel 的數(shù)據(jù)透視表。例如,下面的表格card_record
中,以fund_id
為行,card_id
為列,統(tǒng)計每個用戶獲得的各類卡片分別有多少張(條)。
要實現(xiàn)所述功能,需要在查詢的結(jié)果中判斷對應(yīng)card_id
的值是哪一列,然后再通過AS
命名該列,如下面的靜態(tài)版本所示
靜態(tài)版本
靜態(tài)版本有其局限性,當目標列(也就是card_id
)類型眾多時,不可能手動將條件一條一條列出,因此需要利用MySQL的CONCAT
等函數(shù)構(gòu)造語句,然后再執(zhí)行構(gòu)造完成的所有列條件的語句,如下面的動態(tài)版本
動態(tài)版本
''',card_id,'''
的目的是遍歷card_id
變量的值,作為所有條件判斷的內(nèi)容,''
兩個單引號轉(zhuǎn)義為字符串內(nèi)的單引號CASE WHEN ... THEN ... (ELSE ...) END
,若上述代碼中不寫COUNT
,那么輸出的結(jié)果則是THEN
后響應(yīng)的fund_id
的結(jié)果`',card_id,'`
兩邊設(shè)置反引號的作用是聲明列名,避免字段的Unicode字符解析錯誤第2條語句(
SELECT
)與第3條語句(SET
)查詢的表、WHERE
條件應(yīng)當保持一致
注意,在使用中可能出現(xiàn)如下的提示
這是因為默認GROUP_CONCAT
構(gòu)造的語句最大長度為1024
,當條件過多時語句會被截斷到最大長度,在語句前用下面的代碼聲明最大長度為一個較大的值即可解決
得到的查詢結(jié)果是