首先,咱们来看下什么是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
      
      的数据。
     
    
   
    
     
      大概有点印象了吧,嘿嘿。咱们这次就到这里了,说多了怕懵,如果感觉不错的话,请多多点赞支持哦。。。
      
     
    
   
 
