par3. 分组|子查询

2018-12-14  本文已影响0人  katelin

第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语句中操作多个表,就应使用完全限定列名来避免歧义。

上一篇下一篇

猜你喜欢

热点阅读