美文网首页
par3. 分组|子查询

par3. 分组|子查询

作者: katelin | 来源:发表于2018-12-14 21:23 被阅读0次

    第10章 分组数据

    创建分组

    GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

    SELECT vend_id, COUNT(*) AS num_prods
    FROM Products
    GROUP BY vend_id;
    

    GROUP BY子句可以包含任意数目的列
    GROUP BY子句中列出的每一列都必须是检索列或有效的表达式
    大多数SQL实现不允许GROUP BY列带有长度可变的数据类型
    除了聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出
    如果分组列中包含具有NULL值的列,则NULL将作为一个分组返回,有多个NULL,它们将分为一组
    GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前

    过滤分组

    所有类型的WHERE子句都可以用HAVING来替代
    不同的是:WHERE过滤行,HAVING过滤分组。
    WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤
    使用HAVING时应该结合GROUP BY子句,而WHERE子句用语行级过滤

    SELECT cust_id, COUNT(*) AS orders
    FROM Orders
    GROUP BY cust_id
    HAVING COUNT(*)>=2; #基于分组聚集值进行过滤,而不是特定行的值
    
    #列出具有两个以上产品且其价格大于等于4的供应商
    SELECT vend_id,COUNT(*) AS num_prods
    FROM Products
    WHERE prod_price>=4
    ORDER BY vend_id
    HAVING COUNT(*)>=2;
    

    分组和排序

    SELECT order_num, COUNT(*) AS items
    FROM OrderItems
    GROUP BY order_num
    HAVING COUNT(*) >=3
    ORDER BY items, order_num
    

    SELECT子句顺序

    SELECT
    FROM
    WHERE
    GROUP BY
    HAVING
    ORDER BY

    第11章 使用子查询

    利用子查询进行过滤

    # 列出订购物品RGAN01的所有顾客
    SELECT cust_name,cust_contact
    FROM Customers
    WHERE cust_id IN(SELECT cust_id
                     FROM Orders
                     WHERE order_num IN (SELECT order_num 
                                         FROM OrderItems
                                         WHERE prod_id='RGAN01'));
    

    作为子查询的SELECT语句只能查询单个列

    作为计算字段使用子查询

    # 显示Customers表中每个顾客的订单总数
    SELECT cust_name,
           cust_state,
          (SELECT COUNT(*)
          FROM Orders
          WHERE Orders.cust_id=Customers.cust_id) AS orders
    FROM Customers
    ORDER BY cust_name;
    

    SELECT语句中操作多个表,就应使用完全限定列名来避免歧义。

    相关文章

      网友评论

          本文标题:par3. 分组|子查询

          本文链接:https://www.haomeiwen.com/subject/ehxihqtx.html