SQL语言参考.docx
《SQL语言参考.docx》由会员分享,可在线阅读,更多相关《SQL语言参考.docx(21页珍藏版)》请在冰豆网上搜索。
SQL语言参考
SQL语言
SQL全称是“结构化查询语言(StructuredQueryLanguage)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEMR开发的一种查询语言,它的前身是SQUARE语言。
SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言,得到了广泛的应用。
如今无论是像Oracle、Sybase、Informix、SQLserver这些大型的数据库管理系统,还是像VisualFoxporo、PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。
SQL(结构化查询语言)是大多数数据库使用的一种语言,使用SQL,就能使用任何数据库源和数据。
1SQL功能与特性
通过SQL命令,程序设计师或数据库管理员(DBA)可以:
(1)建立数据库的表格;(包括设置表格所可以使用之空间)
(2)改变数据库系统环境设置;
(3)针对某个数据库或表格,授予用户存取权限;
(4)对数据库表格建立索引值;
(5)修改数据库表格结构;(新建、删除或是修改表格字段)
(6)对数据库进行数据的新建;
(7)对数据库进行数据的删除;
(8)对数据库进行数据的修改;
(9)对数据库进行数据的查询。
SQL广泛地被采用正说明了它的优点。
它使全部用户,包括应用程序员、DBA管理员和终端用户受益非浅。
下面介绍SQL的特点。
(1)非过程化语言
SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。
SQL允许用户在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集。
所有SQL语句接受集合作为输入,返回集合作为输出。
SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。
SQL不要求用户指定对数据的存放方法。
这种特性使用户更易集中精力于要得到的结果。
所有SQL语句使用查询优化器,它是RDBMS的一部分,由它决定对指定数据存取的最快速度的手段。
查询优化器知道存在什么索引,哪儿使用合适,而用户从不需要知道表是否有索引,表有什么类型的索引。
(2)统一的语言
SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、应用程序员、决策支持系统人员及许多其它类型的终端用户。
基本的SQL命令只需很少时间就能学会,最高级的命令在几天内便可掌握。
以前的数据库管理系统为各类操作提供单独的语言,而SQL将全部任务统一在一种语言中。
(3)是所有关系数据库的公共语言
由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一个。
所有用SQL编写的程序都是可以移植的。
2SQL语法的分类
其实SQL命令并不是非常多,可是要把SQL用到出神入化,却也只需要短短几个命令便够,因为SQL命令是针对关系型数据库所建立出来的语法叙述,所以SQL在这类数据库中所发挥的功能非常的强。
(1)属性词(Predicates)
在SQL命令中用来指明所要选择的记录的方式。
如ALL、TOP与DISTINCT等等。
(2)声明(Declaration)
针对SQLParameter或ParameterQuery的名称与数据类型做声明,如PARAMETERS的声明等。
(3)条件子句(Clause)
在SQL的查询中,利用一些表达式定义出查询的条件,以缩小寻找的范围,如WHERE语句。
(4)运算符(Operator)与操作数(Operation)
在SQL的查询中,与Operation共同组成表达式(Expression),如BETWEEN....AND运算符与INNERJOIN操作数。
(5)函数(Function)
一些SQL常见的函数,像AVG()是求算数平均数的函数。
(6)SQL语句(Statement)
SQL的语句,可以说是SQL语法的主体,用来对某一个特定的数据库发出指示,并返回相关的数据,而SQL的语法结构,基本上可以利用下面的式子来表示:
命令+条件子句
例如:
SELECT*FROMTABWHERETAB.NAME='A'
其中的“FROM....WHERE”便是一个条件子句,其实SQL的语法并不难,只需记住这样的一个规则,相信可以很快的了解SQL用法。
3SQL语句
SELECT语句
SELECT语句用于数据库中选取信息,完整的SELECT语句的格式如下:
SELECT[predicate]{*|table.*|[table.]field[,[table.]field2[,...]]}[ASalias1[,alias2[,...]]]
FROMtableexpression[,...][INexternaldatabase]
[WHERE...]
[GROUPBY...]
[HAVING...]
[ORDERBY...]
[WITHOWNERACCESSOPTION]
SELECT语句包括下面几个部分:
(1)Predicate:
如前面所述,包括了ALL、DISTINCT、DISTINCTROW、与TOP我们可以利用这样的语句去限制查询后所得的结果。
(2)*:
从指定表格中指定所有的字段。
(3)Table:
针对被选择出的记录的字段,所指定表格的名称。
(4)field1,(用中文标点符号)field2:
想要读取数据的字段名称,如果包含了一个以上的字段,会依照列出的顺序来读取数据。
(5)alias1,alias2:
用来替代在表格实际字段名称的化名。
(6)Tableexpression:
表格名称或包含我们所想要的数据的表格。
(7)Externaldatabase:
若使用到不是目前的数据库则将其名字定义在externaldatabase当中。
下面先讨论ALL,DISTINCT,DISTINCTROW,TOP属性词用法:
SELECT[ALL|DISTINCT|DISTINCTROW|[TOPn[PERCENT]]]FROMtable
语句中各参数的涵义如下:
(1)ALL:
若是不指定任何的字段数据,则MicrosoftJet数据库引擎(databaseengine)将会选择所有的字段,并依据所定的条件查询出需求数据集。
例如下面这个例子将会从职员表格中返回所有字段的数据。
【例1】若是要查询出职员表格中的所有记录,可以通过下面的语句来完成:
SELECTALL*FROM职员表格;
(2)DISTINCT:
对某个表格所选择的字段数据,略过重复的情况,也就是说,针对某个字段查询出来的记录结果是唯一的。
例如有许多存放在职员表格的职员数据,也许会具有相同的姓名,所以若是用SQL语句中的SELECTDISTINCT,则查询出来的结果将会针对不一样的姓名加以筛选。
若是您把DISTINCT加以省略,则这样的查询会显示所有的记录。
(3)DISTINCTROW:
将整条记录重复的记录忽略掉,而不是只有针对某一个字段的数据。
(4)Table:
指定查询记录所需要的表格。
【例2】
SELECTDISTINCTROW公司名称
FROM顾客表格INNERJOIN订单表格
ON顾客表格.顾客ID=订单表格.顾客ID
ORDERBY公司名称;
如果您忽略,DISTINCTROW则会对每个公司产生一行以下的订单数据。
此外,若是DISTINCTROW只有用在一个表格当中,则会被省略掉。
(5)TOP:
从第一条或最后一条开始(利用ORDERBY条件子句),返回特定条数的数据。
【例3】当想要知道在2000年,班上前25名的学生姓名数据时,您可以输入这样的语句:
SELECTTOP25学生姓名
FORM学生表格
WHERE毕业年份=1994
ORDERBY毕业成绩平均分数DESC;
如果没有加上ORDERBY这行条件的话,所得到的数据,将会随机的数据。
此外,在TOP语句之后,除了可以加上数字以外,还可以利用保留字PERCENT来查询。
【例4】利用保留字PERCENT来查询:
SELECTTOP10PERCENT学生姓名
FROM学生表格
WHERE毕业年份=1994
ORDERBY毕业成绩平均DESC;
PARAMETERS(参数)声明
对于参数型的查询语法中,对参数的名称以及数据类型需要做声明,PARAMETERS(参数)声明的作用正在于此。
具体格式如下:
PARAMETERSnamedatatype[,namedatatype[,...]]
name:
PARAMETERS的名称。
您可以把参数名称当作字符串来使用,若是名称中包含了空字符串,可以利用中括号来处理,例如:
“VBeden”。
datatype:
输入参数的数据类型。
【例5】若是在查询时,需要机动的输入姓名,可以利用下列的方式完成:
PARAMETERS“输入姓名”Text;
SELECT*
FROM职员表格
WHERE姓名=“输入姓名:
”;
ORDERBY条件语句
ORDERBY条件子句,通常与SELECT语句合并使用目的是将查询的结果,依照指定字段加以排序。
SELECTfieldlist
FROMtable
WHEREselectcriteria
ORDERBYfield[ASC|DESC][,field2[ASC|DESC][,...]]
fieldlist:
欲查询的字段名称。
其中可以与ALL,DISTINCT,DISINCTROW,或TOP一起来使用。
table:
欲查询的表格名称。
selectcriteria:
查询的标准设置。
field1:
指定要依照那个字段作为排序的依据,若是你没有加上ORDERBY查询出的数据集将不会作排序的操作。
ASC:
递增顺序类别。
(默认值)
DESC:
递减顺序类别。
【例6】若要将输出数据依据出生的先后次序排列,可以利用下面的命令:
SELECT姓名,生日
FROM职员表格
ORDERBY生日
IN条件子句
IN条件子句指定被查询的一个外部数据库的表格。
(必须是MicrosoftJet数据库引擎所可以连接的数据库,如dBase,Paradox等等)
SELECT|INSERT]INTOdestinationIN
{path|["path""type"]|[""[type;DATABASE=path]]}
FROMtableexpressionIN
{path|["path""type"]|[""[type;DATABASE=path]]}
destination:
欲插入数据的外部表格名称。
tableexpression:
表格名称或是被读取数据的表格名称。
这个参数可以是一个单一的表格名称,或是一段已经被存储的SQL查询等。
path:
包含该表格的完整路径名称。
type:
数据库的类型名称,通常是当数据库部属于Jetdatabase时才会使用。
(例如:
dBASEIII,dBASEIV,Paradox3.x,Paradox4.x,或Btrieve)
【例7】下面这两段的意义相同:
PartA....FROMTable
IN""[dBASEIV;DATABASE=C:
\DBASE\DATA\SALES;];
PartB....FROMTable
IN"C:
\DBASE\DATA\SALES""dBASEIV;"
HAVING条件子句
HAVING条件子句指定一特定的分组记录,并满足HAVING所指定的条件或状态,但条件是针对分组的条件设置,格式如下:
SELECTfieldlist
FROMtable
WHEREselectcriteria
GROUPBYgroupfieldlist
HAVINGgroupcriteria
fieldlist:
显示被查询的字段名称。
(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合)
table:
欲查询数据的表格名称。
selectcriteria:
选取标准。
groupfieldlist:
分组记录的字段名称,到多10个字段。
而这些字段的顺序决定最高到最低的分组阶层。
groupcriteria:
决定什么样的分组记录要被显示。
HAVING跟WHERE的用法相当类似,不同之处在于HAVING必须用于GROUP之后的分组数据上。
【例8】HAVING条件子句用法:
SELECT分类编,Sum(库存数量)
FROM产品表格
GROUPBY分类编号
HAVINGSum(库存数量)>100AND产品名称LIKE"*纸";
GROUPBY条件子句
GROUPBY条件子句依据指定的字段,将具有相同数值的记录合并成一条,格式如下:
SELECTfieldlist
FROMtable
WHEREcriteria
GROUPBYgroupfieldlist
fieldlist:
读取的字段名称。
(可与ALL,DISTINCT,DISTINCTROW,或TOP合并使用)
table:
查询的表格名称。
groupfieldlist:
组记录的字段名称,到多10个字段,而这些字段的顺序决定最高到最低的分组层次。
【例9】GROUPBY条件子句用例:
SELECT姓名,Count(姓名)AS职员姓名
FROM职员表格
WHERE部门名称='业务部'
GROUPBY姓名
FROM条件子句
FROM条件子句指定表格名称或是查询,其中包含列在SELECT语句的字段数据,格式如下:
SELECTfieldlist
FROMtableexpression[INexternaldatabase]
fieldlist:
表格中的字段名称。
(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合)
tableexpression:
表格名称,或多个表格的算式。
externaldatabase:
若该表格参考到外部的数据库时,将其完整的路径名称记下。
【例10】从职员表格下,查询出所有姓名字段的数据(只有姓名字段被查询,其他则不显示)。
SELECT姓名FROM职员表格;
WHERE条件子句
WHERE条件子句指定查询的条件与限制,格式如下:
SELECTfieldlist
FROMtableexpression
WHEREcriteria
fieldlist:
字段名称。
(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合)
tableexpression:
表格名称,或多个表格的算式。
criteria:
查询的结果,必须依照这一限制标准。
【例11】要查询出职员表格中,所有姓氏是李的数据,可以用下面的语句:
SELECT姓名
FROM职员表格
WHERE姓氏='李';
BETWEEN...AND运算符
BETWEEN...AND运算符决定某一人数值是否介于特定的范围之内,此运算符只可以用在SQL的语句中,格式如下:
expr[Not]BETWEENvalue1ANDvalue2
expr:
指定要加以计算的字段与表达式的组合。
value1,value2:
所指明的数值范围。
【例12】若是要从职员表格查询出所有年龄介于25-30岁的员工,可以利用下面的程序来做:
SELECT姓名,年龄BETWEEN25AND30
FROM职员表格;
LIKE操作数
用来将一字符串与另一特定字符串样式(pattern)比较,并将符合该字符串样式的记录过滤出来,格式如下:
expressionLIKE"pattern"
expression:
使用在WHERE条件子句,SQL表达式。
pattern:
用以比较的字符串样式。
【例13】若是你要查询出所有以“李”为首的姓氏,可以利用下面的式子。
Like"李*"
LIKE操作数的多种范例:
(1)多个字符:
(a)"a*a",可筛选:
"aa","aBa","aBBBa",不能筛选:
"aBC"
(b)"*ab*",可筛选:
"abc","AABB","Xab",不能筛选:
"aZb","bac"
(2)特殊字符:
"a“*”a",可筛选:
"a*a",不能筛选:
"aaa"
(3)单一字符:
"a?
a",可筛选:
"aaa","a3a","aBa",不能筛选:
"aBBBa"
(4)单一数字:
"a#a",可筛选:
"a0a","a1a","a2a",不能筛选:
"aaa","a10a"
(5)字符范围:
"“a-z”",可筛选:
"f","p","j",不能筛选:
"2","&"
(6)指定字符以外部范围:
"“!
a-z”"
(7)指定非数字:
"“!
0-9”"可筛选:
"A","a","&","~",不能筛选:
"0","1","9"
(8)组合式结构:
"a“!
b-m”#",可筛选:
"An9","az0","a99",不能筛选:
"abc","aj0"
SQL数字函数
(1)AVG:
算数平均数,格式如下:
AVG(expr)
expr:
字段名称或表达式。
【例14】若要计算职员身高超过165厘米的职员平均身高,可以利用下面的SQL语句来完成:
SELECTAvg(身高)
AS平均身高
FROM职员表格WHERE身高>165;
(2)COUNT:
计算记录条数,格式如下:
COUNT(expr)
expr:
字段名称或表达式。
【例15】若是要统计出业务部门的职员人数,并查询出职员的姓名,可以利用下面的程序:
SELECTCount(姓名)AS职员姓名
FROM职员表格
WHERE部门名称='业务部';
(3)FIRST与LAST:
返回某字段的第一条数据与最后一条数据,格式如下:
FIRST(expr)
LAST(expr)
expr:
字段名称或表达式。
【例16】若是要找出货品数量字段的第一条数据与货品价格字段的最后一条数据时,可以利用下面的查询方式:
SELECTFIRST(货品数量),LAST(货品价格)
FROM订单表格
(4)MAX,与MIN:
返回某字段的最大值与最小值,用法同FIRST与LAST。
(5)SUM:
返回某特定字段或是运算的总和数值,格式如下:
SUM(expr)
expr:
字段名称或表达式。
【例17】要计算出货品总价,可使用下面的程序。
SELECT
Sum(单位价格*货品数量)
AS货品总价FROM订单表格
多层SQL查询
顾名思义,多层的SQL查询的便在于:
“在一个SQL语句中可以包含另一个SQL查询语句,形成内部嵌套的查询类型。
”
comparison[ANY|ALL|SOME](sqlstatement)
expression[NOT]IN(sqlstatement)
[NOT]EXISTS(sqlstatement)
comparison:
将表达式与内层查询的结果比较的操作。
expression:
对内层查询的结果作搜索的表达式。
sqlstatement:
为SELECT语句构成的SQL查询,必须用()将该语句括起来。
【例18】我们先从订单表格当中,查询出所有的单位,再将产品表格中的单位与的一一对比,查询出所有高于订单表格的单位价格的记录。
SELECT*FROM产品表格
WHERE单位价格>ANY(SELECT单位价格FROM订单表格WHERE折扣>=.25);
4SQL与数据库的维护
表格的建立
将SQL中的基本语法作了一番介绍以后,但大多是偏向于数据库数据的查询与过滤,但实际上,我们通过SQL命令所可以做的事还有很多,接下来要介绍的便是如何利用SQL的语法命令来建立一个数据库中的表格。
CREATETABLE语句
我们可以利用这个命令,来建立一个全新的表格,但前提则是:
数据库必须已经存在。
CREATETABLEtable
(field1type[(size)][index1][,field2type[(size)][index2][,...]][,multifieldindex[,...]])
table:
欲建立的新的表格名称。
field1,field2:
在新表格中的新的字段名称,到少要一个字段以上。
type:
字段的数据类型。
Size:
字段的大小。
index1,index2:
利用CONSTRAINT条件子句定义一个单一字段的索引名称。
multifieldindex:
利用CONSTRAINT条件子句定义一个多重字段的索引名称。
使用CREATETABLE语句来定义新表及它的字段以及字段条件。
如果将一字段指定为NOTNULL,则新记录的该字段值必须是有效的数据。
CONSTRAINT子句在字段上可创建不同的限制,并可用来建立主键。
可以使用CREATEINDEX语句在当前表上建立一个主键或附加索引。
可以在单一字段上使用NOTNULL,或在用于单一字段或多重字段(名为CONSTRAINT)的CONSTRAINT子句中使用NOTNULL。
但是,一个字段只能使用一次NOTNULL限制。
尝试多次应用此限制将导致运行错误。
建立TEMPORARY表时,只能在建表的会话期间看见它。
会话期终止时它就被自动删除。
Temporary表能被不止一个用户访问。
WITHCOMPRESSION属性只能和CHARACTER及MEMO(也被称作TEXT)数据类型和它们的同义字一起使用。
WITHCOMPRESSION属性被加入CHARACTER列是因为单码字符表示格式的变化。
Unicode字符一律需要两个字节。
对于现有的主要包含字符数据的MicrosoftJet数据库,这可能意味着数据库文件被转换成MicrosoftJet4.0格式时字长会增加将近一倍。
然而,从前由单字节字符群(SBCS)指示的众多字符群的Unicode表示可以很容易地被压缩成一个单字节。
如果你用这一属性定义一个CHARACTER列,数据被储存时会自动压缩,从列中恢复时会自动解压缩。
MEMO列也能被定义用来把数据存储成压缩格式。
然而有个局限。
只有在压缩时能达到最多4096字节的事例才可被压缩。
所有其他事例则不会被压缩。
这就是说,在一个给定的表中,一个给定的MEMO列中有的数据会被压缩,有的则不会。
【例19】建立一个拥有职员姓名与部门字段的表格。
CREATETABLE职员表格
(姓名TEST,部门TEST,职员编号INTEGERCONSTRAINT职员字段索引PRIMARYKEY)
在这一个范例中,我们建立了一个表格名称为“职员表格”的表格,并且定义了该表格的主键值,以限制数据不能重复输入。
表格索引的建立
CREATEINDEX语句主要是对一个已存在的表格建立索引,其用法如下:
CREATE[UNIQUE]INDEXindexONtable(field[ASC|DESC][,field[ASC|DESC],...])
[WITH{PRIMARY|DISALLOWNULL|IGNORENULL}]
i