经济文库 - 千万精品文档,你想要的都能搜到,下载即用。

数据库系统前半部分知识梳理 2018.pdf

黑人Rap$55 页 1.039 MB 访问 1842.97下载文档
数据库系统前半部分知识梳理 2018.pdf数据库系统前半部分知识梳理 2018.pdf数据库系统前半部分知识梳理 2018.pdf数据库系统前半部分知识梳理 2018.pdf数据库系统前半部分知识梳理 2018.pdf数据库系统前半部分知识梳理 2018.pdf
当前文档共55页 2.97
下载后继续阅读

数据库系统前半部分知识梳理 2018.pdf

第四部分 数据库系统 前半部分知识梳理 • 信息科学与工程学院 • 杨金民 • 2018.10 目录提纲 1. 关系数据模型的本质; 2. 主键、外键约束; 3. 子查询、分组、联接; 4. 外联接的表达; 5. 输出字段; 信息系统架构 浏览器 HTML HTTP //1) 加载数据库访问驱动程序: Class.forName("com.mysql.jdbc.Driver"); //2) 建立与数据库的链接: Connection connection = DriverManager.getConnection( "jdbc:mysql:// 192.168.105.100:3306/education","root","admin"); Web 服务器 应用1 应用2 应用3 ODBC/JDBC 对接 驱动程序 SQL 数据库服务器 DBMS 1 Database 1 数据库特性,对数据库的访问 SQL SQL result •DBMS 完整性,简单性,安全性,正确 性,高效性, 联系:外键 1 3 2 4 The collection of relations Schema Data Database 系统可靠性的体现 程序的鲁棒性: 1)函数调用是否成功; 2)结果是否为空; 3)不为空时,才允许读结果; 数据的正确性; 完整性; 安全性; 操作的简单性; 数据处理的高效性; 系统的可维护性:系统的模块化,层次化, 接口的标准化:邦联性,可组合性; 关系型数据库的特点 概念层面 类 推理 归纳 类的实例 表现层面 表的模式(Schema) 表的数据(data) 一个类对应一张表 一行数据对应一个实例 一张表对应一个类 一个实例对应一行数据 回答了数据的单位概念,数据的量的概念 一个数据只存一份 6 数据的区分概念? 表的特点:从列来看,即从类的概念来看,凡是要用到的属性, 都要包含; 从行来看,所有实例对象都在表中; Student Name studentNo sex nation dept_no birthday phone 周山 2008043101 男 汉 420 2000/12/01 15107312332 汪兵 2008043214 女 回 420 1998/06/12 15116247890 刘军 2009043331 男 藏 410 1998/08/01 139073196999 张珊 2009043332 女 藏 410 1998/09/09 139073196967 Name studentNo sex nation dept_no birthday phone 周山 2008043101 男 汉 420 2000/12/01 15107312332 汪兵 2008043214 女 回 420 1998/06/12 15116247890 Name studentNo 周山 2008043101 从单个用户来看,他仅只须要部分 列,部分行。 汪兵 2008043214 刘军 2009043331 张珊 2009043332 7 数据库中的表:严格按类概念,分表存储; 但是用户希望的业务表,要由分布在多个表中列组合而成; Course Student sex Name dept_no courseNo textbook syllabus Name studentNo 周山 2008043101 男 420 database 430601 数据库 introduction 汪兵 2008043214 女 420 操作系统 430803 操作统 all 张珊 2008043332 女 410 java 430317 语言 section Enroll studentNo courseNo semester class grade 2008043332 430803 2010/01 A 90 2008043101 430803 2009/01 A 56 2008043101 430317 2008/02 B 56 Name studentNo course grade 2008043332 430601 2004/02 A 77 张珊 2008043332 操作系统 90 周山 2008043101 操作系统 56 周山 2008043101 56 张珊 2008043332 database 成绩表Score java 77 8 业务表单和数据库中表的不一致性 学生表单 学院名称:软件学院 学院编号:01 地址:湖南大学软件大楼 姓名 周强 学号 2008043101 性别 出生日期 男 1990/12/14 汪涵 2008043214 男 1992/02/21 张珊 2008043332 女 1988/07/09 刘丽 2008043315 女 1988/01/29 院长:林亚平 该表单包含的信息: 学生信息; 学院信息; 糟糕的数据组织形式 student-department Name studentNo sex birthdate deptName deptNo deptDean Address 张强 2008043101 男 1990/12/14 信科学院 01 李肯立 软件大楼 汪涵 2008043214 女 1992/02/21 金融学院 03 杨胜刚 红叶楼 张珊 2008043332 女 1988/07/09 会计学院 04 黄立红 逸夫楼 刘丽 2008043315 女 1988/01/29 会计学院 04 黄立红 逸夫楼 李娜 2008043358 女 1988/11/13 信科学院 01 李肯立 软件大楼 张军 2008043375 男 1988/09/09 信科学院 01 李肯立 软件大楼 谢莎 2008043398 女 1988/09/09 信科学院 01 李肯立 软件大楼 问题1:数据冗余问题——1:多关系 student-department Name studentNo sex birthdate deptName deptNo deptDean Address 周强 2008043101 男 1990/12/14 信科学院 01 李肯立 软件大楼 汪涵 2008043214 女 1992/02/21 金融学院 03 杨胜刚 红叶楼 张珊 2008043332 女 1988/07/09 会计学院 04 黄立红 逸夫楼 刘丽 2008043315 女 1988/01/29 会计学院 04 黄立红 逸夫楼 李娜 2008043358 女 1988/11/13 信科学院 01 李肯立 软件大楼 张军 2008043375 男 1988/09/09 信科学院 01 李肯立 软件大楼 谢莎 2008043398 女 1988/09/09 信科学院 01 李肯立 软件大楼 问题:1) 数据冗余问题:例如,信科学院数据多个地方重复; 问题2:无形中的数据丢失 student-department Name studentNo sex birthdate deptName deptNo deptDean Address 周强 2008043101 男 1990/12/14 信科学院 01 林亚平 软件大楼 汪涵 2008043214 女 1992/02/21 金融学院 03 杨胜刚 红叶楼 张珊 2008043332 女 1988/07/09 会计学院 04 黄立红 逸夫楼 刘丽 2008043315 女 1988/01/29 信科学院 01 林亚平 软件大楼 李娜 2008043358 女 1988/11/13 信科学院 01 林亚平 软件大楼 张军 2008043375 男 1988/09/09 会计学院 04 黄立红 逸夫楼 谢莎 2008043398 女 1988/09/09 信科学院 01 林亚平 软件大楼 问题: 2) 删除问题:例如,删除一个学院信息时,附带也把其 学生信息也删除了; 问题3:数据添加被抵制 student-department Name studentNo sex birthdate 周强 2008043101 男 1990/12/14 汪涵 2008043214 女 张珊 2008043332 刘丽 deptName deptNo deptDean Address 信科学院 01 林亚平 软件大楼 1992/02/21 金融学院 03 杨胜刚 红叶楼 女 1988/07/09 会计学院 04 黄立红 逸夫楼 2008043315 女 1988/01/29 会计学院 04 黄立红 逸夫楼 李娜 2008043358 女 1988/11/13 信科学院 01 林亚平 软件大楼 张军 2008043375 男 1988/09/09 信科学院 01 林亚平 软件大楼 谢莎 2008043398 女 1988/09/09 信科学院 01 林亚平 软件大楼 量子计算学院 59 毛先进 ******* 问题:3) 插入问题:例如,新建一个学院信息时,由于还 没有学生,出现插入不成功的问题; 问题4:数据不一致 student-department Name studentNo sex birthdate 周强 2008043101 男 1990/12/14 汪涵 2008043214 女 张珊 2008043332 刘丽 deptName deptNo deptDean Address 信科学院 01 李肯立 软件大楼 1992/02/21 金融学院 03 杨胜刚 红叶楼 女 1988/07/09 会计学院 04 黄立红 逸夫楼 2008043315 女 1988/01/29 会计学院 04 黄立红 逸夫楼 李娜 2008043358 女 1988/11/13 信科学院 01 李仁发 软件大楼 张军 2008043375 男 1988/09/09 信科学院 01 李仁发 软件大楼 谢莎 2008043398 女 1988/09/09 信科学院 01 李仁发 软件大楼 问题:4) 修改问题:例如,修改信科学院的院长时, 要修改多行记录,而不是一条记录; 问题5:数据结果错误 student-department Name studentNo sex birthdate 周强 2008043101 男 1990/12/14 汪涵 2008043214 女 张珊 2008043332 刘丽 deptName deptNo deptDean Address 软件学院 01 林亚平 软件大楼 1992/02/21 金融学院 03 杨胜刚 红叶楼 女 1988/07/09 会计学院 04 黄立红 逸夫楼 2008043315 女 1988/01/29 会计学院 04 黄立红 逸夫楼 李娜 2008043358 女 1988/11/13 软件学院 01 林亚平 软件大楼 张军 2008043375 男 1988/09/09 软件学院 01 林亚平 软件大楼 谢莎 2008043398 女 1988/09/09 软件学院 01 林亚平 软件大楼 问题: 5) 统计问题:例如,统计有多少个学院时,由于信息 重复出现使得统计困难; 解决问题的办法——严格按类分表存储 student department Name studentNo sex birthdate deptNo 周强 2008043101 男 1990/12/14 01 软件学院 汪涵 2008043214 女 1992/02/21 03 金融学院 张珊 2008043332 女 1988/07/09 04 刘丽 2008043315 女 1988/01/29 04 李娜 2008043358 女 1988/11/13 01 张军 2008043375 男 1988/09/09 01 谢莎 2008043398 女 1988/09/09 01 deptName deptNo 会计学院 引用 上述5种问题全部自然消失; 01 03 04 Dean Address 林亚平 软件大楼 杨胜刚 红叶楼 黄立红 逸夫楼 业务表单(一):综合信息 课程名称:数据库系统 学 课程编号:CS05069 期:2018/01 该表单包含的信息: 学生信息; 姓名 学号 成绩 周强 2016043101 78 汪涵 2016043214 65 张珊 2016043332 81 刘丽 2016043315 92 课程信息; 老师信息; 学生选课信息; 教师教课信息; 上课老师:杨金民 业务表单(二):综合信息 学院:信息科学与工程学院 学生姓名:张三 该表单包含的信息: 学号:20152406311 学生信息; 课程名称 课程编号 成绩 学分 数据库系统 CS05069 78 3 程序设计 CS05056 65 2 信息检索 CS05041 81 1 计算机网络 CS05075 92 2 课程信息; 学院信息; 学生选课信息; 不同表中记录之间的关系 teacher Name staffNo sex birthdate deptNo department 李肯立 101 男 1990/12/14 01 deptName deptNo 李娜 758 女 1988/11/13 01 谢莎 498 软件学院 女 1988/09/09 01 杨胜刚 214 男 1992/02/21 03 刘丽 315 女 1988/01/29 04 张军 175 男 1988/09/09 01 黄立红 332 女 1988/07/09 04 Dean Address 01 101 软件大楼 金融学院 03 214 红叶楼 会计学院 04 332 逸夫楼 1:1关系:一个院系对应一个院长,一个院长对应一个学院; 不同表中记录之间的关系 teacher Name staffNo sex birthdate deptNo 林亚平 101 男 1990/12/14 01 李娜 758 女 1988/11/13 01 谢莎 498 女 1988/09/09 杨胜刚 214 男 刘丽 315 张军 黄立红 department deptName deptNo DeanNo Address 软件学院 01 101 软件大楼 01 金融学院 03 214 红叶楼 1992/02/21 03 会计学院 04 332 逸夫楼 女 1988/01/29 04 175 男 1988/09/09 01 332 女 1988/07/09 04 1:m关系:一个院系有多个教师; 不同表中记录之间的关系 student Name studentNo sex birthdate 周强 2008043101 男 汪涵 张珊 course Name courseNo textbook syllabus 1990/12/14 database 430601 数据库 introduction 2008043214 女 1992/02/21 operating system 430803 操作统 all 2008043332 女 1988/07/09 java 430317 语言 section enroll studentNo courseNo semester class_no teacherNo grade 2008043332 430803 2010/01 A 2004213 90 2008043435 430317 2009/01 A 2008019 56 2008043101 430317 2008/02 B null nul 2008043332 430007 2004/02 B 2001025 77 n:m关系:一门课程可以有多个学生来选择, 一个学生可以选择多门课程; 关系型数据库的实质 表与表之间存在联系,这就是为什么叫关系型数据库。 正是不同表中记录之间存在关系,沿着这种联系就能够把它 们综合起来,构建出想要的业务表单,满足业务需求; 数据的延伸性 Ø数据要有伸缩性。能够基于现有数据衍生出各种新的数据视图, 服务于不断发展的业务; Ø Hotel (hotelNo, name, address) Ø Room (roomNo, hotelNo, type, price) Ø Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo) Ø Guest (guestNo, name, address) • 1) 每个月的营业收入是多少? • 2)各个宾馆的入住率是多少? • 3)各种房间的入住率是多少? • 4)公司的常客是哪些人? 对主键的理解 Ø类的一个实例,在表中用一行数据来表达。主键是标识类的实 例的属性;自然也就是标识元组。 Ø外键表达类与类之间的联系,自然也表达实例之间的联系; 作业 实体表 QQ帐号表: QQAccount: UserName QQID Password birthday Sex picture nickname 游少华 372929101 Hnu123 1990/09/07 男 d.jpg 夜游神 杨子豪 372929102 372989 1991/06/06 男 12.jpg 阳光 夏雷孟德 372929103 396622 1992/01/02 女 a.bmp 梦中客 史长保 90405030 1994/12/03 男 Yj.ico 花儿红 CS2009 对主键的理解 实体表 QQ群表: QQCommunity CommunityName QQCID AdminstratorQQID picture 湖大软件院 12329101 372929101 d.jpg 长沙一中174班 12337292 372929102 12.jpg 金利来领带 12329103 372929103 a.bmp 羽毛球社区 90405123 90405030 Yj.ico 对主键的理解 QQ群中的用户表: QQCUsers 联系表:表状态的联系 QQCID QQID nickname role 12329101 372929101 掌柜的 群主 12337292 372929102 老板娘 管理员 12337292 372929103 老姜 成员 12337292 90405030 成龙老弟 成员 对主键的理解 好友表 Friend 联系表:表状态的联系 QQID FriendQQID nickname 372929101 372929101 二掌柜 372929102 372929102 老板娘 372929103 372929103 老姜 90405030 90405030 成龙 对主键的理解 5) 聊天记录表 ChatRecord QQID 联系表:因为有重复性,表事 件的联系, OppositeQQID writeTime contents Remark 372929101 122224 2011/03/01 10:30:30 372929101 277777 2011/03/03 17:30:30 文海鬼头鬼脑的! 已递交 372929101 300999 2011/04/01 07:30:30 一起去书店好不? 未递交 372929102 888888 2010/03/01 09:30:30 在线吗 做了作业吗? 已递交 已递交 对主键的理解 选课表: Enroll studentNo 2016043332 courseNo semester CS05069 2017/01 class teacherNo grade A 2004213 90 联系表:本来是表状态的的联系,但是因为 有重修现象,变成了事件 对主键的理解 排课表: Dispatch courseNo semester class period weekday turns interval class room CS05069 2017/01 A 1-16周 1-2节 单周 中楼 117 CS05069 2017/01 A 1-16周 Thursday 5-6节 每周 中楼 117 Tuesday 对主键的理解 酒店预定表: Booking hotelNo guestNo dateFrom dateTo 01 02 roomNo 2013 2018/01/12 2018/01/16 403 2004213 2018/05/05 2018/05/19 401 如果选主键为(hotelNo, guestNo, dateFrom):那么一个顾客在 一天中在某个宾馆只能预订一个房间。 如果选主键为(hotelNo, guestNo, dateFrom,roomNo):那么 一个顾客在一天中在某个宾馆就能能预订一个房间。但存在如下 问题 对主键的思考 酒店预定表: Booking hotelNo guestNo dateFrom dateTo 01 01 roomNo 2013 2018/01/12 2018/01/16 403 2004213 2018/01/12 2018/01/13 403 如果选主键为(hotelNo, guestNo, dateFrom,roomNo):那么 某个宾馆的某个房间,在某天能被多个客户预订。如上例所示。 因此选主键为(hotelNo, dateFrom,roomNo)更合适。 外联接、子查询例子 求2018年,信息学院所有老师的上课情况:输出(工号,姓名, 课程名称,课时,班号),对没有上课的老师也要包括进来。 分析: teacher(t_no, name, ..., d_no); course(c_no, name, hours, credits, ..., d_no); 两表并没有主键-外键的联系,因此不能直接做联接; 它们之间要借助teach(t_no, c_no, semester, class_no)来联接; teacher表与teach有主键-外键的联系,course与teach也有主键 -外键的联系; 外联接、子查询例子 注意:teach表中,只记录了上课的老师。 解题思路: 上课的老师:在teach表中; 没有上课的老师:所有老师 - 上课老师。 所有老师:信息学院的老师;在teacher表中 上课老师:信息学院的上课老师; 所有老师: 上课老师 + 没有上课的老师 外联接,子查询例子 SELECT t.t_no, t.name, c.name, c.hours, class_no FROM teacher AS t, teach AS t1, course AS c WHERE t.t_no=t1.t_no AND t1.c_no=c.c_no AND semester LIKE '2018%'AND t.d_no = (SELECT d_no FROMdepartment WHERE name='信息科学与工程学院' ) UNION SELECT t_no, name, NULL, NULL, NULL FROM teacher WHERE t_no NOT IN ( SELECT DISTINCT t_no FROM teach WHERE semester LIKE '2018%' AND t_no IN (SELECT t_no FROM teacher WHERE d_no = (SELECT d_no FROM department WHERE name='信息科学与工程学院' ))); 求信息学院所有老师2018年的教学工作量 SELECT t.t_no, t.name, SUM(c.hours) FROM teacher AS t, teach AS t1, course AS c WHERE t.t_no=t1.t_no AND t1.c_no=c.c_no AND semester LIKE '2018%'AND t.d_no = (SELECT d_no FROMdepartment WHERE name='信息科学与工程学院' )GROUP BY t.t_no, t.name UNION SELECT t_no, name, 0 FROM teacher WHERE t_no NOT IN ( SELECT DISTINCT t_no FROM teach WHERE semester LIKE '2018%' AND t_no IN (SELECT t_no FROM teacher WHERE d_no = (SELECT d_no FROM department WHERE name='信息科学与工程学院' ))); 随堂测试 Ø对于宾馆数据库中的如下四张表; Ø Hotel (hotelNo, name, address) Ø Room (roomNo, hotelNo, type, price) Ø Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo) Ø Guest (guestNo, name, address) • 1) 用SQL语句求出2018年10月,每个宾馆的营业收入分别是 多少? • 2018年10月是指:dateFrom LIKE ‘2018/10%’ • 一次预订的住宿天数:(dateTo - dateFrom) 随堂测试 Ø对于宾馆数据库中的如下四张表; Ø Hotel (hotelNo, name, address) Ø Room (roomNo, hotelNo, type, price) Ø Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo) Ø Guest (guestNo, name, address) • 1) 用SQL语句求出2018年10月,每个宾馆的营业收入分别是 多少? • 2018年10月是指:dateFrom LIKE ‘2018/10%’ • 一次预订的住宿天数:(dateTo - dateFrom) 随堂测试参考答案 SELECT H.hotelNo, H.name, SUM(R.price*(dateTo - dateFrom)) AS monthIncome FROM hotel AS H, booking AS B, room AS R WHERE H.hotelNo=R.hotelNo AND R.hotelNo=B.hotelNo AND R.roomNo = B.roomNo AND B.dateFrom LIKE ‘2018/10/%’ GROUP BY H.hotelNo, H.name ORDER BY H.hotelNo; 随堂测试参考答案 SELECT H.hotelNo, H.name, SUM(R.price*(dateTo - dateFrom)) AS monthIncome FROM hotel AS H, booking AS B, room AS R WHERE H.hotelNo=R.hotelNo AND R.hotelNo=B.hotelNo AND R.roomNo = B.roomNo AND B.dateFrom LIKE ‘2018/10/%’ GROUP BY H.hotelNo, H.name ORDER BY H.hotelNo; 不是主键-外键的联接没有现实意义 teacher t_no course name rank d_no 2001108 丁俊强 教授 05 数据库系统 CS0569 48 05 2005075 讲师 05 操作系统 CS0554 48 05 java CS0534 32 05 周波 Name courseNo hours d_no course NATURAL JOIN teacher Name courseNo hours d_no t_no t.name rank 数据库系统 CS0569 48 05 2001108 丁俊强 教授 操作系统 CS0554 48 05 2001108 丁俊强 教授 java CS0534 32 05 2001108 丁俊强 教授 数据库系统 CS0569 48 05 2005075 周波 讲师 操作系统 CS0554 48 05 2005075 周波 讲师 java CS0534 32 05 2005075 周波 讲师 业务规则 Ø对于宾馆数据库中的如下四张表; Ø Hotel (hotelNo, name, address) Ø Room (roomNo, hotelNo, type, price) Ø Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo) Ø Guest (guestNo, name, address) • 1) 在Booking表中,某一旅馆的某一个房间在某一天不能出现重复 预定的情况。今天是2018/10/30,某个客户想要在hotelNo为’01’ 的旅馆预定从’2018/11/10’至’2018/11/12’的一个’双人间’ 房间,请列出可供他选择的房间号 (roomNo); 2)用触发器实现订房不能出现时间重叠的业务规则约束; 从'2018/11/10’至'2018/11/12’可供预订 的双人间 SELECT roomNo FROM room WHERE hotelNo =’01’ AND type=’双人间’ AND roomNo NOT IN ( SELECT roomNo FROM booking WHERE hotelNo =’01’ AND ( dateFrom <=DATE ‘2014/04/12’ AND dateTo >=DATE ‘2014/04/10’) ); 业务规则:房间预订不允许时间重叠 应用程序访问数据库的编程接口 ODBC/JDBC 不同的机器,不同的操作系统,对数据的表达是不相同的。例 如在32位机器上,一个整数用4个Bytes存储,而在64位机器上, 一个整数用8个Bytes存储。就字符而言,也存在不同的编码方 式。 因此数据库服务器与应用程序机器之间的传递数据,须要进行 数据转换。 数据库服务器的负载重,能否把转换工作放到应用程序机器一 端呢? 正是这一问题,就引出了数据库访问驱动程序这一概念。也就 引出了ODBC和JDBC编程接口,这一国际标准。 数据库厂家为不同的平台开发不同的驱 动程序 MySQL ODBC driver for X86 Windows 32 platform MySQL ODBC driver for X86 Windows 64 platform MySQL ODBC driver for X86 LINUX 32 platform 数据库 方言 应用程序访问数据库的编程接口 ODBC/JDBC Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø //1) 加载数据库访问驱动程序: Class.forName("com.mysql.jdbc.Driver"); //2) 建立与数据库的链接: Connection connection = DriverManager.getConnection( "jdbc:mysql://192.168.105.100:3306/education","root","admin"); //3) 向数据库发送数据操作指令,响应结果放在resultSet中: Statement statement = connection.createStatement(); ResultSet rs = statement.executeQuery( "SELECT name, phone FROM student WHERE sex =’男’" ); System.out.println(“姓名 电话号码”); //4)扫描/遍历结果集: while (rs.next() ) System.out.println(rs.getString(1) + “ ” + rs.getString(2)); //5) 关闭与数据库的联接: 48 connection.close(); 系统安全——SQL注入攻击 用户名 ' OR '1' ='1 密码 登录 程序为:string sqlState= “SELECT password FROM user WHERE user_id ='” + user_name + “';” SELECT password FROM user WHERE user_id ='' OR'1' ='1'; 为了安全,不要自己拼接SQL语句 Statement statement = connection.createStatement(); string sqlState= “SELECT password FROM user WHERE user_id ='” + user_name + “';” ResultSet rs = statement.executeQuery( sqlState ); string sqlState= “SELECT password FROM user WHERE user_id =?” PrepareStatement pStmt = connection.PrepareStatement(sqlState); pStmt.setString(1, user_name); pStmt.executeQuery( sqlState ); 50 调用存储过程/函数 string sqlState= “{ call my_students(?, ?, ?) }”; CallableStatement cStmt = connection.prepareCall(sqlState); cStmt.setString(1, teacher_name); cStmt.setString(2, course_name); cStmt.setString(3, semester); ResultSet rs = cStmt.execute( sqlState ); 调用函数: string sqlState= “{ ?= call specified_student(?, ?, ?) }”; 51 存储过程(Stored procedure) 提升视图的适应性,使其通用化:上课点名清单 CREATE PROCEDURE my_students(@teacherV IN VARCHAR, @courserV IN VARCHAR, @semesterV IN VARCHAR)AS BEGIN SELECT studentNo, name, class FROM student AS S, enroll AS E, course AS C, teacher AS T WHERE S.studentNo = E.studentNo AND C.courseNo = E.courseNo AND T.teacherNo =E.teacherNo ANDC.name = @courseV AND E.semester =@semesterV AND T.name=@teacherV; END; 获取查询结果的Schema string sqlState= “{ call my_students(?, ?, ?) }”; CallableStatement cStmt = connection.prepareCall(sqlState); cStmt.setString(1, teacher_name); cStmt.setString(2, course_name); cStmt.setString(3, semester); ResultSet rs = cStmt.execute( sqlState ); ResultSetMetaData rsmd = rs.GetMetaData(); for (int i = 1; i <= rsmd.GetColumnCount(); i++) { rsmd.GetColumnName(i); rsmd.GetColumnTypeName(); } 获取数据,设置数据——每种数据类型 都有对应的函数 string sqlState= “SELECT password FROM user WHERE user_id =?” PrepareStatement pStmt = connection.PrepareStatement(sqlState); pStmt.setString(1, user_name); ResultSet rs = pStmt.executeQuery( sqlState ); while (rs.next() ) { String stu_no = rs.getString(1) ; integer score = rs.getInt(2)); } 随堂测试 Ø对于宾馆数据库中的如下四张表; Ø Hotel (hotelNo, name, address) Ø Room (roomNo, hotelNo, type, price) Ø Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo) Ø Guest (guestNo, name, address) • 1) 用触发器实现订房不能出现时间重叠的业务规则约束;

相关文章