MySQL子查询,派生表和通用表达式

时间:2022-02-20 23:44:50

一:子查询

1.介绍

  在另一个查询(外部查询)中嵌套另一个查询语句(内部查询),并使用内部查询的结果值作为外部查询条件。

2.子查询在where中

  SELECT
   customerNumber, checkNumber, amount
  FROM
   payments
  WHERE
   amount = (SELECT
   MAX(amount)
   FROM
   payments);
  MySQL子查询,派生表和通用表达式
  除等式运算符之外,还可以使用大于(>),小于(<)等的其他比较运算符。

3.具有IN和NOT IN的子查询 
  如果子查询返回多个值,则可以在WHERE子句中使用INNOT IN运算符等其他运算符。
  MySQL子查询,派生表和通用表达式
  可以使用带有NOT IN运算符的子查询来查找没有下过任何订单的客户:
  MySQL子查询,派生表和通用表达式
  MySQL子查询,派生表和通用表达式 4.From子句中的子查询
  在FROM子句中使用子查询时,从子查询返回的结果集将用作临时表。 该表称为派生表或物化子查询。
  以下子查询将查找订单表中的最大最小平均数
  MySQL子查询,派生表和通用表达式
  MySQL子查询,派生表和通用表达式

5.相关子查询

  在前面的例子中,注意到一个子查询是独立的。 这意味着您可以将子查询作为独立查询执行。

  与独立子查询不同,相关子查询是使用外部查询中的数据的子查询。 换句话说,相关的子查询取决于外部查询。 对外部查询中的每一行对相关子查询进行一次评估。

  在以下查询中,我们查询选择购买价格高于每个产品线中的产品的平均购买价格的产品。

  MySQL子查询,派生表和通用表达式

  MySQL子查询,派生表和通用表达式

  

6.MySQL子查询与EXISTS和NOT EXISTS

  当子查询与EXISTSNOT EXISTS运算符一起使用时,子查询返回一个布尔值为TRUEFALSE的值。

  用法:

  MySQL子查询,派生表和通用表达式

  在上面的查询中,如果子查询(subquery)有返回任何行,则EXISTS子查询返回TRUE,否则返回FALSE

  通常在相关子查询中使用EXISTSNOT EXISTS

  下面我们来看看示例数据库(yiibaidb)中的ordersorderDetails表:

·  MySQL子查询,派生表和通用表达式

  以下查询选择总额大于60000的销售订单。

  MySQL子查询,派生表和通用表达式

  或者:

  MySQL子查询,派生表和通用表达式

二:派生表

1.介绍

  派生表是从SELECT语句返回的虚拟表。派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。

  派生表*和子查询通常可互换使用。当SELECT语句的FROM子句中使用独立子查询时,我们将其称为派生表。

  与子查询不同,派生表必须具有别名,以便稍后在查询中引用其名称。 如果派生表没有别名,MySQL将发出错误

  

2.示例

  orders表和orderdetails表中获得2013年销售收入最高的前5名产品。

  MySQL子查询,派生表和通用表达式

  MySQL子查询,派生表和通用表达式 =》MySQL子查询,派生表和通用表达式

  :

  MySQL子查询,派生表和通用表达式

  MySQL子查询,派生表和通用表达式

3.更复杂的派生表 

  假设必须将2013年的客户分为3组:铂金,白金和白银。 此外,需要了解每个组中的客户数量,具体情况如下:

  • 订单总额大于100000的为铂金客户;
  • 订单总额为10000100000的为黄金客户
  • 订单总额为小于10000的为银牌客户

  要构建此查询,首先,您需要使用CASE表达式和GROUP BY子句将每个客户放入相应的分组中。

  MySQL子查询,派生表和通用表达式=》MySQL子查询,派生表和通用表达式

  MySQL子查询,派生表和通用表达式

  MySQL子查询,派生表和通用表达式

三:公共表表达式

1.介绍

  公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如SELECTINSERTUPDATEDELETE)的执行范围内存在。

  与派生表类似,CTE不作为对象存储,仅在查询执行期间持续。 与派生表不同,CTE可以是自引用(递归CTE),也可以在同一查询中多次引用。 此外,与派生表相比,CTE提供了更好的可读性和性能。

2.语法

  CTE的结构包括名称,可选列列表和定义CTE的查询。

   定义CTE后,可以像SELECTINSERTUPDATEDELETECREATE VIEW语句中的视图一样使用它。

  MySQL子查询,派生表和通用表达式

  请注意,查询中的列数必须与column_list中的列数相同。 如果省略column_listCTE将使用定义CTE的查询的列列表。

3.简单的CTE

  MySQL子查询,派生表和通用表达式 

  在此示例中,CTE的名称为customers_in_usa,定义CTE的查询返回两列:customerNamestate。因此,customers_in_usa CTE返回位于美国的所有客户。

  在定义美国CTE的客户之后,我们可在SELECT语句中引用它。

  


  


4.