SQL查询语句使用方法

来源:百度文库 编辑:神马文学网 时间:2024/04/29 21:29:32
一、SELECT...FROM...WHERE语句
    语句的语法如下:
 SELECT [all | * | distinct column1, column2]
 FROM table1[, table2]
 WHERE [condition1 | expression1] [AND condition2 | rxpression2]
    在上面的语法中,[]外的语句是必须的,而[]内的是可选的,对于以 | 分割的操作符,则表明语法中必须从| 分割的
操作符中选择一个。
 另外还可以包含ORDER BY语句来制定排序纪录。语法如下:
 ORDER BY column1 | Integer [ASC | DESC]
 其中column1制定排序的字段,也可以使用Integer指定的字段索引来排序,ASC为升序、DESC为降序。
例1.找到Titles表中所有出版日期在1990年以后以及包含文字Beginner的书名,并将书名按照降序进行排列。
  select 书名 from Titles where 出版日期>1990 and 书名 like '%Beginner%'  ORDER BY 书名 DESC

在WHERE语句中,可以使用的操作符有以下几类:
1、比较操作符
    包含 =、<>、>、<、>=、<= 等若干类
2、逻辑操作符
    包含以下若干类:
    LIKE、IN、BETWEEN、UNIQUE、IS NULL、EXISTS、ALL和ANY
    LIKE 操作符通过使用通配符将一个值同其它值比较,在VB的SQL查询中,可以使用的通配符是 * 和 ? 其中 * 代表任
意的若干个字符,而 ? 代表一个字符,例如上面语句中的LIKE '*Beginner* 代表查找所有包含字符串Beginner的值。不
过要注意的是使用 * 和 ? 作为通配符是VB的专利。真正的SQL语言的通配符是 % 和 _ ,其中 % 代表任意多个字符,_ 
代表一个字符例如VB中的Data Environment使用的就是 % 和 _ 作为查询通配符。
   IN 操作符用于比较某一个值是否等于几个值中的一个值,例如下面的语句:
    "SELECT [Title],[Year Published] FROM [Titles] WHERE [Year Published] IN (1990,1991,1995)"
    将从表Titles中选择所有在1990、1991、1995年出版的书籍纪录。
    BETWEEN 操作符勇于在两个值之间搜索,例如 WHERE [Year Published] BETWEEN 1989 AND 1991 指定出版日期必须
在1989年和1991年之间。
    对于逻辑操作符,可以结合NOT操作符实现改变查询条件的方向。例如 WHERE [Year Published] NOT IN (1990,1991,1995)

例2:如何在数据表中加入统计等功能
    SQL当中提供了一定数量的统计以及计算功能,其中统计函数主要有如下一些:
 COUNT 计算字段中的纪录数
 SUM 计算字段中的所有值的和
 MAX 获得字段中所有值中的最大值
 MIN 获得字段中所有值中的最小值
 AVG 计算字段中所有值的平均值
 计算符有 +、-、*、/ 4种。
ex:SELECT db1.产品编号, ((db1.出厂价 - db1.成本)/db1.成本)  AS dRate, " & _
    "(db1.出厂价 * db1.销售数量) AS eTotal FROM db1 ORDER BY db1.产品编号
上面的查询语句中,通过计算字符操作表中已有字段,然后再将结果输出到输出字段中保存。

二、JOIN...ON...语句
    JOIN...ON... 语句是SQL查询中用于连接多个表的语句,该语句的语法为:
    FROM table1 [INNER|OUTER|LEFT|RIGHT]  JOIN  table2  ON  table1.field1  compopr  table2.field2
    其中tabel1指定要查询的表,tabel2指定连接到tabel1的表,field1, field2指定连接字段名称,
compopr指定关系比较符,它可以是大于、小于、等于、不等于等。
 例3: 列出所有书籍以及它的作者以及包含文字Beginner的书名
    在BIBLIO中,书籍的名称位于Titles表的Title字段中,而书籍的作者位于Authors表的Autoor字段中,而这两个表之间没
有相关联的字段,我们这时需要联合数据库中的Title Author表,利用该表的Au_ID字段同Authors表中的Au_ID字段的关联以及
ISBN字段同Titles表中的ISBN字段的关联,范例如下:
   select 书籍表.书籍 and 作者表.作者 from 书籍作者表 inner  jion 书籍表  on 书籍作者表.ISBN =书籍表.ISBN    and   inner  jion   作者表  on 书籍作者表.Au_ID = 作者表. Au_ID   WHERE  Titles.Title LIKE '*Beginner*'
   在上面的范例中,我们使用两个INNER JION联合将Authors表中的Au_ID字段 和Titles表中的ISBN字段连接到Title Author
表中,然后在Title Author表中查找Title字段中包含字符串“Beginner”的纪录并将Title字段和Author字段输出。

三、GROUP BY...语句
    GROUP BY... 语句实现纪录分组功能,它通常需要和上面我们提到过的统计函数 SUM、COUNT 等联合使用,它的语法为:

 SELECT column1[, column2] 
 FROM table1[,table2] 
 WHERE conditions 
 GROUP BY column1[, column2]
 ORDER BY column1[, column2]

例4. 计算学生成绩及总成绩
SELECT SUM(db2.成绩)AS rTotal, FORMAT((AVG(db2.成绩)),'###.#') AS rAVG,   db2.学生) AS Student FROM db2 GROUP BY db2.学生姓名
 在上面的代码中,我们利用GROUP BY将纪录根据学生姓名分组,再建立了两个统计字段rTotal和rAvg并分别利用
统计函数SUM和AVG分别统计各个分组的总成绩以及平均成绩。要注意的是,在SELECT语句中出现的字段,如果没有包含
在统计函数内的话,都要包含在GROUP BY子句中。
    另外在上面的SQL查询中我们还使用了FORMAT子句,这是SQL中的转换和格式化语句中的一个,该语句的语法同VB中
的Format语句是一样的,相似的语句还有FIX语句。需要注意的一点是,虽然在Microsoft JET Engine 中的SQL语法和
ANSI决大部分是一样的,但是有一些还是保留了“微软特色”,特别是象这一类的转换和格式化语句,例如FORMAT就是
ANSI中没有的。而象其它数据库,诸如oracle也有各自的SQL语法扩展。在使用不同数据库进行SQL查询时要注意这一点。
    在GROUP BY 语句中还可以连接使用HAVING子句。该语句同GROUP BY的关系就如同WHERE子句同SELECT的关系类似,
WHERE子语句为SELECT所选择的列设置条件,而HAVING子语句是给由GROUP BY创建的组设置条件。
例如:列出平均成绩大于90分的学生的成绩和名字
SELECT SUM(db2.成绩)AS rTotal, FORMAT((AVG(db2.成绩)),'###.#')  AS rAVG, db2.学生) AS Student FROM db2 GROUP BY db2.学生  HAVING (AVG(db2.成绩))>=90

例5.获得分数高于总平均分数的学生及科目
SELECT db2.成绩, db2.学生,db2.科目 FROM db2 WHERE db2.成绩 > (SELECT AVG(db2.成绩) FROM db2) GROUP BY db2.学生,db2.成绩,db2.科目  ORDER BY db2.学生
在上面的查询中,我们使用了一个嵌套查询,首先在子查询中获得所有科目总的平均分数,然后在查询中查询成绩字段值大于平均分数的纪录。

 

四、TRANSFORM...PIVOT... 语句
    这是Microsoft JET Engine 3.5以上版本所特有的SQL查询语句,该语句的特点是可以建立一个交叉表格式的查询,
一个交叉表同电子表相类似。该语句可以将表中的某些数据作为行,某些数据作为列建立交叉表。该语句的语法如下:

 TRANSFORM condition [select opreation] PIVOT column

    其中condition是在交叉表中要显示的数据,select opreation 是一个SELECT...FROM... 查询,该查询形成交叉表的
行信息,PIVOT recordset中column为表中的一个字段,PIVOT子句使用该字段形成交叉表的列。
例6.建立一个学生成绩表
Transform SUM(db2.成绩)AS iRes SELECT db2.学生 FROM db2 GROUP BY db2.学生 Pivot db2.科目
查询结果如下:

 

学生 数学 英语 语文
 李永 90     94     93
 王为 87     98     91
 张严 96.5  80.5   86.5
上面的查询中还使用了SUM子语句,这时因为对于GROUP BY来说,没有包含在统计函数内的列都要包含在GROUP BY中,如果
将字段db2.成绩包含在 GROUP BY 子语句中,就会使最终结果出现9行而不是3行。由于每个学生的每科成绩只有一个,所以可以
使用SUM函数将字段db2.成绩排除在GROUP BY外面。