数据库系统:(需要强调学习的知识点)
1. 当完整性约束条件涉及到该表的多个属性列时,则必须定义在表级上;
比如:学生选课表中:
primary key(Sno,Cno) //主码由两个属性构成,必须作为表级完整性定义
foreign key(Sno) references Student(Sno)
foreign key(Cno) references Student(Cno)
2. 修改原有的列定义
lter table 表名 alter column 列名 数据类型
其子句用来,包括修改列名和数据类型
3. 完整的数据查询语句:
select [all || distinct ] <目标列表达式>
from 表名
where 条件表达式
group by <列名1> having <条件表达式>
order by <列名2>[all || distinct]
(1)根据where 子句的条件表达式从from指定的基本表中找到满足条件的元组,再按select 子句中的目标列表达式选出元组中的属性值形成结果表
(2) 若有group by子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组,通常每组会作用聚集函数;若带有having 子句,只有满足指定条件的组才输出
(3)若有order by子句,则结果还要按列名2的值的升序(asc)或降序(desc)排序,默认升序排列
order by子句一直放在最后
4. select 子句中的<目标列表达式>不仅可以是表中的属性列,也可以是表达式
表达式可以是算术表达式,字符串常量,函数等
可以通过指定别名来改变查询结果的列标题(将原属性名和别名放在一起,以空格隔开),各个列标题以逗号隔开
where子句常用的查询条件:
比较: = > >= < <= != <> !> !<
确定范围: between and 和 not between and
确定集合: in 和 not in
字符匹配: like 和 not like (匹配串用单引号括起来,%代表任意长度,_ 代表任意单个字符)
空值: is null 和 is not null
多重条件: and or ( and优先级大于or)
5. 聚集函数
count(*) 统计元组的个数
count([all || distinct] <列名> ) 统计一列中值的个数
sum/ avg / max/ min([all || distinct] <列名>) 针对一列值
查询选修了课程的学生人数
select count(distinct Sno)//一个学生可能会选修多门课程
from SC
聚集函数只用于select 子句 和 group by 中的having 子句
6. group by子句
可以将查询结果按一列或多列的值分组,值相等的为一组;
分组的目的是细化聚集函数的作用对象,分组后的聚集函数将作用于每一个组,即每一个组都有一个函数值
若分组后还要求按一定条件对这些组进行筛选,利用having指定筛选条件
比如:查询了3门以上课程的学生学号
select Sno
from SC
group by Sno
having count(*)>3
先用group by子句按Sno进行分组,再用聚集函数count对每一组计数,having给出选择组的条件,只有元组个数>3的组才会被选出来
where子句作用于基本表或视图,从中选择满足条件的元组;having短语作用于组,从中选择满足条件的组
7.连接查询
多数是等值连接:
表名1 . 列名1 = 表名2 . 列名2
比如:
查询学号为201251012选修课程的总学分数
select sum(Ccredit)
from SC,Cource
where Sno = '201251012' and SC.Cno = Course.Cno
8. 嵌套查询
1. 带in谓词的子查询
(1)查询与“刘晨”在同一个系学习的学生
(1)确定“刘晨”所在的系的系名
(2)查询此系的学生
select Sno,Sname,Sdept
from Student
where Sdept in (
select Sdept
from Student
where Sname = '刘晨'
)
此例子中的子查询不依赖于夫查询,称为“不相关子查询”
2. 带比较运算符的子查询(当子查询的结果是单个值时)
(1)查询每个学生超过他自己选修课程平均成绩的课程号
select Sno,Cno
from SC x //x是SC的别名
where Grade >= (
select avg(Grade)
from SC y
where y.Sno = x.Sno
)
内层查询是求一个学生所有选修课程平均成绩的,至于是那个学生的平均成绩要看参数x.Sno的值,而该值是与父查询相关的,因此这类查询称为“相关子查询”
3. 带有any 或 all 谓词的子查询(当子查询的结果是多值时)
使用any 或 all时必须同时使用比较运算符
>any 大于子查询结果中的某个值(是大于结果集合中的min)>min
>all >max
<any <max
<all <min
查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生的学生姓名和年龄
select Sname , Sage
from Student
where Sage < any(
select Sage
from Student
where Sdept = 'CS'
)
and Sdept <> 'CS'
等价于
select Sname , Sage
from Student
where Sage < (
select max(Sage)
from Student
where Sdept = 'CS'
)
and Sdept <> 'CS'
9. 尽量使用连接查询(以下2个非常典型的例子)
(1)查询选修了课程名为“信息系统”的学生的学号和姓名
分析:
(1)学号和姓名放在Student表中,课程名放在Course表中,但Student和Course两个表之间没有直接联系,必须通过SC表建立二者的关系
(2) 对于多个表中的属性,要表明来自那个表,若是各个表特有的,就不必表明
(3) 一般将其桥梁作用的表放在中间
select Student.Sno , Sname
from Student,SC,Course
where Student.Sno = SC.Sno and SC.Cno = Course.Cno and Course.Cname = '信息系统'
(2)查询既选修了课程1 又选修了课程2的学生。
select Sno
from SC
where Cno = '1' and Sno in (
select Sno
from SC
where Cno = '2'
)
//注意此处不是用Cno = '1' and Cno = '2',它表示只选修了课程1和课程2的,但除了这两个外,还有可能选修了其他课程
//只是要求查询选修了课程1的学生集合 和 选修了课程2的学生集合的交集
10. 数据更新
(1)插入数据 : insert into 表名(属性列) values(属性列对应的属性值)
可以插入一个元组,也可以插入子查询的结果(一次插入多个元组)
- 对于 into 子句中没有出现的属性列,新元组在这些列上取空值(系统自动赋予空值null)
- 若nto 子句中只指出了表名,新元组在表的所有属性列上都有指定值,并且属性列的次序与表中的次序相同
此时对于没有指明属性值的列,需要手动赋予空值null
(2)修改数据 : update 表名 set 列名= 表达式 where条件
既可以修改一个元组的值
若省略where子句,则表示要修改表中的所有元组
(3)删除数据: delete from 表名 where条件
若省略where子句,则表示要删除表中的所有元组,但表的定义仍在数据字典中,就是说仅仅删除表中的数据
若想删除数据库对象,用drop table 表名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现