分享10個高級sql寫法
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
本文主要介紹博主在以往開發(fā)過程中,對于不同業(yè)務(wù)所對應(yīng)的 sql 寫法進(jìn)行歸納總結(jié)而來。進(jìn)而分享給大家。
一、ORDER BY FIELD() 自定義排序邏輯MySql 中的排序 ORDER BY 除了可以用 ASC 和 DESC,還可以通過**ORDER BY FIELD(str,str1,...)**自定義字符串/數(shù)字來實(shí)現(xiàn)排序。這里用 order_diy 表舉例,結(jié)構(gòu)以及表數(shù)據(jù)展示: ORDER BY FIELD(str,str1,...) 自定義排序sql如下:
查詢結(jié)果如下: 如上,我們設(shè)置自定義排序字段為 title 字段,然后將我們自定義的排序結(jié)果跟在 title 后面。 二、CASE 表達(dá)式「case when then else end」表達(dá)式功能非常強(qiáng)大可以幫助我們解決
查詢結(jié)果: 三、EXISTS 用法我猜大家在日常開發(fā)中,應(yīng)該都對關(guān)鍵詞 exists 用的比較少,估計使用 in 查詢偏多。這里給大家介紹一下 exists 用法,引用官網(wǎng)文檔: 可知 exists 后面是跟著一個子查詢語句,它的作用是「根據(jù)主查詢的數(shù)據(jù),每一行都放到子查詢中做條件驗(yàn)證,根據(jù)驗(yàn)證結(jié)果(TRUE 或者 FALSE),TRUE的話該行數(shù)據(jù)就會保留」,下面用 emp 表和 dept 表進(jìn)行舉例,表結(jié)構(gòu)以及數(shù)據(jù)展示: 計入我們現(xiàn)在想找到 emp 表中 dept_name 與 dept表 中 dept_name 對應(yīng)不上員工數(shù)據(jù),sql 如下:
查詢結(jié)果: 我們通過 exists 語法將外層 emp 表全部數(shù)據(jù) 放到子查詢中與一一與 dept 表全部數(shù)據(jù)進(jìn)行比較,只要有一行記錄返回true。畫個圖展示主查詢所有記錄與子查詢交互如下:
四、GROUP_CONCAT(expr) 組連接函數(shù)「GROUP_CONCAT(expr)」 組連接函數(shù)可以返回分組后指定字段的字符串連接形式,并且可以指定排序邏輯,以及連接字符串,默認(rèn)為英文逗號連接。這里繼續(xù)用 order_diy 表舉例:sql 如下:
查詢結(jié)果: 如上我們通過 「GROUP_CONCAT(title ORDER BY id desc SEPARATOR '-')」 語句,指定分組連接 title 字段并按照 id 排序,設(shè)置連接字符串為 五、自連接查詢自連接查詢是 sql 語法里常用的一種寫法,掌握了自連接的用法我們可以在 sql 層面輕松解決很多問題。這里用 tree 表舉例,結(jié)構(gòu)以及表數(shù)據(jù)展示: tree 表中通過 pid 字段與 id 字段進(jìn)行父子關(guān)聯(lián),假如現(xiàn)在有一個需求,我們想按照父子層級將 tree 表數(shù)據(jù)轉(zhuǎn)換成
結(jié)果如下: 我們通過 「tree t1 join tree t2 on t1.id = t2.pid」 自連接展示 六、更新 emp 表和 dept 表關(guān)聯(lián)數(shù)據(jù)這里繼續(xù)使用上文提到的 emp 表和 dept 表,數(shù)據(jù)如下: 可以看到上述 emp 表中 jack 的部門名稱與 dept 表實(shí)際不符合,現(xiàn)在我們想將 jack 的部門名稱更新成 dept 表的正確數(shù)據(jù),sql 如下:
查詢結(jié)果: 我們可以直接關(guān)聯(lián) emp 表和 dept 表并設(shè)置關(guān)聯(lián)條件,然后更新 emp 表的 dept_name 為 dept 表的 dept_name。 七、ORDER BY 空值 NULL 排序ORDER BY 字句中可以跟我們要排序的字段名稱,但是當(dāng)字段中存在 null 值時,會對我們的排序結(jié)果造成影響。我們可以通過 「ORDER BY IF(ISNULL(title), 1, 0)」 語法將 null 值轉(zhuǎn)換成0或1,來達(dá)到將 null 值放到前面還是后面進(jìn)行排序的效果。
查詢結(jié)果: 八、with rollup 分組統(tǒng)計數(shù)據(jù)的基礎(chǔ)上再進(jìn)行統(tǒng)計匯總MySql 中可以使用 with rollup 在分組統(tǒng)計數(shù)據(jù)的基礎(chǔ)上再進(jìn)行統(tǒng)計匯總,即用來得到 group by 的匯總信息。這里繼續(xù)用order_diy 表舉例,sql 如下:
查詢結(jié)果: 可以看到通過 「GROUP BY name WITH ROLLUP」 語句,查詢結(jié)果最后一列顯示了分組統(tǒng)計的匯總結(jié)果。但是 name 字段最后顯示為 null,我們可以通過
查詢結(jié)果: 九、with as 提取臨時表別名with as 語法需要 MySql 8.0以上版本,它的作用主要是提取子查詢,方便后續(xù)共用,更多情況下會用在數(shù)據(jù)分析的場景上。 如果一整句查詢中「多個子查詢都需要使用同一個子查詢」的結(jié)果,那么就可以用with as,將共用的子查詢提取出來,加個別名。后面查詢語句可以直接用,對于大量復(fù)雜的SQL語句起到了很好的優(yōu)化作用。這里繼續(xù)用 order_diy 表舉例,這里使用with as給出sql 如下:
查詢結(jié)果: 這個 sql 查詢了 order_diy 表中 money 大于30且小于等于60之間并且 name 是周伯通的記錄。 10、存在就更新,不存在就插入MySql 中通過「on duplicate key update」語法來實(shí)現(xiàn)存在就更新,不存在就插入的邏輯。插入或者更新時,它會根據(jù)表中主鍵索引或者唯一索引進(jìn)行判斷,如果主鍵索引或者唯一索引有沖突,就會執(zhí)行「on duplicate key update」后面的賦值語句。這里通過 news 表舉例,表結(jié)構(gòu)和說數(shù)據(jù)展示,其中 news_code 字段有唯一索引: 添加sql:
結(jié)果如下: 總結(jié)到這里,本文所分享的10個高級sql寫法就全部介紹完了,希望對大家日常開發(fā) sql 編寫有所幫助,喜歡的朋友們可以點(diǎn)贊加關(guān)注😘。 該文章在 2023/6/2 12:03:21 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |