用的比較少的sql示例

2021-09-25 23:58:39 字數 4157 閱讀 4220

1.find_in_set(str,strlist)   函式作用為 strlist中是否包含str

group_concat(distinct a) 將多行的a列上的引數拼接成一行用逗號隔開的串

連表查詢時關聯欄位中有乙個表的字段值為用逗號拼接的字串可以用以下sql查詢出來,其中 on 後面的 find_in_set()  函式會把所有對應的資料查詢出來,不過顯示出來的列表會已下面顯示的樣子

如圖所見,本來是一條資料的,結果查詢出來三條,那麼就可以用到group_concat(distinct  a)函式了,這個函式的作用是把某字段的值合併成乙個逗號隔開的字串,執行完下面的sql展示出來的下面這個樣子

select f.id,group_concat(distinct p.position_name) as positionsname,p1.position_name as allotionendname

from functional_base f

left join attachment a on a.file_id = family_background_id

left join position p on find_in_set (p.position_id,f.positions)

left join position p1 on p1.position_id=f.allotion_end

上面的sql適用於我的functional_base這個主表中只會有一條資料存在的情況下可以這樣直接使用,但是大部分主表中不會只有一條資料,那樣就會被group_concat(distinct  a)函式給合併成一條資料,這樣的結果肯定不行,所以要給sql加乙個group by  分組,建議分組用主表id來分,因為id是唯一的,可以達到最一開始的效果

select f.id,group_concat(distinct p.position_name) as positionsname,p1.position_name as allotionendname

from functional_base f

left join attachment a on a.file_id = family_background_id

left join position p on find_in_set (p.position_id,f.positions)

left join position p1 on p1.position_id=f.allotion_end

group by f.id

其中distinct 的作為為去重,如果邏輯**現多個欄位為多包含1的關係,那麼兩個group_concat()的引數會是重複的拼接,如果邏輯中有這樣的操作,可以把distinct 去掉嘗試一下看看。

'$'  的含義為 實體類包中的 defaulthead 類中的引數defaultheadurl 被引入進了 下面方法中的 then 後面,程式中只要給defaultheadurl賦值就可以直接將值賦值到sql中。

select

case

when s.file_path is null then '$'

when s.staff_head is null then '$'

else s.file_path

end as staff_head

from testtable s

3.如果想要根據不同的狀態用乙個sql計算出各種狀態的sum,可以使用下面的方法,使用sum()和case when 來實現,下面的sql主要是根據  rewards_or_penalties 的不同狀態,來計算不同狀態下的 score 的總和,其中ifnull是將計算出來的null轉換為0

select

ifnull(sum(case when rewards_or_penalties=0 then score end),0) as sumscore,

ifnull(sum(case when rewards_or_penalties=1 then score end),0) as subscore

from achievement_event

where 1=1

4.用sql子查詢實現排名,其中的group by input_staff_id 中的input_staff_id,就是根據這個引數分組,然後進行排名,《為小於號,下面的sql語句,只是最基本的乙個示例,可以根據自己的邏輯修改,得到的結果如果出現相同的數值那就是並列排名

select a.*,(

select count(distinct column1) from (

select sum(column1) as score

from achievement_event

group by input_staff_id) as b where a.score < b.score)+1 as rank

from (

select sum(column1) as score

from sz_gf_achievement_event ae

group by ae.input_staff_id) as a order by rank asc

5.sql計算兩個時間相差的天數,下面函式計算出來的方法值包含開始天數,結束時間不計算在內

datediff(enddate,startdate);
6.sql中if的使用,在某些特定的邏輯下if會比case when 要簡單整潔的多,其中第一組資料為表示式,可以為多個,只要符合表示式則結果等於10,不符合表示式結果為20

if(a=b and b=c and 等等等,10,20)
7.mysql取字段逗號分隔的第乙個,如a,b,c 串中取a(有兩種方法)

主要用到的函式為(第一種方法):

locate(',',必須為需要處理的逗號隔開串的欄位名),該函式的作用就是定位該串中第乙個逗號的位置

left(需要擷取的逗號隔開串的欄位名,擷取的位置),該函式的作用為左擷取,從左邊開始擷取到想要的位置

下面這個sql的邏輯是因為需要操作的字段有可能只有乙個資料,並沒有多個逗號隔開,所以locate()函式得到的位置是0,配合擷取的時候就會出現問題,所以用if()函式判斷一下,只有在多個逗號隔開的情況下才會操作擷取,至於sql中的 『-1』 是因為我們要擷取的是不包含逗號在內的值(有left()函式就有right()函式,意思是從右向左開始擷取)

select a.row1,if(a2.row2 is null,'',row2 ) as row2 

from table1 a1

left join table2 a2 on if(locate(',',a1.str1)=0,a1.str1,left(a1.str1,locate(',',a1.str1)-1))=a2.str2

where 1=1

主要用到的函式為substring_index(為需要被處理的逗號隔開的欄位名稱,",",1)

select a.row1,if(a2.row2 is null,'',row2 ) as row2 

from table1 a1

left join table2 a2 on substring_index(a1.row1,",",1)=a2.row1

where 1=1

8.使用sql進行批量插入,直接在sql內部進行迴圈相對比一直訪問書庫局來的要快一些

insert into table(id, field1, field2)

values

(#, #, #)

9.使用sql將a表中的某個欄位的資料同步到b表中某個字段(批量資料操作),where 為兩個表的關聯字段

update `table1` as t1, `table2` as t2

set t1.ziduan= t2.ziduan

where t1.ziduan_id= t2.ziduan_id

python一些我目前用的比較少的知識

描述 import 函式用於動態載入類和函式 如果乙個模組經常變化就可以使用 import 來動態載入。語法 import 語法 import name globals locals fromlist level 引數說明 name 模組名 返回值 返回匯入的模組 描述 getattr 函式用於返回...

用引數較少的函式替換引數較多的函式

target 用法就是通用函式特殊化 具體 函式轉換 define spi dma txd srcaddress,datalength spi dma start spi1,txd,dma2 stream5,srcaddress,uint32 t spi1 dr,datalength 函式具體實現 ...

一些比較少用但比較有用的linux命令備忘

ssh fcnr 10000 localhost 22 userb b.b.b.b b.b.b.b是乙個外網機器b的ip ssh p 10000 usera localhost 在機器b,ssh到機器a 取消 設定git 注意設定的前提是以及在系統中設定好了 i2cdetect l 列出系統中有的i...