文章目录
问题描述
一、绪论
1.1、数据库系统概述
1.1.1、数据库的4个基本概念
1.数据(Data):描述事物的符号称为数据
2.数据库(DataBase,DB):数据库是长期存储在计算机内、有组织的、可共享的大量数据集合
3.数据库管理系统(DataBase Management System,DBMS):数据库管理系统是位于用户与操作系统之间的一层数据管理软件
4.数据库系统(DataBase System,DBS):数据库系统是由数据库、数据管理系统、应用程序和数据库管理员(DataBase Administrator,DBA)组成的存储、管理、处理和维护数据的系统
1.1.2、数据管理技术的产生和发展
1.人工管理阶段
数据不保存,应用程序管理数据,数据不共享,数据不具有独立性
2.文件系统阶段
数据可以长期保存,由文件系统管理数据,数据共享性差、冗余度大,数据独立性差
3.数据库系统阶段
1.数据结构化
2.数据共享性高、冗余度低且容易扩充
3.数据独立性高(数据独立性、物理独立性、逻辑独立性)
4.数据由数据库管理系统统一管理和控制
1.2、数据模型
数据模型是对现实数据的抽象
1.2.1、两类数据模型
1.第一类是概念模型,他是按照用户的观点来对数据和信息的建模,主要用于数据库设计
2.第二类中的逻辑模型,他是按照计算机系统的观点对数据建模,主要用于数据库管理系统的实现
3.第二类中的物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方法和存取方法
1.3、数据库系统的结构
(1)实体:客观存在并可以相互区别的事物称之为实体
(2)属性:实体所具有的某一特性称为属性
(3)码:唯一标识实体的属性集称为码
(4)实体型:用实体名及其属性名集合来抽象和刻画同类实体,称为实体型
(5)实体集:同一类型实体的集合
(6)联系;实体之间的联系通常是指不同实体之间的联系
二、关系数据库
2.1、关系数据库结构及形式化定义
2.1.1、关系
- 域:域是一种具有相同数据类型的值得集合
- 笛卡尔积:是域上的一种集合运算
- 关系:
2.2、关系操作
关系模型中常用的关系操作包括查询操作和插入、删除、修改操作两大部分
选择可以分为:选择、投影、并、差、除、交、笛卡尔积等
基本操作:选择、投影、并、差、笛卡尔积
2.3、关系的完整性
- 实体完整性
- 参照完整性
- 用户定义完整性
实体完整性:若属性A是基本关系R的主属性,则A不能取空值
参照完整性:若属性F是基本关系R的外码,它与基本关系Ks的主码相对应,则对R中在每个元祖在F上的值必须:
- 或者取空值(F的每个属性值均为空)
- 或者等于S中某个元组的主码值
用户定义完整性:任何关系数据库系统都应该支持实体完整性和参照完整性
2.4、关系代数
关系代数的运算按运算符的不同成分可分为传统的集合运算和专门的集合运算两类
集合运算符:∪(并)、∩(交)、-(差)、×(笛卡尔积)
专门的关系运算符:σ(选择)、∏(投影)、∞(连接)、÷(除)
2.4.1、传统的集合运算
三、关系数据库标准语言SQL
3.1、单表查询
1.选择表中的若干列
1.查询指定列
select Sno,Sname from Student;
2.查询全部列
select*from Student;
3.查询经过计算的值
3.1、查询到同学的出生年份
select Sname,2022-Sage from student;
3.2、起别名,增加列,通过函数转换大小写
select Sname 姓名,'Brith',2022-Sage,lower(Sdept) from Student;
2.选择表中的若干元组
1.消除取值重复行
select distinct Sno from SC;
2.查询满足条件的元组
2.1、比较大小
select * from Student where Sage<20;
2.2、确定范围
select * from Student where Sage between 20 and 30;
2.3、确定集合
select * from Student where Sdept in ('CS','MA');
2.4、字符匹配
- %(百分号)代表任意长度(长度可以为0)的字符串
- _(下横线)代表任意单个字符
select * from Student where Sname like '刘%';
select * from Student where Sname like '刘_';
select * from Student where Sname not like '刘%';
select * from Student where Sname not like '刘_';
2.5、空值查询
select * from Student where Grade is null;
3.order by子句
用户可以用order by 子句对查询结果按照一个或多个属性列的升序(ASC)降序(DESC)排列,默认值升序
select * from SC order by Grade;
4.聚集函数
select count(*) from Student;
select count(Sno) from Student;
select avg(Grade) from SC;
select sum(Grade) from SC;
select max(Grade) from SC;
select min(Grade) from SC;
当聚集函数遇到空值时,除count(*)外,都跳过空值处理非空值
聚集函数只能用于select子句和group by中的having子句
5.group by分组
select Sno,count(*) from Student group by Sno;
select Sno from SC group by Sno having count(Sno)>3;
3.2、连接查询
若一个查询同时涉及两个以上的表,则称之为连接查询
1、等值与非等值连接查询
- 连接查询的where子句中用来连接两个表的条件成为连接条件或连接谓词
- 当连接运算符为=号时,称为等值连接,使用其他运算符称为非等值连接
例1、查询每个学生及其选修课程的情况
select * from Student,SC where Student.Sno=SC.Sno;
把目标列中重复的属性列去掉则为自然连接
select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade from Student,SC where Student.Sno=SC.Sno;
2、自身连接
连接操作不仅可以在两个表之间进行,也可以时一个表与自身进行连接,称之为表的自身连接
例2、查询每一门课的间接先修课(即先修课的先修课)
select first.Cno,second.Cpno from Course first,Course second where first.Cpno=second.Cno;
3、外连接
有时想以Student 表为主体列出每个学生的基本情况和选课情况。若某个学生没有选课,仍把Student的悬浮元组保存在结果关系中,而在SC表的属性上填空值NULL,这时就需要使用外连接
select * from Student left outer join SC on (Student.Sno=SC.Sno);
左外连接列出左边关系中所有元组,右外连接列出右边关系中所有的元组
4、多表连接
连接操作除了可以时两表连接、一个表与自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接。
例4、查询每个学生的学号、姓名、课程名、成绩
select Student.Sno,Sname,Cname,Grade from Student,Course,Sc where Student.Sno=SC.Sno and SC.Cno=Course.Cno;
3.3、嵌套查询
在SQL语言中,一个select-from-where 语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称为嵌套查询例如:
查询选修课程号为2的学生姓名
select Sname from Student where Sno in (select Sno from SC where Cno='2');
本例中,下层查询块 select sno from sc where cno=‘2’是嵌套在上层查询块select sname from student where sno in 的where条件中的,上层的查询块称为外查询或父查询,下层查询块称为内查询或子查询
子查询的select语句中不能使用 order by 子句,order by子句只能对最终查询结果排序
1、带有IN谓词的子查询
例1、查询与“刘晨”在同一个系学习的学生
select * from student where Sdept in (select Sdept from Student where Sname='刘晨');
本例中,子查询条件不依赖于父查询,称为不相关子查询
例2、查询选修了课程名为“信息系统”的学生学号和姓名
select Sno,Sname from Student where Sno in(select Sno from SC where Cno in (select Cno from Course where Cname='信息系统'));
2、带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户明确知道内层查询返回的是单个值时,可以用>、<、=、>=、<=、!=或<>等比较运算符
例3、找出每个学生超过他自己选修课程平均成绩的课程号
select Sno,Cno from SC x where Grade>(select avg(Grade) from SC y where y.Sno=x.Sno);
x 是表SC的别名,又称为元组变量,可以用来表示SC的一个元组,内层查询是求一个学生所有选修课平均成绩的,至于是哪个学生的平均成绩要看参数x.Sno的值,而该值是与父查询相关的,因此这类查询称为相关子查询
3、带有ANY或ALL谓词的子查询
>ANY 大于子查询结果中的某个值
>ALL 大于子查询结果中的所有值
<ANY 小于子查询结果中的某个值
<ALL 小于子查询结果中的所有值
>=ANY 大于等于子查询结果中的某个值
>=ALL 大于等于子查询结果中的所有值
<=ANY 小于等于子查询结果中的某个值
<=ALL 小于等于子查询结果中的所有值
例4、查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
select Sname,Sage from Student where Sage<ANY(select Sage from Student where Sdept='CS') and Sdept!='CS';
4、带有EXISTS谓词的子查询
EXISTS代表存在量词,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”
例5、查询所有选修了1号课程的学生姓名
select Sname from Student where exists (select * from SC where Student.Sno=SC.Sno and Cno='1');
使用存在量词exists后,若内层查询结果非空,则外层的where子句返回真值,否者返回假值
例6、查询选修了全部课程的学生姓名
SQL中没有全称量词(for all),但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词,可以将题目转换成等价的存在量词的形式:没有一门课程是他不选修的
select Sname from Student where exists (select * from Course where exists (select * from SC where SC.Sno=Student.Sno and SC.Cno=Course.Cno));
3.4、集合查询
集合操作主要包括并操作NUION、交操作INTERSERT和差操作EXCEPT
例1、查询计算机科学系的学生及年龄不大于19岁的学生
select * from Student where Sdept='CS' union select * from Student where Sage<=19;
例2、查询计算机科学系的学生与年龄不大于19岁的学生的交集
select * from Student where Sdept='CS' intersect select * from Student where Sage<=19;
这实际上就行查询计算机科学系中年龄不大于19岁的学生
select *from Student where Sdept='CS' and Sage<=19;
例2、查询计算机科学系的学生与年龄不大于19岁的学生的差集
select * from Student where Sdept='CS' except select * from Student where Sage<=19;
这实际上就行查询计算机科学系中年龄大于19岁的学生
select *from Student where Sdept='CS' and Sage>19;