SELECT表达式.docx

上传人:b****7 文档编号:9835241 上传时间:2023-02-06 格式:DOCX 页数:18 大小:23.08KB
下载 相关 举报
SELECT表达式.docx_第1页
第1页 / 共18页
SELECT表达式.docx_第2页
第2页 / 共18页
SELECT表达式.docx_第3页
第3页 / 共18页
SELECT表达式.docx_第4页
第4页 / 共18页
SELECT表达式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

SELECT表达式.docx

《SELECT表达式.docx》由会员分享,可在线阅读,更多相关《SELECT表达式.docx(18页珍藏版)》请在冰豆网上搜索。

SELECT表达式.docx

SELECT表达式

SELECT表达式

接着,让我们看看SELECT表达式,SELECT用来在表中寻找符合特定条件的记录,语法如下:

SELECT[关键字]{*|表名称.*|[表名称.]字段名称1[AS别名1][,[表名称.]字段名称2[AS别名2][,...]]}

FROM表运算式[,...][IN外部表]

[WHERE...]

[GROUPBY...]

[HAVING...]

[ORDERBY...]

[WITHOWNERACCESSOPTION]

关键字:

可以用来限制返回之记录的数量,可以设定为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运算式:

限定范围。

NOTIN运算式:

表示不属于所指定的范围。

ORDERBY子句:

可以设定排序的字段。

GROUPBY子句:

将查询的结果做统计。

HAVING子句:

使用在SELECT表达式中,筛选已经GROUPBY统计的记录。

Union:

可以合并多组查询的结果。

JOIN:

连接组合两个表中的字段记录。

子查询(subquery):

表达式中,可以包括SELECT表达式。

Select...Into:

将查询的结果,建立一个产生的表。

详细介绍如下:

ALL/DISTINCT/DISTINCTROW/TOP关键字

使用SELECT查询时,可以加上关键字,以选取所查询的记录。

如下:

ALL:

返回所有的记录。

DISTINCT:

指定字段中的记录有重复时只返回一条记录,记录不重复。

DISTINCTROW:

指定字段中的记录有重复时都不返回。

TOP:

返回前面几个记录或几个百分比的记录。

语法如下:

SELECT[ALL|DISTINCT|DISTINCTROW|[TOPn[PERCENT]]]

FROM表

ALL返回所有的记录。

不加关键字时,与加ALL的意义相同,将返回所有的记录。

譬如下列两个例子的执行结果相同,都从产品表中返回所有的记录:

SELECTALL*FROM产品

与以下的执行结果相同:

SELECT*FROM产品

DISTINCT不选取指定字段之中的重复资料。

使用DISTINCT后,查询的结果,列在

SELECTDISTINCT后的每个字段的资料值,若相同则只取一条记录,换句话说,指定字段的资料不会有重复的现象。

例如,在产品表之中有一些产品名称相同的产品,加上DISTINCT的SQL表达式只会返回一条记录字段为产品名称资料相同的记录:

SELECTDISTINCT产品名称FROM产品

如果您不加上DISTINCT,上例查询将返回数个包含相同产品名称的记录。

如果SELECTDISTINCT子句后指定数个字段,查询的结果,所有字段的组合值不会有重复的现象。

DISTINCTROW则不返回指定字段所有重复的记录。

TOPn[PERCENT],返回前面几条记录或几个百分比的记录。

排列的顺序可以使用ORDERBY子句来指定。

譬如找到成绩前10名的学生姓名:

SELECTTOP10姓名

FROM学生

ORDERBY成绩

如果您没有包含ORDERBY子句,查询将由学生表返回任意的10个记录。

TOP不在相同值间作选择,如果第10及第11的成绩是相同的,查询将返回11个记录。

您可使用PERCENT来设定前面几个百分比的记录,譬如譬如找到成绩前10%的学生姓名:

SELECTTOP10PERCENT姓名

FROM学生

ORDERBY成绩

让我们看一个在ASP程式中使用这个SQL指令的例子。

可以利用Distinct找出不重复的记录,譬如ASP程式rs7.asp如下,[InsertInto产品(代号,名称)SelectDistinct代号,名称From产品where代号='C2000']使用Distinct与InsertInto新增代号为C2000的记录:

%

'Distinct代号,名称只判断代号,名称是否相同,相同者只加一条记录

sql="InsertInto产品(代号,名称)SelectDistinct代号,名称From产品where代号='C2000'"

Seta=conn1.Execute(sql)

Setrs3=Server.CreateObject("ADODB.Recordset")

sql="Select*from产品where代号='C2000'"

rs3.Opensql,conn1,1,1,1

%

TABLECOLSPAN=8CELLPADDING=5BORDER=0

TR

TDALIGN=CENTERBGCOLOR="#800000"FONTCOLOR="#FFFFFF"代号

/FONT/TD

TDALIGN=CENTERBGCOLOR="#800000"FONTCOLOR="#FFFFFF"名称

/FONT/TD

TDALIGN=CENTERBGCOLOR="#800000"FONTCOLOR="#FFFFFF"价格

/FONT/TD

TDALIGN=CENTERBGCOLOR="#800000"FONTCOLOR="#FFFFFF"数量

/FONT/TD

/TR

%Dowhilenotrs3.EOF%

TR

TDBGCOLOR="f7efde"ALIGN=CENTER%=rs3("代号")%/TD

TDBGCOLOR="f7efde"ALIGN=CENTER%=rs3("名称")%/TD

TDBGCOLOR="f7efde"ALIGN=CENTER%=rs3("价格")%/TD

TDBGCOLOR="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价格Between1000And5000:

表示价格介于1000至5000之间。

一个WHERE子句,最多可包含40个运算式,运算式之间由AND或OR等逻辑运算子相连结。

设定特定的条件时,依照字段类型,前后加不同的符号,譬如:

文字:

前后加单引号,譬如WHERE分类='电脑'。

数字:

前后不加符号,譬如WHERE数量100。

日期:

前后加#号,譬如WHERE日期=#5/15/99#。

WHERE可以使用下面的BETWEEN、LIKE、IN运算子。

******************************************************

ADO使用SELECT语法二

接上一篇文章:

WHERE可以使用下面的BETWEEN、LIKE、IN运算子。

Between...And

Between...And判断表达式的值是否落在指定的范围之中。

语法为:

exprBetweenvalue1Andvalue2

表示如果expr的值介于value1和value2之间,则Between...And运算子会返回True;否则它会返回False。

您也可以加上逻辑运算NotexprBetweenvalue1Andvalue2,来判断相反的条件,即expr落在value1和value2的范围之外。

如果expr、value1、或value2为Null时,则Between...And会返回Null值。

您不能在Between...And运算子中使用通配符*,例如,您不能使用100*和500*来寻找介于1000至5000中的产品代号。

Like

Like寻找相符合的关键字。

Like跟随一个运算式,列出所要比较的字串或字符串文字。

在一运算式中,您可以使用Like运算子将一字段资料和一字串运算式做一比较。

您可以使用通配符*来找出相类似的资料,譬如Like"王*",则查询会返回所有字段中以[王]做为开头的资料。

Like后运算式可以使用的符号:

%:

通配符,表示一个或多个字符,譬如LIKEjack%将找到所有以jack为起头的字串文字,LIKE%jack%则找到包括jack的字串文字。

_:

一个字符的通配符,譬如LIKEjack_将找到如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分的记录:

%

Setconn1=Server.CreateObject("ADODB.Connection")

conn1.Open"DBQ="&Server.MapPath("ntopsamp.mdb")&";Driver=

{MicrosoftAccessDriver(*.mdb)};DriverId=25;FIL=MSAccess;"

Setrs2=Server.CreateObject("ADODB.Recordset")

SqlStr="SELECT姓名,科目,分数From考试Where分数In(SELECT分数

From考试Where分数=60)"

rs2.OpenSqlStr,conn1,1,1

Response.Write"pIn:

低于60分不算"

Dowhilenotrs2.EOF

Response.Write"BR"&rs2("姓名")&""&rs2("科目")&"分数:

"&

rs2("分数")

rs2.MoveNext

Loop

rs2.Close

%

以上的ASP程式rs24.asp,在用户端使用浏览器,浏览执行的结果,显示分数大于或等于60分的记录。

NOTIN

NOTIN运算式,表示不属于所指定的范围。

让我们看一个于ASP程式中使用这个SQL指令的例子。

我们可以利用NotIn子句决定不应显示的记录,譬如ASP程式rs24.asp如下,[SELECT姓名,科目,分数From考试Where分数NotIn(SELECT分数From考试Where分数=60)],使用IN找出分数不大于或等于60分的记录,即小于60分的记录:

%

Setconn1=Server.CreateObject("ADODB.Connection")

conn1.Open"DBQ="&Server.MapPath("ntopsamp.mdb")&";Driver=

{MicrosoftAccessDriver(*.mdb)};DriverId=25;FIL=MSAccess;"

Setrs2=Server.CreateObject("ADODB.Recordset")

SqlStr="SELECT姓名,科目,分数From考试Where分数NotIn(SELECT分

数From考试Where分数=60)"

rs2.OpenSqlStr,conn1,1,1

Response.Write"pNotIn:

高于60分不算"

Dowhilenotrs2.EOF

Response.Write"BR"&rs2("姓名")&""&rs2("科目")&"分数:

"&

rs2("分数")

rs2.MoveNext

Loop

rs2.Close

%

以上的ASP程式rs24.asp,在用户端使用浏览器,浏览执行的结果,显示分数不大于或等于60分的记录

*****************************************************

在ADO使用SELECT语法三

接上一篇文章:

ORDERBY

ORDERBY子句,可以设定排序的字段。

在一个SQL表达式之中,ORDERBY子句通常放置于最后。

若要以递减顺序来进行排序(Z~A,9~0),须于您要递减排序的每一字段的尾部加DESC字。

譬如:

SELECT姓名

FROM员工

ORDERBY工资DESC,年龄

表示[工资]字段以递减顺序来进行排序,[年龄]字段以递增顺序来进行排序。

ORDERBY子句中排序的字段,不可以包含MEMO字段类型或OLE对象类型,否则会发生错误。

在ORDERBY子句之中包含多个的字段时,首先以ORDERBY之后的第一个字段来进行排序。

然后,若在此字段之中有相同的资料记录,才会以列第二字段来进行排序,依此类推。

GROUPBY

GROUPBY将查询的结果做统计,语法如下:

SELECTfieldlist

FROMtable

WHEREcriteria

[GROUPBYgroupfieldlist]

使用WHERE子句,可以设定不想要做统计的资料,而使用HAVING子句可以筛选已经统计之后的字段。

不可以对MEMO字段类型或OLE对象类型的字段做统计,否则会发生错误。

譬如ASP程式rs22.asp如下,[SELECT种类,Avg(价格)As平均From产品GroupBy种类]使用GROUPBY将查询的结果做[种类]统计,统计各个种类统计来平均价格Avg(价格):

%

Setconn1=Server.CreateObject("ADODB.Connection")

conn1.Open"DBQ="&Server.MapPath("ntopsamp.mdb")&";Driver=

{MicrosoftAccessDriver(*.mdb)};DriverId=25;FIL=MSAccess;"

Setrs2=Server.CreateObject("ADODB.Recordset")

SqlStr="SELECT种类,Avg(价格)As平均From产品GroupBy种类"

Response.Write"pAvg(价格)"

rs2.OpenSqlStr,conn1,1,1

Dowhilenotrs2.EOF

Response.Write"BR"&rs2("种类")&":

"&rs2("平均")

rs2.MoveNext

Loop

rs2.Close%

以上的ASP程式rs22.asp,用户端使用浏览器,浏览执行的结果,显示依据[种类]统计来统计平均价格。

让我们多看个例子,譬如ASP程式rs22.asp如下,[SELECT种类,Sum(数量*价格)As总计From产品GroupBy种类]使用GROUPBY将查询的结果做[种类]统计,统计各个种类的数量与价格相乘的总价Sum(数量*价格):

%

Setconn1=Server.CreateObject("ADODB.Connection")

conn1.Open"DBQ="&Server.MapPath("ntopsamp.mdb")&";Driver=

{MicrosoftAccessDriver(*.mdb)};DriverId=25;FIL=MSAccess;"

Setrs2=Server.CreateObject("ADODB.Recordset")

SqlStr="SELECT种类,Sum(数量*价格)As总计From产品GroupBy种类"

rs2.OpenSqlStr,conn1,1,1

Response.Write"pSum(数量*价格)"

Dowhilenotrs2.EOF

Response.Write"BR"&rs2("种类")&":

"&rs2("总计")

rs2.MoveNext

Loop

rs2.Close%

以上的ASP程式rs22.asp,在用户端使用浏览器,浏览执行的结果,显示依据[种类]来统计总价。

Groupfieldlist为用以统计的字段名称,最多为10个字段。

在groupfieldlist中字段名称的顺序,将决定统计层次,由最高至最低的层次来分组。

最后,譬如ASP程式rs22.asp如下,[SELECT姓名,科目,Avg(分数)As平均From考试GroupBy姓名,科目]使用GROUPBY将查询的结果做依据[姓名]和[科目]统计,统计各个统计的[平均]分数Avg(分数):

%

Setconn1=Server.CreateObject("ADODB.Connection")

conn1.Open"DBQ="&Server.MapPath("ntopsamp.mdb")&";Driver=

{MicrosoftAccessDriver(*.mdb)};DriverId=25;FIL=MSAccess;"

Setrs2=Server.CreateObject("ADODB.Recordset")

SqlStr="SELECT姓名,科目,Avg(分数)As平均From考试GroupBy姓名,科目"

rs2.OpenSqlStr,conn1,1,1

Response.Write"pGroupBy姓名,科目"

Dowhilenotrs2.EOF

Response.Write"BR"&rs2("姓名")&""&rs2("科目")&"平均:

"&

rs2("平均")

rs2.MoveNext

Loop

rs2.Close

%

以上的ASP程式rs22.asp,在用户端使用浏览器,浏览执行的结果,显示依据[姓名]和[科目]来统计[平均]分数

2.6.修改表

如果你建立了一个表后发现自己犯了一些错误,或者是应用的需求发生了变化,那么你可以删除这个表然后重新建立它。

但是如果这个表已经填充了好多数据了,或者是该表已经被其它数据库对象参照,(比如一个外键约束)那这可不是一个方便的选项。

因此PostgreSQL提供了一族命令用于修改现有表。

你可以

增加字段,

删除字段,

增加约束,

删除约束,

修改默认值,

重命名字段,

重命名表。

所有这些动作都是用ALTERTABLE命令执行的。

2.6.1.增加字段

要增加一个字段,使用这条命令:

ALTERTABLEproductsADDCOLUMNdescriptiontext;

新增的字段对于表中已经存在的行而言最初将先填充空值。

你也可以同时在该字段上定义约束,使用通常的语法:

ALTERTABLEproductsADDCOLUMNdescriptiontextCHECK(description<>'');

一个新字段不能用非空约束,因为最初的时候该字段必须包含空值。

但是你可以稍后增加一个非空约束。

同样,你也不能在一个新字段上定义默认值。

根据SQL标准的说明,这样需要对现存行的新字段填充默认值,而这个特性还没有实现。

但是你可以稍后调整字段预设。

2.6.2.删除字段

要删除一个字段,使用这个命令:

ALTERTABLEproductsDROPCOLUMNdescription;

2.6.3.增加约束

要增加一个约束,使用表约束语法。

比如:

ALTERTABLEproductsADDCHECK(name<>'');

ALTERTABLEproductsADDCONSTRAINTsome_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1