• 1. Sybase学习总结
  • 2. 数据库总体介绍-数据库介绍 数据库(DataBase,DB)是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。 数据库的概念实际包括两层意思: (1)数据库是一个实体,它是能够合理保管数据的“仓库”,用户在该“仓库”中存放要管理的事务数据,“数据”和“库”两个概念结合成为数据库。 (2)数据库是数据管理的新方法和技术,他能更合适的组织数据、更方便的维护数据、更严密的控制数据和更有效的利用数据。
  • 3. 数据库系统一般由4个部分组成: 数据库,即存储在磁带、磁盘、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。 数据库管理系统(DBMS)。它是一组能完成描述、管理、维护数据库的程序系统。它按照一种公用的和可控制的方法完成插入新数据、修改和检索原有数据的操作。 数据库管理员(DBA)。 用户和应用程序。
  • 4. 数据库的分类: 层次结构模型 层次结构模型实质上是一种有根结点的定向有序树 按照层次模型建立的数据库系统称为层次模型数据库系统。 IMS(Information Manage-mentSystem)是其典型代表。 网状结构模型 按照网状数据结构建立的数据库系统称为网状数据库系统。 典型代表是DBTG(Data Base Task Group)。用数学方法可将网状数据结构转化为层次数据结构。 关系结构模型 关系式数据结构把一些复杂的数据结构归结为简单的二元关系(即二维表格形式)。 在关系数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关系表格的分类、合并、连接或选取等运算来实现数据的管理。
  • 5. 常用数据库: Oracle:目前使用最广泛的大型数据库,企业级的数据库 sql server:微软的数据库,从前是中小型,现在已经转型为大型数据库,对windows支持良好 Access:微软office的组件之一,小型数据库,只是用于小型办公室和用户使用的 my sql:开源的数据库,属于中小型数据库,在很多开源项目中都使用到,应用非常广泛 DB2:IBM公司研制的一种关系型数据库系统。DB2主要应用于大型应用系统,具有较好的可伸缩性,可支持从大型机到单用户环境。 Sybase: Sybase公司成立于1984年,公司名称“Sybase”取自“system”和“database” 相结合的含义。Sybase公司的创始人之一Bob Epstein 是Ingres 大学版(与System/R同时期的关系数据库模型产品)的主要设计人员。公司的第一个关系数据库产品是1987年5月推出的Sybase SQLServer1.0。Sybase首先提出Client/Server 数据库体系结构的思想,并率先在Sybase SQLServer 中实现。
  • 6. Sybase环境配置
  • 7. (本页无文本内容)
  • 8. (本页无文本内容)
  • 9. (本页无文本内容)
  • 10. (本页无文本内容)
  • 11. (本页无文本内容)
  • 12. SYBASE数据库缺省的安装选项是:语言为us_english,字符集为roman8。安装过程中一般要改变成语言为chinese,字符集为eucgb. 如果字符集设置不对,数据库操作过程中就可能产生乱码现象。
  • 13. Sybase数据库的组成 Sybase 数据库主要由三部分组成: (1)Sybase SQL Server:进行数据库管理和维护的一个联机的关系数据库管理系统。 Sybase SQL Server是个可编程的数据库管理系统,它是整个Sybase产品的核心软件,起着数据管理、高速缓冲管理、事务管理的作用。 (2)Sysbase SQL Toolset:支持数据库应用系统的建立与开发的一组前端工具。 ISQL是与SQL Server进行交互的一种SQL句法分析器。ISQL接收用户发出的SQL语言。将其发送给SQL Server,并将结果以形式化的方式显示在用户的标准输出上。 DWB是数据工作台,是Sybase SQL Toolset的一个主要组成部分,它的作用在于使用户能够设置和管理SQL Server上的数据库,并且为用户提供一种对数据库的信息执行添加、更新和检索等操作的简便方法。在DWB中能完成ISQL的所有功能。且由于DWB是基于窗口和菜单的,因此操作比ISQL简单,是一种方便实用的数据库管理工具。
  • 14. APT是Sybase客户软件部分的主要产品之一,也是从事实际应用开发的主要环境。APT工作台是用于建立应用程序的工具集,可以创建从非常简单到非常复杂的应用程序,它主要用于开发基于表格(Form)的应用。其用户界面采用窗口和菜单驱动方式,通过一系列的选择完成表格(Form)、菜单和处理的开发。 (3)Sybase Open Client/Open Server:可把异构环境下其它厂商的应用软件和任何类型的数据连接在一起的接口。 通过Open Client的DB_LIB库,应用程序可以访问SQL Server。而通过Open Server的SERVER-LIB,应用程序可以访问其它的数据库管理系统。
  • 15. SQL 用到的数据表 学生表(Student) 课程表课程号课程名先行课学分1数据库542数学23信息系统144操作系统635数据结构746数据处理27Pascal语言 64学号姓名性别年龄所在系200215121李勇男20CS200215122刘晨女19CS200215123王敏女18MA200215125张立男19IS
  • 16. 学号课程号成绩200215121192200215121285200215121388200215122290200215122380选课表
  • 17. 2.1 查询语句格式: SELECT [all | distanct] ·|具体的列 别名 FROM 表名称1 别名1 , ....... WHERE 条件,...... GROUP BY 分组条件 HAVING 分组条件 ORDER BY 字段名 ASC/DESC ;查询全体学生的学号和姓名SELECT Sno , Sname From Student ;
  • 18. 其结果为:分析: |= SELECT后面可以加上参数 all 或者 distanct , 加上all表示列出全部查询出来的记录,默认就是all。如果是distinct则表示会去掉查询结果中的重复记录。· 查询全体学生的详细记录SELECT * FROM Student ;其结果为:
  • 19. 分析: |= 查询的项可以使用具体的列名,如果是查出表中全部的列,则可以使用·表示。 查询全体学生的姓名及出生年份SELECT Sname ,2004-Sage 'birth' FROM Student ; 其结果为:分析: = 可以在列名后面加上别名,这样就能知道查询出的列的具体意义。
  • 20. 2.2. WHERE语句 如果在查询中需要加入判断就需要使用where语句。在where语句中可以加入一天谓词作为查询条件。常用的查询条件查询条件谓词比较= , > , < , >= , != , <> , !> , !< 确定范围BETWEEN......AND...... , NOT BETWEEN......AND...... 确定集合IN , NOT IN 字符匹配LIKE , NOT LIKE v空值IS NULL , IS NOT NULL 多重条件AND , OR
  • 21. SELECT Sname FROM Student WHERE Sdept= 'CS' ; SELECT Sname FROM Student WHERE Sage BETWEEN 20 AND 23; ·查询计算机科学系全体学生的名单 ----- 验证比较大小操作其结果为:·查询年龄在20-23岁(包括20和23岁)之间的 学生的姓名-----验证确定范围SELECT Sname FROM Student WHERE Sdept= 'CS' ; SELECT Sname FROM Student WHERE Sage BETWEEN 20 AND 23; 这里需要注意的是between....and.....包括两边的边界值
  • 22. 其结果为:·查询计算机科学系(CS),数学系(MA)。信息系(IS)学生的姓名和性别-----验证集合SELECT Sname , Ssex FROM Student WHERE Sdept IN ('CS','MA','IS'); 在使用IN操作的时候,如果集合里出现了表以外的其他内容,不会影 响结果。其结果为:
  • 23. ·查询所有姓刘的学生的姓名,学号和性别------验证字符匹配SELECT Sname , Sno , Ssex FROM Student WHERE Sname LIKE '刘%'; 分析: 在使用LIKE进行操作的时候需要注意通配符的使用,一般有两种 通配符: ·% :表示任意个字符的长度。 ·_ :表示一个字符的长度,需要说明的是,一个汉字占两个字符。其结果为:·查询姓“欧燕”且全名为3个汉字的学生的姓名SELECT Sname FROM Student WHERE Sname LIKE '欧阳__';
  • 24. 其结果为:·查询姓“欧燕”且全名为3个汉字的学生的姓名 SELECT Sname FROM Student WHERE Sname LIKE '欧阳__'; 其结果为:特别的两个操作需要注意: ·当我们需要查询在任意一个地方出现“·”的模式匹配应该写成‘%·%' ·当我们需要全部查询的模式匹配为 '%%' 在使用的过程中,如果我们匹配的关键字本身就有跟通配符一样的符号,就需要进行转义,这个时候我们需要使用ESCAPE关键字进行换码操作。
  • 25. Printable PagePoints of interestAdd text here·查询DB_DESIGN课程的课程号和学分SELECT Ccredit FROM Course WHERE Cname like 'DB\_DESIGN' ESCAPE '\' ; 其结果为:·查询所有有成绩的学生的学号和课程号-----验证空查询 SELECT Sno , Cno FROM SC WHERE grade IS NOT NULL ; 其结果为:
  • 26. ·查询计算机科学系年龄在20岁以下的学生的姓名 ------ 验证多条件查询SELECT Sname , Ssex FROM Student WHERE Sdept = 'CS' AND Sage < 20 ; 其结果为:
  • 27. 2.3 分组统计 2.3.1 聚集函数(组函数) 在数据库中我们常常会使用以下几个组函数: ·COUNT:统计查询的记录的条数 ·MAX:统计一列中的最大值 ·MIN:统计一列中的最小值 ·SUM:统计一列值的总和 ·AVG:统计一列值的平均值·查询学生总人数SELECT COUNT(*) FROM Student ; 其结果为:
  • 28. ·查询选修了课程的学生人数SELECT COUNT(DISTINCT Sno) FROM SC ;其结果为: ·计算1号课程的学生平均成绩SELECT avg(grade) FROM SC WHERE Cno = 1 ;其结果为:
  • 29. 2.3.2 GROUP BY 子句 GROUP BY子句将查询的结果按某一列或多列的值分组,值相等的为一组。 对于查询结果分组的目的是为了细化组函数的作用对象。如果为对查询结果分组,组函数将作用于整个查询结果,分组后聚集函数将作用于每一个组,即每一组都有一个函数值。 ·求各个课程号及相应的选课人数SELECT Cno , COUNT(Sno) FROM SC GROUP BY Cno ;其结果为: ·查询选修了3门以上课程的学生的学号。 此时考略,选修了3门以上一定是一个COUNT函数的值大于3。这时我们需要注意,组函数的判断条件是不可以写在WHERE子句中的。那么此时这个条件需要借助我们新的关键字HAVING来实现我们需要的功能
  • 30. SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(Cno) > 3 ; 从本质上区别WHERE和HAVING: ·WHERE子句作用于基本表或视图上,从中选择满足条件的记录。 ·HAVING短语作用于组,从中选择满足条件的组。 其结果是:
  • 31. 注意:在使用GROUP BY语句时,我们的SELECT查询的列是有限制的: |= 如果程序中使用了组函数,则有两种可以使用的情况 |= 程序中使用了GROUP BY,并且制定了分组条件,这样可以将分组条件一起查询出来。 |= 程序中没有使用GROUP BY,则只能单独的使用组函数。 |= 在使用组函数的时候,不能出现组函数和分组条件之外的字段。最后我们需要知道的是,组函数可以嵌套使用,但是在组函数嵌套使用的时候在查询的字段中不能再出现分组条件和其他条件,即只能出现嵌套组函数。
  • 32. 2.4 排序 用户可以使用ORDER BY来进行排序操作 ·查询选修了3号课程的学生的学号及其成绩,查询结果按照分数的降序排序。SELECT Sno , grade FROM SC WHERE Cno = 3 ORDER BY grade DESC ;其结果为: 在排序语句中存在两个关键字:ASC(默认)为升序,DESC为降序。 对于空值,若按升序排序,汗空值的记录将最后显示,若按降序排序,空值的记录将最先显示。 对于排序,还应该知道,可以对多个字段进行排序,第一位的是一级排序,第二位的是二级排序,依次往后。
  • 33. 同时涉及多个表的查询称为连接查询 用来连接两个表的条件称为连接条件或连接谓词 一般格式: [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> 比较运算符:=、>、<、>=、<=、!= [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3> 连接查询
  • 34. 等值与非等值连接查询 等值连接、自然连接、非等值连接 [例1] 查询每个学生及其选修课程的情况。 SELECT Student.*, SC.* FROM Student, SC WHERE Student.Sno = SC.Sno 连接字段 连接谓词中的列名称为连接字段 连接条件中的各连接字段类型必须是可比的,但不必是相同的连接查询
  • 35. 等值连接连接运算符为 “=“ 的连接操作 [<表名1>.]<列名1> = [<表名2>.]<列名2> 任何子句中引用表1和表2中同名属性时,都必须加表名前缀。引用唯一属性名时可以加也可以省略表名前缀。
  • 36. 等值连接假设Student表、SC表分别有下列数据: Student表 Sno Sname Ssex Sage Sdept 95001 李勇 男 20 CS 95002 刘晨 女 19 IS 95003 王敏 女 18 MA 95004 张立 男 19 IS
  • 37. 等值连接SC表 Sno Cno Grade 95001 1 92 95001 2 85 95001 95002 95002 3 2 3 88 90 80
  • 38. 等值连接结果表 Student.Sno Sname Ssex Sage Sdept SC.Sno Cno Grade 95001 李勇 男 20 CS 95001 1 92 95001 李勇 男 20 CS 95001 2 85 95001 李勇 男 20 CS 95001 3 88 95002 刘晨 女 19 IS 95002 2 90 95002 刘晨 女 19 IS 95002 3 80  
  • 39. 自然连接等值连接的一种特殊情况,把目标列中重复的属性列去掉。 [例2] 对[例1]用自然连接完成。 SELECT Student.Sno,Sname,Ssex,Sage, Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno = SC.Sno
  • 40. 非等值连接查询连接运算符 不是 “=“ 的连接操作 [<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2> 比较运算符:>、<、>=、<=、!= [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
  • 41. 自身连接 一个表与其自己进行连接,称为表的自身连接 需要给表起别名以示区别 由于所有属性名都是同名属性,因此必须使用别名前缀
  • 42. 自身连接 [例3] 查询每一门课的间接先修课(即先修课的先修课) SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno
  • 43. 自身连接 FIRST表(Course表) Cno Cname Cpno Ccredit 1 数据库 5 4 2 数学   2 3 信息系统 1 4 4 操作系统 6 3 5 数据结构 7 4 6 数据处理 2 7 PASCAL语言 6 4
  • 44. 自身连接 SECOND表(Course表) Cno Cname Cpno Ccredit 1 数据库 5 4 2 数学   2 3 信息系统 1 4 4 操作系统 6 3 5 数据结构 7 4 6 数据处理 2 7 PASCAL语言 6 4
  • 45. 自身连接 查询结果 cnocpno1 735 5 6
  • 46. 外连接外连接与普通连接的区别 普通连接操作只输出满足连接条件的元组 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
  • 47. 外连接 [例 5] 查询每个学生及其选修课程的情况包括没有选修课程的学生----用外连接操作 SELECT Student.Sno,Sname,Ssex, Sage,Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno *= SC.Sno
  • 48. 外连接 结果: Student.Sno Sname Ssex Sage Sdept Cno Grade 95001 李勇 男 20 CS 1 92 95001 李勇 男 20 CS 2 85 95001 李勇 男 20 CS 3 88 95002 刘晨 女 19 IS 2 90 95002 刘晨 女 19 IS 3 80 95003 王敏 女 18 MA 95004 张立 男 19 IS
  • 49. 外连接(续) 左外连接 *=(left join) 外连接符出现在连接条件的左边 右外连接 =* (right join) 外连接符出现在连接条件的右边
  • 50. 复杂条件连接WHERE子句中含多个连接条件时,称为复合条件连接 [例6]查询选修2号课程且成绩在90分以上的所有学生的 学号、姓名 SELECT Student.Sno, student.Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND SC.Cno= ' 2 ' AND SC.Grade > 90
  • 51. 子查询的谓词带有IN谓词的子查询 带有比较运算符的子查询 带有ANY或ALL谓词的子查询 带有EXISTS谓词的子查询
  • 52. 一、带有IN谓词的子查询[例7] 查询与“刘晨”在同一个系学习的学生。 此查询要求可以分步来完成 ① 确定“刘晨”所在系名 SELECT Sdept FROM Student WHERE Sname= ' 刘晨' 结果为: Sdept IS
  • 53. 带有IN谓词的子查询 ② 查找所有在IS系学习的学生。 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept= 'IS' 结果为: Sno Sname Sdept 95001 刘晨 IS 95004 张立 IS
  • 54. 构造嵌套查询SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname= '刘晨')
  • 55. 带有IN谓词的子查询 用自身连接完成本查询要求 SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept = S2.Sdept AND S2.Sname = '刘晨'
  • 56. 带有IN谓词的子查询 父查询和子查询中的表均可以定义别名 SELECT Sno,Sname,Sdept FROM Student S1 WHERE S1.Sdept IN (SELECT Sdept FROM Student S2 WHERE S2.Sname= '刘晨')
  • 57. 带有IN谓词的子查询 [例8]查询选修了课程名为“信息系统”的学生学号和姓名 SELECT Sno,Sname ③ 最后在Student关系中 FROM Student 取出Sno和Sname WHERE Sno IN (SELECT Sno ② 然后在SC关系中找出选 FROM SC 修了3号课程的学生学号 WHERE Cno IN (SELECT Cno ① 首先在Course关系中找出“信 FROM Course 息系统”的课程号,结果为3号 WHERE Cname= '信息系统'))
  • 58. 带有IN谓词的子查询 结果: Sno Sname ---- ----- 95001 李勇 95002 刘晨
  • 59. 带有IN谓词的子查询 用连接查询 SELECT Sno,Sname FROM Student,SC,Course WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Course.Cname='信息系统'
  • 60. 二、带有比较运算符的子查询 当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。
  • 61. 带有比较运算符的子查询 [例9]假设一个学生只可能在一个系学习,并且必须属于一个系 : SELECT Sno,Sname,Sdept FROM Student WHERE Sdept = SELECT Sdept FROM Student WHERE Sname= '刘晨'
  • 62. 带有比较运算符的子查询(续) 子查询一定要跟在比较符之后 错误的例子: SELECT Sno,Sname,Sdept FROM Student WHERE ( SELECT Sdept FROM Student WHERE Sname= '刘晨' ) = Sdept
  • 63. 三、带有ANY或ALL谓词的子查询谓词语义 ANY:任意一个值 ALL:所有值
  • 64. 带有ANY或ALL谓词的子查询(续)需要配合使用比较运算符 > ANY 大于子查询结果中的某个值 > ALL 大于子查询结果中的所有值 < ANY 小于子查询结果中的某个值 < ALL 小于子查询结果中的所有值 >= ANY 大于等于子查询结果中的某个值 >= ALL 大于等于子查询结果中的所有值 <= ANY 小于等于子查询结果中的某个值 <= ALL 小于等于子查询结果中的所有值 = ANY 等于子查询结果中的某个值 =ALL 等于子查询结果中的所有值(通常没有实际意义) !=(或<>)ANY 不等于子查询结果中的某个值 !=(或<>)ALL 不等于子查询结果中的任何一个值
  • 65. 带有ANY或ALL谓词的子查询 [例 9] 查询其他系中比信息系任意一个(其中某一个)学生年龄小的学生姓名和年龄 SELECT Sname,Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept= ' IS ') AND Sdept <> ' IS '
  • 66. 带有ANY或ALL谓词的子查询(续)结果 Sname Sage 王敏 18 执行过程 1. 执行此查询时,首先处理子查询,找出 IS系中所有学生的年龄,构成一个集合(19,18) 2. 处理父查询,找所有不是IS系且年龄小于 19 或 18的学生
  • 67. 带有ANY或ALL谓词的子查询 用集函数实现子查询通常比直接用ANY或ALL查询效率要高,因为前者通常能够减少比较次数
  • 68. 带有ANY或ALL谓词的子查询 [例10]:用集函数实现[例9] SELECT Sname,Sage FROM Student WHERE Sage < (SELECT MAX(Sage) FROM Student WHERE Sdept= ' IS ') AND Sdept <> ' IS '
  • 69. 带有ANY或ALL谓词的子查询 [例11] 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。 方法一:用ALL谓词 SELECT Sname,Sage FROM Student WHERE Sage < ALL (SELECT Sage FROM Student WHERE Sdept= ' IS ') AND Sdept <> ' IS ' 查询结果为空表。
  • 70. 带有ANY或ALL谓词的子查询(续) 方法二:用集函数 SELECT Sname,Sage FROM Student WHERE Sage < (SELECT MIN(Sage) FROM Student WHERE Sdept= ' IS ') AND Sdept <>' IS '
  • 71. 带有EXISTS谓词的子查询 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则返回真值 若内层查询结果为空,则返回假值 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
  • 72. 带有EXISTS谓词的子查询 思路分析: 本查询涉及Student和SC关系。 在Student中依次取每个元组的Sno值,用此值去检查SC关系。 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= '1',则取此Student.Sname送入结果关系。
  • 73. 带有EXISTS谓词的子查询 [例12] 查询所有选修了1号课程的学生姓名。 用嵌套查询 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ‘ 1 ’)
  • 74. 带有EXISTS谓词的子查询 用连接运算 SELECT Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno= '1'
  • 75. 带有EXISTS谓词的子查询 [例13] 查询没有选修1号课程的学生姓名。 SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno='1') 此例用连接运算难于实现
  • 76. 带有EXISTS谓词的子查询 不同形式的查询间的替换 一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。
  • 77. 带有EXISTS谓词的子查询(续)例:[例7]查询与“刘晨”在同一个系学习的学生。可以用带EXISTS谓词的子查询替换: SELECT Sno,Sname,Sdept FROM Student S1 WHERE EXISTS   SELECT * FROM Student S2 WHERE S2.Sdept = S1.Sdept AND S2.Sname = '刘晨'
  • 78. 数 据 更 新 1 插入数据 2 修改数据 3 删除数据
  • 79. 插入数据两种插入数据方式 插入单个元组 插入子查询结果
  • 80. 1. 插入单个元组语句格式 INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)] VALUES (<常量1> [,<常量2>] … ) 功能 将新元组插入指定表中。
  • 81. 插入单个元组 [例1] 将一个新学生记录 (学号:95020;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。 INSERT INTO Student VALUES ('95020','陈冬','男','IS',18)
  • 82. 插入单个元组 [例2] 插入一条选课记录( '95020','1 ')。 INSERT INTO SC(Sno,Cno) VALUES ('95020 ','1') 新插入的记录在Grade列上取空值
  • 83. 插入单个元组 INTO子句 指定要插入数据的表名及属性列 属性列的顺序可与表定义中的顺序不一致 没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致 指定部分属性列:插入的元组在其余属性列上取空值 VALUES子句 提供的值必须与INTO子句匹配 值的个数 值的类型
  • 84. 2. 插入子查询结果语句格式 INSERT INTO <表名> [(<属性列1> [,<属性列2>… )] 子查询 功能 将子查询结果插入指定表中
  • 85. 插入子查询结果 [例3] 对每一个系,求学生的平均年龄,并把结果存入数据库。 第一步:建表 CREATE TABLE Deptage (Sdept CHAR(15) Avgage SMALLINT)
  • 86. 插入子查询结果 第二步:插入数据 INSERT INTO Deptage(Sdept,Avgage) SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept
  • 87. 插入子查询结果 INTO子句(与插入单条元组类似) 指定要插入数据的表名及属性列 属性列的顺序可与表定义中的顺序不一致 没有指定属性列:表示要插入的是一条完整的元组 指定部分属性列:插入的元组在其余属性列上取空值 子查询 SELECT子句目标列必须与INTO子句匹配 值的个数 值的类型
  • 88. 2 修改数据语句格式 UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式>]… [WHERE <条件>] 功能 修改指定表中满足WHERE子句条件的元组
  • 89. 修改数据 三种修改方式 修改某一个元组的值 修改多个元组的值 带子查询的修改语句
  • 90. 1. 修改某一个元组的值 [例4] 将学生95001的年龄改为22岁。 UPDATE Student SET Sage=22 WHERE Sno='95001'
  • 91. 2. 修改多个元组的值 [例5] 将所有学生的年龄增加1岁。 UPDATE Student SET Sage= Sage+1
  • 92. 修改多个元组的值 [例6] 将信息系所有学生的年龄增加1岁。 UPDATE Student SET Sage= Sage+1 WHERE Sdept='IS'
  • 93. 3. 带子查询的修改语句 [例7] 将计算机科学系全体学生的成绩置零。 UPDATE SC SET Grade=0 WHERE 'CS'= (SELETE Sdept FROM Student WHERE Student.Sno = SC.Sno)
  • 94. 修改数据 SET子句 指定修改方式 要修改的列 修改后取值 WHERE子句 指定要修改的元组 缺省表示要修改表中的所有元组
  • 95. 3 删除数据 DELETE FROM <表名> [WHERE <条件>] 功能 删除指定表中满足WHERE子句条件的元组 WHERE子句 指定要删除的元组 缺省表示要修改表中的所有元组
  • 96. 删除数据 三种删除方式 删除某一个元组的值 删除多个元组的值 带子查询的删除语句
  • 97. 1. 删除某一个元组的值[例8] 删除学号为95019的学生记录。 DELETE FROM Student WHERE Sno='95019'
  • 98. 2. 删除多个元组的值[例9] 删除2号课程的所有选课记录。 DELETE FROM SC WHERE Cno='2' [例10] 删除所有的学生选课记录。 DELETE FROM SC
  • 99. 3. 带子查询的删除语句[例11] 删除计算机科学系所有学生的选课记录。 DELETE FROM SC WHERE 'CS'= (SELETE Sdept FROM Student WHERE Student.Sno=SC.Sno)
  • 100. Sybase视图 视图是查看一张或几张表中的数据的一种方式。通过将一张或几张表中的一部分数据进行组合得到视图。 视图看上去与表非常相像,但与表还是有着本质的区别。通过视图看到的数据实际上都是存放在表中的,在数据库中仅存在视图的定义。 视图的优点:可以使用视图来关注、简化和自定义每个用户查看数据库的效果;同时,视图还提供了一种便于使用的安全措施。对数据库的结构进行了更改,但用户都愿意使用他们已习惯的数据库结构时,视图也非常有用。 可以使用视图来: ● 关注每个用户感兴趣的数据和该用户所承担的任务。用户不感兴趣的数据可以从视图中省略。 ● 将常用的连接、投影和选择定义为视图,这样在每次操作该数据时,用户就不需要指定所有的条件和限制。 ● 为不同的用户显示不同的数据(即使他们同时使用同一数据)。
  • 101. 视图定义: 格式: 视图示例: ·建立信息系学生的视图 提示:CREATE VIEW IS_Student AS SELECT Sno , Sname ,Sage FROM Student WHERE Sdept = 'IS' ;CREATE VIEW 视图名称 AS 子查询 ;
  • 102. 使用建立好的视图 结果SELECT * FROM IS_Student ;
  • 103. 数据类型 Adaptive Server提供了几种系统数据类型和用户-定义的数据类型timestamp、sysname和longsysname。下表列出了Adaptive Server数据类型的种类。类别用于精确数值数据类型必须确切表示的数值 (整数和带有小数部分的数)近似数值数据类型在算术运算中允许舍入的数字数据money 数据类型货币数据Timestamp 数据类型在 Client-Library™ 应用程序中浏览的表
  • 104. 日期和时间数据类型日期和时间信息字符数据类型含有字母、数字和符号的字符串二进制数据类型原始二进制数据,例如图片,类似十六进制的符号bit 数据类型真 /假和是/ 否类型的数据sysname 和 longsysname 数据 类型系统表text、 image 和 unitext 数据 类型可打印字符或十六进制式数据,它需要的列大小超出了服务器的 逻辑页大小所提供的最大列大小。抽象数据类型Adaptive Server 通过 Java 类支持抽象数据类型。有关详细 信息,请参见 Adaptive Server Enterprise 中的 Java。用户定义的数据类型定义继承了此表所列数据类型的规则、缺省值、空值类 型、 IDENTITY 属性和基本数据类型的对象。如果客户 端使用不同的字符集,text 会进行字符集转换,而 image 则不会。
  • 105. 范围和存储大小 Adaptive Server 允许将大写或小写字符用于系统数据类型, 但数据类型是用小写字符输出的。用户定义的数据类型(例如 timestamp)是区分大小写的。 Adaptive Server 提供的大多数数据类型都不是保留字,并且可以用于命名其它对象。 Adaptive Server 系统数据类型
  • 106. (本页无文本内容)
  • 107. 数据类型的转换 隐式转换:许多由一种数据类型到另一种数据类型的转换都是由 Adaptive Server 自动处理的。这些转换称作隐式转换。 显示转换:必须使用 convert、hextoint、inttohex、hextobigint 和 biginttohex 函数显式执行的转换。 固定长度的 NULL 列的自动转换 只有具有可变长度的数据类型的列才能存储空值。当创建具有固定长度的数据类型的 NULL 列时,Adaptive Server 会自动将其转换为相应的可变长度的数据类型。Adaptive Server 不会告诉用户数据类型有更改。 某些可变长度的数据类型(例如,moneyn)是保留的数 据类型;不能使用它们来创建列、变量或参数
  • 108. 固定长度的数据类型的自动转换原始的固定长度的数据类型转换为charvarchar unicharunivarcharncharnvarcharbinary varbinarydatetimedatetimndatedatentimetimenfloat floatnbigint、int、 smallint 和 tinyintintn unsigned bigint、unsigned int 和 unsigned smallintuintndecimal decimalnnumericnumericnmoney 和 smallmoneymoneyn
  • 109. 数据类型转换函数 数据类型转换函数将表达式从一种数据类型更改为另一种数据类型,并为 date 和 time 信息指定新的显示格式。数据类型转 换函数包括: • cast • convert • inttohex • hextoint • hextobigint • biginttohex • str 您可以在选择列表、where clause 以及允许使用表达式的任何地方使用数据类型转换函数。
  • 110. 显式、隐式和不支持的数据类型转换
  • 111. • E — 需要进行显式数据类型转换。 • I — 既可以隐式地进行转换,也可以使用显式数据类型转 换函数来转换。 • I/E — 当存在精度或标度损失且打开 了arithabortnumeric_truncation 时,需要显式数据类 型转换函数;其它情况下则允许隐式转换。 • U — 不支持的转换。 • — 将某个数据类型转换为其本身。这些转换虽然可以进行, 但毫无意义。
  • 112. 游标 一个游标一次访问SQL select 语句结果中的一行或多行。使用游标可以修改或删除单独的行或一组行。 sybase游标使用方法      1、DECLARE CUR_ACCTINFO CURSOR FOR SELECT ..... (定义)      2、OPEN CUR_ACCTINFO                            (打开)      3、WHILE @@SQLSTATUS = 0                         (判断是否成功)           BEGIN                4、       FETCH CUR_ACCTINFO INTO   .......     (取数据)       IF @@SQLSTATUS   <>; 0          begin                    ......           end                 ...........     5、CLOSE CUR_ACCTINFO             (关闭)    6、DEALLOCATE   CURSOR CUR_ACCTINFO   (释放)
  • 113. 使用 declare student_crsr cursor for SELECT * FROM dbo.Student go open student_crsr fetch student_crsr fetch student_crsr fetch student_crsr close student_crsr DEALLOCATE CURSOR student_crsr
  • 114. 显示
  • 115. 触发器 触发器是在表中插入、删除或更新数据时起作用的存储过程。可以使用触发器执行多种自动操作,例如,对相关表进行级联更改,强制实施列限制,比较数据修改的结果和维护数据库中数据的参照完整性。 Create trigger语法 create trigger [owner.]trigger_name on [owner.]table_name for {insert,update} as [if update (column_name) [{and | or} update(column_name)]…] SQL_statements [if update (column_name) [{and | or} update(column_name)]… SQL_statements]…
  • 116. 创建触发器 create trigger del_student on Student for delete as begin rollback transaction print “You cannot delete any student!” end 显示
  • 117. 验证触发器 delete FROM dbo.Student where Sno='200215125' 显示