SQL Server知识点四

第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 子句,所以不能通过使用列别名来引用选择列表中指定的聚合函数。

  1. 子查询

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;

  1. 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 。

  1. 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

以下是在上述语法中组合两个查询的结果集的规则: 两个查询中列的数量和顺序必须相同。

相应列的数据类型必须相同或兼容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值