SQL数据处理语言手册

来源:互联网 发布:网络招生实战 编辑:程序博客网 时间:2024/05/03 01:19

SELECT 语句

命令 Microsoft Jet数据库引擎从数据库里返回信息,作为一组记录。

语法

SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
    FROM tableexpression [, ...][IN外部数据库]
    [WHERE...]
    ]
[GROUP BY...]
    ]
[HAVING...]
    ]
[ORDER BY...]
    ]
[WITH OWNERACCESS OPTION]

SELECT 语句具有以下几个部分:

部分说明
predicate下列谓词之一:ALL, DISTINCT, DISTINCTROW, 或 TOP.您可用谓词来限制返回的记录数量。如果没有指定谓词,则默认值为 ALL。
*从特定的表中指定全部字段。
table表的名称,此表中包含已被选择的记录的字段。
field1, field2字段的名称,该字段包含了您要获取的数据。如果数据包含多个字段,则按列举顺序依次获取它们。
alias1, alias2名称,用来作列标头,以代替 table.中原有的列名。
tableexpression表的名称,这些表包含要获取的数据。
Externaldatabase数据库的名称,该数据库包含 tableexpression 中的表,如果这些表不在当前数据库中的话。

说明

为完成此运算,Microsoft Jet 数据库引擎会搜索指定的表,抽出所选择的列,并选择满足条件的行,并按指定的顺序对选出的行排序,或将它们分组。

SELECT 语句不会更改数据库的中的数据。

SELECT通常是 SQL 语句.大部分 SQL 语句或者是 SELECT 语句,或者是 SELECT...INTO 语句。

SELECT 语句的最短的语法是:

SELECT fields FROM table

可以用一个星号 (*) 选取表中所有字段。下例选择了雇员表中的全部字段:

SELECT * FROM Employees;

如果 FROM 子句中有多个表包含字段名,则字段之前为表名称和 .(点)操作符。在以下示例中,「部门」字段将出现在雇员表及超级用户表中。SQL 语句将从雇员表和超级用户表来选择部门:

SELECT Employees.Department, Supervisors.SupvName

FROM Employees INNER JOIN Supervisors

WHERE Employees.Department = Supervisors.Department;

Recordset 对象被创建时, Microsoft Jet 数据库引擎把表的字段名作为 Recordset对象中的 Field 对象命名。 如果想要一个不同的字段名,或想要一个不是由生成字段的表达式导出的名,则使用 AS 保留字。在下例所得到的 Recordset 对象中用 Birth 标题将返回的 Field 对象命名:

SELECT BirthDate

AS Birth FROM Employees;

无论何时使用合计函数或查询,而且该查询返回含糊的或重复的 Field 对象名称,都必须用 AS 子句来提供 Field 对象的替代名称。在以下示例所得到的 Recordset 对象中用 HeadCount 标题将返回的 Field 对象命名:

SELECT COUNT(EmployeeID)

AS HeadCount FROM Employees;

可使用 SELECT 语句中的其它子句进一步限制和组织已返回的数据。若需更多信息,参见所用子句的主题帮助。

======================================================

SELECT...INTO 语句

创建制表检索.

语法

SELECT field1[, field2[, ...]]INTO新表[IN外部数据库]
    FROM

SELECT...INTO 语句可分为以下几个部分:

部分说明
field1, field2欲复制至新表的字段的名称。
NewTable欲创建的表的名称。它应遵循标准命名公约.如果 NewTable 的名称与现存表的名称相同时,将会发生可以捕捉到的错误。
Externaldatabase进入外部数据库的路径。有关路径的描述,请参阅 IN 子句
source从其中选择记录的现存表的名称。它可以是单一表或多重表或一个查询。

说明

可以使用生成表查询来存档记录、生成表的复制备份、或生成输出至另一个数据库的表的副本、或用作定期显示数据的报表的依据。例如,可以每月运行一次同样的生成表查询,生成地区的销售月报。


注意

  • 或许你想要为新表定义一个主键。创建新表时,新表中的字段将继承查询基本表中每一个字段的数据类型及大小,但不传递其他的字段或表属性。
  • 使用 INSERT INTO 语句 而不用创建追加检索来把数据加入当前表中。
  • 在运行生成表查询之前,若要知道会选择哪些记录,可以先看一看使用相同选择条件的 SELECT 语句的结果。

=====================================================

INSERT INTO 语句

添加一个或多个记录至一个表。这叫作追加查询.

语法

多重记录追加查询:

INSERT INTO target [(field1[, field2[, ...]])][IN外部数据库]
    SELECT field1[, field2[, ...]]
    FROM tableexpression

单一记录追加查询:

INSERT INTO target [(field1[, field2[, ...]])]
    VALUES (value1[, value2[, ...])

INSERT INTO 语句可分为以下几个部分:

部分说明
target欲追加记录的表或查询的名称。
field1, field2如果后面跟的是 target 参数,则为要追加数据的字段名;如果后面跟的是 source 参数,则为从其中获得数据的字段名。
Externaldatabase进入外部数据库的路径。有关路径的描述,请参阅 IN 子句
source复制记录的来源表或查询的名称。
tableexpression从其中得到要插入的记录的表名。这个变元可能是一个单一的表名,也可能是一个由 INNER JOINLEFT JOINRIGHT JOIN 运算组成的复合体,或是一个储存的查询。
value1value2欲插入新记录的特定字段的值。每一个值将依照它在列表中的位置,顺序插入相关字段:value1 将被插入至追加记录的 field1 之中,value2 插入至 field2,依此类推。必须使用逗点将这些值分隔,并且将文本字段用引号 (' ') 括起来。

说明

可以使用 INSERT INTO 语句来添加一个单一记录至一个表中,如以上所示使用单一记录追加查询语法。在这个例子中,代码指定了该记录每一字段的名称和值。必须指定追加数值的记录的每一个字段和那个字段的值。如果您没有指定每一个字段时,缺省值或 Null 值将被插入至没有数据的字段之中。这些记录将被添加至表的尾部。

通过使用 SELECT ...FROM 子句如以上所示的多重记录追加查询语法,也可以从另一表或查询使用 INSERT INTO追加一组记录。在这个示例中,SELECT 子句将指定追加字段至指定的 target 表。

sourcetarget 表可以指定一个表或查询。如果查询被指定,Microsoft Jet数据库引擎会把记录追加到由该查询指定的所有表中。

INSERT INTO 是可选的,但当使用时,请置於 SELECT 语句之前。

如果你的目标表包含一个 主键,,你一定要把唯一的非 Null 值追加到主键字段中,否则 Microsoft Jet 数据库引擎不会追加记录。

如果你要把把记录追加到带有 AutoNumber字段的表中,还想重编追加的记录,请不要在你的查询中包含 AutoNumber字段。如果您要保持字段中的原始值,请将自动编号加在您的查询之中。

使用 IN 子句,可追加记录至另一个数据库中的表。

要创建新表请用 SELECT...INTO 语句代替制表查询的创建。

若要在运行追加查询之前找出哪些记录是被追加的,首先执行和查阅一个使用相同的选择条件之选定查询所获得的结果。

追加查询为从一个或多个表中复制记录至另一个表。您追加的表包含记录将不会被追加查询所影响。

除了从另一表中来追加现存的记录,可以指定在单一追加记录之中使用 VALUES 子句来指定对每一字段的值。如果您省略字段列表,VALUES 子句在表之中必须包含每一字段的值;否则, INSERT运算将

========================================================

UPDATE 语句

创建更新查询来改变基于特定准则的指定表中的字段值。

语法

UPDATE
    SET新值
    WHERE准则;

UPDATE 语句可分为以下几个部分:

部分说明
table表的名称,其中包含要更改的数据。
newvalue表达式,用来计算要插入更新记录中特定字段的值。
criteria表达式,用来计算被更新的记录。只有符合表达式的记录才会被更新。

说明

当需要更改多个记录,或要更改的记录在多重表中时,UPDATE 特别有用。

可以同时更改多个字段。下列示例为对联合王国的一家公司增加 10% 的 Order Amount (订货量)和 3% 的 Freight (货运):

UPDATE Orders

SET OrderAmount = OrderAmount * 1.1,

Freight = Freight * 1.03

WHERE ShipCountry = 'UK';


重点

  • UPDATE 不生成结果集。而且当使用更新查询更新记录之后,不能取消这次操作。如果想知道哪些记录被更新,先看一下使用相同的条件的选定查询的结果,然后运行更新查询。
  • 随时注意维护数据的复制备份。如果更新了错误记录,可从备份副本中恢复这些数据。

====================================================

DELETE 语句

创建一个删除查询把记录从 FROM 子句列出并符合 WHERE 子句的一个或更多的表中清除。

语法

DELETE [表.*]
    FROM 表
    WHERE标准

DELETE 语句可分为以下几个部分:

部分说明
table从其中删除记录的表的可选名称。
table从其中删除记录的表的名称。
criteria确定删除哪个记录的表达式

说明

可以使用 DELETE 删除多个记录。

可以用 Execute 方法和 DROP 语句从数据库中删除整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。

可以用 DELETE从与其他表有着 一对多关系的表中清除记录。若在一个查询中删除了关系中‘一’的一方的表的相应记录,级联删除操作将删除关系中‘多’的一方的表的记录。例如,在客户表与订单表之间的关系中,客户表是‘一’方,而订单表是‘多’方。如果指定使用级联删除,从客户数据中删除一个记录,相对应之订单记录也会被删除。

删除查询不只删除指定字段之中的数据,它会删除全部的记录。如果要删除指定字段值,可创建更新查询使该值变为 Null.


重点

  • 当使用删除查询删除记录之后,不能取消此操作。如果想要知道哪些记录已被删除,首先验证使用相同条件的选定查询的结果,然后运行删除查询。
  • 随时注意维护数据的复制备份。如果您误删除记录,可以从备份副本中将数据恢复。

=================================================

EXECUTE 语句

用于激活 PROCEDURE.

语法

EXECUTE过程 [参数1[, 参数2[, ...]]

UPDATE 语句可分为以下几个部分:

部分说明
过程要执行的过程
param1, param2由该过程定义的参数s

==============================================

TRANSACTION 语句

用于启动和结束显式事务

语法

启动新事务.

BEGIN TRANSACTION

通过提交事务期间进行的所有工作来结束事务。

COMMIT [TRANSACTION | WORK]

通过回滚事务期进行的所有工作来结束事务。

ROLLBACK [TRANSACTION | WORK]

说明

事务不会自启动。要启动事务,必须使用BEGIN TRANSACTION来启动。

事务可嵌套多达5层。要启动嵌套事务,使用当前事务中的BEGIN TRANSACTION。

连接表不支持事务。

=============================================

TRANSFORM 语句

创建连接查询.

语法

TRANSFORM合计函数
    selectstatement
    TRANSFORM aggfunction
selectstatement
PIVOT pivotfield [IN (value1[, value2[, ...]])]

TRANSFORM 语句可分为以下几个部分:

部分说明
aggfunction运算所选数据的 SQL合计函数
selectstatementSELECT 语句.
pivotfield在查询结果集中用来创建列标题的字段或表达式
value1value2用来创建列标题的固定值。

说明

使用交叉表查询来摘要数据时,从指定的字段或表达式中选定值作为列标题,这样,可以用比选定查询更紧凑的格式来观察数据。

TRANSFORM是可选的,但当被包含时为 SQL字符串的第一句。它出现在 SELECT 语句(指定作为行标题的字段的)之前,还出现在 GROUP BY 子句(指定行分组的)之前。可以有选择地包含其它子句,例如 WHERE 子句,它指定附加的选择或排序条件。也可以将子查询当作谓词,特别是在叉表查询的 WHERE 子句中。

pivotfield 返回的值被用作查询结果集中的列标题。例如,在交叉表查询中,将根据销售图表按销售月份创建 12 个列。可以限制 pivotfield 用列在可选的 IN 子句中的固定值(value1, value2)来创建标题。也可以用没有数据存在的固定值来创建附加的列。

=======================================================

INNER JOIN 运算

组合两个表中的记录,只要在公共字段之中有相符的值。

语法

FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2

INNER JOIN 运算可分为以下几个部分:

部分说明
table1, table2记录被组合的表的名称。
field1, field2被联接的字段的名称。若它们不是由数字构成的,则这些字段必须为相同的数据类型并包含同类数据,但它们无须具有相同的名称。
compopr任何的关系比较运算子:"=," "<," ">," "<=," ">=," 或 "<>."

说明

可以在 FROM 子句中使用INNER JOIN运算。.这是最普通的联接类型。只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录。

可以使用 INNER JOIN 与部门表及员工表选择每一个部门中的全部员工。反之,可以使用 LEFT JOIN或 RIGHT JOIN运算创建 outer join,从而选择所有部门(即使有些并没有员工)或所有员工(即使有些尚未分配到部门)。

若试图联接包含 MemoOLE Object数据的字段,会导致错误。

可以联接任何两个相同类型的数值字段。例如,可以联接 AutoNumberLong字段,因为它们类型相似。但不能联接 SingleDouble 类型的字段。

下列示例显示如何在类标识符字段联接类表及产品表:

SELECT CategoryName, ProductName

FROM Categories INNER JOIN Products

ON Categories.CategoryID = Products.CategoryID;

在上面的示例中,类标识符是已被联接的字段,但是它并不包含在查询输出中,因它并非被包含在 SELECT 语句之中。在这个示例中,若要包含联接字段,将字段名包含在 SELECT 语句中, Categories.CategoryID.

也可以使用下列语法,在一个 JOIN 语句中链接多个 ON 子句:

SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2) OR
ON table1.field3 compopr table2.field3)];

也可以使用下列语法,嵌套 JOIN 语句:

SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN ...)]
ON table3.field3 compopr tablex.fieldx)]
ON table2.field2 compopr table3.field3)
ON table1.field1 compopr table2.field2;

在一个 INNER JOIN 之中,可以嵌套 LEFT JOIN 或 RIGHT JOIN,但是在 LEFT JOIN 或 RIGHT JOIN 中不能嵌套 INNER JOIN。

==============================================================

LEFT JOIN 和 RIGHT JOIN 运算

用于 FROM 子句时,把源表记录组合起来。

语法

FROM1 [ LEFT | RIGHT ] JOIN2
    ON 1.字段1 compopr 2. 字段2

LEFT JOIN 及 RIGHT JOIN 运算可分为以下几个部分:

部分说明
table1, table2记录被组合的表的名称。
field1, field2被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr任何的关系比较运算子:"=," "<," ">," "<=," ">=," 或 "<>."

说明

用 LEFT JOIN 运算 创建左边外部联接.左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

用RIGHT JOIN 运算 创建 右边外部联接.右边外部联接将包含了从第二个(右边)开始的两个表中的全部记录,即使在第一个(左边)表中并没有匹配值的记录。

例如,可以使用 LEFT JOIN 与部门(左边)及员工(右边)表来选择所有的部门,包含了没有分配到员工的部门。可以使用 RIGHT JOIN 选择所有的员工,包含了没有分配到部门的员工。

下列示例显示如何在类标识符字段中联接类表及产品表。查询将会列出所有种类的列表,包含那些没有产品在其中的种类:

SELECT CategoryName,

ProductName

FROM Categories LEFT JOIN Products

ON Categories.CategoryID = Products.CategoryID;

在本例中,CategoryID 是联接的字段,但由于它不包含在 SELECT 语句中,因此,也不包含在查询结果中。要包含联接的字段,请在 SELECT 语句中输入字段名 — 在这个示例中为 Categories.CategoryID。


注意

欲创建只包含联接字段中数据相同的记录的查询,请用 INNER JOIN 运算。

  • 在 INNER JOIN 之中可以写一个嵌套的 LEFT JOIN 或一个 RIGHT JOIN,但是在一个 LEFT JOIN 或一个 RIGHT JOIN 之中不能写嵌套的 INNER JOIN。请参阅 INNER JOIN 主题中有关使用嵌套的讨论,从其中可获知如何在其它联接中编写嵌套联接的信息。
  • 可以链接多个 ON 子句。若需更多信息,请参阅在 INNER JOIN 主题中的子句链接的讨论。

若试图联接包含 MemoOLE Object数据的字段,会导致错误。

==========================================================

UNION 运算

创建一个联合查询,它组合了两个或更多的独立查询或表的结果。

语法

[TABLE] query1 UNION [ALL] [TABLE] query2 [UNION [ALL] [TABLE] queryn [ ... ]]

UNION 运算可分为以下几个部分:

部分说明
query1-nSELECT 语句、已存储的查询的名称、或冠以 TABLE 关键字的存储表的名称。

说明

可以在任何组合中、单一 UNION 运算中,合并两个或多个查询、表、及 SELECT 语句的结果。下列示例将名为 New Accounts 的现存表和一个 SELECT 语句合并:

TABLE [New Accounts] UNION ALL

SELECT *

FROM Customers

WHERE OrderAmount > 1000;

按照缺省规定,使用 UNION 运算时不返回重复的记录;然而,可以包含 ALL 谓词来确保返回所有的记录。这样,运行查询的速度也会快些。

一次 UNION 运算中的所有查询必须要求相同的字段数量;但是,字段无须具有相同的大小或数据类型

只能在第一个 SELECT 语句中使用别名,因为它们在其他语句中已被省略。在 ORDER BY 子句中,可引用在第一个 SELECT 语句中被调用的字段名。


注意

  • 可以在各个查询变元中使用GROUP BYHAVING 子句来为返回的数据分组。
  • 要想以指定的顺序来显示返回的数据,可以在最后一个 query 参数的末尾使用 ORDER BY 子句

==========================================================

PARAMETERS 声明

参数的名称和数据类型在参数查询中说明。

语法

PARAMETERS name datatype [, name datatype [, ...]]

PARAMETERS 声明有这些部分:

部分说明
name参数的名称。具有Name特性(此特性属于 Parameter对象),并被用于在Parameters中标识此参数。当应用程序运行查询时,可用 name 作为字符串显示在对话框中。包含空格或标点符号的文本应用方括号 ([ ]) 括起来。例如,[Low price] 及 [Begin report with which month?] 都是有效的 name 参数。
datatype基本 Microsoft Jet SQL数据类型或其同义字之一。

说明

对于有规则运行的查询,可用 PARAMETERS 声明创建一个参数查询。参数查询便于自动更改查询准则。对于参数查询,代码必须提供每次查询运行时使用的参数。

PARAMETERS 声明是可选的,但是当使用时,须置於任何其他语句之前,包括 SELECT 语句

如果声明包含一个以上的参数,用逗点将它们分隔。下列示例中声明了两个参数:

PARAMETERS [Low price] Currency, [Beginning date] DateTime;

WHEREHAVING 子句中可以使用 name,但不能用数据类型。下列示例中要提供两个参数,然后使用这个条件来查询 Orders 表中的记录。

PARAMETERS [Low price] Currency,

[Beginning date] DateTime;

SELECT OrderID, OrderAmount

FROM Orders

WHERE OrderAmount > [Low price]

AND OrderDate >= [Beginning date];

=====================================================

WITH OWNERACCESS OPTION 声明

在具有安全工作组的多用户环境中,使用该声明和查询给运行该查询的用户与查询所有者相同的权限

语法

sqlstatement
    WITH OWNERACCESS OPTION;

说明

WITH OWNERACCESS OPTION 声明是可选的。

下列示例使用户能够查看工资信息(即使用户没有权限查看工资表),提供查询主人拥有的权限:

SELECT LastName,

FirstName, Salary

FROM Employees

ORDER BY LastName

WITH OWNERACCESS OPTION;

如果用户无法创建表或添加,可使用 WITH OWNERACCESS OPTION来运行 制表追加查询

如果要强制工作组安全性设置及用户的权限,不要包含 WITH OWNERACCESS OPTION 声明。

此选项要求您必须访问与该数据库相关的 System.mdw 文件。它只在安全的多用户实现中才真正有用。

=================================================

SQL 子查询

子查询是一个 SELECT 语句,它嵌套在一个 SELECT、SELECT...INTO 语句INSERT...INTO 语句DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。

语法

可用三种语法来创建子查询:

comparison [ANY | ALL | SOME] (sqlstatement)

expression [NOT] IN (sqlstatement)

[NOT] EXISTS (sqlstatement)

子查询可分为以下几个部分:

部分说明
comparison一个表达式及一个比较运算符,将表达式与子查询的结果作比较。
expression用以搜寻子查询结果集的表达式。
sqlstatementSELECT 语句,遵从与其他 SELECT 语句相同的格式及规则。它必须括在括号之中。

说明

可以拿子查询代替表达式 用于SELECT 语句字段表或 WHEREHAVING 子句。在子查询之中,在 WHERE 或 HAVING 子句的表达式中,用于计算的特定值是由 SELECT 语句提供的。

使用 ANY 或 SOME 谓词,它们是同义字,来检索主查询中的记录,这些记录要满足在子查询中检索的任何记录的比较条件。下列示例将返回全部单价比任何以 25% 或更高的折扣卖出的产品高的产品:

SELECT * FROM Products

WHERE UnitPrice > ANY

(SELECT UnitPrice FROM OrderDetails

WHERE Discount >= .25);

使用 ALL 谓词只检索主查询中的这些记录,它们满足在子查询中检索的所有记录的比较条件。如果将前一个示例中的 ANY 改为 ALL,查询只会返回单价比全部以 25% 或更高的折扣卖出的产品高的产品。这是更多的限制。

用 IN 谓词,只能在主查询检索那些记录,在子查询中的某些记录也包含和它们相同的值。下列示例返回有 25% 或更高的折扣的所有产品:

SELECT * FROM Products

WHERE ProductID IN

(SELECT ProductID FROM OrderDetails

WHERE Discount >= .25);

相反,可用 NOT IN 在主查询中检索那样的记录,在子查询中没有包含与它们的值相同的记录。

在 true/false 比较中使用 EXISTS 谓词(与可选的 NOT 保留字一道)来决定子查询是否会返回任何记录。

还可用子查询中的表名别名来查询子查询外的 FROM 子句的列表。下列示例返回工资等于或高于所有职位相同员工的平均工资的员工姓名。这张员工表的别名为 "T1":

SELECT LastName,

FirstName, Title, Salary

FROM Employees AS T1

WHERE Salary >=

(SELECT Avg(Salary)

FROM Employees

WHERE T1.Title = Employees.Title) Order by Title;

上例中AS保留词可选。

某些子查询在交叉表查询中是允许的,特别是谓词(那些在 WHERE 子句中的)。将子查询作为输出(那些列在 SELECT 中的)在交叉表查询中是不允许的。