首先,咱们来看下什么是CTE(公共表表达式)?其实,公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如SELECT,INSERT,UPDATE或DELETE)的执行范围内存在。与派生表类似,CTE不作为对象存储,仅在查询执行期间持续。 与派生表不同,CTE可以是自引用(递归CTE,也可以在同一查询中多次引用。 此外,与派生表相比,CTE提供了更好的可读性和性能。CTE的结构包括名称,可选列列表和定义CTE的查询。 定义CTE后,可以像SELECT
,INSERT
,UPDATE
,DELETE
或CREATE VIEW
语句中的视图一样使用它。我们来看下CTE的基本语法:
WITH cte_name (column_list) AS (
query
)
SELECT * FROM cte_name;
我们要注意的是查询中的列数必须与column_list
中的列数相同。 如果省略column_list
,CTE将使用定义CTE的查询的列列表。同时嘞,为了大家更容易地了解CTE概念,咱们通过查询customers
表中的数据,来做个实例:
WITH customers_in_usa AS (
SELECT
customerName, state
FROM
customers
WHERE
country = 'USA'
) SELECT
customerName
FROM
customers_in_usa
WHERE
state = 'CA'
ORDER BY customerName;
咱们来看下部分结果集:
在上面的例子中,CTE的名称为customers_in_usa
,定义CTE的查询返回两列:customerName
和state
。因此,customers_in_usa
CTE返回位于美国的所有客户。大概感觉有点意思了吧,嘿嘿。咱们再来看个复杂一点的例子,来看下面的sql:
WITH salesrep AS (
SELECT
employeeNumber,
CONCAT(firstName, ' ', lastName) AS salesrepName
FROM
employees
WHERE
jobTitle = 'Sales Rep'
),
customer_salesrep AS (
SELECT
customerName, salesrepName
FROM
customers
INNER JOIN
salesrep ON employeeNumber = salesrepEmployeeNumber
)
SELECT
*
FROM
customer_salesrep
ORDER BY customerName;
执行上面查询语句,得到以下结果:
在上面的sql询中有两个CTE。 第一个CTE(salesrep
)获得职位是销售代表的员工。 第二个CTE(customer_salesrep
)使用INNER JOIN
子句与第一个CTE连接来获取每个销售代表负责的客户。在使用第二个CTE之后,使用带有order by子句的简单SELECT
语句来查询来自该CTE的数据。
大概有点印象了吧,嘿嘿。咱们这次就到这里了,说多了怕懵,如果感觉不错的话,请多多点赞支持哦。。。