VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - SQL 比较完整的语句及语法。
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:17721, 日期:2002-03-07
一、 SELECT 语句
?????完整语法格式:

SELECT [predicate] { * | table.* | [table.]field1 [As Alias1][,[table.]field2 [As alias2][,…]] }??
FROM tableexpression [,…][IN extenaldatabase]
[WHERE]
[GROUP BY …]
[HAVING …]
[ORDER BY …]

predicate 为下列限定词之一: ALL、DISTINCT、TOP n [PERCENT]。不选为ALL。
ALL 规定无论是不是副本值,返回所有的行,即所有满足条件的记录;
DISTINCT 只返回无副本的行,即多个相同的记录只返回一个,忽略那些在 Select 指定的字段上具有相同值的记录。
TOP 指定返回最前面的记录。如 TOP 5 返回前五个记录。TOP 5 PERCENT 返回前 5%的记录。使用 ORDER BY fieldname DESC 则可得到倒数 n 名的记录。

*??????????????????从特定的表中返回所有的行。
Table??????????????数据表名,这个表中包含了已被选择的记录的字段。
Field1,field2??????字段名,指定要获取的列。
Alias1,alias2??????别名,用来做列标题,代替原来的名字。
Tableexpression????被操作的表的名称。
Externaldatabase???数据库名,该数据库包含有tableexpression 中的表,但是该数据库不是当前的数据库。

SELECT 最短语法是:select fields from table。
如 select * from authors, 将authors 表中的数据全部选出。(使用Biblio.mdb)
(注:此处所有例子所用的数据库是VB 自带的 Biblio.mdb 和 Nwind.mdb。)

WHERE 子句限定所要返回记录的条件,决定哪些记录该返回。
WHERE 使用的格式如下:
????WHERE Expression1 and | or Expression2 …
SQL 语句提供基本的关系运算符:<、<=、=、>=、> 和<>。
SQL 增加了一组运算符,用于处理文本数据类型的字段:LIKE、IN、IS NULL 和 IS NOT NULL。 此外,SQL 还提供了 BETWEEN语句用于数值或日期字段类型。语法为:field (NOT) BETWEEN value1 AND value2。
&#61548; 谓词 IS NULL 和 IS NOT NULL 检验一个值是否进入了一个字段,如果该字段已经包含了一个空串””,或者 为0,则 IS NULL 返回的是 false,IS NOT NULL返回的是true。

&#61548; LIKE谓词用于查找字符串,使用时,取”?” (ADODC不可用)代表任意单个字符,
”*” (ADODC用”%”)代表任意字符串。其具体形式如下:
包含字符am的任何文本??????????LIKE “*am*”
以字符am开头的任何文本????????LIKE “am*”
包字符am结尾的任何文本????????LIKE “*am”
取字符am和单个任意后綴字符????LIKE “am?”
取字符am和单个任意前綴字符????LIKE “?am”

&#61548; 对日期类型的数据,要求在日期值的两边加上数字标志”#”,如 DataField BETWEEN #1-1-1997# and #12-31- 1997#。

&#61548; IN 谓词用于进行集合运算,它的格式如下:
(NOT) IN (data1,data2,data3,…)
如果要从Employee 表中选出职业为”Salesman”和”Manager”的职工,可以使用如下语句(使用 Nwind.mdb):
SELECT * FROM employees WHERE title IN (’Sales Representative’,’Sales Manager’)

ORDER BY 子句的作用是按照递增或递减的顺序在指定字段中对查询的结果记录进行排序。排序字段不能是memo字段或 binary字段。语法如下:

ORDER BY field1 [ASC|DESC] [,field2 [ASC|DESC][,…]]
ASC 指定为递增排序,DESC 指定为递减排序。
ORDER BY 后面若有若干个字段,则首先用 ORDER BY 之后列举的第一个字段对记录排序,然后对此字段中等值的记 录用第二个字段列举的值进行排序,依此类推。
以下示例用 Au_ID 进行排序:
SELECT Author FROM Authors ORDER BY Au_ID DESC

GROUP BY 子句将查询出的记录分组,分组的目的是为了统计,每一组返回一个总计信息。HAVING 子句指定选择满 足条件的分组。分组字段不能是memo字段或binary字段。SQL 提供的统计函数有:
AVG:求平均值;
COUNT:查询行数;
MAX:最大值;
MIN:最小值;
SUM:求和。

下例使用NWIND.mdb:
SELECT ProductID, SUM(UnitPrice)
FROM Products GROUP BY ProductID
HAVING SUM(UnitPrice) > 100

按年、月汇总订单数量:
select datepart("yyyy",orderdate) as year, datepart("m",orderdate) as month, sum(quantity) as TotalQty from orders,[order details] where orders.orderid = [order details].orderid group by datepart("yyyy",orderdate) ,datepart("m",orderdate)

如果查询中使用多个表,则必须用一个WHERE table1.field = table2.field 子句来建立表之间的连接,如果省略建立连接的 语句,查询将返回两个表的笛卡儿积。

下例使用 Biblio.mdb:
SELECT Publishers.Name,Titles.ISBN,Titles.Title
FROM Publishers,Titles
WHERE publishers.pubid = titles.pubid

??在一个 SELECT 语句中的 WHERE 子句中,如果又出现了另一个 SELECT 语句。这种查询被称为子查询,亦被称为嵌 套查询。
这种查询的子查询定义了一个 SELECT 查询结果集,以限制外查询操作上记录集的大小。典型的语法有两种格式。
格式1:
SELECT field_list
???FROM table_list
???WHERE field_name (NOT) IN
??????(SELECT field_name
??????????FROM table_name
????????????WHERE search_criteria)

格式2:
SELECT field_list
???FROM table_list
?????WHERE field_name {<|<=|=|=>|>} {ANY|SOME|ALL}
???????(SELECT field_name
??????????FROM table_name
????????????WHERE search_criteria)

下面例子使用NWIND.mdb。返回Products表中的产品记录,这些产品的单元价格大于Order Details表中折扣大于5%的任何单 元价格:
SELECT ProductID,productname,categoryid
???FROM products
???WHERE unitprice > any
???(SELECT unitprice
???????FROM [order details] where discount > 0.05)


联合查询
联合查询可以把两个独立的查询结果集结合起来,联合查询的一般语法为:
SELECT field_list1 FROM table_list1
{UNION|INTERSECT|MINUS}
SELECT field_list2 FROM table_list2

UNION为并操作,有相同的行只取其中的一行;
INTERSECT为交操作,有相同的行两行都显示;
MINUS为差操作,有相同的行两行都不显示。

下面的例子使用NWIND.mdb。返回巴西顾客和供应商的记录:
select companyname,city,supplierid as id
????from suppliers where country = ”Brazil”
UNION
Select companyname,city,customerid as id
????From customers where country = ”Brazil”
Order by city

内连接(Inner Join)
语法格式:
SELECT fieldlist FROM table1 INNER JOIN table2 ON table1.field1 <关系运算符> table2.field2

功能:
合并两个表中满足条件的记录。

说明:
可以利用逻辑运算符来连接多个ON条件。即可以使用如下的格式:
ON??关系表达式1 AND ON 关系表达式2??OR ON 关系表达式3

例子:(NWIND.mdb)
select customers.companyname, orders.orderid, orders.orderdate from orders INNER JOIN customers on orders.customerid = customers.customerid

外连接(Outer Join)
语法格式:
Select fieldlist from table1 { LEFT | RIGHT } JOIN table2
ON table1.field1 <关系表达式> table2.field2

功能:
合并两个表中的记录。其中源表中的记录即使在联接表中没有匹配的记录,也会产生一个新记录,该新记录只有来自源表 中的字段有内容,而来自联接表中的字段内容为空。

说明:
使用关键字 LEFT 或 RIGHT 指定一个源表。当使用 LEFT 时,FROM 后指定的表为源表,当使用 RIGHT 时,JOIN 后指定的表为源表。

例子:(NWIND.mdb)
select customers.companyname, orders.orderid, orders.orderdate from orders LEFT JOIN customers on orders.customerid = customers.customerid




二、 Select … into 语句
语法格式:
SELECT field1[, field2[, …]] INTO newtable [IN externaldatabase] FROM source
功能:
从源表复制一个新表。可以复制源表的全部字段,也可以复制部分字段。
说明:
1. field1[, field2[, …]]指定要复制源表的字段。如果复制全部字段,则可以用*号表示。
2. newtable指定新表的名字。
3.
4. source指定当前数据库中要复制的源表。该参数可以是一个或多个表名或查询名。
5. 新表只继承源表的字段类型和大小。
6. 应用举例。(Biblio.mdb)
Select au_id, author, [year born] into auth from authors where au_id <= 100

Select * into auth from authors where au_id <= 100

三、 Insert Into 语句
语法格式:
?????1. 添加单个记录
INSERT INTO target [(field1[, field2[, …]])] VALUES (value1[, value2[, …]])

2. 添加多个记录
INSERT INTO target [IN externaldatabase] [(field1[, field2[, …]])]
SELECT [source.]field1[, field2[, …]]
FROM tableexpression

功能:
在指定的表中添加一个或多个记录。

?????说明:
?????1. 第一种语法格式是直接用Value1, Value2等参数指定的值在表中添加一个新记录。

?????2. 第二种语法格式是从其他表向指定表添加记录。
?????
?????3. Target参数指定要添加记录的表或查询名。如果是一个查询名,则Microsoft Jet数据库引擎会在该查询涉及的所有表 中添加记录。
?????
?????4. 跟在Target参数后的field1, field2等参数指定要添加数据的字段。跟在Select参数数后的field1, field2等参数指定要提供 数据的字段。
?????
?????5. tableexpression指定提供记录的表或查询。
?????
?????6. 如果要添加记录的表是一个外部数据库,则可以使用IN关键字来指定外部数据库。
?????
?????7. 对于在添加记录的表中含有自动增值的字段的情况,如果希望新添加的记录的相应字段重新编号,则SQL语句中不 要指定该字段。如果希望新添加的记录保持相应字段原来的值,则在SQL语句中指定该字段。
?????
?????8. 应用举例。(Biblio.mdb)
?????Insert into auth values(99, “Scott”, “”)

Insert into auth(au_id, author, [year born]) select au_id, author, [year born] from authors where au_id <= 100

Insert into auth select * from authors where au_id > 100 and au_id <= 200


四、 Transform 语句
语法格式:
TRANSFORM aggfunction selectstatement PIVOT pivotfield [IN (value1[, value2[, …]])]

功能:
用于创建一个交叉表查询。所谓交叉表查询是指先对表中的记录

说明:
1. aggfunction用于指定一个统计函数,以便对表执行某类统计计算。

2. selectstatement是一个SQL的的Select语句。它通常要包括一个Group By子句以便指定按哪些字段进行分类统计,而Select 后指定的字段和Group By 子句指定的字段是相同的。这里指定的字段将作为结果交叉表的行标题。

3. pivotfield指定用作列标题的字段或表达式。

4. value1[, value2[, …]]指定用于列标题的固定值。

5. 应用举例。
TRANSFORM sum(Quantity) SELECT DatePart(“m”, SaleDate) as Month FROM ProductSale GROUP BY??DatePart(“m”, SaleDate)
PIVOT ProductName IN (“Apple”,”Orange”,”Pear”)

五、 Parameter 语句
语法格式:
PARAMETERS name1 datatype[, name2 datatype[, …]]; SELECT …
功能:
为一个带变量参数的SQL语句定义参数。
说明:
1. name指定参数的名字。该名字可以含有空格,指定一个含有空格的参数名时,需要用方括号[]括住。

2. datatype 指定相应参数的类型。

3. 应用举例。(NWIND.mdb)
PARAMETERS cls integer; select * from orders where orderid = cls
10250

六、 Update 语句
语法格式:
UPDATE table SET newvalue WHERE criteria
update t1, t2 set t1_inv = t1_inv + t2_in where t1_id = t2_id

功能:
对指定的表中满足条件的记录进行修改。

说明:
1. table指定要修改的表。

2. newvalue指定修改值。

3. criteria指定条件。

4. 应用举例。(NWIND.mdb)
Select * into prod from products
UPDATE prod SET UnitsOnOrder = 0
UPDATE prod, [order details] SET UnitsOnOrder = UnitsOnOrder + Quantity where prod.productId = [order details].productID


七、 Delete 语句
语法格式:
DELETE [table.*] from table WHERE criteia

功能:
删除指定表中满足条件的所有记录。

说明:
1.??[table.*] 可以用* 代替或完全省略。

2.???table指定要删除记录的表。

3???criteria指定条件。

4.??应用举例。(NWIND.mdb)
DELETE * FROM prod WHERE productID = 10