SQL Server子查询

一、 SQL Server子查询。

  1. 子查询是一个嵌套在另一个语句(如:[SELECT],[INSERT],[UPDATE]或[DELETE])语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。
  2. 一般子查询要保证返回结果只有一个(即一行,一列)in子查询返回一列多行。子查询的一个查询结果可以作为另外一个查询的条件。
  3. 子查询从内往外读(写),当要显示多个表数据时使用联结,只显示一个表数据时使用子查询。
  4. 虽然子查询和连接都要查询多个表,但子查询和连接不同,子查询是更为复杂的查询。子查询可以计算一个变化的聚合函数值,并返回到外围查询进行比较,而连接做不到。大多数情况下子查询和连接是等价的。

二、 SQL Server嵌套子查询。

  1. 子查询可以嵌套在另一个子查询中,SQL Server最多支持 32 个嵌套级别。

  2. 嵌套查询是指将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询。

  3. 示例。

    select column_name1,column_name2,column_name3
    from list
    where condition = (select son_column_name from son_list where son_condition = true);
    

三、 SQL Server相关子查询。

  1. 相关子查询是使用外部查询的值的[子查询]。 换句话说,它取决于外部查询的值。 由于这种依赖性,相关子查询不能作为简单子查询独立执行。

  2. 此外,对外部查询评估的每一行重复执行一次相关子查询。相关子查询也称为重复子查询。

  3. 示例。

    SELECT column_name1,column_name2,column_name3
    FROM list b1 
    WHERE
    condition IN (
    SELECT MAX(b2.son_column_name) FROM son_list b2 WHERE b2.column_id = b1.column_id);
    

四、 SQL Server Exists运算符。

  1. EXISTS 运算符是一个逻辑运算符,用于检查子查询是否返回任何行。 如果子查询返回一行或多行,则EXISTS 运算符返回 TRUE。

  2. 示例。

    SELECT column_name1,column_name2,column_name3
    FROM list b1
    WHERE
    EXISTS (SELECT COUNT (*) FROM son_list b2 WHERE b2.customer_id = b1.customer_id);
    
  3. 在此语法中,子查询仅是 SELECT 语句。子查询返回行后, EXISTS 运算符返回 TRUE 并立即停止处理。请注意,即使子查询返回 NULL 值, EXISTS 运算符也会计算为 TRUE。

  4. EXISTS 与 IN 的区别:in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

  5. EXISTS与IN的使用效率,通常情况下采用exists要比in效率高,因为IN不走索引。

五、 SQL Server Any运算符。

  1. ANY 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值集进行比较。

  2. 示例。

    SELECT product_name,list_price
    FROM production.products
    WHERE product_id = ANY (
    SELECT product_id FROM sales.order_items WHERE quantity >= 2);
    

六、 SQL Server All运算符。

  1. SQL Server ALL 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值列表进行比较。

  2. 示例。

    SELECT product_name,list_price
    FROM production.products
    WHERE list_price > ALL (
    SELECT AVG (list_price) avg_list_price FROM production.products);
    
  3. scalar_expression > ALL ( subquery )
    如果 scalar_expression 大于子查询返回的最大值,则表达式返回 TRUE 。

  4. scalar_expression < ALL ( subquery )
    如果标量表达式( scalar_expression )小于子查询( subquery )返回的最小值,则表达式求值为 TRUE 。

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐