第6节. 分组数据
A. SQL Server Group By语句
Group By 从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
SELECT select_list FROM table_name
GROUP BY column_name1, column_name2 ,...;
B. GROUP BY子句和聚合函数
GROUP BY 子句通常与聚合函数一起用于统计数据。
聚合函数对组执行计算并返回每个组的唯一值。 例如, COUNT() 函数返回每个组中的行数。
其他常用的聚合函数是: SUM() , AVG() , MIN() , MAX() 。
GROUP BY 子句将行排列成组,聚合函数返回每个组的统计量(总数量,最小值,最大值,平均值,总和等)。
C. SQL Server Having子句
HAVING 子句通常与[GROUP BY]子句一起使用,以根据指定的条件列表过滤分组。
注:group by 语句查询条件时不可以使用where,只能使用having
SELECT select_list FROM table_name
GROUP BY group_list
HAVING conditions;
在此语法中, GROUP BY 子句将行汇总为分组, HAVING 子句将一个或多个条件应用于这些每个分组。 只有使条件评估为 TRUE 的组才会包含在结果中。 换句话说,过滤掉条件评估为 FALSE 或 UNKNOWN 的组。 因为SQL Server在 GROUP BY 子句之后处理 HAVING 子句,所以不能通过使用列别名来引用选择列表中指定的聚合函数。
- 子查询
A. SQL Server子查询
子查询是嵌套在另一个语句(如:[SELECT],[INSERT],[UPDATE]或[DELETE])中的查询。
SELECT order_id, order_date, customer_id
FROM sales.orders
WHERE customer_id IN ( SELECT customer_id FROM sales.customers
WHERE city = 'New York')
ORDER BY order_date DESC;
B. SQL Server嵌套子查询
子查询可以嵌套在另一个子查询中。
SQL Server最多支持 32 个嵌套级别。
SELECT product_name, list_price FROM production.products
WHERE
list_price > (
SELECT AVG (list_price)
FROM production.products
WHERE
brand_id IN (
SELECT brand_id FROM production.brands
WHERE brand_name = '上海永久' OR brand_name = '凤凰'
)
)
ORDER BY list_price;
C. SQL Server相关子查询
相关子查询是使用外部查询的值的[子查询]。 换句话说,它取决于外部查询的值。 由于这种依赖性,相关子查询不能作为简单子查询独立执行。 此外,对外部查询评估的每一行重复执行一次相关子查询。 相关子查询也称为重复子查询。
-- 相关子查询:
SELECT product_name, list_price, category_id FROM production.products p1
WHERE list_price IN (
SELECT MAX (p2.list_price) FROM production.products p2
WHERE p2.category_id = p1.category_id
GROUP BY p2.category_id )
ORDER BY category_id, product_name;
-- 子查询写法:
SELECT p1.product_id,p1.product_name,p1.category_id,p1.list_price
FROM production.products p1
INNER JOIN (
SELECT category_id, max(list_price) max_price FROM production.products
GROUP BY category_id) p2 ON p1.category_id = p2.category_id AND p1.list_price = p2.max_price;
- SQL Server Exists运算符 :EXISTS 运算符是一个逻辑运算符,用于检查子查询是否返回任何行。 如果子查询返回一行或多行,则EXISTS 运算符返回 TRUE 。
(1)EXISTS带有相关子查询示例
SELECT customer_id, first_name, last_name FROM sales.customers c
WHERE EXISTS ( SELECT COUNT (*) FROM sales.orders o WHERE customer_id = c.customer_id
GROUP BY customer_id
HAVING COUNT (*) > 2)
ORDER BY first_name, last_name;
如果客户下达的订单数小于或等于 2 ,则子查询返回一个空结果集,该结果集导致 EXISTS 运算符计算为 FALSE 。
- EXISTS 与 IN示例
使用 IN 运算符查找城市为 San Jose 的客户订单:
SELECT * FROM sales.orders WHERE customer_id IN (
SELECT customer_id FROM sales.customers WHERE city = 'San Jose')
ORDER BY customer_id, order_date;
使用返回相同结果的 EXISTS 运算符:
SELECT * FROM sales.orders o WHERE EXISTS (
SELECT customer_id FROM sales.customers c WHERE o.customer_id = c.customer_id
AND city = 'San Jose')
ORDER BY o.customer_id, order_date;
SQL中EXISTS与IN的使用及效率:
EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引。但要看实际情况具体使用:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。当A表数据与B表 数据一样大时,in与exists效率差不多,可任选一个使用。
E. SQL Server Any运算符
ANY 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值集进行比较。
F. SQL Server All运算符
SQL Server ALL 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值列表进行比较。
第8节. 集合运算符
A. SQL Server Union(并集)
SQL Server UNION 是一组集合操作,用于将两个SELECT语句的结果组合到一个结果集中,该结果集包括属于 union 中 SELECT 语句的所有行。
query_1
UNION
query_2
以下是上述语法中的查询要求: 两个查询中列的数量必须相同。 相应列的数据类型必须相同或兼容。
B. SQL Server Intersect(交集)
SQL Server INTERSECT 组合了两个或多个查询的结果集,并返回两个查询输出的不同行。
query_1
INTERSECT
query_2
与 UNION 运算符类似,上述语法中的查询必须符合以下规则:
两个查询必须具有相同的列数和顺序。 相应列的数据类型必须相同或兼容。
C. SQL Server Except(差积)
SQL Server EXCEPT 比较两个查询的结果集,并返回第一个查询中不是由第二个查询输出的不同行。 换句话说, EXCEPT 从一个查询结果中减去另一个查询的结果集。
query_1
EXCEPT
query_2
以下是在上述语法中组合两个查询的结果集的规则: 两个查询中列的数量和顺序必须相同。
相应列的数据类型必须相同或兼容。

被折叠的 条评论
为什么被折叠?



