正文共:8926 字 5 图 预计阅读时间:23 分钟
本文目录:
查询是对存储在 SQL Server 中的数据的一种请求。可以使用下列几种形式发出查询:
尽管查询使用多种方式与用户交互,但它们都完成相同的任务:它们为用户提供 SELECT 语句的结果集。即使用户从不指定 SELECT 语句,与使用图形化工具(如 Visual Studio Query Designer)所经常遇到的情况一样,客户端软件可将每个用户查询转换成发送到 SQL Server 的 SELECT 语句。
SELECT 语句从 SQL Server 中检索出数据,然后以一个或多个结果集的形式将其返回给用户。结果集是对来自 SELECT 语句的数据的表格排列。与 SQL 表相同,结果集由行和列组成。
大多数 SELECT 语句都描述结果集的四个主要属性:
例如下列 SELECT 语句查找单价超过 $40
SELECT ProductID, Name, ListPrice
FROM Production.Product
WHERE ListPrice > $40
ORDER BY ListPrice ASC
在 SELECT 关键字之后所列出的列名(ProductID、Name 和 ListPrice)形成选择列表。此列表指定结果集有三列,并且每一列都具有 Product 表中相关列的名称、数据类型和大小。因为 FROM 子句仅指定了一个基表,所以 SELECT 语句中的所有列名都引用该表中的列。
FROM 子句仅列出 Product 这一个表,该表用来检索数据。
WHERE 子句指定出条件:在 Product 表中,只有 ListPrice 列中的值大于 40的产品的产品ID、名称以及标价¨G0G在SELECT关键字之后所列出的列名(ProductID、Name和ListPrice)形成选择列表。此列表指定结果集有三列,并且每一列都具有Product表中相关列的名称、数据类型和大小。因为FROM子句仅指定了一个基表,所以SELECT语句中的所有列名都引用该表中的列。FROM子句仅列出Product这一个表,该表用来检索数据。WHERE子句指定出条件:在Product表中,只有ListPrice列中的值大于40,该值所在的行才符合 SELECT 语句的要求。
ORDER BY 子句指定结果集将基于 ListPrice 列中的值按照升序进行排序 (ASC)。
Select的主要子句可归纳如下:
SELECT
[ ALL | DISTINCT ]
[TOP (expression) [PERCENT] [ WITH TIES ] ]
select_list
INTO new_table_name
FROM table_list
[ WHERE search_conditions ]
[ GROUP BY group_by_list ]
[ HAVING search_conditions ]
[ ORDER BY order_list [ ASC | DESC ] ]
结果集列的以下特性由选择列表中的下列表达式定义:
选择列表还可以包含下列控制结果集最终格式的关键字:
TOP (120) /*返回120行*/
TOP (15) PERCENT /* 返回前15%的行结果 */.
TOP(@n) /* 返回变量n指定数量的行结果,比如:DECLARE @n AS BIGINT; SET @n = 2 */.
选择列表中的项包括下列内容:
SELECT ProductID, ROUND( (ListPrice * .9), 2) AS DiscountPrice
FROM Production.Product
WHERE ProductID = 748;
SELECT ( CAST(ProductID AS
VARCHAR(10)) + ': '
+ Name ) AS ProductIDName
FROM Production.Product;
SELECT ProductID, Name,
CASE
Class
WHEN
'H'
THEN
ROUND( (ListPrice * .6), 2)
WHEN
'L'
THEN
ROUND( (ListPrice * .7), 2)
WHEN
'M'
THEN
ROUND( (ListPrice * .8), 2)
ELSE
ROUND( (ListPrice * .9), 2)
END
AS DiscountPrice
FROM Production.Product;
SELECT Prd.ProductID, Prd.Name,
( SELECT
SUM(OD.UnitPrice * OD.OrderQty)
FROM AdventureWorks2008R2.Sales.SalesOrderDetail AS OD
WHERE OD.ProductID = Prd.ProductID
) AS SumOfSales
FROM Production.Product AS Prd
ORDER
BY Prd.ProductID;
在每一个要从表或视图中检索数据的 SELCET 语句中,都需要使用 FROM 子句。使用 FROM 子句可以:
FROM 子句是用逗号分隔的表名、视图名和 JOIN 子句的列表。
Transact-SQL 具有扩展功能,支持在 FROM 子句中指定除表或视图之外的其他对象。这些对象返回结果集,也就是 OLE DB 术语中所说的行集,该结果集构成了虚拟表。然后 SELECT 语句就像操作表一样操作这些结果集。
FROM 子句可以指定
SELECT
RTRIM(p.FirstName) + ' ' + LTRIM(p.LastName) AS
Name,
d.City
FROM Person.Person AS p
INNER
JOIN HumanResources.Employee AS e
ON p.BusinessEntityID = e.BusinessEntityID
INNER
JOIN Person.BusinessEntityAddress AS bea
ON e.BusinessEntityID = bea.BusinessEntityID
INNER
JOIN (SELECT AddressID, City FROM Person.Address) AS d
ON bea.AddressID = d.AddressID
ORDER
BY p.LastName, p.FirstName ;
不需要 FROM 子句的 SELECT 语句是那些不从数据库内的任何表中选择数据的 SELECT 语句。这些 SELECT 语句只从局部变量或不对列进行操作的 Transact-SQL 函数中选择数据:
SELECT SYSDATETIME();
SELECT @MyIntVariable;
SELECT @@VERSION;
-- PIVOT 语法
SELECT <非透视的列>,
[第一个透视的列] AS <列名称>,
[第二个透视的列] AS <列名称>,
...
[最后一个透视的列] AS <列名称>,
FROM
(<生成数据的 SELECT 查询>)
AS <源查询的别名>
PIVOT
(
<聚合函数>(<要聚合的列>)
FOR
[<包含要成为列标题的值的列>]
IN ( [第一个透视的列], [第二个透视的列],
... [最后一个透视的列])
) AS <透视表的别名>
<可选的 ORDER BY 子句>;
SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4
FROM
(SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader) p
PIVOT
(
COUNT (PurchaseOrderID)
FOR EmployeeID IN
( [250], [251], [256], [257] )
) AS pvt
ORDER BY pvt.VendorID;
/* pivot result
VendorID Emp1 Emp2 Emp3 Emp4
1492 2 5 4 4
1494 2 5 4 5
1496 2 4 4 5
1498 2 5 4 4
1500 3 4 4 5
*/
SELECT 语句中的 WHERE 和 HAVING 子句可以控制用于生成结果集的源表中的行。WHERE 和 HAVING 是筛选器。这两个子句指定一系列搜索条件,只有那些满足搜索条件的行才用于生成结果集。我们称满足搜索条件的行包含在结果集中。
HAVING 子句通常与 GROUP BY 子句一起使用来筛选聚合值的结果。但是,也可以不使用 GROUP BY 而单独指定 HAVING。HAVING 子句指定在 WHERE 子句筛选之后应用的其他筛选器。这些筛选器可应用于选择列表中使用的聚合函数。
理解应用 WHERE、GROUP BY 和 HAVING 子句的正确顺序对编写高效的查询代码会有所帮助:
WHERE 和 HAVING 子句中的搜索条件或限定条件可以包括:
SELECT ProductID, Name
FROM Production.Product
WHERE
Class = 'H'
ORDER
BY ProductID;
-- 100到500之间
SELECT ProductID, Name
FROM Production.Product
WHERE ListPrice BETWEEN
100
and
500
ORDER
BY ListPrice;
-- 如果不适用IN,就需要用多个or
-- 使用IN更简洁
SELECT ProductID, Name
FROM Production.Product
WHERE Color IN ('Multi', 'Silver')
ORDER
BY ProductID;
SELECT ProductID, Name
FROM Production.Product
WHERE
Name
LIKE
'Ch%'
ORDER
BY ProductID;
like通配符
使用通配符时应着重考虑对性能的影响。如果表达式以通配符开头,则无法使用索引。(正如在电话簿中进行查找一样,如果所给的名称是“%mith”,而不是“Smith”,那么您将不知道需从电话簿的何处开始搜索。)如果通配符位于表达式内部或位于表达式末尾,则可以使用索引。
SELECT s.Name
FROM Sales.Customer c
JOIN Sales.Store s
ON c.CustomerID = s.CustomerID
WHERE c.CustomerID IS
NOT
NULL
ORDER
BY s.Name;
比较 null 值时请谨慎从事。例如,指定 = NULL 与指定 IS NULL 是不同的。
-- 从其中已发货的产品量大于任何已发货的 H 类产品量的 SalesOrderDetail 表中检索订单和产品 ID
SELECT OrdD1.SalesOrderID, OrdD1.ProductID
FROM Sales.SalesOrderDetail OrdD1
WHERE OrdD1.OrderQty > ALL
(SELECT OrdD2.OrderQty
FROM Sales.SalesOrderDetail OrdD2 JOIN Production.Product Prd
ON OrdD2.ProductID = Prd.ProductID
WHERE Prd.Class = 'H');
SELECT ProductID, Name
FROM Production.Product
WHERE ListPrice < 500
OR (Class = 'L'
AND ProductLine = 'S');
当可以搜索通配符字符。有两种方法可指定平常用作通配符的字符:
使用 ESCAPE 关键字定义转义符。在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符。例如,若要搜索字符串中所有的字符串 5%,请使用:
sql_like
SELECT ColumnA FROM your_table
WHERE ColumnA LIKE
'9[-]5';
通配符转义
ORDER BY 子句按一列或多列(最多 8,060 个字节)对查询结果进行排序。
从 SQL Server 2005 开始,SQL Server 允许在 FROM 子句中指定对 SELECT 列表中未指定的表中的列进行排序。
ORDER BY 子句中引用的列名必须明确地对应于 SELECT 列表中的列或 FROM 子句中的表中的列。如果列名已在 SELECT 列表中有了别名,则 ORDER BY 子句中只能使用别名。同样,如果表名已在 FROM 子句中有了别名,则 ORDER BY 子句中只能使用别名来限定它们的列。
排序可以是升序的 (ASC),也可以是降序的 (DESC)。默认为 ASC。
-- 使用 Traditional_Spanish 排序规则
SELECT LastName FROM Person.Person
ORDER
BY LastName
COLLATE Traditional_Spanish_ci_ai ASC;
本文项目地址:
https://github.com/firewang/sql50
(喜欢的话,Star一下)
阅读原文,或者访问该链接可以在线观看(该系列将更新至GitHub,并且托管到read the docs)
https://sql50.readthedocs.io/zh_CN/latest/
参考网址: