55
信息科学与工程学院 杨金民 2018.10 第四部分 数据库系统 前半部分知识梳理

第四部分 数据库系统 前半部分知识梳理csee.hnu.edu.cn/Content/UploadFiles/2004213/Files/b0f6348c-2edd-… · 业务表单和数据库中表的不一致性 姓名 学号

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

  • • 信息科学与工程学院• 杨金民

    • 2018.10

    第四部分 数据库系统

    前半部分知识梳理

  • 目录提纲

    1. 关系数据模型的本质;

    2. 主键、外键约束;

    3. 子查询、分组、联接;

    4. 外联接的表达;

    5. 输出字段;

  • 信息系统架构

    Web 服务器

    浏览器

    应用1 应用2 应用3

    数据库服务器

    HTTPHTML

    SQL

    DBMS 1Database 1

    ODBC/JDBC驱动程序

    对接

    //1) 加载数据库访问驱动程序:Class.forName("com.mysql.jdbc.Driver");//2) 建立与数据库的链接:Connection connection = DriverManager.getConnection( "jdbc:mysql:// 192.168.105.100:3306/education","root","admin");

  • 数据库特性,对数据库的访问 SQL

    联系:外键

    •DBMS完整性,简单性,安全性,正确

    性,高效性,

    DatabaseSchemaData

    SQL result

    12

    3 4The collection of relations

  • 系统可靠性的体现

    程序的鲁棒性:1)函数调用是否成功;

    2)结果是否为空;

    3)不为空时,才允许读结果;

    数据的正确性; 完整性; 安全性;

    操作的简单性;

    数据处理的高效性;

    系统的可维护性:系统的模块化,层次化,

    接口的标准化:邦联性,可组合性;

  • 6

    关系型数据库的特点

    概念层面

    表现层面

    类 类的实例

    表的模式(Schema) 表的数据(data)

    一行数据对应一个实例

    推理

    归纳

    一个实例对应一行数据

    回答了数据的单位概念,数据的量的概念

    一张表对应一个类

    一个类对应一张表

    一个数据只存一份

    数据的区分概念?

  • 7

    表的特点:从列来看,即从类的概念来看,凡是要用到的属性, 都要包含; 从行来看,所有实例对象都在表中;

    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

    Student

    Name studentNo

    周山 2008043101

    汪兵 2008043214

    刘军 2009043331

    张珊 2009043332

    Name studentNo sex nation dept_no birthday phone

    周山 2008043101 男 汉 420 2000/12/01 15107312332

    汪兵 2008043214 女 回 420 1998/06/12 15116247890

    从单个用户来看,他仅只须要部分列,部分行。

  • 8

    数据库中的表:严格按类概念,分表存储;

    但是用户希望的业务表,要由分布在多个表中列组合而成;StudentName studentNo sex dept_no

    周山 2008043101 男 420

    汪兵 2008043214 女 420

    张珊 2008043332 女 410

    EnrollstudentNo courseNo semester class grade

    2008043332 430803 2010/01 A 90

    2008043101 430803 2009/01 A 56

    2008043101 430317 2008/02 B 56

    2008043332 430601 2004/02 A 77

    CourseName courseNo textbook syllabus

    database 430601 数据库 introduction

    操作系统 430803 操作统 all

    java 430317 语言 section

    Name studentNo course grade张珊 2008043332 操作系统 90

    周山 2008043101 操作系统 56

    周山 2008043101 java 56

    张珊 2008043332 database 77

    成绩表Score

  • 业务表单和数据库中表的不一致性

    姓名 学号 性别 出生日期

    周强 2008043101 男 1990/12/14

    汪涵 2008043214 男 1992/02/21

    张珊 2008043332 女 1988/07/09

    刘丽 2008043315 女 1988/01/29

    学院名称:软件学院 学院编号:01

    地址:湖南大学软件大楼

    院长:林亚平

    学生信息;学院信息;

    该表单包含的信息:

    学生表单

  • 糟糕的数据组织形式

    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 李肯立 软件大楼

    student-department

  • 问题1:数据冗余问题——1:多关系

    问题:1) 数据冗余问题:例如,信科学院数据多个地方重复;

    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 李肯立 软件大楼

    student-department

  • 问题2:无形中的数据丢失

    问题: 2) 删除问题:例如,删除一个学院信息时,附带也把其

    学生信息也删除了;

    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 林亚平 软件大楼

    student-department

  • 问题3:数据添加被抵制

    问题:3) 插入问题:例如,新建一个学院信息时,由于还

    没有学生,出现插入不成功的问题;

    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 林亚平 软件大楼

    量子计算学院 59 毛先进 *******

    student-department

  • 问题4:数据不一致

    问题:4) 修改问题:例如,修改信科学院的院长时,

    要修改多行记录,而不是一条记录;

    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 李仁发 软件大楼

    student-department

  • 问题5:数据结果错误

    问题: 5) 统计问题:例如,统计有多少个学院时,由于信息

    重复出现使得统计困难;

    student-departmentName 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 林亚平 软件大楼

  • 解决问题的办法——严格按类分表存储

    studentName 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 Dean Address

    软件学院 01 林亚平 软件大楼金融学院 03 杨胜刚 红叶楼会计学院 04 黄立红 逸夫楼

    department

    引用

    上述5种问题全部自然消失;

  • 业务表单(一):综合信息

    姓名 学号 成绩

    周强 2016043101 78

    汪涵 2016043214 65

    张珊 2016043332 81

    刘丽 2016043315 92

    课程名称:数据库系统 课程编号:CS05069

    学 期:2018/01

    上课老师:杨金民

    学生信息;

    课程信息;

    老师信息;

    学生选课信息;

    教师教课信息;

    该表单包含的信息:

  • 业务表单(二):综合信息

    课程名称 课程编号 成绩 学分

    数据库系统 CS05069 78 3

    程序设计 CS05056 65 2

    信息检索 CS05041 81 1

    计算机网络 CS05075 92 2

    学院:信息科学与工程学院

    学生姓名:张三 学号:20152406311学生信息;

    课程信息;

    学院信息;

    学生选课信息;

    该表单包含的信息:

  • 不同表中记录之间的关系

    1:1关系:一个院系对应一个院长,一个院长对应一个学院;

    Name staffNo sex birthdate deptNo

    李肯立 101 男 1990/12/14 01李娜 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

    deptName deptNo Dean Address

    软件学院 01 101 软件大楼金融学院 03 214 红叶楼会计学院 04 332 逸夫楼

    departmentteacher

  • 不同表中记录之间的关系

    1:m关系:一个院系有多个教师;

    Name staffNo sex birthdate deptNo

    林亚平 101 男 1990/12/14 01李娜 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

    deptName deptNo DeanNo Address

    软件学院 01 101 软件大楼金融学院 03 214 红叶楼会计学院 04 332 逸夫楼

    departmentteacher

  • 不同表中记录之间的关系

    n:m关系:一门课程可以有多个学生来选择, 一个学生可以选择多门课程;

    studentName studentNo sex birthdate

    周强 2008043101 男 1990/12/14汪涵 2008043214 女 1992/02/21张珊 2008043332 女 1988/07/09

    enrollstudentNo courseNo semester class_no teacherNo grade

    2008043332 430803 2010/01 A 2004213 902008043435 430317 2009/01 A 2008019 562008043101 430317 2008/02 B null nul2008043332 430007 2004/02 B 2001025 77

    Name courseNo textbook syllabus

    database 430601 数据库 introductionoperating system 430803 操作统 all

    java 430317 语言 section

    course

  • 关系型数据库的实质

    表与表之间存在联系,这就是为什么叫关系型数据库。

    正是不同表中记录之间存在关系,沿着这种联系就能够把它

    们综合起来,构建出想要的业务表单,满足业务需求;

  • 数据的延伸性

    Ø数据要有伸缩性。能够基于现有数据衍生出各种新的数据视图,服务于不断发展的业务;Ø 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 CS2009 1994/12/03 男 Yj.ico 花儿红

    实体表

  • 对主键的理解

    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 courseNo semester class teacherNo grade

    2016043332 CS05069 2017/01 A 2004213 90

  • 对主键的理解

    排课表:Dispatch

    courseNo semester class period weekday turns interval classroom

    CS05069 2017/01 A 1-16周 Tuesday 1-2节 单周 中楼117

    CS05069 2017/01 A 1-16周 Thursday 5-6节 每周 中楼117

  • 对主键的理解

    酒店预定表:BookinghotelNo guestNo dateFrom dateTo roomNo

    01 2013 2018/01/12 2018/01/16 403

    02 2004213 2018/05/05 2018/05/19 401

    如果选主键为(hotelNo, guestNo, dateFrom):那么一个顾客在一天中在某个宾馆只能预订一个房间。

    如果选主键为(hotelNo, guestNo, dateFrom,roomNo):那么一个顾客在一天中在某个宾馆就能能预订一个房间。但存在如下问题

  • 对主键的思考

    酒店预定表:BookinghotelNo guestNo dateFrom dateTo roomNo

    01 2013 2018/01/12 2018/01/16 403

    01 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.nameUNION 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;

  • 不是主键-外键的联接没有现实意义

    course NATURAL JOIN teacher

    t_no name rank d_no2001108 丁俊强 教授 052005075 周 波 讲师 05

    Name courseNo hours d_no数据库系统 CS0569 48 05操作系统 CS0554 48 05

    java CS0534 32 05

    teacher course

    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/10’)

    );

  • 业务规则:房间预订不允许时间重叠

  • 应用程序访问数据库的编程接口ODBC/JDBC

    不同的机器,不同的操作系统,对数据的表达是不相同的。例如在32位机器上,一个整数用4个Bytes存储,而在64位机器上,一个整数用8个Bytes存储。就字符而言,也存在不同的编码方式。

    因此数据库服务器与应用程序机器之间的传递数据,须要进行数据转换。

    数据库服务器的负载重,能否把转换工作放到应用程序机器一端呢?

    正是这一问题,就引出了数据库访问驱动程序这一概念。也就引出了ODBC和JDBC编程接口,这一国际标准。

  • 数据库厂家为不同的平台开发不同的驱动程序

    MySQL ODBC driverfor X86 Windows 32 platform

    MySQL ODBC driverfor X86 Windows 64 platform

    MySQL ODBC driverfor 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) 关闭与数据库的联接:Ø connection.close();

    48

  • 密码

    用户名

    系统安全——SQL注入攻击

    程序为:string sqlState= “SELECT password FROM user WHERE user_id ='” + user_name + “';”

    登录

    ' OR '1' ='1

    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 );

    50

    string sqlState= “SELECT password FROM user WHERE user_id =?”

    PrepareStatement pStmt = connection.PrepareStatement(sqlState);

    pStmt.setString(1, user_name);

    pStmt.executeQuery( sqlState );

  • 调用存储过程/函数

    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 );

    51

    调用函数:string sqlState= “{ ?= call specified_student(?, ?, ?) }”;

  • 存储过程(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

  • 获取数据,设置数据——每种数据类型都有对应的函数

    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) 用触发器实现订房不能出现时间重叠的业务规则约束;