库的四个概念

  • 数据Data
  • 数据库Database:长期存储的大量数据集合
  • 数据库管理系统DBMS:位于用户和操作系统之间的数据管理软件
  • 数据库系统

数据管理的三个阶段

人工管理(不独立依赖程序)-文件系统(独立性差)-数据库系统

人工管理 人工管理 人工管理
不独立依赖程序 独立性差 物理,逻辑独立
面向某一应用程序 某一应用 现实世界

数据模型

现实世界→概念模型(ER图)→逻辑模型(关系表)→物理模型

ER图

  • 实体E 矩形
  • 属性 椭圆形
  • 实体联系R 菱形 1:1,1:n,n:m

数据模型

层次模型,网状模型,关系模型

层次模型

pass

网状模型

pass

关系模型

  • 关系 对应的表
  • 元组 一行
  • 属性 一列
  • 主码 key 候选码中的一个码,唯一确定一个元组

完整性

实体完整性,参照完整性,用户定义完整性

数据库结构

三模式

内模式-模式-外模式(多个)

  • 内模式:数据物理结构和存储方式
  • 模式:逻辑模式,全体逻辑结构和特征的描述,所有数据视图
  • 外模式:局部数据的逻辑结构和特征,是与某一应用有关数据逻辑表示和视图。是模式的子集

两级映射

外模式/模式 保证数据逻辑独立性

模式/内模式 保证数据物理独立性

关系三类约束

实体完整性

关系主属性不能为空

参照完整性

应该值得是关系中的外键

可以为空值,或者为某个元组的主码

用户定义完整性

针对性的约束,反应某一具体应用所涉及的数据必须满足的语义要求

关系代数

并:∪
差:−
交:∩
笛卡尔积:×
选取:σ
投影:π
自然连接:⋈
除:÷

象集

理解:一个属性的一个值,对应另一个属性值的集合

x1 z1
x1 z2
x1 z3
x2 z2
x2 z3

x1的象集 {z1,z2,z3}

x2的象集{z2,z3}

R∪S

RS都具有相同数量n的属性

R

A B
a1 b2
a2 b2

S

A B
a3 b1
a2 b2

R∪S

A B
a1 b2
a2 b2
a3 b1

R-S=R-R∩S

A B
a1 b2

R∩S

A B
a2 b2

笛卡尔积

R×S

R.A R.B S.A S.B
a1 b2 a3 b1
a1 b2 a2 b2
a2 b2 a3 b1
a2 b2 a2 b2

选择

选择关系中的某一行

σA=a2 (R)

A B
a2 b2

投影

选择关系中的某一列

πA(R)

A
a1
a2

连接

R

A B C
a1 b1 5
a1 b2 6
a2 b3 8
a2 b4 12

S

B E
b1 3
b2 7
b3 10
b3 2
b5 2

等值连接

R⋈S(R.B=S.B)

A R.B C S.B E
a1 b1 5 b1 3
a1 b2 6 b2 7
a2 b3 8 b3 10
a2 b3 12 b3 2

自然连接

R⋈S

A B C E
a1 b1 5 3
a1 b2 6 7
a2 b3 8 10
a2 b3 12 2

外连接

A B C E
a1 b1 5 3
a1 b2 6 7
a2 b3 8 10
a2 b4 8 2
a2 b4 12 NULL
NULL b5 NULL 2

左外连接

同属性,以左边为基本,右边没有的填null

A B C E
a1 b1 5 3
a1 b2 6 7
a2 b3 8 10
a2 b3 8 2
a2 b4 12 NULL

右外连接

A B C E
a1 b1 5 3
a1 b2 6 7
a2 b3 8 10
a2 b3 8 2
NULL b5 null 2

就是象集包含另外一个关系的全部就。。。

举个栗子吧

R

A B
2 4
3 1
3 3

S

B
1
3

R÷S

A
3

SQL

SQL功能 动词
数据查询 SELECT
数据定义 CREATE,DROP,ALTER
数据操纵 INSERT,UPDATE,DELETE
数据控制 GRANT,REMOVE

数据定义

对象 创建 删除 修改
模式(数据库) create schema(database) drop schema(database)
create table drop table alter table
视图 create view drop view
索引 create index drop index alter index

student

1
2
3
4
5
6
7
create table student(
sno char(9) primary key,
sname cahr(20) unique,
ssex char(2),
sage smallint,
sdept char(20)
);

course

1
2
3
4
5
6
7
create table course(
cno char(4) primary key,
cname char(40),
cpno char(4),
ccredit smallint,
foreign key(cpno) references course(cno)
);

sc

1
2
3
4
5
6
7
8
create table sc(
sno char(9),
cno cahr(4),
grade smallint,
primary key(sno,cno),
foreign key(sno) references student(sno),
foreign key(cno) references course(cno)
);

修改表/删除表

1
2
3
4
5
alter table student alter column sage int;
alter table course add unique(cname);
--
drop table student restrict 有限制的删除,有约束依赖就删不了
drop table student cascade 删除该表没有限制,相关依赖一起删

索引

create[unique] [cluster] index <索引名> on student(sno)

1
2
3
create unique index stusno on student(sno);
create unique index scno on sc(sno asc,cno desc);
drop index<索引名>

查询

  • select语句:指定要显示的属性列
  • from:指定查询的对象(表,视图)
  • where:指定查询条件
  • group by:对查询结果分组
  • having:只有满足指定条件组才会输出
  • order by:对查询列值 升序,或降序

select单表查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
--等价于选择全部 select *
select sno,sname,ssex 性别,sage ,sdept
from student;

-- 属性后面空格加一个名字就可以改名
select ssex 性别
from student;

--distinct取消重复值,缺少则all
select sno
from student;

--谓词BETWEEN...AND...,NOT BETWEEN... ADN..
--查询年龄在20到30之间的学生name
select sname,sage
from student
where sage between 20 and 30;

--IN<值表>,NOT IN<值表>
--查找学生是cs系或ma系的学生
select sname
from student
where sdept in ('cs','ma');

-- 字符串like匹配
where sno like '201215121';
-- 等价
where sno='201215121';
--%匹配多个,比如刘马,刘马牛
where sname like '刘%';
-- _ 匹配一个,比如 刘马,刘牛
where sname like '牛_';
--查询空值
where sname is null;
--order排序默认是升序 ASC,DESC
select *
from student
order by sanme,sage desc; -- 名字升序,年龄降序

举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 查询学生总人数
select count(*)
from student;
-- 查询选修了课程的学生人数
select count(distinct sno)
from sc;
-- 查询一号课程的学生平均成绩
select avg(grade)
from sc
where cno='1';
-- 查询一号课程的最高分数
select max(grade)
from sc
where cno='1';

group by

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--- 查询各课程选课人数
select cno,count(sno)
from sc
group by cno;
-- 查询选修三门课以上的学生
select sno
from sc
group by sno
having count(*)>3;
-- 查询平均成绩大于等于90分的学号和平均成绩
select sno,avg(grade)
from sc
where avg(grade)>=90
group by sno;

-- 列出计算机刘同学的信息,按学号排序,对字符串用like
select *
from student
where sname like'刘%' and sdept='cs'
order by sno;

select sdept,ssex,count(sno)
from student
group by sdept,ssex
order by count(sno) desc;

连接查询

等值连接,非等值连接

1
2
3
4
-- 多表查询,相当于等值连接
slelct student.ano,sname
from student,sc
where student.sno=sc.sno;

自连接

1
2
3
4
-- 查询每一门课的课程名,和先修课名称
select first.cname,second.cname
from course first,course second
where first.cpno=second.cno;