|
该文章所用数据库仅供参考,语法适用所有数据库。
第6节. 分组数据
A. SQL Server Group By语句
Group by 指定规则对数据进行分组。
示例:
select?city,count(*)?from?sales.customers
group?by?city
select?city,state,count(*)?from?sales.customers
group?by?city,state
order?by?state
select?count(*)?from?sales.customers
group?by?customer_id,fist_name,last_name
B. GROUP BY子句和聚合函数
GROUP BY 子句通常与聚合函数一起用于统计数据。
聚合函数对组执行计算并返回每个组的唯一值。 例如, COUNT() 函数返回每个组中的行数。
其他常用的聚合函数是: SUM()总和?, AVG()平均值?, MIN()最小值?, MAX()最大值?。
GROUP BY 子句将行排列成组,聚合函数返回每个组的统计量(总数量,最小值,最大值,平均值,总和等)。
示例:
--查询返回客户按年度下单的订单数
select?customer_id,year(order_date)?from?sales.orders
select?customer_id,year(order_date),count(*)?
from?sales.orders
group?by?customer_id,year(order_date)
order?by?customer_id
--查询某个产品的最高价格
select?category_id,max(list_price)?最大,min(list_price)?最小,avg(list_price)?平均,count(*)
from?production.products
group?by?category_id
having?avg(list_price)>1000
;
C. SQL Server Having子句
HAVING 子句通常与[GROUP BY]子句一起使用,以根据指定的条件列表过滤分组。
--查询某个产品的最高价格
select?category_id,max(list_price)?最大,min(list_price)?最小,avg(list_price)?平均,count(*)
from?production.products
group?by?category_id
having?avg(list_price)>1000
第7节. 子查询
A. SQL Server子查询
子查询是嵌套在另一个语句(如:[SELECT],[INSERT],[UPDATE]或[DELETE])中的查询。
--使用子查询来查找位于纽约('New York')的客户的销售订单:
select?*?from?sales.customers
where?city =?'New York'
select?*?from?sales.orders
where?customer_id in?(
select?customer_id from?sales.customers
where?city =?'New York'
)
B. SQL Server嵌套子查询?
子查询可以嵌套在另一个子查询中。
SQL Server最多支持 32 个嵌套级别。
--查找价格高于'上海永久'和'凤凰'品牌的所有产品的平均定价的产品
select?*?from?production.brands;
select?*?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 in('上海永久','凤凰')
??)
)
C. SQL Server相关子查询
相关子查询是使用外部查询的值的[子查询]。 换句话说,它取决于外部查询的值。 由于这种依赖性,相 关子查询不能作为简单子查询独立执行。 此外,对外部查询评估的每一行重复执行一次相关子查询。 相关子查询也称为重复子查询。
--查找价格等于其类别的最高价格的产品
select?p1.*?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
;
select?p1.*?from?production.products p1
where?p1.list_price in?(
---321次内层查询
???select?max(list_price)?max_price
???from?production.products p2
???where?p2.category_id =?p1.category_id
???group?by?category_id
)
select?p1.*?from?production.products p1
order?by?category_id
D.SQL Server Exists运算符
EXISTS 运算符是一个逻辑运算符,用于检查子查询是否返回任何行。 如果子查询返回一行或多行,则 EXISTS 运算符返回 TRUE 。
以下是SQL Server EXISTS 运算符的语法:
EXISTS ( subquery)
在此语法中,子查询仅是 SELECT 语句。子查询返回行后, EXISTS 运算符返回 TRUE 并立即停止处理。请注意,即使子查询返回 NULL 值, EXISTS 运算符也会计算为 TRUE
select?null
select?p1.*?from?production.products p1 where?product_id =?1
select?*?from?production.products p1
where?exists?(
???select?*?from?production.products p2
???where?p2.list_price >?8000
)
EXISTS 与?IN示例
--每个经理的下属员工
select?*?from?sales.staffs
where?manager_id in?(
select?manager_id from?sales.staffs
)
--员工'Wiggins'的经理管理的所有员工
select?*?from?sales.staffs
where?manager_id =?(
select?manager_id from?sales.staffs
where?last_name =?'Wiggins'
)
--提问2:返回所有型号年份为'2018'的最低和最高价产品;
select?category_id,model_year,?
max(list_price)?最高价,min(list_price)?最低价
from?production.products
where?model_year =?2018
group?by?category_id,model_year
--返回型号年份为'2018'年的所有产品的平均价格
select?category_id,model_year,?
avg(list_price)?平均价格
from?production.products
where?model_year =?2018
group?by?category_id,model_year
--价格等于其类别的最高价格的产品
select?*?from?production.products p1
inner?join?(
select?category_id,max(list_price)?最高价格
from?production.products
group?by?category_id)?p2
on?p1.category_id =?p2.category_id
and?p1.list_price =?p2.最高价格;
select?*?from?production.products p1
where?p1.list_price =?(
???select?max(list_price)?最高价格
???from?production.products p2
???where?p1.category_id =?p2.category_id
???group?by?category_id
)
E. SQL Server Any运算符
ANY 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值集进行比较。
--查找销售订单中销售的数量超过'2'个的产品
select?*?from?sales.order_items
select?*?from?production.products
where?product_id =?any(
select?product_id
from?sales.order_items
group?by?product_id
having?sum(quantity)?>?2
)
select?brand_id from?production.brands
--查找价格大于'优米优'品牌产品的最高价格的产品
select?*?from?production.products
where?list_price >?any?(
select?list_price from?production.products
where?brand_id =?9)
and?brand_id !=?9
F. SQL Server All运算符
SQL Server ALL 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值列表进行比较。
--查找其他品牌价格大于'优米优'品牌任何产品的价格的产品
select?*?from?production.products
where?list_price >?all?(
select?list_price from?production.products
where?brand_id =?8)
and?brand_id !=?8
order?by?list_price
|