《第四章-数据查询》由会员分享,可在线阅读,更多相关《第四章-数据查询(46页珍藏版)》请在金锄头文库上搜索。
1、第五章第五章 关系数据库标准语言关系数据库标准语言SQL一、SQL概述结构化查询语言全称全称:Structured Query Language内容内容:数据定义、数据操纵、数据查询和数据控制。特点特点:w简结w 一体化语言w高度非过程化w 命令交互使用SQL 命令动词表SQL 功能命令动词数据查询SELECT数据定义CREATE、DROP、ALTER数据操纵INSERT、UPDATE、DELETE数据控制GRANT、REVOKE查询技巧查询技巧首先读题义,从中抽出关键字打开查询的表、先浏览,从中找线索从题目中提取所要信息,作为条件对所得的条件进行有效的组合完善查询SQL中的数据查询语句中的数
2、据查询语句数据库中的数据很多时侯是为了查询的,因此,数据查是数据库的核心操作。而在SQL语言中,查询语言中有一条查询命令,即SELECT语句。4.5.1 基本查询语句基本查询语句【格式】SELECT ALL | DISTINCT FROM 【功能】无条件查询。【功能】无条件查询。【说明】ALL: 表示显示全部查询记录,包括重复记录。 DISTINCT: 表示显示无重复结果的记录。简单查询简单查询例5.1 从职工关系中检索所有工资值分析分析:关系指二维表,工资是要显示的结果字 段,没有条件。方法方法:把信息插入SQL语句。结果表示结果表示: SELE 工资 FROM 职工语句说明语句说明: SE
3、LECT: 字段名(或查询的结果) FROM :来源于哪张表。 DISTINCT:是否要去掉等值的字段。例5.1 检索仓库关系中的所有元组 SELE * FROM 仓库*:是通配符,表示所仓库表的中字段.此题中可以:SELE 仓库号,城市,面积 FROM 仓库例5.2 :检索工资多于1230元的职工号 条件:工资多于1230 等价于工资1230 显示字段:职工号 来源表:职工表 SELE 职工号 FROM 职工 WHERE 工资1230例:检索哪些仓库有工资多于1210元的职工分析:工资多于1210元等价于工资1210 仓库:是要显示的字段信息,用仓库号 来表示. SELE DIST 仓库号
4、FORM 职工 WHERE 工资1210 例:5.5给出在仓库“WH1”或“WH2”工作,并且工资少于1250元的职工号条件:(仓库号=“WH1” OR 仓库号=“WH2”)AND 工资1250 语句:SELE 职工号 FROM 职工 WHERE (仓库号=“WH1” OR 仓库号=“WH2”)AND 工资1250 二、连接查询连接查询【说说明明】在在一一个个数数据据库库中中的的多多个个表表之之间间一一般般都都存存在在着着某某些些联联系系,在在一一个个查查询询语语句句中中同同时时涉涉及及到到两两个个或或两两个个以以上上的的表表时时,这这种种查查询询称称之之为为连连接接查查询询(也也称称为为多多
5、表表查查询询)。在在多多表表之之间间查查询询必必须须处处理理表与表之间的连接关系。表与表之间的连接关系。 SELECT ALL | DISTINCT FROM ,表,表2. WHERE 简单的联接查询针对多张表,一张表的结果要依靠另一张表为条件,才能查出.把两张表联接起来,形成逻辑上的一张表.技巧:找两张表之间的公共字段及联接条件结构: SELE FROM 表1,表2 WHER AND 联接条件(或者两张表的公共字段) 联接条件:表名.字段名(或者表的别名.字段名)例5.6 找出工资多于1230元的职工号和他们所在城市.注意:一张表查出不能完成,结果需要两张表,职工表只有职工号,而仓库表有中只
6、有城市.他们的公共字段为仓库号. 联接条件:职工.仓库号=仓库.仓库号 一般条件:工资1230 两张表:职工,仓库 显示字段:职工号,城市 语句:SELE 职工号,城市 FROM 职工,仓库 WHERE (工资1230) AND (职工.仓库号=仓库.仓库号)例:找出工作在面积大于400的仓库的职工号以及这些职工工作所在的城市.分析条件:面积400 联接条件:(职工.仓库号=仓库.仓库号)查询涉及表:仓库,职工 查询结果字段:职工号,城市 SELE 职工号,城市 FROM 仓库,职工 WHERE (面积400) AND (职工.仓库号=仓库.仓库号)嵌套查询外查询的条件来自内查询的结果在SQL
7、语句中,一个SELECTFROMWHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询或子查询。IN:属于关系,返回多个值NOT IN :不属于关系联接条件:公共字段名 IN (SELE 公共字段名 相当于联接中条件 表1.公共字段名=表2.公共字段名例题:哪些城市至少有一个仓库的职工工资1250元?SELE 城市 FROM 仓库表 WHERE 仓库号 IN (SELE 仓库号 FROM 职工 WHERE 工资=1250)IN:属于关系,返回多个值注意: 仓库号 IN (SELE 仓库号相当于连接的条件:仓库.仓库号=职工.仓库
8、号例:查询所有职工的工资都于1210元的仓库 的信息.SELE * FROM 仓库 WHERE 仓库号 NOTIN(SELE 仓库号 FROM 工资=1210)分析没有错,但实际错了。应该为SELE * FROM 仓库 WHERE 仓库号NOT IN(SELE 仓库号 FROM 工资WHERE 工资=1210) AND (工资=1240) 例:从供应商关系中检索出全部公司的信息,不工厂或其它供应商的信息.SELE * FROM 供应商 WHERE LIKE”%公司”例:找出不在北京的全部供应商信息.SELECT * FROM 供应商 WHERE 地址!=“北京” 或者SELE * FROM 供
9、应商 WHERE NOT(地址=“北京”)注:地址!=“北京” 与NOT(地址=“北京”)等价只是两种不同的表达方式五、排序ORDER BY ASC/DESCASC升序,可以不用.DESC 降序例:按职工的工资值升序索出全部职工信息. SELE * FROM 职工 ORDER BY 工资 ASC例、先按仓库号排序,再按工资排序并输 出全部职工信息。注:这句话可这样叙述,对职工表的仓库号进行排序,如果仓库号相同再按工资排序。SELE * FROM 职工 ORDER BY 仓库号 DESC,工资注:ORDE BY 不能用在子查询中例:按职工的工资值升序检索出全部职工 信息。 SELE * FROM
10、 职工 ORDER BY 工资 降序:在所面加 DESC 例:先按仓库号排序,再按工资排序并输 出全部职工信息。 对多个字段进行排序: SELE * FROM 职工ORDER BY 仓库号,工资简单的计算查询COUNT()- 计数SUM()-求和AVG()-求平均值MAX()-求最大值MIN()-求最小值查询产生新字段查询中新字段查询中新字段:在查询的结果中多一个统计或计算的字段。定义格式定义格式:SELE SUM(工资) AS 总工资总工资 FROM 职工例例1:SELECT AVG(工资) AS 平均工资例例2:SELECT COUNT(职工号)AS 职工个数例:找出供应商所在地址的数目S
11、ELE COUNT(DIST 地址) FROM 供应商DIST 相同的地址例:求支付的工资总数SELE SUM(工资)FROM 职工例:求北京和上海的仓库职工的工资总和SELE SUM(工资)FROM 职工,仓库 WHERE (城市=“北京”OR城市=“上海”)AND (职工.仓库号=仓库.仓库号)SELE SUM(工资) FROM 职工 WHERE 仓库号 IN (SELE 仓库号 FROM 仓库 WHERE 城市=“北京”OR城市=“上海”) 例:求所有职工的工资都多于1210元的仓库的平均面积. SELE AVG(面积) AS 平均面积 FROM 仓 库 WHERE 仓库号 not IN
12、 (SELE 仓库号 FROM 职工 WHERE 工资=1210) and 仓库号 IN (SELE 仓库号 FROM 职工)例:求在WH2仓库工作的职工的最高工资值.SELE MAX(工资) FROM 职工 WHERE 仓库号=“WH2”分组与计算查询结构结构:GROUP BY HAVING 什么时候使用分组什么时候使用分组:需要统计统计、计算计算每个仓库每个职工,每个学生等含有“每个每个” 提示信息需用。分组字段分组字段:如每个职工就是职工号,每个学生就是学生的学号限定条件:至少选修两门以课,至少两个职工例例:求每个每个仓库的职工的平均工资 GROUP BY 一般跟在WHERE后,如果没有
13、就跟在FROM 之后SELE 仓库号,AVG(工资) FROM 职工 GROUP BY 仓库号例例:求至少有两个职工的每个仓库的平均 工资。 SELE 仓库号,COUNT(*),AVG(工资)FROM 职工 GROUP BY 仓库号 HAVING COUNT(*)=2八、利用空值查询空值空值:指不确定的值判断为不为空判断为不为空:IS NULL(空)IS NOT NULL例例:找出尚未确定供应商的订购单尚未确定供应商的订购单。 SELE * FROM 订购单 WHERE 供应商号 IS NULL不能用 =NULL例例:列出已经确定了供应商的订购单信息。 SELE * FROM 订购单 WHER
14、E 订购信息 IS NOT NULL九、别名和自联接查询别名:别名不是必须的,但是在关系的自联别名:别名不是必须的,但是在关系的自联接操作中,别名必不可少接操作中,别名必不可少作用作用:一般用在多表查询或多字段查询上公共的字段:公共的字段:作为联接条件:别名别名1.字段名=别名别名2.字段名自联接自联接:指同一关系中与其自身联接一张表使用两次时,区分两次的使用情况一张表使用两次时,区分两次的使用情况例:根据雇员关系列出上一级经理及所领导的职工清单。SELE S.雇员名,“领导领导”,E.雇员雇员姓名 FROM 雇员 S,雇员 E WHERE S.雇员号=E.经理常量:领导“雇员号雇员姓名经理E
15、3赵涌E4钱潮E3E6孙洁E3E8李渌E6十、内外层相关嵌套查询十、内外层相关嵌套查询这张表查询的结果要依靠这张表的另一个查询条件而取得,采用自我嵌套的方法来实现。方法:嵌套条件为 别名1.公共字段=别名2.公共字段员工号相同进行比较。自嵌套和自联接的区别自嵌套和自联接的区别:自联接通过公共的记录来联接,自嵌套通过公共字段来联接例:列出每个职工经手的具有最高总金额的订购单信息。SELE OUT.职工号,OUT.供应商号,OUT.订购日期,OUT.总金额 FROM 订购单 OUTWHERE 总金额=(SELE MAX(总金额) FROM 订购单 INNER1 WHERE OUT.职工号=INNE
16、R1.职工号)十一、使用量词查询ANY、SOME:查询的结果一行为真则结果为真。ALL:子查询中所有行为为真查询的结果就为真NOT EXISTS:检查子查询中是否有结果返回。NOT EXISTS与与NOT IN之间联系之间联系:可以相互转换,WHERE NOT EXISTS(SELECT * WHERE A.仓库号仓库号=B.仓库号仓库号等价于仓库号仓库号 NOT IN(SELECT 仓库号仓库号 区别:区别:NOT EXISTS指是否存在一个返回结果,NOT IN 指具体的返回值。检索那些仓库中还没有职工的仓库的信息。这里的查询是没有职工或不存在职工,所以可以使用谓词NOT EXISTS:S
17、ELECT*FROM 仓库 WHERE NOT EXISTS; (SELECT*FROM 职工 WHERE 仓库号 = 仓库仓库号)注意:这里的内层查询引用了外层查询的表,只有这样使用谓词EXISTS或NOT EXISTS才有意义。所以这类查询也都是内、外层互相关嵌套查询。以上的查询等价于: SELECT*FROM 仓库 WHERE 仓库号 NOT IN; (SELECT 仓库号 FROM 职工)检索那些仓库中至少已经有一个职工的仓库的信息。SELECT * FROM 仓库 WHERE EXISTS; (SELECT * FROM 职工 WHERE 仓库号 = 仓库仓库号)它等价于:SELEC
18、T*FROM 仓库 WHERE 仓库号 IN(SELECT 仓库号 FROM 职工) 注意:NOT EXISTS 只是判断子查询中是否有或没有结果返回,它本身并没有任何运算或比较。检索有职工的工资大于等于WH1仓库中任何一名职工工资的仓库号。 这个查询可以使用ANY或SOME量词。SELECT DISTINCT仓 库 号 FROM 职 工 WHERE 工资 = ANY; (SELECT 工资 FROM 职工 WHERE 仓库号=“WH1”) 它等价于:SELECT DISTINCT仓 库 号 FROM 职 工 WHERE 工资 = ; (SELECT MIN(工资)FROM 职工WHERE 仓
19、库号=“WH1”) 检索有职工的工资大于或等于WH1仓库中所有职工工资的仓库号。 这个查询使用ALL量词。SELECT DISTINCT仓库号 FROM 职工 WHERE 工资 =ALL (SELECT 工资 FROM 职工 WHERE 仓库号=“WH1”)它等价于:SELECT DISTINCT仓库号 FROM 职工 WHERE 工资 = ; (SELECT MAX(工资)FROM 职工WHERE 仓库号=“WH1”) 十二、超联接查询内联接n格式:表1 INNER JOIN表2 on 联接条件n满足条件:两张表都有的联接记录。左联接n格式:表1 LEFT JOIN表2 ON 联接条件n满足
20、条件:两张表都有的联接记录,且满足左表中(表1)的记录右联接n格式:表1 RIGHT JOIN 表2 ON 联接条件n满足条件:两张表都有的联接记录,且满足右表中(表2)的记录全联接n格式:表1 FULL JOIN 表2 ON 联接条件n 满足条件:两张表都有的联接记录,且满足右表中(表1)和表2所有的记录内部联接,即只有满足联接条件的记录才 出现在查询结果中。SELECT 仓库仓库号,城市,面积,职工号,工资;FROM 仓库(INNER) JOIN 职工; ON 仓库仓库号=职工仓库号 等价:SELECT 仓库仓库号,城市,面积,职工号,工资;FROM 仓库,职工 WHERE 仓库仓库号=职
21、工仓库号左联接:即除满足联接条件的记录出现在查询结果中外,第一个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库仓库号,城市,面积,职工号,工资;FROM 仓库 LEFT JOIN 职工 ON 仓库.仓库号=职工.仓库号右联接:即除满足联接条件的记录出现在查询结果中外,第二个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库仓库号,城市,面积,职工号,工资;FROM 仓库 LEFT JOIN 职工 ON 仓库.仓库号=职工.仓库号全联接:即除满足联接条件的记录出现在查询结果中外,两个表中不满足联接条件的记录也出现在查询结果中。SELECT 仓库仓库号,城市,面积,职工
22、号,工资;FROM 仓库 LEFT JOIN 职工 ON 仓库.仓库号=职工.仓库号注:JION 的位置和ON联接条件相反 SELECT 仓库仓库号,城市,面积,职工号,工资 FROM 供应商 JION 订购单 JION 职工 JION 仓库 ON 仓库.仓库号=职工.仓库号 ON 订购单.职工号=职工.职工号 ON 供应商号.供应商号=订购单.供应商号.十三、集合的并运算将两个SELE 的查询结果合并成一个查询结果,要求:相同的字段,值域,数据类型,取值范围.例:显示结果为北京和上的仓库信息:SELE * FROM 仓库 WHERE 城市=“北京”;UNION SELE * FROM 仓库 WHERE 城市=“上海”等价于: SELE * FROM 仓库 WHERE 城市=“北京” OR 城市=“上海”十四十四 查询去向查询去向1.浏览方式显示记录(一般就是浏览)2.将查询结果存放到数组中(INTO ARRA 数组名)3.将查询结果存放在临时文件中(INTO CURSOR TMP)4.将查询结果存放在永久的表中(INTO TABLE /DBF 表名)5.将查询结果存放在文本文件中(TO FILE 文本.TXT)6.将查询结果直接输出打印机中(TO PRINTER)