目录
1、文件处理系统(file-processing system)的弊端(数据库系统的主要目标):
4、数据库操纵语言(Data-Manipulation Language,DML)
数据库定义语言(Data-Definition Language,DDL)
1、并运算:union运算自动去除重复。如果想保留重复用 union all
2、交运算:intersect 运算自动去除重复。如果想保留重复用 intersect all
3、差运算:except 运算自动去除重复。如果想保留重复用 except all
一、数据库系统基本概念
1、文件处理系统(file-processing system)的弊端(数据库系统的主要目标):
- 数据的冗余和不一致
- 数据访问困难
- 数据孤立:数据分散在不同文件中,检索数据困难
- 完整性问题:一致性约束处理困难。如余额必须大于0,年龄必须在某一区间
- 原子性问题
- 并发访问异常
- 安全性问题
2、数据库系统的数据抽象:
物理层、逻辑层、视图层
3、数据模型:
- 关系模型:关系模型用表的集合来表示数据与数据间的联系
- 实体-联系模型(E-R模型):现实世界由一组称作实体的基本对象以及这些对象间的联系构成。
- 基于对象的数据模型:面向对象的数据模型可以看做是E-R模型增加了封装、方法(函数)和对象标识等概念的扩展。
- 半结构化的数据模型:半结构化的数据模型允许那些相同类型的数据项含有不同属性表的数据定义。
4、数据库操纵语言(Data-Manipulation Language,DML)
数据库定义语言(Data-Definition Language,DDL)
5、一致性约束
- 域约束:取值范围
- 参照完整性:一个关系中某属性的取值在另一个关系中的某一属性集中出现。如,学生信息(表)中每个学生的学院(属性)必须是学校机构(表)中学院(属性)中的某一个。
- 断言:一个断言就是数据库需要时刻满足的某一条件。如,每学期每个学院必须开设至少5门课
- 授权:增删改查权限
二、关系模型
- 基本概念
域:对于关系的每个属性,都存在一个允许取值的集合,成为该属性的域
超码(super key)
候选码(candidate key)
主码(primary key)
外码(foreign key)
三、SQL
SQL主要内容:
1、数据库定义语言(DDL )定义、删除、修改关系
2、数据库操纵语言(DML)查询信息、插入删除修改元组
3、完整性
4、视图定义
5、事务
6、嵌入式SQL动态SQL
7、授权
样例code:
数据定义
create
create table department
( dept_name varchar(20),
building varchar(15),
budget numeric(12,2), --12位的数,小数点后保留2位
primary key (dept_name)
);
create table course
( course_id varchar(7),
title varchar(50),
dept_name varchar(20),
credits numeric(2,0),
primary key (course_id),
foreign key (dept_name) references department
);
create table instructor
( ID varchar(5),
name varchar(20) not null,
dept_name varchar(20),
salary numeric(8,2),
primary key (ID),
foreign key (dept_name) references department
);
insert
insert into instructor
values(10211,'Smith','Biology',66000);
delete/drop
delete from student; --从student关系中删除所有元组
drop table student; --删除student关系
alter
alter table r add A D; --为关系r添加属性 A为待添加属性名字 D为待添加属性的域
alter table r drop A; --从关系r中删除属性
单关系查询
select name
from instructor;
--强行删除重复
select distinct dept_name
from instructor;
--强行显示重复
select all dept_name
from instructor;
select ID,name,dept_name,salary*1.1
from instructor;
select name
from instructor
where dept_name = 'Comp.Sci' and salary >70000;
--where 语句中可使用 and or not
多关系查询
select name,instructor.dept_name,building
from instructor,department
where instructor.dept_name=department.dept_name
/*
这里的表是叉乘关系
相当于
for each 元组 t1 in 关系 r1
for each 元组 t2 in 关系 r2
...
for each 元组 tm in 关系 rm
把t1,t2,...,rm连接成单个元组t
把t加入结果集中
*/
自然连接
自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对
select name,course_id
from instructor,teaches
where instructor.ID = teacher.ID
--等价于
select name,course_id
from instructor natural join teaches;
select name,title
from (instructor natural join teaches) join course using (course_id );
附加基本运算
select name as T.name,id as S.course_id
from instructor as T,teaches as S
where T.ID=S.ID
upper(s) --将字符串转换为大写
lower(s) --将字符串转换为小写
trim(s) --去掉字符串后面的空格
like 模式匹配
% --匹配任意字符串
_ --匹配一个字符
select dept_name
from department
where building like '%Watson%';
like 'ab\%cd%' escape '\' --匹配所有以“ab%cd开头的字符串”
select instructor.*
from instructor,teaches
where instructor.ID=teaches.ID
select *
from instructor
order by salary desc,name asc; --按薪水降序、按名字升序
select name
from instructor
where salary between 90000 and 100000
集合运算
1、并运算:union运算自动去除重复。如果想保留重复用 union all
(
select course_id
from section
where semester = 'Fall' and year = 2009
)
union
(
select course_id
from section
where semester = 'Spring' and year = 2010
);
2、交运算:intersect 运算自动去除重复。如果想保留重复用 intersect all
3、差运算:except 运算自动去除重复。如果想保留重复用 except all
聚集函数
avg min max sum count
select avg(salary)
from instructor
where dept_name = 'Comp.Sci';
select count(distinct ID)
from teachers
where semester = 'Spring' and year = 2010;
group
select dept_name,avg(salary) as avg_salary
from instructor
group by dept_name;
having
用来过滤指定条件的分组
select dept_name,avg(salary) as avg_salary
from instructor
group by dept_name
having avg(salary>42000)
嵌套子查询
in / not in
select distinct course_id
from section
where semester = 'Fall' and year = 2009 and
course_id not in (
select course
from section
where semester = 'Spring' and year = 2010
);
some/all
>some至少比某一个大
>all 比所有的都大
select name
from instructor
where salary >some(
select salary
from instructor
where dept_name = 'Biology'
);
exists/not exists
unique/not unique
with
with子句提供定义临时关系(表)的方法
with max_budget(value) as
(
select max(budget)
from department
)
select budget
from department, max_budget
where department.budget=max_budget.value
数据库的修改
delete
insert
update
update instructor
set salary = salary *1.03
where salary>100000
update instructor
set salary = case
when salary <=100000 then salary*1.05
else salary * 1.03
end
四、数据库设计
五、事务管理