可能某個子查詢在多個層級多個地方存在重復使用的情況,這個時候我們可以使用 with as 語句將其獨立出來,極大提高SQL可讀性,簡化SQL~
注:目前 oracle、sql server、hive等均支持 with as 用法,但 mysql並不支持!
一、介紹
with as 也叫做子查詢部分,首先定義一個sql片段,該sql片段會被整個sql語句所用到,為了讓sql語句的可讀性更高些,作為提供數據的部分,也常常用在union等集合操作中。
with as就類似於一個視圖或臨時表,可以用來存儲一部分的sql語句作為別名,不同的是with as 屬於一次性的,而且必須要和其他sql一起使用才可以!
其最大的好處就是適當的提高代碼可讀性,而且如果with子句在后面要多次使用到,這可以大大的簡化SQL;更重要的是:一次分析,多次使用,這也是為什么會提供性能的地方,達到了“少讀”的目標。
二、使用
WITH t1 AS ( SELECT * FROM carinfo ), t2 AS ( SELECT * FROM car_blacklist ) SELECT * FROM t1, t2
注意:這里必須要整體作為一條sql查詢,即with as語句后不能加分號,不然會報錯。
三、注意事項
1. with子句必須在引用的select語句之前定義,同級with關鍵字只能使用一次,多個只能用逗號分割;最后一個with 子句與下面的查詢之間不能有逗號,只通過右括號分割,with 子句的查詢必須用括號括起來.
以下寫法會報錯:
with t1 as (select * from carinfo) with t2 as (select * from car_blacklist) select * from t1,t2
with t1 as (select * from carinfo); select * from t1
2.如果定義了with子句,但其后沒有跟select查詢(即單獨使用就會報錯),則會報錯!
以下寫法會報錯:
with t1 as (select * from carinfo)
正確寫法(沒有使用 t1沒關系,其后有select就行):
with t1 as (select * from carinfo) select * from carinfo
3.前面的with子句定義的查詢在后面的with子句中可以使用。但是一個with子句內部不能嵌套with子句!
正確寫法
with t1 as (select * from carinfo), t2 as (select t1.id from t1) select * from t2
==========================================================================
搬上一個我沒有看懂的博客:
https://blog.csdn.net/hejisan/article/details/51835279