使用前提:多次重復出現的子查詢
with-as 意義:對於多次反復出現的子查詢,可以降低掃描表的次數和減少代碼重寫,優化性能和使編碼更加簡潔
✿ 使用注意事項:
1、mysql版本
: 8以及8以上的
2、首先
定義子查詢的臨時虛擬表:
語法: with 臨時表名 as 子查詢,定義出(子查詢)的虛擬臨時表,然后定義之后需要立馬引用才有意義
即:定義好with子查詢,但其后沒有跟select查詢引用,會報錯!
即:臨時虛擬表需要立即引用它,with子查詢語句必須定義在引用它的select語句之前!
3、定義多個子查詢的臨時表,這多個子查詢共用一個with
,子查詢之間使用,隔開
注意:子查詢與引用之間不能加,
#WITH AS 語法: WITH 虛擬臨時表名 AS (子查詢) +引用
WITH temp AS (select * from t_teacher) # 定義子查詢
(SELECT `name` FROM temp) t1, # 多次引用子查詢的臨時虛擬表
(SELECT age FROM temp) t2,
(SELECT sex FROM temp) t3
WHERE t1.id = t2.id AND t1.id = t3.id and t2.id = t3.id;
#WITH AS 語法(定義多個子查詢)
WITH
temp1 AS (select * from t_teacher),
temp2 AS (select * from t_stu),
temp3 AS (select * from t_user)
select count(*) FROM temp1......
#....引用即可.....#
✿ 重復子查詢之with-as是否使用效率對比:
- 沒有使用with-as:selet 物理表時掃描了兩次
- 使用了with-as:select 臨時表,節約了一次加載時間

