当前位置:文档之家› SELECT语句使用大全(二)

SELECT语句使用大全(二)

SELECT语句使用大全(二)三、使用WHERE和 HAVING筛选行WHERE 和 HAVING 子句可以控制用于生成结果集的源表中的行。

WHERE 和HAVING 是筛选器。

这两个子句指定一系列搜索条件,只有那些满足搜索条件的行才用于生成结果集。

HAVING 子句通常与 GROUP BY 子句一起使用以筛选聚合值结果。

但是 HAVING 也可以在不使用 GROUP BY 的情况下单独指定。

HAVING 子句指定在应用 WHERE 子句筛选器后要进一步应用的筛选器。

这些筛选器可以应用于 SELECT 列表中所用的聚合函数。

1、比较搜索条件。

2、范围搜索条件。

[NOT ] BETWEEN 范围搜索返回介于两个指定值之间的所有值SELECT * FROM A WHERE Acount Between 10 AND 203、列表搜索条件。

IN 关键字使您可以选择与列表中的任意值匹配的行。

SELECT ProductID, [Name] FROM Product WHERE CategoryID IN (12, 14, 16)4、搜索条件中的模式匹配。

LIKE 关键字搜索与指定模式匹配的字符串、日期或时间值。

% 包含零个或多个字符的任意字符串。

_ 任何单个字符。

[ ] 指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符。

[^] 不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符。

5、NULL比较搜索条件。

NULL比较行为取决于 SET ANSI_NULLS设置,当 SET ANSI_NULLS 为 ON 时,如果比较中有一个或多个表达式为 NULL,则既不输出 TRUE 也不输出 FALSE,而是输出 UNKNOWN。

此时需要使用 IS [NOT] NULL 子句测试 NULL 值。

当 ANSI_NULLS 为 OFF 时,如果 ColumnA 包含空值,则比较操作 ColumnA = NULL 返回 TRUE;如果 ColumnA 除包含 NULL 外还包含某些值,则比较操作返回 FALSE。

此外,两个都取空值的表达式的比较也输出 TRUE6、所有记录(=ALL、>ALL、<= ALL、ANY)。

select * from A where Amount=Any(select amount from A where [Year]=2001) and [Year]<>20017、逻辑运算符。

逻辑运算符包括 AND、OR 和 NOT。

逻辑运算符的优先顺序为NOT、AND 和 OR。

四、使用 GROUP BY分组行GROUP BY 子句用来为结果集中的每一行产生聚合值。

如果聚合函数没有使用GROUP BY 子句,则只为 SELECT 语句报告一个聚合值。

WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。

HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。

HAVING 子句可以引用选择列表中显示的任意项。

select [Year],Sum(AMount) AMount from A Group By [Year] --按年份分组统计销量五、用 ORDER BY对行进行排序ORDER BY 子句按一列或多列(最多 8,060 个字节)对查询结果进行排序。

排序可以是升序的 (ASC),也可以是降序的 (DESC)。

如果未指定是升序还是降序,就假定为 ASC。

六、子查询子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。

任何允许使用表达式的地方都可以使用子查询。

子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。

1、使用别名的子查询当表进行自联接或需要引入外表表列与本表列名相同时需要使用表别名2、使用 [NOT] IN 的子查询USE AdventureWorks;GOSELECT NameFROM Production.ProductWHERE ProductSubcategoryID IN(SELECT ProductSubcategoryIDFROM Production.ProductSubcategoryWHERE Name = 'Wheels')3、UPDATE、DELETE 和 INSERT 语句中的子查询如:联表更新GOUPDATE Production.ProductSET ListPrice = ListPrice * 2FROM Production.Product AS pINNER JOIN Purchasing.ProductVendor AS pvON p.ProductID = pv.ProductID AND pv.VendorID = 51;4、使用比较运算符的子查询GOSELECT CustomerIDFROM Sales.CustomerWHERE TerritoryID =(SELECT TerritoryIDFROM Sales.SalesPersonWHERE SalesPersonID = 276)5、使用 [NOT] EXISTS 的子查询6、用于替代表达式的子查询GOSELECT Name, ListPrice,(SELECT AVG(ListPrice) FROM Production.Product) AS Average,ListPrice - (SELECT AVG(ListPrice) FROM Production.Product) AS DifferenceFROM Production.ProductWHERE ProductSubcategoryID = 1七、表联接通过联接,可以从两个或多个表中根据各个表之间的逻辑关系来检索数据。

联接条件可通过以下方式定义两个表在查询中的关联方式:指定每个表中要用于联接的列。

典型的联接条件在一个表中指定一个外键,而在另一个表中指定与其关联的键。

指定用于比较各列的值的逻辑运算符(例如 = 或 <>)。

1、内联接[INNER] JOIN.仅当两个表中都至少有一个行符合联接条件时,内部联接才返回行,内部联接消除了与另一个表中的行不匹配的行.2、外连接 {LEFT |RIGHT|FULL} OUTER JOIN外部联接会返回 FROM 子句中提到的至少一个表或视图中的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。

将检索通过左外部联接引用的左表中的所有行,以及通过右外部联接引用的右表中的所有行。

在完全外部联接中,将返回两个表的所有行其分为:左外部联接,数据列表包括了满足查询条件的左边表的所有行。

右外部联接,数据列表包括了满足查询条件的右边表的所有行。

完全外部联接,数据包含了所有满足查询条件的列。

3、交叉联接CROSS JOIN返回满足查询条件记录的笛卡尔积运算的集合(N×M)。

4、自联接表可以通过自联接与自身联接。

5、多表联接SELECT , FROM Production.Product pJOIN Purchasing.ProductVendor pvON p.ProductID = pv.ProductIDJOIN Purchasing.Vendor vON pv.VendorID = v.VendorIDWHERE ProductSubcategoryID = 15ORDER BY 6、NULL和联接联接表的列中的空值(如果有)互相不匹配。

如果其中一个联接表的列中出现空值,只能通过外部联接返回这些空值(除非 WHERE 子句不包括空值)。

八、结果集的操作1、[ALL] UNION 运算符组合结果集。

UNION 运算符使您得以将两个或多个 SELECT 语句的结果组合成一个结果集。

使用 UNION 运算符组合的结果集都必须具有相同的结构。

而且它们的列数必须相同,并且相应的结果集列的数据类型必须兼容。

默认情况下,UNION 运算符将从结果集中删除重复的行。

如果使用 ALL 关键字,那么结果中将包含所有行而不删除重复的行。

2、EXCEPT 和 INTERSECT 执行半联接操作EXCEPT 和 INTERSECT 运算符使您可以比较两个或多个 SELECT 语句的结果并返回非重复值。

EXCEPT 运算符返回由 EXCEPT 运算符左侧的查询返回、而又不包含在右侧查询所返回的值中的所有非重复值。

INTERSECT 返回由 INTERSECT 运算符左侧和右侧的查询都返回的所有非重复值。

使用 EXCEPT 或 INTERSECT 比较的结果集必须具有相同的结构。

3、公用表表达式 (CTE) 递归查询公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。

递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。

递归 CTE 由下列三个元素组成:1、例程的调用:递归 CTE 的第一个调用包括一个或多个由 UNION ALL、UNION、EXCEPT 或 INTERSECT 运算符联接的 CTE_query_definitions。

由于这些查询定义形成了 CTE 结构的基准结果集,所以它们被称为“定位点成员”。

2、例程的递归调用。

递归调用包括一个或多个由引用 CTE 本身的 UNION ALL 运算符联接的 CTE_query_definitions。

这些查询定义被称为“递归成员”。

3、终止检查。

终止检查是隐式的;当上一个调用中未返回行时,递归将停止。

示例:go--创建表CREATE TABLE T (id INT identity(1,1), [NAME] VARCHAR(100), FathID int)--插入测试数据Insert t([Name],FathID) VALUES('A',0) --1Insert t([Name],FathID) VALUES('B',0)Insert t([Name],FathID) VALUES( 'C',0)Insert t([Name],FathID) VALUES('Aa',1) --4Insert t([Name],FathID) VALUES('Ab',1) --5Insert t([Name],FathID) VALUES('Ac',1)Insert t([Name],FathID) VALUES('Ba',2)Insert t([Name],FathID) VALUES('Bb',2)Insert t([Name],FathID) VALUES('Aaa',4)Insert t([Name],FathID) VALUES('Aab',4)Insert t([Name],FathID) VALUES('ABa',5)Insert t([Name],FathID) VALUES('ABb',5)GOWITH CN (ID,[Name],FathID,Lev)AS(--例程的调用,定位点成员select A.ID,A.[Name],FathID,1 LEVFROM T AWHERE A.FATHid=0 and [Name]='A'UNION ALL--递归调用,递归成员select a.ID,a.[Name],a.FathID, (LEV+1) LEV FROM T A JOIN CN c ON A.FATHID=C.IDWHERE A.FATHID=C.ID)--测试调用SELECT * FROM CN order by Lev--删除表DROP TABLE t4、汇总数据A、CUBE 汇总数据。

相关主题