1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,数据库查询技术,内容提要,对于用户来说,数据查询是数据库最为重要的功能。,本章将讲述数据查询实现的各种具体方法,本章所有的示例都基于,Northwind,数据库,并且,所有的查询语句在,SQL,语言窗口中完成,要点,SELECT,语句,简单查询,连接查询,合并查询,嵌套子查询,存储查询结果,1,SELECT,语句,在数据库中数据查询是通过,SELECT,语句来完成的,,SELECT,语句的作用是让服务器从数据库中按用户要求检索数据,并将结果以表格的形式返回给客户,由于,SELECT,语句特别复杂,完整的语
2、法结构还不能完全说明其用法,因此,将它拆分为若干部分来讲述。,SELECT,子句,SELECT ALL|DISTINCT,TOP n PERCENT WITH TIES,:=,*,|,table_name,|,view_name,|,table_alias,.*,|,column_name,|expression|IDENTITYCOL|ROWGUIDCOL,AS,column_alias,|,column_alias,=expression,.n,SELECT,子句指定需要通过查询返回的表的列。,语法:,INTO,子句,INTO,子句用于把查询结果存放到一个新建的表中。,语法:,INTO,n
3、ew_table,From,子句,FROM,子句指定需要进行数据查询的表,只要,SELECT,子句中有要查询的列,就必须使用,FROM,子句。,语法:,FROM ,.n,Where,子句,WHERE,子句指定数据检索的条件以限制返回的数据行。,语法:,WHERE|,Group By,子句,GROUP BY,子句指定查询结果的分组条件。,语法:,GROUP BY ALL,group_by_expression,.n,WITH CUBE|ROLLUP ,Having,子句,HAVING,子句指定分组搜索条件。,HAVING,子句通常与,GROUP BY,子句一起使用。,TEXT NTEXT,和,I
4、MAGE,数据类型不能用于,HAVING,子句。,语法:,HAVING,UNION,操作符,UNION,操作符将两个或两个以上的查询结果合并为一个结果集,它与使用连接查询合并两个表的列是不同的。使用,UNION,操作符并查询结果需要遵循两个基本规则:,(,1,)列的数目和顺序在所有查询中必须是一致的;,(,2,)数据类型必须兼容。,语法:,|(),UNION ALL,),UNION ALL query specification|().n,ORDER BY,子句,ORDER BY,子句指定查询结果的排序方式。,语法:,ASC,:指定按递增顺序,从最低值到最高值对指定列中的值进行排序。,DESC
5、指定按递减顺序,从最高值到最低值对指定列中的值进行排序。,ORDER BY,order_by_expression,ASC|DESC ,.n,COMPUTE,子句,COMPUTE,子句在查询结果的末尾生成一个汇总数据行。,语法:,AVG|COUNT|MAX|MIN|STDEV|STDEVP|VAR|VARP|SUM,:指定要执行的聚合形式。,COMPUTE,AVG|COUNT|MAX|MIN|STDEV|STDEVP|VAR|VARP|SUM,(expression),.n BY expression,.n,FOR BROWSE,子句,FOR BROWSE,子句用于读取另外的用户正在进行添
6、加删除或更新记录的表。,语法:,BROWSE,:指明当查看在使用,DB-Library,的客户机应用程序中的数据时可以更新数据。使用此子句时对所操作的表有一些限制:,表必须包含一个,timestamp,类型的时间标识列;,表必须有一个唯一索引。,FOR BROWSE|XML RAW|AUTO|EXPLICIT,XMLDATA ,ELEMENTS ,BINARY base64,OPTION,子句,OPTION,子句用于指定在整个查询过程中的查询提示(,Query Hint,)。通常,用户不必使用,OPTION,子句,因为查询优化器会自动选择一个最佳的查询计划。,OPTION,子句必须由最外层的主
7、查询来指定。各查询提示之间应使用逗号隔开。,语法格式:,OPTION(,.n),:=HASH|ORDER GROUP|CONCAT|HASH|MERGE UNION|LOOP|MERGE|HASH JOIN,|FAST,number_rows,|FORCE ORDER|MAXDOP number,|ROBUST PLAN|KEEP PLAN|KEEPFIXED PLAN|EXPAND VIEWS,2,简单查询,:,选择列,选择列表,SELECT,ProductName,UnitPrice,FROM Products,选择所有列,SELECT*FROM Products,使用计算列,SELECT
8、ProductID,ProductName,CASE,CategoryID,WHEN 1 THEN ROUND(,UnitPrice,*.6),2),WHEN 2 THEN ROUND(,UnitPrice,*.7),2),WHEN 3 THEN ROUND(,UnitPrice,*.8),2),ELSE ROUND(,UnitPrice,*.9),2),END AS,DiscountPrice,FROM Products,常量列,SELECT,LastName,FirstName,爱好,as Hobby FROM Employees,选择行,使用,TOP n,关键字,SELECT DIST
9、INCT TOP 10,ShipCity,ShipRegion,FROM Orders,使用,DISTINCT,关键字,SELECT DISTINCT,ShipCity,ShipRegion,FROM Orders,使用,WHERE,子句,SELECT*FROM Employees WHERE,BirthDate,1960-1-1,使用,IN,关键字,SELECT*FROM Order Details WHERE,ProductID,in(11,42,41,14),使用,BETWEENAND,关键字,SELECT*FROM Order Details WHERE,ProductID,Betwe
10、en 15 and 25,使用通配符和转义符,SELECT*FROM Employees WHERE,lastName,like M%,对查询结果排序,当用户要对查询结果进行排序时,就需要在,SELECT,语句中加入,ORDER BY,子句。在,ORDER BY,子句中,可以使用一个或多个排序要求,其优先级次序为从左到右。,SELECT*FROM Order Details ORDER BY,ProductID,对查询结果分组,使用,GROUP,子句,SELECT,categoryid,avg,=,AVG(unitprice,),FROM Products,GROUP BY,categoryi
11、d,使用,WITH CUBE|ROLLUP,选项,SELECT,orderid,productid,sum(quantity,),FROM order details,WHERE,orderid,1200,使用聚集函数,在,SELECT,语句中使用聚集函数可以得到很多有用的信息。,SELECT count(*)AS total,FROM employees,GO,SELECT count(*)AS total,FROM employees,3,连接查询,当用户需要从多个表中提取所需要的数据时,必须使用连接查询。如果一个查询需要对多个表进行操作就称为连接查询。,连接查询分为等值连接查询、非等值连
12、接查询、自连接查询、外部连接查询和复合条件连接查询。,等值连接,如果表之间的连接是通过相等的字段值连接起来的,则称为等值连接查询。可以用两种方式来指定连接条件。,SELECT DISTINCT Order,Details.ProductID,ProductName,FROM Order,Details,Products,WHERE Order,Details.ProductID,=,Products.ProductID,go,SELECT DISTINCT Order,Details.ProductID,ProductName,FROM Order Details JOIN Products,
13、ON Order,Details.ProductID,=,Products.ProductID,自连接查询,连接不仅可以在表之间进行,也可以使一个表同其自身进行连接。这种连接称为自连接(,Self Join,),相应的查询称为自连接查询。,SELECT,a.EmployeeID,a.LastName,b.EmployeeID,b.LastName,a.HireDate,FROM Employees a,JOIN Employees b,ON,a.EmployeeID,!=,b.EmployeeID,AND,a.HireDate,=,b.HireDate,WHERE,a.LastName,b.L
14、astName,ORDER BY,a.HireDate,外部连接查询,外部连接(,Outer Join,),在外部连接的两个表中,一般称为其中一个表为主表,另一个表为从表。连接时,总是用主表的每行数据去匹配从表中符合条件的数据行,如果从表的数据列符合连接条件,则将数据返回到结果集中,否则,使用,NULL,数据返回到结果集中。由于结果集中的,BIT,数据类型不允许为,NULL,,所以,该列数据将会被自动填充为,0,后再返回到结果集中。,分类,左外部连接(,Left Outer Join,):主表在左边则称为左外部连接,右外部连接(,Right Outer Join,):主表在右边则称为右外部连接
15、SELECT,a.OrderID,b.CustomerName,c.ProductName,FROM Orders a LEFT JOIN Customers b ON,a.CustomerID,=,b.CustomerID,RIGHT JOIN Products c ON,c.ProductID,=,a.ProductID,ORDER BY,a.OrderDate,SELECT,CompanyName,Customers.Customerid,OrderDate,FROM Customers,LEFT JOIN Orders ON,Customers.CustomerID,=,Order
16、s.CustomerID,SELECT,Suppliers.CompanyName,Shippers.CompanyName,FROM Suppliers CROSS JOIN Shippers,复合条件连接查询,在,WHERE,子句中使用多个连接条件的查询称为复合条件连接查询。,SELECT,EmployeeName,CustomerName,OrderDate,FROM,Orders,Customers,Employees,WHERE,Orders.CustomerID,=,Customers.CustomersID,AND,Orders.EmployeeID,=,Employees.Em
17、ployeeID,SELECT,LastName,FirstName,TerritoryDescription,FROM Employees,a,Territories,b,EmployeeTerritories,c,WHERE,c.EmployeeID,=,a.EmployeeID,AND,c.TerritoryID,=,b.TerritoryID,AND,Title=SALE MANAGER,合并查询,将两个或更多查询的结果组合为单个结果集,该结果集包含了所有查询的全部行,这种查询称为合并查询。,合并查询使用,UNION,操作符来实现。,SELECT,CustomerID,as,编号,Co
18、mpanyName,as,名称,客户,AS,类型,FROM Customers,UNION,SELECT,SupplierID,as,编号,CompanyName,as,名称,供应,AS,类型,FROM Suppliers ORDER BY,编号,SELECT,EmployeeID,AS,编号,LastName,+,FirstName,as,名称,FROM Employees,UNION,SELECT,ProductID,as,编号,ProductName,as,名称,FROM Products,ORDER BY,编号,嵌套子查询,嵌套子查询是一个,SELECT,查询,它返回单个值且嵌套在,S
19、ELECT,、,INSERT,、,UPDATE,、,DELETE,语句或其他嵌套查询中。,任何允许使用表达式的地方都可以使用嵌套子查询。,SELECT,Ord.OrderID,Ord.OrderDate,(SELECT,MAX(OrdDet.UnitPrice,),FROM,Northwind.dbo.Order,Details AS,OrdDet,WHERE,Ord.OrderID,=,OrdDet.OrderID,)AS,MaxUnitPrice,FROM Orders AS,Ord,存储查询结果,在,SQL Server 2005,中,可以将每次查询的信息保存到一个临时表或变量中,当需要时可以直接访问上述临时数据。,存储查询结果到表中,EXEC SP_DBOPTION,Northwind,Select,Into,TRUE,SELECT*INTO#,tmp_products,FROM Products,存储查询结果到变量中,DECLARE x varchar(50),DECLARE y float,USE,Northwind,SELECT x=,ProductName,y,=,UnitPrice,FROM Products,WHERE,ProductID,=10010001,SELECT x AS,ProductName,y AS,UnitPrice,






