快速掌握如何使用SQL Server来过滤数据
2007-12-06 16:31
579 查看
我们知道,关系型数据一般以规范化的形式保存,也就是说你应该尽可能少地重复数据;在正常情况下,表与表之间仅通过各种键值实现关联。进一步地讲,规范化的含义就是:你不能在数据库中保存计算后的值,而你只能在需要的时候临时计算数据库中保存的值。
对数据进行某些分析通常是很重要的。比方说,你或许想知道哪些产品的定单最多或者哪些定单的利润最大。这些问题都要求你针对自己的SQL语句创建执行过滤规则的公式。其中最重要的语句之一就是GROUP BY子句。
◆Northwind数据库中的定单
Northwind数据库是包含在SQL Server安装软件中的两个示范数据库。这个数据库虽然谈不上完美无缺但也足够满足我们讨论GROUP BY语句的目的了。原因之一是它工作原理清晰,运行良好,包含了一整套标准的数据表,比如Customers(客户)、Orders(定单)、Order Details(定单细节)和处理定单的Products(产品)。
◆表的结构模式
如果你想查看各个定单的OrderID和ProductID ,以下的SQL命令可以满足要求:
以下为引用的内容:
这样你就通过OrderID字段把Orders和Order Details连接了起来。给出的结果列表即显示各定货条目的OrderID和ProductID。
你可以从这个列表中找到条目数量最大的定单。可是,再想想,要能简单地要求数据库计算出需要的条目数目不更方便吗?如果你不关心单个条目而只想知道订购条目数量最大的定单,那么你可以采用以下的SQL语句:
以下为引用的内容:
这样就可以总计出产品的数量并用一个名为NumItems的新字段来显示总数。可是,如果你执行该语句则可能得到以下错误:
以下为引用的内容:
选择语句中的'o.OrderID'列是无效的,因为它没有包含在汇集函数之内而且没有相应的GROUP BY 子句。
在这种情况下,你实际上在总计ProductID,但OrderID却没有被计算总和或者有其他操作施加于其上。
其实这个示例中计算的并不是订购产品条目的总数而是特定订购产品条目的数目。换句话说,你可以看到某一特定定单包括三种产品,但却并不能表示客户各订购了5种。你得到的正是按照定单统计的产品总量。你应该用GROUP BY字句来查看订购产品的总数。
◆使用GROUP BY
使用GROUP BY就好比提出下面的问题:“我如何查看数据?“如果答案是“按照”某种要素来看那么你就可能用到GROUP BY。就我们的例子来说,你希望按照定单查看产品的数量,所以你就可以用OrderID字段进行分组。此外,采用ORDER BY 子句可以更容易地找出订购条目最多的定单。新的查询语句如下所示:
以下为引用的内容:
现在你就得到问题的答案了。
◆理解规则
GROUP BY具有相当高的灵活性,当然你还得遵守相应的语法规则。比如说,你可以在ORDER BY 子句中包含多个表列。如果你想查看每一客户订购产品各个类型的数量,那么你必须通过定单创建查询把客户连接到产品。图A显示的4表连接显然就要用到了。之后你要根据客户和产品进行分组同时对Order Details表内的Quantity列计算总和。查询语句如下:
以下为引用的内容:
查询结果显示出数据库内每一客户购买各类产品的总数。
同时,你还可以在查询中置入多个汇集列。例如,假设你想查看的定单列表要显示单一项目的最大购买量以及该定单的项目总数,那么以下的语句就可以用Max函数来显示单一项目的最大订购量。这种方法还能对所购项目总量求和。
以下为引用的内容:
对数据进行某些分析通常是很重要的。比方说,你或许想知道哪些产品的定单最多或者哪些定单的利润最大。这些问题都要求你针对自己的SQL语句创建执行过滤规则的公式。其中最重要的语句之一就是GROUP BY子句。
◆Northwind数据库中的定单
Northwind数据库是包含在SQL Server安装软件中的两个示范数据库。这个数据库虽然谈不上完美无缺但也足够满足我们讨论GROUP BY语句的目的了。原因之一是它工作原理清晰,运行良好,包含了一整套标准的数据表,比如Customers(客户)、Orders(定单)、Order Details(定单细节)和处理定单的Products(产品)。
◆表的结构模式
如果你想查看各个定单的OrderID和ProductID ,以下的SQL命令可以满足要求:
以下为引用的内容:
SELECT o.OrderID, od.ProductID FROM Orders o, [Order Details] od WHERE o.OrderID = od.OrderID |
你可以从这个列表中找到条目数量最大的定单。可是,再想想,要能简单地要求数据库计算出需要的条目数目不更方便吗?如果你不关心单个条目而只想知道订购条目数量最大的定单,那么你可以采用以下的SQL语句:
以下为引用的内容:
SELECT o.OrderID, Count(od.ProductID) as NumItems FROM Orders o, [Order Details] od WHERE o.OrderID = od.OrderID |
以下为引用的内容:
Server: Msg 8118, Level 16, State 1, Line 1 |
在这种情况下,你实际上在总计ProductID,但OrderID却没有被计算总和或者有其他操作施加于其上。
其实这个示例中计算的并不是订购产品条目的总数而是特定订购产品条目的数目。换句话说,你可以看到某一特定定单包括三种产品,但却并不能表示客户各订购了5种。你得到的正是按照定单统计的产品总量。你应该用GROUP BY字句来查看订购产品的总数。
◆使用GROUP BY
使用GROUP BY就好比提出下面的问题:“我如何查看数据?“如果答案是“按照”某种要素来看那么你就可能用到GROUP BY。就我们的例子来说,你希望按照定单查看产品的数量,所以你就可以用OrderID字段进行分组。此外,采用ORDER BY 子句可以更容易地找出订购条目最多的定单。新的查询语句如下所示:
以下为引用的内容:
SELECT o.OrderID, Count(od.ProductID) as NumItems FROM Orders o, [Order Details] od WHERE o.OrderID = od.OrderID |
◆理解规则
GROUP BY具有相当高的灵活性,当然你还得遵守相应的语法规则。比如说,你可以在ORDER BY 子句中包含多个表列。如果你想查看每一客户订购产品各个类型的数量,那么你必须通过定单创建查询把客户连接到产品。图A显示的4表连接显然就要用到了。之后你要根据客户和产品进行分组同时对Order Details表内的Quantity列计算总和。查询语句如下:
以下为引用的内容:
SELECT c.CompanyName, p.ProductName, Sum(od.Quantity) as TotalBought FROM Customers c, Products p, Orders o, [Order Details] od WHERE c.CustomerID=o.CustomerID AND o.OrderID=od.OrderID AND od.ProductID=p.ProductID GROUP BY c.CompanyName, p.ProductName ORDER BY CompanyName, TotalBought DESC |
同时,你还可以在查询中置入多个汇集列。例如,假设你想查看的定单列表要显示单一项目的最大购买量以及该定单的项目总数,那么以下的语句就可以用Max函数来显示单一项目的最大订购量。这种方法还能对所购项目总量求和。
以下为引用的内容:
SELECT o.OrderID, Max(od.Quantity) as TopItem, Sum(od.Quantity) as TotalBought FROM Orders o, [Order Details] od, Products p WHERE o.OrderID = od.OrderID AND od.ProductID=p.ProductID GROUP BY o.OrderID ORDER BY TotalBought DESC |
相关文章推荐
- 教你如何使用SQL Server来过滤数据
- 如何使用SQL Server来过滤数据
- 使用JDBC在MySQL数据库中如何快速批量插入数据
- 如何在 Visual C# .NET 中使用 SqlDataAdapter 对象更新 SQL Server 数据库
- SQL 教程数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等,您将学到如何使用 SQL 访问和处理数据系统中的数据
- 教你快速掌握如何使用"Opatch"打补丁
- ADO.NET 快速入门(十四):使用 SQL Server 检索数据
- 如何快速掌握man手册的使用
- ADO.NET 快速入门(十四):使用 SQL Server 检索数据
- 如何使用CHECK约束为SQL Server数据执行域完整性
- [SQL Server]如何快速查找使用了某个字段的所有存储过程?
- 如何使用JDBC快速处理大数据
- 如何快速学习、掌握、使用新技术
- 如何使用SQL Server高级数据表提示
- 如何使用 Docker 快速配置数据科学开发环境?
- 在SQL Server中sqlserver,access,excel之间数据如何使用sql语句直接操作
- foxpro如何使用ADO从SQL Server中取出的数据并放到Grid中
- 在sql server中,如何使用一条语句实现将表1中的数据复制到表2中
- 【量化小讲堂-Python&Pandas系列01】如何快速上手使用Python进行金融数据分析
- 教你快速掌握如何使用“Opatch”打补丁