77范文网 - 专业文章范例文档资料分享平台

资料 SQL语言(2)

来源:网络收集 时间:2018-12-17 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

如下:

<列名> <比较运算符>{<列名>|<常量>|<表达式>}

在使用某些比较运算符时,表达式略有差别,这将在例子中说明。 字符串常量或日期常量要用一对单引号括起来。 在这里,列名就像通常的关系表达式中的变量那样地使用,当然在使用时也要注意它的变量类型。

根据实际需要把多个关系表达式用逻辑运算符(not,and,or)连接起来,形成一个复合的逻辑表达式,数据库管理系统将把整个逻辑表达式为真的所有行取出。 下面我仍给出一些例子,以说明如何在WHERE子句中规定查询条件: 1、简单和条件查询

例8:列出在“P20”部门工作的所有职员的信息, SELECT * FROM people WHERE deptcode='P20'; 结果为: 12 沈晓华 男 53/09/28 82/02/15 处长 180 P20 13 吴志红 女 61/05/12 86/09/17 办事员 125 P20 14 姚志邦 男 50/06/20 81/08/23 采购员 150 30 P20 15 张浩 男 49/02/18 83/05/06 采购员 140 10 P20 16 林光华 男 47/04/11 88/04/10 采购员 110 20 P20 例9:列出工资大于170.00元的职工的信息, SELECT * FROM people WHERE salary>170; 结果为: 1 李铭棠 男 40/04/25 80/10/01 经理 200 P00 12 沈晓华 男 53/09/28 82/02/15 处长 180 P20 23 王英泉 男 35/12/02 81/09/25 处长 210 P40 26 黄伯尧 男 50/10/18 85/08/23 处长 180 P50 27 沈妙玉 女 57/04/20 81/08/05 小车驾驶员 180 20 P50 例10:列出工资在140.00元和160.00元之间的职工信息。 SELECT * FROM people

WHERE Salary between 140 and 160;

例11:列出其职务是处长或是经理的职员, SELECT * FROM people

WHERE job in ('经理','处长');

例12:列出不在P00部门工作的所有办事员, SELECT * FRIM people

WHERE(job='办事员')and(deptcode!='P00');

例13:列出有奖金并且在88年1月1日前参加工作的人员, SELECT * FROM people?

WHERE (award is not null) and (workdate<'01-JAN- 88 ');

例14:列出职务是处长,或工资和奖金之和大于190.00元的职工, SELECT * FROM people

SHERE (job='处长) or salary+nvl(award,0)>190;

例15:列出除经理。处长以外的工资大于150.00元的所有职工, SELECT * FROM people

WHERE not (job='经理' or job='处长') and salary>150;

2、匹配查询

有时用户并不精确地知道需要查询的条件(例如可能忘了某个人的名字,但却还记得他的姓)或确要查询某一类客体(例如要查询所有处的信息 )时,可以使用匹配查询(也可称为模糊查询)。

SQL中使用两个匹配符:

(1) 百分号(%):匹配零个或多个字符序列 (2) 下划线(_):只匹配单个字符 在匹配查询中,比较运算符用like。 下面给出几个匹配查询的例子: 例16:列出所有姓张的职工, SELECT * FROM people WHERE peopname like '张%';

例17:列出公司中除处级单位以外所有部门的信息, SELECT*FROM department 2 SHERE deptname not like '%处'; 结果为:

P00 长城五金批发公司 公司大楼303室 1 303 P11 财务处计划科 公司大楼102室 4 102 P10 P12 财务处记帐科 公司大楼201室 6 201 P10 P13 财务处报销科 公司大楼101室 9 101 P10 P31 销售研究中心 P30 公司大楼202室 202 例18:列出公司中所有单姓单名的职工, SELECT * FROM people WHERE peopname like '__'; 2 周曙 女 62/07/15 62/10/20 办事员 157 5 陈虹 女 57/05/10 86/07/19 计划员 120 7 叶铭 女 60/08/08 86/02/08 记帐员 120 15 张浩 男 49/02/18 83/05/06 采购员 140 19 王晨 男 52/06/05 82/01/05 推销员 150 10 30 P00 P11 P12 P20 P30 3、防止选择重复行

一般来说,SQL将会把所选择到的行全部显示出来, 即使有些行的内容完全一样。 例19:要显示people表中的所有职务,输入以下两个查询:

SELECT job SELECT DISTINCT job FROM people; FROM people; 结果为: 结果为: 经理 办事员 办事员 报销员 处长 采购员 科长 处长 计划员 管理员 科长 计划员 记帐员 记帐员 记帐员 驾驶员 科长 经理 报销员 科长 报销员 推销员 处长 办事员 采购员 采购员 采购员 处长 办事员 推销员 推销员 推销员 推销员 处长 管理员 管理员 处长 驾驶员 驾驶员 驾驶员 上例中第一个查询显示了所有的职务,但其中有些职务显示了多次。在第二个查询中,在列名job前增加了保留字DISTINCT,清除了查询结果中的重复职务行。所以,如果希望在查询结果中不出现两行完全一样的内容时,可以在列名前加DISTINCT 来消除他们。 4、控制行的显示顺序

一般来说,屏幕上查询结果的显示顺序是按SQL*Plus 检索到的先后次序显示的,先取到的先显示,后取到的后显示。通过在SELECT命令中添加ORDER BY子句,可以控制所选取行的显示顺序。

例20:按工资从低到高的顺序,列出供应处(编号为P20)的所有职工,输入: SELECT * FROM people? WHERE deptcode='P20' ORDER BY salary; 结果为:

16 林光华 男 47/04/11 88/04/10 采购员 110 20 P20 13 吴志红 女 61/05/12 96/09/17 办事员 125 P20 15 张浩 男 49/02/18 83/05/06 采购员 140 10 P20 14 姚志邦 男 50/01/20 81/08/23 采购员 150 30 P2 12 沈晓华 男 53/09/28 82/12/15 处长 180 P20 若不使用ORDER BY子句时,查询结果的显示顺序是不确定的,(一般按物理的存贮顺序)。如果查询结果的显示顺序很重要的话,则应该使用ORDER BY子句。

ORDER BY子句必须是放在SELECT命令中影响选取行的所有子句的后面,并且通常按指定的排序列的升序排列的(最小值排在最前面)。如果希望按某列的降序(最大值排在最前面)对行进行排列,此时可在排序列名后添加保留字DESC。 例21:按工资的降序列出供应处(编码为P20)的所有职工, SELECT * FROM people WHERE deptcode='P20' ORDER BY salary desc;

结果为:

12 沈晓华 男 53/09/28 82/12/15 处长 180 P20 14 姚志邦 男 50/01/20 81/08/23 采购员 150 30 P20 15 张浩 男 49/02/18 83/05/06 采购员 140 10 P20 13 吴志红 女 61/05/12 86/09/17 办事员 125 P20 16 林光华 男 47/04/11 88/04/10 采购员 110 20 P20 有时,用户可能需要根据多个列的值来排列显示行,

例22:先按职务的升序,然后按工资的降序,列出没有奖金的全部职工,输入: SELECT * FROM people WHERE award is null

ORDER BY job,salary desc;

此外,在ORDER BY子句中也可以使用表达式。

例23:按奖金占工资的比例的升序,列出所有销售人员的姓名、工资、奖金和奖金占工资的百分比:

SELECT peopcode,peopname,salary,award,100*award/salary percent FROM people

WHERE job='推销员' ORDER BY award/salary

5、行的分组和分组统计

假如用户不是想知道表中每个记录的详尽信息,而只关心一些统计数据(例如某部门的总工资、总人数、平均工资等等),则可以用GROUP BY子句对行进行分组,并使用组函数对其进行分组统计。

带GROUP BY子句的SELECT命令的形式如下: SELECT 希望检索的列名(符号分组要求) FROM 包含上述列表的表名 WHERE 查询条件

GROUP BY 要分组的名列;

当省略WHERE子句时,表示对所有的行进行分组。

最常用的组函数有MAX、MIN、AVG、COUNT、SUM等,它们分别表示求最大值、最小值、平均值、个数、总和。组函数的详细情况请参看§2.2.5小节的内容。 例24:列出除经理以外每一种职务的总工资、人数和平均工资: SELECT job,sum(salary),count(*),avg(salary) FROM people

WHERE job != '经理' GROUP BY job

ORDER BY avg(salary); 结果为:

235 2 117.5 报销员 120 1 120 计划员 仓库管理员 260 2 130 520 4 130 推销员 400 3 133.333333 采购员 402 3 134 办事员 卡车驾驶员 290 2 145 460 3 153.333333 科长 小车驾驶员 180 1 180 910 5 182 处长 在这个例子中,SQL首先根据FROM子句和WHERE子句确定表people中所选取的行,然后由GROUP BY子句对所选取的行根据job列的值进行分组,job 列值相同的分为一组(即职务相同的分为一组),再分别由组函数SUM、COUNT、AVG分别计算出每组(工作相同)的总工资、人数和平均工资,最后由ORDER BY子句根据平均工资按从小到大的顺序输出。 与ORDER BY子句可以对多列进行排序一样,GROUP BY子句也可以对多列进行分组。当对多列进行分组时,SQL会先对排在前面的列分组, 再对各组内对第二个分组列进行分组,如果还有其它的分组列,则依次类推。

例25:要分别列出供应处、销售处、仓库管理处的各种职务的人数和年平均工资: SELECT deptcode,job,count(*),12*avg(salary) FROM people

WHERE deptcode in ('P20','P30','P40') GROUP BY deptcode,job;

注意:当对多列进行分组时,所有的组函数统计都是对最后的分组列进行的。如上例中统计的是某一部门中每一种职务的人数和平均工资。 在使用GRONP BY子句进行分组选择时,一定要注意所选项与分组的一致性, 不然会发生各种错误。如下面的查询是错误的: SELECT peopname,job,count(*) FROM people

WHERE job!='经理' GROUP BY job;

因在这儿:peopname不是按job分组确定的列,所以与job分组不相匹配。一般来说,在SELECT子句中所选的列,或者应作为分组标志同时出现在GROUP BY子句中, 或者应以组函数的自变量出现在SELECT子句中。

6、组的选择

正如用WHERE子句可以选取指定的行一样,我们可以在一个查询中用HAVING子句来规定满足条件的分组。只当有GROUP BY子句的查询才可以有HAVING子句,并且 HAVING子句一定要安排在GROUP BY子句之后。

例26:列出多于两个人从事的各种职务的人数和年平均工资: SELECT job,count(*),12*avg(salary) FROM people GROUP BY job

HAVING count(*)>2; 结果为:

办事员 3 1608 采购员 3 1600 处长 5 2184 科长 3 1840 推销员 4 1560 HAVING子句中的条件与WHERE子句中的条件是类似的,唯一的区别在于:HAVING子句中是用分组后的组属性来进行比较,而WHERE子句中是用表中的行属性来进行比较的。 7、行的并、交、差运算

两个查询之间可以进行并、交、差运算,运算符分别是UNION、INTERSECT和MINUS。 UNION表示并运算,它返回两个查询中任一个所返回的行。

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库资料 SQL语言(2)在线全文阅读。

资料 SQL语言(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/369843.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: