Concepts

What is subquery?

  • query 中包含的query,会在query中最先执行,一般被()包围.
  • subquery可以返回:
    • 一行一列
    • 多行一列
    • 多行多列
  • 在整个query执行完成后,subquery的执行结果就会作废,类似于temporary table.

Subquery Type

Noncorrelated Subqueries

  • 定义: Subqueries are completely self-contained,subquery并不会引用包含其的query中的数据

  • scalar subquery: 用于数值判断

  • 一列一行: = <> > <

  • 一列多行的输入: IN NOT IN ALL

    • ALL: $compare_operator ALL($single_column_multiple_row) 与一列多行的元素进行一一对比,当对所有行后满足condition时为true,如3 > ALL(0,1,2)为true,而1 > ALL(0,1,2)为false
    • ANY: $compare_operator ANY($single_column_multiple_row) 与一列多行的元素进行一一对比,当对任意某行后满足condition时为true,如3 > ALL(0,1,2)为true,而1 > ALL(0,1,2)也为true
  • 多列

Correlated Subqueries

  • 定义:reference columns from the containing statement.
  • 运行过程
    • code
      SELECT c.first_name, c.last_name
      FROM customer c
      WHERE 20 = (SELECT count(*) FROM rental r
      WHERE r.customer_id = c.customer_id)
      
    • 过程
      1. 从customer中依次抽取每一个customer_id在subquery中进行对比。
      2. 然后再根据subquery输出的结果和总query的condition进行判断,将符合条件的结果输出。
  • Performance Issue: 因为需要遍历,所以correlated subquery可能会导致性能问题。

  • EXISTS

    • EXISTS($subquery) 判断subquery中是否存在符合条件的row

Maniplating By Subqueries

  • UPDATE

    UPDATE $tbl_name $tbl_alias
    SET $tbl_alias.$fld_name = 
    ($subqueries)
    WHERE $condition
    ($contain_subqueries);
    
  • DELETE

    DELETE FROM $tbl_name
    WHERE $condition
    ($contain_subqueries);
    

    DELETE FROM 中不能使用table alias

results matching ""

    No results matching ""