sql 子查询
- 可用三种语法来创建子查询:
说明可以拿子查询代替表达式 用于SELECT 语句字段表或 WHERE 或 HAVING 子句。在子查询之中,在 WHERE 或 HAVING 子句的表达式中,用于计算的特定值是由 SELECT 语句提供的。使用 ANY 或 SOME 谓词,它们是同义字,来检索主查询中的记录,这些记录要满足在子查询中检索的任何记录的比较条件。下列示例将返回全部单价比任何以 25% 或更高的折扣卖出的产品高的产品:SELECT * FROM ProductsWHERE UnitPrice > ANY(SELECT UnitPrice FROM OrderDetailsWHERE Discount >= .25);使用 ALL 谓词只检索主查询中的这些记录,它们满足在子查询中检索的所有记录的比较条件。如果将前一个示例中的 ANY 改为 ALL,查询只会返回单价比全部以 25% 或更高的折扣卖出的产品高的产品。这是更多的限制。用 IN 谓词,只能在主查询检索那些记录,在子查询中的某些记录也包含和它们相同的值。下列示例返回有 25% 或更高的折扣的所有产品:SELECT * FROM ProductsWHERE ProductID IN(SELECT ProductID FROM OrderDetailsWHERE Discount >= .25);相反,可用 NOT IN 在主查询中检索那样的记录,在子查询中没有包含与它们的值相同的记录。在 true/false 比较中使用 EXISTS 谓词(与可选的 NOT 保留字一道)来决定子查询是否会返回任何记录。还可用子查询中的表名 别名 来查询子查询外的 FROM 子句的列表。下列示例返回工资等于或高于所有职位相同员工的平均工资的员工姓名。这张员工表的别名为 "T1":SELECT LastName,FirstName, Title, SalaryFROM Employees AS T1WHERE Salary >=(SELECT Avg(Salary)FROM EmployeesWHERE T1.Title = Employees.Title) Order by Title;
- LEFT JOIN 和 RIGHT JOIN 运算
用于 FROM 子句时,把源表记录组合起来。
语法
ON 表 1. 字段 1 compopr 表 2. 字段 2
部分
|
说明
|
---|---|
table1,
table2
|
记录被组合的表的名称。
|
field1,
field2
|
被联接的字段的名称。且这些字段必须有相同的
数据类型及包含相同类型的数据,但它们不需要有相同的名称。
|
compopr
|
任何的关系比较运算子:"=," "<," ">," "<=," ">=," 或 "<>."
|
ALL | 如果不包含任何一个谓词,则取此值。Microsoft Jet数据库引擎选取所有满足 SQL 语句的所有记录。下列两示例是等价的,并且都返回雇员表的所有记录: SELECT ALL * SELECT * |
DISTINCT | 省略选择字段中包含重复数据的记录。为了让查询结果包含它们,必须使 SELECT 语句中列举的每个字段值是唯一的。例如,雇员表可能有一些同姓的雇员。如果有两个记录的姓氏字段皆包含 Smith,则下列 SQL 语句只返回包含 Smith 的记录: SELECT DISTINCT 如果省略 DISTINCT,则查询将返回两个包含 Smith 的记录。 如果 SELECT 子句包含多个字段,则对已给记录,所有字段值的组合必须是唯一的,而且结果中将包含这一组合。 如果查询使用 DISTINCT,则不能更新其输出,而且该输出也不会反映其它用户所作的一系列更改。 |
DISTINCTROW | 省略基于整个重复记录的数据,而不只是基于重复字段的数据。例如,可在客户ID字段上创建一个联结客户表及订单表的查询。客户表并未复制一份 CustomerID 字段,但是订单表必须如此做,因为每一客户能有许多订单。下列 SQL 语句显示如何使用 DISTINCTROW 生成公司的列表,且该列表至少包含一个订单,但不包含有关那些订单的任何详细数据: SELECT DISTINCTROW CompanyName 如果省略 DISTINCTROW,则查询将对每一公司生成多重行,且该公司包含多个订单。 仅当从查询中的一部分表但不是全部表中选择字段时,DISTINCTROW 才会有效。如果查询只包含一个表,或者从所有的表中输出字段,则可省略DISTINCTROW。 |
TOP n [PERCENT] | 返回特定数目的记录,且这些记录将落在由 ORDER BY 子句指定的前面或后面的范围中。假设您想要 1994 年班级里的前 25 个学生名字: SELECT TOP 25 如果您没有包含 ORDER BY 子句,则查询将由学生表返回 25 个记录的任意集合,且该表满足 WHERE 子句。 TOP 谓词不在相同值间作选择。在前一示例中,如果第 25 及第 26 的最高平均分数相同,则查询将返回 26 个记录。 也可用 PERCENT 保留字返回特定记录的百分比,且这些记录将落在由 ORDER BY 子句指定的前面或后面范围中。假设用班级后面 10% 的学生代替前 25 个学生,: SELECT TOP 10 PERCENT ASC 谓词指定返回后面的值。遵循 TOP的值一定是无符号 Integer. 查询是否可更新,这不会受到 TOP 的影响。 |
table | 从其中获取记录的表的名称。 |