MySQL中的WITH表示子查询,可以用来简化复杂的嵌套查询。WITH的基本语法如下:
sql
WITH cte_name AS (
SELECT ...
)
SELECT * FROM cte_name;
这里,cte_name是定义的子查询名称。WITH子句中的查询可以在外部查询中通过名字进行引用,避免重复编写子查询。例如:
sql
WITH t1 AS (
SELECT col1, col2 FROM table1
)
SELECT t1.col1, t2.col1
FROM t1 JOIN table2 t2
ON t1.col2 = t2.col2
这里定义了名为t1的子查询,然后外部查询引用t1,进行连接查询。使用WITH可以使查询更清晰易读,尤其是多个层级的嵌套查询。它在MySQL 8.0版本里才开始支持。需要注意的是,CTE仅在单个查询中使用,执行完毕后就会释放,不会保存。WITH不像视图那样可以持久化。
---------------------------------WITH和视图的区别-------------------------------
WITH和视图的主要区别如下:
1、作用范围不同- WITH中的子查询仅在该语句内生效,执行后会释放。- 视图在数据库中创建后持久存在,可以在多个语句中使用。
2、定义时是否执行- WITH在定义时不会执行,只有在查询时才会执行一次。- 视图在创建时会执行其SQL语句,建立起可查询的虚拟表。
3、是否物化- WITH的结果集仅在语句执行时生成,不会物化。- 视图会将查询的结果集存储或缓存,是“物化”的。
4、是否可以更新- WITH中的子查询不可以进行更新。- 视图若干条件下可以进行更新、插入等操作。所以两者主要区别在于作用范围和物化的程度。WITH适合临时替代重复子查询,视图更适合Persistent的场景。WITH在定义时不会执行,只在引用时运算一次,不会存储结果集。