计算机等级考试三级数据库:全面接触SQL语法

SQL功能与特性 
  其实,在前面的文章中,已经提及SQL命令的一些基本功能,然而,通过SQL命令,程序设计师或数据库管理员(DBA)可以: 
(一)建立数据库的表格。(包括设置表格所可以使用之空间)

 


(二)改变数据库系统环境设置。 
(三)针对某个数据库或表格,授予用户存取权限。 
(四)对数据库表格建立索引值。 
(五)修改数据库表格结构。(新建、删除或是修改表格字段) 
(六)对数据库进行数据的新建。 
(七)对数据库进行数据的删除。 
(八)对数据库进行数据的修改。 
(九)对数据库进行数据的查询。 
这几项便是通过SQL命令可以完成的事情,看起来是不是比起“查询”两个字所代表的功能要多的多了呢? 
SQL语法的分类 
其实SQL命令并不是非常多,可是要把SQL用到出神入化,却也只需要短短几个命令便够,因为SQL命令是针对关系型数据库所建立出来的语法叙述,所以SQL在这类数据库中所发挥的功能非常的强,以下将针对在VB中常用的SQL语法基本命令加以分类介绍。在说明SQL的命令以及使用语法之前,以下将SQL做了的分类,在致上SQL语法所使用到的类型,可以说都已包含在这些类别当中。 
第一类、属性词(Predicates) 
在SQL命令中用来指明所要选择的记录的方式。如ALL、TOP与DISTINCT等等。 
第二类、声明(Declaration) 
针对SQL Parameter或Parameter Query 的名称与数据类型做声明,如PARAMETERS的声明等等。 
第三类、条件子句(Clause) 
在SQL的查询中,利用一些表达式定义出查询的条件,以缩小寻找的范围,如WHERE。
第四类、运算符(Operator)与操作数(Operation) 
在SQL的查询中,与Operation共同组成表达式(Expression),如BETWEEN....AND 运算符与INNER JOIN操作数。

  第五类、函数(Function) 
一些SQL常见的函数,像是AVG()是求算数平均数的函数。 
第六类、SQL语句(Statement) 
SQL的语句,可以说是SQL语法的主体,用来对某一个特定的数据库发出指示,并返回相关的数据,而SQL的语法结构,基本上可以利用下面的式子来表示:命令+条件子句 
例如: 
SELECT*FROM TAB WHERE TAB.NAME=’A’ 
其中的“FROM....WHERE”便是一个条件子句,其实SQL的语法并不难,您只需记住这样的一个规则,相信可以很快的了解SQL用法。

 SQL语法与命令 

SELECT 语句 
SELECT[predicate]{*|table.*|[table.]field [,[table.]field2[,...]]} [AS alias1 [,alias2[,...]]] 
FROM tableexpression [,...][IN externaldatabase] 
[WHERE...] 
[GROUP BY...] 
[HAVING...] 
[ORDER BY...] 
[WITH OWNERACCESS OPTION] 
SELECT 语句包括下面几个部分 
predicate 
如前面所述,包括了ALL,DISTINCT,DISTINCTROW,与TOP 我们可以利用这样的语句去限制查询后所得的结果。

 


* 
从指定表格中指定所有的字段。 
table 
针对被选择出的记录的字段,所指定表格的名称。 
field1,field2 
想要读取数据的字段名称,如果包含了一个以上的字段,会依照列出的顺序来读取数据。 
alias1,alias2 
用来替代在表格实际字段名称的化名。 
tableexpression 
表格名称或包含我们所想要的数据的表格。 
externaldatabase 
若使用到不是目前的数据库则将其名字定义在externaldatabase当中。 
 
ALL,DISTINCT,DISTINCTROW,TOP属性词用法 
SELECT [ALL|DISTINCT|DISTINCTROW|[TOP n[PERCENT]]] FROM table 
ALL 
若是您不指定任何的字段数据,则Microsoft Jet数据库引擎(database engine)将会选择所有的字段,并依据所定的条件查询出需求数据集。例如下面这两个例子将会具有相同的效果,都会从职员表格中返回所有字段的数据。 
例如: 
若是我们要查询出职员表格中的所有记录,可以通过下面的语句来完成。
SELECT ALL* FROM 职员表格; DISTINCT 
 
对某个表格所选择的字段数据,略过重复的情况,也就是说,针对某个字段查询出来的记录结果是唯一的。例如有许多存放在职员表格的职员 
数据,也许会具有相同的姓名,所以若是我们用SQL语句中的SELECT DISTINCT,则查询出来的结将会针对不一样的姓名加以筛选。若是您把 
DISTINCT 加以省略,则这样的查询会显示所有的记录。 
DISTINCTROW 
将整条记录重复的记录忽略掉,而不是只有针对某一个字段的数据。 
table 
指定查询记录所需要的表格。 
例如: 
SELECT DISTINCTROW 公司名称 
FROM 顾客表格 INNER JOIN 订单表格 
ON 顾客表格.顾客ID=订单表格.顾客ID 
ORDER BY 公司名称; 
如果您忽略 DISTINCTROW 则会对每个公司产生一行以下的订单数据。此外,若是DISTINCTROW只有用在一个表格当中,则会被省略掉。 
TOP 
从第一条或最后一条开始(利用ORDER BY条件子句),返回特定条数的数据。 
例如: 
当您想要知道在2000年,班上前25名的学生姓名数据时,您可以输入这样的语句: 
SELECT TOP 25 学生姓名 
FORM 学生表格 
WHERE 毕业年份=1994 
ORDER BY 毕业成绩平均分数 DESC;

如果您没有加上ORDER BY 这行条件的话,您所得到的数据,将会随机的数据。此外,在TOP语句之后,除了可以加上数字以外,还可以利用保留 
字PERCENT来查询。 
例如: 
SELECT TOP 10 PERCENT学生姓名 
FROM学生表格 
WHERE毕业年份=1994 
ORDER BY毕业成绩平均DESC;   
PARAMETERS(参数)声明的用法 
对于参数型的查询语法中,对参数的名称以及数据类型作 声明的操作。 
PARAMETERS name datatype[,name datatype[,...]] 
name 
PARAMETERS的名称。您可以把参数名称当作字符串来使用,若是名称中包含了空字符串,可以利用中括号来处理,例如:“VBeden”。 
datatype 
输入参数的数据类型。 
例如: 
若是您在查询时,需要机动的输入姓名 ,可以利用下列的方式完成: 
PARAMETERS “输入姓名” Text; 
SELECT* 
FROM 职员表格 
WHERE姓名=“输入姓名:”; 
ORDER BY条件语句
此条件子句,通常与SELECT语句合并使用目的是将查询的结果,依照指定字段加以排序。
SELECT fieldlist
FROM table
WHERE selectcriteria
ORDER BY field[ASC|DESC][,field2[ASC|DESC][,...]] 
fieldlist
欲查询的字段名称。其中可以与ALL,DISTINCT,DISINCTROW,或TOP一起来使用。
table
欲查询的表格名称。 
selectcriteria
查询的标准设置。 
field1
指定要依照那个字段作为排序的依据,若是你没有加上ORDER BY查询出的数据集将不会作排序的操作。
ASC
递增顺序类别。(默认值) 
DESC
递减顺序类别。
例如:
或是我们要将输出数据依据出生的先后次序排列,可以利用下面的命令。
SELECT 姓名,生日
FROM 职员表格
ORDER BY 生日
SELECT LastName,FirstName
FROM Employees
ORDER BY LastName ASC; 

IN 条件子句
  指定要速胜哪一个外部数据库的表格。(必须是Microsoft Jet数据库引擎所可以连接的数据库,如dBase,Paradox等等)

SELECT|INSERT]INTO destination IN
{path|["path" "type"]|[""[type;DATABASE=path]]}
FROM tableexpression IN
{path|["path" "type"]|[""[type;DATABASE=path]]} 
destination
欲插入数据的外部表格名称。 
tableexpression
表格名称或是被读取数据的表格名称。这个参数可以是一个单一的表格名称,或是一段已经被存储的SQL查询等。 
path
包含该表格的完整路径名称。 
type
数据库的类型名称, 通常是当数据库部属于Jet database时才会使用。(例如:dBASE III,dBASE IV,Paradox 3.x,Paradox 4.x,或 Btrieve)

HAVING 条件子句
指定一特定的分组记录,并满足HAVING 所指定的条件或状态,但条件是针对分组的条件设置。
SELECT fieldlist
FROM table
WHERE selectcriteria
GROUP BY groupfieldlist
HAVING groupcriteria 
fieldlist
显示被查询的字段名称。(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合) 
table
欲查询数据的表格名称。 
selectcriteria
选取标准。 
groupfieldlist
分组记录的字段名称,到多10个字段。而这些字段的顺序决定最高到最低的分组阶层。 
groupcriteria
决定什么样的分组记录要被显示。 
HAVING跟WHERE 的用法相当类似,不同之处在于HAVING必须用于GROUP之后的分组数据上。
例如:
SELECT 分类编,Sum(库存数量)
FROM 产品表格
GROUP BY 分类编号
HAVING Sum(库存数量)>100 AND 产品名称 LIKE "*纸";

  GROUP BY 条件子句
  依据指定的字段,将具有相同数值的记录合并成一条。
SELECT fieldlist
FROM table
WHERE criteria
GROUP BY groupfieldlist 
fieldlist
欲读取的字段名称。(可与ALL,DISTINCT,DISTINCTROW,或TOP合并使用) 
table
被查询的表格名称。 
groupfieldlist
分组记录的字段名称,到多10个字段,而这些字段的顺序决定最高到最低的分组层次。
例如:
SELECT 姓名,Count(姓名)AS 职员姓名
FROM 职员表格
WHERE 部门名称='业务部'
GROUP BY 姓名 
 
FROM 条件子句
  指定表格名称或是查询,其中包含列在SELECT语句的字段数据。
SELECT fieldlist
FROM tableexpression[IN externaldatabase] 
fieldlist
表格中的字段名称。(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合) 
tableexpression
表格名称,或多个表格的算式。 
externaldatabase
若该表格参考到外部的数据库时,将其完整的路径名称记下。
例如:
从职员表格下,查询出所有姓名字段的数据(只有姓名字段被查询,其他则不显示)。
SELECT 姓名 FROM 职员表格; 

WHERE 条件子句
指定查询的条件与限制。
SELECT fieldlist
FROM tableexpression
WHERE criteria 
fieldlist
字段名称。(可与ALL,DISTINCT,DISTINCTROW,或TOP相结合) 
tableexpression
表格名称,或多个表格的算式。 
criteria
查询的结果,必须依照这一限制标准。
例如:
要查询出职员表格中,所有姓氏是李的数据,可以用下面的语句。
SELECT 姓名
FROM 职员表格
WHERE 姓氏='李';

BETWEEN...AND 运算符
决定某一人数值是否介于特定的范围之内,此运算符只可以用在SQL的语句中。
expr[Not]BETWEEN value1 AND value2 
expr
指定要加以计算的字段与表达式的组合。 
value1,value2
所指明的数值范围。
例如:
若是要从职员表格查询出所有年龄介于25-30岁的员工,可以利用下面的程序来做。
SELECT 姓名,年龄 BETWEEN 25 AND 30
FROM 职员表格; 

LIKE 操作数
用来将一字符串与另一特定字符串样式(pattern)比较,并将符合该字符串样式的记录过滤出来。
expression LIKE "pattern" 
expression
使用在WHERE条件子句,SQL表达式。 
pattern
用以比较的字符串样式。
例如:
若是你要查询出所有以“李”为首的姓氏,可以利用下面的式子。
Like "李*" 

LIKE操作数的多种范例: 
1、多个字符: 
(1)"a*a"
可筛选:"aa","aBa","aBBBa",不能筛选:"aBC"
(2)"*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
字段名称或表达式。

例如:
若要计算职员身高超过165厘米的职员平均身高,可以利用下面的SQL语句来完成。
SELECT Avg(身高)
AS 平均身高
FROM 职员表格 WHERE 身高>165; 
2、COUNT:计算记录条数
COUNT(expr) 
expr

字段名称或表达式。
例如:
若是要统计出业务部门的职员人数,并查询出职员的姓名,可以利用下面的程序。
SELECT Count(姓名) AS 职员姓名
FROM 职员表格
WHERE 部门名称='业务部'; 
3、FIRST与LAST:返回某字段的第一条数据与最后一条数据。
FIRST(expr)

LAST(expr) 
expr
字段名称或表达式。

  例如:
若是要找出货品数量字段的第一条数据与货品价格字段的最后一条数据时,可以利用下面的查询方式。
SELECT FIRST(货品数量),LAST(货品价格)

FROM 订单表格 
4、MAX,与MIN:返回某字段的最大值与最小值。
用法同FIRST与LAST。 
5、SUM:返回某特定字段或是运算的总和数值。
SUM(expr) 
expr
字段名称或表达式。

例如:
要计算出货品总价,可使用下面的程序。

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查询,必须用()将该语句括起来。

例如:
我们先从订单表格当中,查询出所有的单位,再将产品表格中的单位与的一一对比,查询出所有高于订单表格的单位价格的记录。
SELECT * FROM 产品表格
WHERE 单位价格>ANY (SELECT 单位价格 FROM 订单表格 WHERE 折扣>=.25);

SQL与数据库的维护
表格的建立
  将SQL中的基本语法作了一番介绍以后,但大多是偏向于数据库数据的查询与过滤,但实际上,我们通过SQL命令所可以做的事还有很多,接下来要介绍的便是如何利用SQL的语法命令来建立一个数据库中的表格。 
CREATE TABLE语句
我们可以利用这个命令,来建立一个全新的表格,但前提则是:数据库必须已经存在。
CREATE TABLE table(field1 type[(size)][index1][,field2 type[(size)][index2][,...]][,nultifieldindex[,...]]) 
table
欲建立的新的表格名称。 
field1,field2
在新表格中的新的字段名称,到少要一个字段以上。 
type
字段的数据类型。 
size
字段的大小。 
index1,index2
利用CONSTRAINT条件子句定义一个单一字段的索引名称。 
multifieldindex
利用CONSTRAINT条件子句定义一个多重字段的索引名称。

例如:
建立一个拥有职员姓名与部门字段的表格。
CREATE TABLE 职员表格 (姓名TEST,部门TEST,职员编号 INTEGER CONSTRAINT职员字段索引PRIMARY KEY)
在这一个范例中,我们建立了一个表格名称为“职员表格”的表格,并且定义了该表格的主键值,以限制数据不能重复输入。

  表格索引的建立 
CREATE INDEX语句
这个命令主要是对一个已存在的表格建立索引,其用法如下:
CREATE[UNIQUE]INDEX index ON table(field[ASC|DESC][,field[ASC|DESC],...])
[WITH {PRIMARY|DISALLOWNULL|IGNORENULL}] 
index

欲被建立的索引名称。 
table
欲建立索引的表格名称。 
field
欲被建立的索引的字段名称。并可通过DESC保留字,来决定索引的顺序。
例如:
在职员表格中建立一个索引。
CREATE INDEX 新索引名称
ON 职员表格(姓名部门);

表格的字段更新 
CONSTRAINT条件子句
CONSTRAINT 的功能是类似索引(INDEX)的,虽然CONSTRAINT 也可以建立表格之间的关联性。 
单一字段索引:
CONSTRAINT name{PRIMARY KEY|UNIQUE|REFERENCES foreigntable[(foreignfield1,foreignfield2)]} 
多字段索引:
CONSTRAINT name
{PRIMARY KEY(primary1[,primary2[,...]])
|UNIQUE(unique1[,unique2[,...]])
|FOREIGN KEY (ref1[,ref2[,...]])
|REFERENCES foreigntable[(foreignfield1[,foreignfield2[,...]])]} 
name
要被建立的CONSTRAINT名称。 
primary1,primary2
被用来设计成主键值的字段名称(可一个以上)。 
unique1,unique2
被用来设计成唯一键值的字段名称(可一个以上)。 
foreign key
字段名称,或是参考到别的表格中字段的字段名称。 
foreigntable
如前所述,被参考到的表格。 
foreignfield1,foreignfield2
在参考到的表格当中,被ref1,ref2字段所指定的字段。如果被参考的字段是参考表格中的主键值,你也可以省略这个条件子句。
例如:
当我们要建立一个新的职员数据表格,表格包含姓名、部门名称与生日三个字段,且由这三个字段建立一个唯一的索引时,可以使用下面这段SQL的语句。
CREATE TABLE 职员数据表格
(姓名 TEST,部门名称 TEST,生日 DATETIME,CONSTRAINT 职员数据表格限制 UNIQUE(姓名,部门名称,生日));
以上是SQL中,与数据库表格建立相关的命令,你可以利用这些命令,通过SQL的语句,将数据库表格完整的建立出来,接下来的章节,将针对数据库建立之后的维护与增删所要使用的SQL语句作一介绍。