设为首页 加入收藏

TOP

SqlServer数据库使用(四)
2014-11-23 22:14:30 来源: 作者: 【 】 浏览:37
Tags:SqlServer 数据库 使用
间,接着再通过聚合函数获得最便宜的价格。

3、GROUP BY后多个字段情况
实例:SELECT MAX(C) FROM table_name GROUP BY A,B
原理:当执行时先对A进行分组如果A中有相同项,则开始对B进行分组。如果A、B同时出现相同项。则将相同项合并,留下一个唯一项。
若A出现相同项,B为不同项。则此时不进行合并,保留此时的项。当A、B分组结束后,则开始通过聚合函数找出分组好后C的最大项。

错误情况:
SELECT EmployeeID,price FROM table_name GROUP BY EmployeeID
错误提示:选择列表中的列 'table_name.price' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
解决办法:
1、将price写在GROUP BY。(原因:没有被GROUP BY包含,Group By语句的后面,作为分组的依据)
2、将price写在聚合函数中 (例如:min(price))

错误原因:根据分组字段,将具有相同分组字段的记录归并成了一条记录。
这个时候剩下的那些不存在于Group By语句后面作为分组依据的字段就有可能出现多个值,
但是目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,
所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,
那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregate functions)了。

总结:GROUP BY 主要是用于分组之后,再通过聚合函数获得相应的值。GROUP BY后面的字段主要是分组的依据,
当获得唯一项之后再执行SELECT后的聚合函数获得相应的值。GROUP BY 可以通过条件来获得指定的组,
例如:SELECT EmployeeID,min(OrderDate) FROM table_name WHEER price =value GROUP BY EmployeeID
另一种用法:Group By All [COLUMN]
SELECT EmployeeID,min(OrderDate) FROM table_name WHEER price =value GROUP BY All EmployeeID
分组好之后显示对应的项
聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。
注意:当GROUP BY子句中用于分组的列中出现了NULL值时,会将所有的NULL值分别在同
一组,即认为他们是“相等”的

HAVING子句
GROUP BY子句只是简单地依据所选列的数据进行分组,将该列具有相同值的行划为一组。而实际应用中,
往往还需要删除不满足条件的组,SQL提供HAVING子句来实现该功能。
示例:SELECT EmployeeID,MIN(price) FROM table_name GROUP BY EmployeeID HAVING MIN(price)
查询重复字段:
--查找重复记录
select * from personnel
where name in (select name from personnel group by name having count(name) > 1)
可以看出,虽然聚合函数不能直接做为where的条件。但是通过group by 和 having 组合,便可以将其作为条件进行查询

HAVING与WHERE的区别
HAVING子句与WHERE子句的相似之处在于定义了搜索条件,但与WHERE子句不同,HAVING子句与组有关,而不是与单个的行有关。
WHERE子句不能直接以聚合函数作为搜索条件。在SELECT语句中,WHERE和HAVING子句的执行顺序不同。
添加限制条件
1、SELECT EmployeeID,MIN(price) FROM table_name GROUP BY EmployeeID HAVING MIN(price)>20 AND EmployeeID>2

错误写法:SELECT EmployeeID,MIN(price) FROM table_name GROUP BY EmployeeID HAVING MIN(price)>100 AND OrderID>5
错误提示:选择列表中的列 'table_name.OrderID' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
产生错误的原因:不能将单个的OrderID的值应用于组,包括在HAVING子句中的列必须是祖列。此时,WHERE子句不能用HAVING子句代替。
为了获得所需的结果,需要需改如下:
SELECT EmployeeID,MIN(price) FROM table_name WHERE OrderID>5 GROUP BY EmployeeID HAVING MIN(price)>100

表的基本链接
1、两表链接:SELECT * FROM table_name1 [AS] a,table_name2 [AS] b WHERE a.ID=b.ID
2、多表链接:SELECT * FROM table_name1 [AS] a,table_name2 [AS] b,table_name3 [AS] c WHERE a.ID=b.ID AND b.ID=c.ID
注意:
1、使用SQL Server关键字作为表名、列名时,需要使用"[]"括起来。例如Order为SQL Server关键字,若需要创建一张名伟Order的表,则写为"CREATE TABLE [Order]"
2、SELECT语句首先执行FROM子句,由于定义表别名是在FROM子句中执行,而在其他子句中使用,所以在SELECT语句的任何子句中都可以使用表的别名。

表的连接类型
1、内链接:内连接也称等同连接,返回的结果集是两个表中所有相匹配的数据,并舍弃不匹配的数据(类似于上面的表的基本连接)。
语法:SELECT * FROM table_name1 [INNER] JOIN table_name2 ON <表达式> [WHERE] [<表达式>]
示例:SELECT * FROM Categories INNER JOIN Prouducts ON Categories.CategorID=Prouducts.CategorID
注意:INNER关键字可以省略。

2、外连接:无论是内连接还是带WHERE子句的多表查询,都只返回相匹配的数据(内连接和外连接的区别)。即如果任何一个源表中的行
在另一个源表中没有匹配,则系统不会将该行放在最后的结果中,而在外连接系统生成的结果表中, 不仅包含符合条件的行,还包括左表、
右表、或两个表中所有的数据行。
(1)左外连接(LEFT [OUTER] JOIN)
左外连接除了包括匹配的行之外,还包括JOIN关键字左表中不匹配的行,其中,右表中缺少的属性值用NULL值表示。左表连接示意图如下:

TB_A TB_B
A B C C D
a1 b1 c1 c1 d1
a2 b2 c2 c2 d2
a3 b3 c3

TB_A LEFT [OUTER] JOIN TB_B ON TB_A.C=TB_B.C
A B C C D
a1 b1 c1 c1 d1
a2 b2 c2 c2 d2
a3 b3 c3 NULL NULL

UNION运算符
UNION运算符用于执行集合的“并”运算。
语法:SELECT * FROM table_name1 WHERE <表达式> UNION SELECT * FROM table_name1 WHERE <表达式>
内连接实现多表连接
语法:SELECT * FROM table_name1 Orders o INNER JOIN Details od ON o.OrderID=od.Orde

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQLSERVER服务启动失败 下一篇多线程下不重复读取SQLServer表的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: