SELECT [关键字] { * | 表名称.* | [表名称.]字段名称1 [AS 别名1] [, [表名称.] 字段名称2 [AS 别名2] [, ...]]}
FROM 表运算式 [, ...] [IN 外部表]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]关键字:可以用来限制返回之记录的数量,可以设定为ALL、DISTINCT、DISTINCTROW 、或TOP。如果没有指定述语,缺省值为 ALL。
*:选取全部的字段。
别名:代替在表中原有的字段名称。
表运算式:一个或多个以逗号分隔的表名称。
外部表:如果表不存在目前的表当中,须设定包含表运算式中表的表名称。
执行SELECT 表达式,并不会改变表之中现有的资料。
一个 SELECT 表达式的最基本语法是:
SELECT * FROM 表运算式
您可以使用星号(*)来选取表的全部字段。譬如下例选取 [产品] 表中的全部字段:
SELECT * FROM 产品
字段名称包含空格或标点符号时,须使用括号[ ]将它括在其中。例如:
SELECT [电脑 的产品]
如果在FROM子句中的字段名称中,包含多个的表中时,需在字段名称前加上表名称和点(.)运算子,即 表名称.字段名称。譬如下例选取 [产品] 表的 [价格] 字段和 [订单] 表的 [数量] 字段:
SELECT 产品.价格, 订单.数量
FROM 产品, 订单
WHERE 产品.代号 = 订单.代号
当您使用Recordset 对象时,Recordset并不认得rs(表名称.字段名称) 格式,即rs(“产品.价格”)会发生错误,您必须使用AS来设定字段名称的别名。譬如:
SELECT 产品.价格 AS 价格, 订单.数量AS 数量
FROM 产品, 订单
WHERE 产品.代号 = 订单.代号
如此就可以使用rs(“价格”) 和rs(“数量”),来读取其字段的资料。
与SELECT表达式相关的语法:
关键字:ALL/ DISTINCT/ DISTINCTROW/ TOP。
WHERE:寻找FROM中的表符合特定条件的资料记录。WHERE 可以使用下面的BETWEEN、LIKE、IN运算子:
Between...And:判断表达式的值是否落在指定的范围之中。
Like:寻找相符合的关键字。
IN运算式:限定范围。
NOT IN运算式:表示不属于所指定的范围。
ORDER BY子句:可以设定排序的字段。
GROUP BY子句:将查询的结果做统计。
HAVING子句:使用在SELECT 表达式中,筛选已经GROUP BY统计的记录。
Union:可以合并多组查询的结果。
JOIN:连接组合两个表中的字段记录。
子查询(sub query):表达式中,可以包括SELECT表达式。
Select...Into:将查询的结果,建立一个产生的表。
详细介绍如下:
ALL/DISTINCT/DISTINCTROW/TOP关键字
使用SELECT查询时,可以加上关键字,以选取所查询的记录。如下:
ALL:返回所有的记录。
DISTINCT:指定字段中的记录有重复时只返回一条记录,记录不重复。
DISTINCTROW:指定字段中的记录有重复时都不返回。
TOP:返回前面几个记录或几个百分比的记录。
语法如下:
SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM 表ALL返回所有的记录。不加关键字时,与加ALL的意义相同,将返回所有的记录。譬如下列两个例子的执行结果相同,都从产品表中返回所有的记录:
SELECT ALL * FROM 产品
与以下的执行结果相同:
SELECT * FROM 产品
DISTINCT不选取指定字段之中的重复资料。使用DISTINCT后,查询的结果,列在SELECT DISTINCT后的每个字段的资料值,若相同则只取一条记录,换句话说,指定字段的资料不会有重复的现象。例如,在产品表之中有一些产品名称相同的产品,加上DISTINCT的SQL表达式只会返回一条记录字段为产品名称资料相同的记录:
SELECT DISTINCT 产品名称 FROM 产品
如果您不加上DISTINCT,上例查询将返回数个包含相同产品名称的记录。
如果SELECT DISTINCT子句后指定数个字段,查询的结果,所有字段的组合值不会有重复的现象。
DISTINCTROW则不返回指定字段所有重复的记录。
TOP n [PERCENT] ,返回前面几条记录或几个百分比的记录。排列的顺序可以使用ORDER BY子句来指定。譬如找到成绩前10名的学生姓名:
SELECT TOP 10 姓名
FROM 学生
ORDER BY 成绩如果您没有包含ORDER BY子句,查询将由学生表返回任意的10个记录。
TOP不在相同值间作选择,如果第10及第11的成绩是相同的,查询将返回11个记录。
您可使用PERCENT来设定前面几个百分比的记录,譬如譬如找到成绩前10%的学生姓名:
SELECT TOP 10 PERCENT 姓名
FROM 学生
ORDER BY 成绩让我们看一个在ASP程式中使用这个SQL指令的例子。
可以利用Distinct找出不重复的记录,譬如ASP程式rs7.asp如下,[Insert Into 产品(代号,名称) Select Distinct 代号,名称 From 产品 where 代号 ='C2000'] 使用Distinct与Insert Into新增代号为C2000的记录:
<%
'Distinct 代号,名称只判断代号,名称是否相同, 相同者只加一条记录
sql = "Insert Into 产品(代号,名称) Select Distinct 代号,名称 From 产品 where 代号 ='C2000'"
Set a = conn1.Execute(sql)
Set rs3 = Server.CreateObject("ADODB.Recordset")
sql = "Select * from 产品 where 代号 ='C2000'"
rs3.Open sql,conn1,1,1,1
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">代号</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">名称</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">价格</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">数量</FONT></TD>
</TR>
<% Do while not rs3.EOF %>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("代号")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("名称")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("价格")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("数量")%></TD>
</TR>
<%
rs3.MoveNext
Loop
rs3.Close
%>
</TABLE>
WHERE
WHERE寻找FROM中的表符合特定条件的资料记录,WHERE 使用在SELECT、UPDATE、或DELETE表达式。
如果SELECT查询中没有指定WHERE子句,将返回表中所有的资料。如果在SELECT查询多个表,且没有使用WHERE子句、或JOIN 子句的话,查询结果为多个表资料的乘积。
WHERE设定特定的条件,譬如:
FROM 产品 WHERE 分类 = '电脑':表示选择 [分类] 为 [电脑] 的 [产品]
WHERE 价格 Between 1000 And 5000:表示价格介于1000至5000之间 。
一个WHERE子句,最多可包含40个运算式,运算式之间由AND或OR等逻辑运算子相连结。
设定特定的条件时,依照字段类型,前后加不同的符号,譬如:
文字:前后加单引号,譬如WHERE 分类 = '电脑'。
数字:前后不加符号,譬如WHERE 数量 > 100。
日期:前后加#号,譬如WHERE 日期 = #5/15/99#。
WHERE可以使用下面的BETWEEN、LIKE、IN运算子。
WHERE可以使用下面的BETWEEN、LIKE、IN运算子。Between...And
Between...And判断表达式的值是否落在指定的范围之中。语法为:
expr Between value1 And value2
表示如果expr的值介于value1和value2之间,则Between...And运算子会返回True;否则它会返回False。
您也可以加上逻辑运算 Not expr Between value1 And value2,来判断相反的条件,即expr落在value1和 value 2的范围之外。
如果expr、value1、或value2为Null时,则Between...And会返回Null值。
您不能在 Between...And 运算子中使用通配符*,例如,您不能使用 100* 和 500* 来寻找介于1000至5000中的产品代号。
Like
Like寻找相符合的关键字。
Like跟随一个运算式,列出所要比较的字串或字符串文字。
在一运算式中,您可以使用 Like 运算子将一字段资料和一字串运算式做一比较。您可以使用通配符*来找出相类似的资料,譬如Like "王*",则查询会返回所有字段中以 [王] 做为开头的资料。
Like后运算式可以使用的符号:

%:通配符,表示一个或多个字符,譬如LIKE jack% 将找到所有以jack为起头的字串文字,LIKE %jack%则找到包括jack的字串文字。
_:一个字符的通配符,譬如LIKE jack_ 将找到如jack1、jacka等字串文字,LIKE _jack_ 则找到如ajackb、cjackf等字串文字。
[x-y]:指定字符范围,譬如LIKE [a-c]jack 将找到如ajack1、bjack、cjack等字串文字。
[^x-y]:指定排除的字符范围,譬如LIKE [^a-c]jack 将不会找到如ajack1、bjack、cjack等字串文字。
下例中,会得到以字母A做为开头而其后接着介于B到G之间的任何字母和一个数字的资料:
Like "A[B-G]#"
IN
IN运算式,限定范围。
语法为:
expr [Not] In(value1, value2,…)
其中expr为运算式字段。value1, value2, …为指定的范围清单。
例如,您可以使用In运算子,来指定学生必须居住的城市,为广州市、深圳市、或汕头市:
SELECT *
FROM 学生
WHERE 城市 In ('广州市','深圳市','汕头市')
让我们看一个ASP程式使用这个SQL指令的例子。
我们可以利用IN子句决定范围,譬如ASP程式rs24.asp如下,[SELECT 姓名,科目,分数 From 考试 Where 分数 In (SELECT 分数 From 考试 Where 分数>=60)],使用IN找出分数大于或等于60分的记录:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT 姓名,科目,分数 From 考试 Where 分数 In (SELECT 分数 From 考试 Where 分数>=60)"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>In: 低于60分不算"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分数: " & rs2("分数")
rs2.MoveNext
Loop
rs2.Close
%>
以上的ASP程式rs24.asp,在用户端使用浏览器,浏览执行的结果,显示分数大于或等于60分的记录。
NOT IN
NOT IN运算式,表示不属于所指定的范围。
让我们看一个于ASP程式中使用这个SQL指令的例子。
我们可以利用Not In子句决定不应显示的记录,譬如ASP程式rs24.asp如下,[SELECT 姓名,科目,分数 From 考试 Where 分数 Not In (SELECT 分数 From 考试 Where 分数>=60)],使用IN找出分数不大于或等于60分的记录,即小于60分的记录:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT 姓名,科目,分数 From 考试 Where 分数 Not In (SELECT 分数 From 考试 Where 分数>=60)"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>Not In: 高于60分不算"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分数: " & rs2("分数")
rs2.MoveNext
Loop
rs2.Close
%>
以上的 ASP程式rs24.asp,在用户端使用浏览器,浏览执行的结果,显示分数不大于或等于60分的记录