《VF关系数据库标准语言SQL.pdf》由会员分享,可在线阅读,更多相关《VF关系数据库标准语言SQL.pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、关系数据库标准语言 S Q L 1、SQL 是结构化的查询语言,是一种高度非过程化的语言。查询是其核心。特点:一体化、高度非过程化、简洁,交互方式和程序方式都可以用 SQL 功能 命令动词 格式 数据查询 SELECT SELE FROMWHERE 数据定义 CREATE、DROP、ALTER CREA TABLE 数据操纵 INSERT、UPDATE、DELETE INSERT INTO 数据控制 GRANT、REVOKE 注意:数据定义一般是对数据表操作,数据操纵一般是对表中的记录进行操作 2、查询功能 格式:SELE 字段名&说明要查询的数据 FROM 数据表名(有联系的多个数据表名,有
2、公共域)&数据来源哪些表 ON 联接的字段名 WHERE 连接条件 AND 条件&说明查询条件 GROUP BY 分组(字段名)HAVING 分组条件&查询结果分组 ORDER BY 排序字段&查询结果排序 成绩管理数据库有以下三个数据库表:学生(学号 C,姓名 C,性别 C,年龄 N,系 C)选课(学号 C,课程号 C,成绩 N)课程(课程号 C,课程名 C)1)简单查询(要求熟练写查询语句)基于单个数据表,SELEFROM WHERE(类似 VF 命令 LIST FOR 条件)SELE 后面接要查询输出的字段名,多个用逗号分隔,全部可以用*FROM 后面是查询的数据表(单个数据表)WHER
3、E 后面跟查询条件 教材 P130 SELE 工资 FROM 职工(从职工表中查询所有职工的“工资”字段值)SELE*FROM 职工 (从职工表中查询所有职工的元组,*表示所有属性)SELE*FROM 职工 WHERE 工资1230(从职工表中查询工资大于 1230 的元组)注意:1、WHERE 后面的条件可以是任意复杂的条件表达式 2、DISTINCT 短语消除结果中重复值(注意)列:查询成绩大于等于 60 分的学生的学号、课程号、成绩(学号,课程号,成绩都在选课表中)SELE 学号,课程号,成绩 FROM 选课 WHERE 成绩=60 相当于 VF 命令:LIST FIELDS 学号,课程
4、号,成绩 FOR 成绩=60 查询有考试成绩的学生的学号 SELE DIST 学号 FROM 选课 (DIST 去掉重复)列:在学生表中查询 2 系年龄小于 25 的女同学的学号,姓名 在学生表中查询 2 系或 6 系年龄小于 25 的男同学的学号,姓名 分析条件:性别=女 AND 年龄25 AND(系=6 OR 系=2)等于条件:性别=男 AND 年龄25 AND 系=6 OR 性别=男 AND 年龄=60 注意:1、“;”是续行符号 2、学号是公用字段(连接条件),因此前面必须加表名,指明是哪个数据表的字段 WHERE 学生.学号=选课.学号:这两个数据表的学号字段有公共域(相同值域)查询
5、考试成绩大于等于 60 分的学生的学号,姓名,课程名,成绩,则 SQL 语句是:SELE 学生.学号,姓名,课程名,成绩;FROM 学生,选课,课程;WHERE 学生.学号=选课.学号 AND 选课.课程号=课程.课程号 AND 成绩=60 多个表查询规则:SELE 后面(查询输出字段)是公共字段须指明;FROM 后面的数据表源之间用逗号分隔;WHERE 后面一定注意不能少表的连接条件 3)嵌套查询(要求能看懂语句)查询结果出自一个关系,但是相关条件却涉及多个关系 教材 132 哪些城市至少有一个仓库的职工的工资为 1250 元 分析:查询所有职工的工资都多于 1210 元的仓库信息 分析:S
6、ELE*FROM 仓库 WHERE 仓库号 NOT IN;(SELE 仓库号 FROM 职工 WHERE 工资1210)AND 仓库号 IN;(SELE 仓库号 FROM 职工)那就成了:有 职工工资多于 1210 元的仓库的信息 注意:IN 相当于集合运算“属于”,和“=”有什么区别?例:那些学生至少有一门课程成绩大于 90,输出其姓名 SELE 姓名 FROM 学生 WHERE 学号 IN;(SELE 学号 FROM 选课 WHERE 成绩90)注意:IN 运算相当于属于 输出至少有一名学生选修了的课程名称(输出没有一名学生选修的课程名称?)sele 课程名称 FROM 课程 WHERE
7、课程号 IN;(SELE 课程号 FROM 选课)4)几个特殊运算符 P133 BETWEENAND 在什么范围内(包含两头)(成绩在 80-99 之间的学生学号)SELE DISTINCT 学号 FROM 选课 WHERE 成绩 BETWEEN 80 AND 99 LIKE:字符匹配运算符,注意格式,”%”表示 0 个或多个,”_”表示一个 供应商名 LIKE”%公司”-供应商名是“公司”查询姓王的学生信息,SELE*FROM 学生;WHERE 姓名 LIKE 王%(姓王的同学)(王)注意:条件还可以用其他方法:LEFT()函数,SUBST()LEFT(姓名,2)=”王”或 SUBST(姓名
8、,1,2)=”王”SELE*FROM 学生 WHERE 姓名 LIKE 王_ (姓王且名字只有两个字)5)排序短语:ORDER BY ASC|DESC,ASC|DESC 说明:ASC(升序),DESC(降序)。默认是升序 ASC。例:SELE *FROM 职工 ORDER BY 工资 SELE *FROM 职工 ORDER BY 仓库号,工资 DESC 先按仓库号升序再按工资降序 等价于 SELE *FROM 职工 ORDER BY 2,3 DESC 6)简单计算(以下函数计算都是纵向,对表的某一个字段的值的进行计算)COUNT(计数,统计记录条数)可以用 COUNT(*),或任意某个具体字段
9、 查询男生数量:SELE COUNT(*)AS 男生数量;FROM 学生;where 性别=男 SUM(求和)字段的值一般是数值型 计算徐小帆的选修课总成绩,输出姓名和总成绩 SELE 姓名,SUM(成绩)AS 总成绩;FROM 学生,选课;WHERE 学生.学号=选课.学号 AND 姓名=徐小帆 AVG(计算平均值)字段的值一般是数值型 查询徐小帆的选修课平均成绩,输出姓名和平均成绩 SELE 姓名,AVG(成绩)AS 平均成绩;FROM 学生,选课;WHERE 学生.学号=选课.学号 AND 姓名=徐小帆 MAX(字段名)取某个字段值中最大的 查询成绩最高分 SELE MAX(成绩)AS
10、最高成绩;FROM 选课 MIN(字段名)取某个字段值中最小的 7)分组与计算(难点)理解分组,可按不同属性(或属性组合)进行分组,举例 查询每个学生的平均成绩,输出学号,平均成绩 SELE 学号,AVG(成绩)AS 平均成绩 FROM 选课 GROUP BY 1 解析:因为每个同学有几门功课成绩,因此对成绩用函数 AVG 求平均值时要以学号分组,相当于每一个同学是一组,查询结果就是该同学的平均成绩,一个同学就只有一条记录 思考:去掉GROUP BY 1 此语句的查询结果?查询男女生的平均成绩,输出性别,平均成绩 SELE 性别,AVG(成绩)AS 平均成绩;FROM 选课,学生;WHERE
11、选课.学号=学生.学号;GROUP BY 1 在分组的基础上,要对分组条件进一步进行限制后面加 HAVING 查询至少有两门课程成绩在 70 分以上(含)的学生姓名 SELE 姓名 FROM 学生,选课 WHERE 成绩=70 AND 学生.学号=选课.学号;GROUP BY 选课.学号 HAVING COUNT(*)=2 要点:HAVING 一定是跟在 GROUP BY 字句后面,限定分组条件,(不能单独使用)8)利用空值查询 WHERE 后面条件要用 IS NULL 不能用=NULL 9)别名与自连接查询 别名的使用(多表查询比较方便)自连接查询:不同属性而值域相同则可以将同一关系与其自身
12、进行连接进行查询 10)内外层嵌套查询 11)使用量词和谓词的查询 EXISTS 直接跟在 WHERE 后面,功能和属于运算 IN 相同,但注意 IN 跟在字段名后面(笔试要点)EXISTS 同 IN NOT EXISTS 同 NOT IN 区别:WHERE EXIST WHERE 字段名 IN 子查询中 WHERE 连接条件 子查询中 WHERE 后无连接条件 查询被学生选修了的课程信息 SELE*FROM 课程 WHERE EXISTS;(SELE*FROM 选课 WHERE 课程号=课程.课程号)同 SELE*FROM 课程 WHERE 课程号 IN;(SELE 课程号 FROM 选课)
13、ANY,SOME:任意,在比较运算时只要子查询中有一行能使结果为真,则结果就为真 ALL:所有,在比较运算时要子查询中所有行使结果为真,则结果就为真 P140 例 4.29 和 4.30 12)普通连接 INNER JOIN ON 同 JOIN ON(重点)相似简单连接:查询考试成绩大于等于 60 分的学生的学号,姓名,课程名,成绩,则 SQL 语句是:SELE 学生.学号,姓名,课程名,成绩;FROM 学生,选课,课程;WHERE 学生.学号=选课.学号 AND 选课.课程号=课程.课程号 AND 成绩=60 普通连接:连接查询:SELE 学生.学号,姓名,课程名,成绩;SELE 学生.学号
14、,姓名,课程名,成绩;FROM 学生 INNER JOIN 选课 INNER JOIN 课程;FROM 学生,选课,课程;ON选课.课程号=课程.课程号;WHERE 选课.课程号=课程.课程号;ON 学生.学号=选课.学号;and 学生.学号=选课.学号;WHERE 成绩=60 and 成绩=60 假如数据表 A 和 B 有关系(A 和 B 有同名字段),B 和 C 有关系 B 和 C 有同名字段 注意“JOIN 后面和 ON 后面顺序相反原则”A INNER JOIN B INNER JOIN C ON B.字段=C.字段 ON A.字段=B.字段 P142 教材底部的注意 等价于:FROM
15、 A,B,C WHERE A.字段=B.字段 AND B 字段=C.字段 13)集合的并运算 UNION :两个查询结果合并,查询结果具有相同的字段数和值域 SELE*FROM WHERE;UNION SELE*FROM WHERE 14)几个特殊项 TOP N:前 N 项,要与 ORDER BY 短语同时使用才有效(要点)TOP N PERCENT:前面百分之几十,其他同 TOP N 在选课表中查询分数最高的前 5 个 SELE*TOP 5 FROM 选课 ORDER BY 3 desc 查询结果存放:P143 1、数组:INTO ARRAY 数组名 假设查询结果 3 条记录,有 4 个字段
16、,则自动二维数组 数组名(3,4)举例 2、临时表文件:INTO CURSOR 文件名,只读,使用完后自动删除 3、永久表:INTO TABLE 表名 可以来复制表 (自由表)4、结果存放文本文件中:TO FILE 文件名 查询结果存放在.TXT 文件中 5、直接送打印机:TO PRINTER 4.3 操作功能 1、插入数据:INSERT INTO 表名VALUES()注意字段的数据类型要匹配 例如:在“选课”表(学号,课程号,成绩)插入元组(00088,002,85)INSERT INTO 选课 VALUES(00088,002,85)数据类型要匹配 全部字段直接插入数据 如果只插入学号和成
17、绩:INSERT INTO 选课(学号,成绩)VALUES(00088,85)部分字段要指明 2、更新数据:UPDATE 表 SET WHERE 条件 UPDATE 职工 SET 工资=工资+200 WHERE 性别=”女”女职工的工资增加 200 元(和 VF 命令 REPL 相似)3、删除数据:DELETE FROM 表 WHERE 条件 DELE FROM 职工 WHERE 性别=”男”注意:是逻辑删除 逻辑删除男职工,要物理删除,用 PACK (和 VF 命令 DELE 相似)定义功能 定义表(新建):CREA TABLE 文件名FREE 修改表:ALTER TABLE 表名 删除表:
18、DROP TABLE 表名 新建表:CREA TABLE AAA(XH C(6),XM C(8),CJ N(6,2)说明:没有参数 FREE,如果当前打开数据库,则在此数据库中建立数据库表,否则建立的是自由表。如果加 FREE,不管打开数据库否,都是建自由表 1、建立新表(数据库表),说明主关键字、定义字段的有效性规则、说明出错信息、设置默认值 例:(P148)用 SQL 语句建立信息表,3 个字段 XH C(3),为主索引,XB C(2)定义有效性规则:性别是“男女”,出错信息“性别只能是男或女”,默认为“女”,CJ N(6,2).用命令建立“信息”表:crea table 信息(XH C(
19、3)PRIMARY KEY,;XB C(2)CHECK XB=男 OR XB=女;ERROR 性别只能是男或女 DEFA 女,CJ N(6,2)PRIMARY KEY:主索引 UNIQUE:候选索引 2、表的删除 DROP TABLLE 表名 3、表结构的修改(1)添加或修改字段 给学生表添加 CJ 字段,设置有效性规则 ALTER TABLE 学生 ADD CJ N(6,2);CHECK CJ=0 AND CJ=0 AND CJ=100 ERROR 成绩只能在 0-100 之间 (3)对表的字段删除或改名 对“学生”表的“CJ”字段改名 CJCJ ALTER TABLE 学生 RENA CJ
20、 TO CJCJ 对“学生”表的“CJCJ”字段进行删除 ALTER TABLE 学生 DROP COLU CJCJ 对“学生表”的“学号”字段定义为候选索引,索引名为 XH ALTER TABLE 学生 ADD UNIQ 学号 TAG XH 4.4 视图的定义:(视图只能存在于数据库中)1、在有打开数据库的前提下,建立视图 菜单:命令:CREA VIEW 视图名 AS SELE 查询语句 (要点)查询视图的内容(同表查询):SELE*FROM 视图名 (要点)视图中的虚字段、视图的查询、插入、更新、删除有一定限制。2、视图的删除 命令:DROP VIEW 视图名 在数据库中选定视图,移去(删除)3、关于视图的说明 1)视图可以更新 2)视图并不真正含数据,是原表的一个窗口,是虚表,不能修改视图的结构(和表不同)3)视图的结果保存在数据库中,找不到类似文件 4)视图有本地视图和远程视图