首頁 > 人文

盤點 Sql 中幾個比較實用的小 Tips!

由 阿琪指導師 發表于 人文2022-12-03

簡介其中,having 和 where 使用上有下面區別:where在 group by 分組前執行,將查詢結果按照條件過濾資料需要注意的是,where 無法與聚合函式一起使用having只能配合 group by 使用,在分組之後執行,用於過

sql中floor是什麼意思

1。 前言

工作中,我們經常需要編寫 SQL 指令碼,對資料庫進行增、刪、改、查,很少會考慮到 Sql 效能最佳化

盤點 Sql 中幾個比較實用的小 Tips!

盤點 Sql 中幾個比較實用的小 Tips!

實際上,從效能角度考慮,有很多 Sql 關鍵字都有它們各自的使用場景;如果使用恰當,能大大地提升後端服務的響應效率

下面一 Mysql 為例,羅列出幾個比較實用的小 Tips

2。 union、union all、or

union [all] 代表聯合查詢,即:將多個查詢結果合併起來成一個結果並返回

PS:

union 聯合查詢針對每一個查詢結果,必須保證列數量、列資料型別及查詢順序一致

語法如下:

# 以兩張表的聯合查詢為例

# table_one:表一

# table_two:表二

# 表一中的查詢欄位:table_one_field1,table_one_fileld2。。。

# 表二種的查詢欄位:table_two_field1,table_two_field2。。。

# 注意:表一、表二查詢欄位數目、欄位型別、欄位順序應該保持一致

select

table_one_field1,table_one_fileld2。。。

from

table_one

union

[all]

select

table_two_field1,table_two_field2。。。

from

table_two;

其中,

union、union all、or 三者的區別如下:

union

錶鏈接後會利用欄位的順序進行排序,以此篩選掉重複的資料行,最後再返回結果

因此,當資料量很大時效率很低

union all

相比 union,union all 在錶鏈接時不會刪除重複的資料行,直接返回表聯合後的結果

因此,

union all 執行效率要高很多,在不需要去重和排序時,更推薦使用 union all

or

or 用於 SQL where 子句中,SQL 指令碼可讀性更高,但是它會引起全表掃描,根本不走索引查詢

所以通常情況下,

union [all] 查詢會利用索引進行查詢,執行效率要高於 or;但是當 or 條件中查詢列相同,or 的執行效率要高於 union

3。 group by + having、where

group by 分組查詢,根據一個或多個列對結果集進行分組,一般配合聚合函式使用

語法如下:

# 查詢欄位:多個查詢欄位

select

查詢欄位。。。,聚合函式。。。

from

table_one

where

條件語句

group

by

分組欄位。。。having 分組條件;

# 比如

select

red_num1,

count

(red_num1)

from

dlt

where

create_at>=

‘2021-11-01’

group

by

red_num1;

其中,having 和 where 使用上有下面區別:

where

在 group by 分組前執行,將查詢結果按照條件過濾資料

需要注意的是,

where 無法與聚合函式一起使用

having

只能配合 group by 使用,在分組之後執行,用於過濾滿足條件的組

需要注意的是,

分組是一個耗時的操作,建議在分組前使用 where 對資料進行一次過濾,然後再進行分組

比如,where 搭配 having 一起使用

# 查詢表dlt

# 首先,使用where透過時間過濾資料

# 然後,使用欄位red_num1+group by對資料進行分組

# 最後,使用having對分組後的資料再進行一次過濾

select

red_num1,

count

(red_num1)

from

dlt

where

create_at>=

‘2021-10-01’

group

by

red_num1

having

count

(red_num1)>=

2

4。 exists、in

exists 用於 where 子句中,一般用於判斷子查詢中是否會返回資料,如果返回的資料不為空,則為 True,否則為 False

PS:exists 也可以搭配 not 使用,查詢出不滿足子查詢語句的資料

語法如下:

—— exists使用

select

*

from

表一

where

exists

select

*

from

表二

where

條件判斷語句);

—— not exists使用

select

*

from

表一

where

not

exists

select

*

from

表二

where

條件判斷語句);

in 同樣用於 where 子句中,篩選出某個表字段存在於多個值中的所有資料

關鍵字 in 常見的 2 種使用方式如下:

—— in 使用

—— 方式一

select

*

from

表名

where

欄位

in

(過濾欄位

1

,過濾欄位

2

,過濾欄位

3。

。。);

—— 方式二

select

*

from

表名

1

where

欄位

1

in

select

欄位

2

from

表名

2

where

condition)

由於 SQL 做子查詢最優方案是小表驅動大表,

對於 in 來說是子查詢表驅動外表,當子查詢表資料少於主表資料時推薦使用

而 exists 是外表驅動子查詢表,因此當外表資料少於子查詢表時更推薦使用

Tags:查詢unionwhere欄位分組