第一章:绪论
第二章:关系型数据库
1、一些概念
关系:实体与实体之间的联系(可以看做一张二维表)、
候选码:若关系中的一个属性或属性组的值能够唯一地标识一个元组,且他的真子集不能唯一的标识一个元组,则称这个属性或属性组做候选码。
主码:若一个关系有多个候选码,则选定其中一个为主码
主属性:候选码的各个属性成为主属性
全码:表中的所有属性都是这个表的候选码,则称为全码
外键(外码):如果公共关键字在一个关系中是主键,那么这个公共关键字被称为另一个关系的外键。
关系三种类型:①基本表(基本关系)②查询表③视图表
关系模式:关系的描述称为关系模式(即为表头)
2、关系完整性
- 实体完整性:实体完整性要求每个数据表都必须有主键,而作为主键的所有字段,其属性必须是独一及非空值。
- 参照完整性:参照的关系中的属性值必须能够在被参照关系找到或者取空值
- 用户定义完整性
3、列级完整性约束和表级完整性约束
列级约束有六种:Primary key(主键)、foreign key(外键) 、 unique(唯一)、 check (检查)、default (默认)、not null/ null(非空/空值 )
表级约束有四种:Primary key(主键)、foreign key(外键) 、 unique(唯一)、 check (检查)
只能是列级完整性约束:default (默认)、not null/ null(非空/空值 )
第三章:SQL语句
1、数据类型
2、基本表的定义、修改与删除
基本操作语句
表的定义
create table student (
列名 数据类型 列级完整性约束
sno char(9) unique,
ssex char(2),
primary KEY(sno),
foreing key(sno) refferences student(sno)
);
表的修改
[]:可以出现,可以不出现
<>:一定会出现 drop
是删除
注:上述
表的删除
3、数据查询
数据查询是数据库的核心操作
查询的一般格式(块)为:
select 目标列表达式
from 表明或视图名
where 条件表达式
group by 列名 having 选择组的条件
order by 列名 asc/desc(升降序)
执行顺序为:from→where→select
一、单表查询:
选择表中的若干列
(1)查询指定列
select Sname,Sno,Sdept from Student;
(2)查询所有列
select * from Student;
(3)查询经过计算的值
select语句中的目标表达式可以是表中的属性列,也可以是表达式,还可以是字符串常量、函数等
例:查询全体学生的姓名及其出生年份
select Sname,'Year of Birth' birth,2021-Sage /*当前年份-年龄*/ from Student;
输出结果为:
Sname birth 2021-Sage 李勇 Year of Birth 1994 李晨 Year of Birth 1995 注意:上方代码块中的
'Year of Birth' birth
表示将’Year of Birth’列命名为birth,中间用空格号分隔开选择表中的若干元组
(1)消除取值重复的行
distinct:消除取值重复的行 select distinct Sno
若没有指定distinct
关键字则默认为all
(2)查询满足条件的元组
where:查询满足条件的元组
①比较大小
where Sdept='cs'
where Sage<20
②确定范围
where Sage between 20 and 23
③确定集合
where Sedpt in('CS','MA','IS')
④字符分配
%:代表任意长度(可以为0)的字符串。
_:代表任意单个字符
where Sname like'_阳%'(查询第二个字为阳的学生)
⑤涉及空值的查询
where Grade is null
⑥多充条件查询
使用 and 或者 or,通常 and的优先级高于 or,可以使用括号改变优先级
where Sdept='CS'and Sage<20
注:实际上 in是多个 or运算符的缩写
3.order by语句
升序:ASC
降序:DESC
默认为升序
例:查询结果按所在的系的系号升序排列,同一系中的学生按年龄降序排列:
order by Sdept,Sage desc
- 聚集函数
查询学生总人数:select count(distinct Sno)
计算平均成绩:select avg(Grade)
- group by 语句
group by子句将查询结果按某一列或多列的值分组,值相等的为一组。
求各个课程号及相应选课人数
select Con,count(Sno)
from sc
group by Con
***查询选修了三门以上课程的学生学号
select Sno
from sc
group by Sno
having count()
***求选课在三门以上(包括三门)且各门课程均及格的学生的学号及其总成绩,查询结果按总成绩降序列出
select sno,sum(score)
from sc
where score>=60
group by sno
having count(*)>=3
order by sum(score)desc
执行过程:
1.from 取出整个sc
2.where 筛选score>=60的元组
3.group by 将选出的元组按sno分组
4.having 筛选选课三门以上的分组
5.select 将选中的组中提取学号和总成绩
6.order by 将选取结果排序
先用where语句查询效率更高,如果直接用group则将会在sc表中的所有元组进行分组,若先用where则group将在筛选出来的元组中进行分组,提高了查询效率。
执行顺序为:where→group by→having
辨析:where作用于基本表或者视图,having作用于组
二、连接查询
1.等值于非等值连接查询
where student.sno = sc.sno
以上比较运算符‘ = ’可以有:=、>、<、>=、<=
此时连接查询的where句子用来连接两个表的条件称为连接条件或者*连接谓词
*连接谓词中的列名称为连接字段(student.sno)
2.自身连接
3.外连接
定义:有时想以学生标student为主体,列出每个学生的基本情况及选课情况,如果某个学生没有选课,仍把该学生的记录留在结果关系中,而在sc表中的属性值加上NULL,这时就需要外连接。