赞
踩
数据是数据库中存储的基本对象
文本、图形、图象、音频、视频、、商品销售情况等都是数据
可以将数据定义为:数据是描述事物的符号记录
数据有多种表现形式,可以经过数字化后保存在计算机中
数据库管理员
系统分析人员
数据库设计人员
应用程序编程人员
最终用户
实体
联系
联系是数据之间的关联集合,是客观存在的语义链
实体内部的联系:一个实体内属性之间的联系
实体之间的联系:不同实体之间的联系。
表达方式:菱形
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lxO9CEHx-1648904975211)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220319194309532.png)]
联系的种类:一对一、一对多、多对多
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4I5juSI4-1648904975212)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220319194452883.png)]
属性:实体所具有的特征或性质:身高、年龄、性别…
吧数据看作成二维表中的元素,而这个二维表就是关系
用关系(表格数据)表示实体和实体之间的联系的模型称为关系数据模型
实例:
学号 | 姓名 | 性别 | 年龄 | 所在系 |
---|---|---|---|---|
9512101 | 李勇 | 男 | 19 | 计算机系 |
9512102 | 刘晨 | 男 | 20 | 计算机系 |
9512103 | 王敏 | 女 | 20 | 计算机系 |
9521101 | 张立 | 男 | 22 | 信息系 |
9521102 | 吴宾 | 女 | 21 | 信息系 |
一些基本术语
关系:就是二维表
性质:每一列都是不可再分的基本属性
行列次序并不重要
元组:表中的每一行乘坐是一个元组,它相当于一个记录值
属性:表中的每一列是一个属性值的集合,类可以明明,称为属性名
主码:表中用于唯一的确定一个元组的一个属性或最小的属性组
域:属性的取值范围。如性别的域为(‘男’,‘女’)
关系模式:二维表的结构称为关系模式,即,关系模式是二维表的表框架或表头结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2NSaMajz-1648904975212)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220319200612336.png)]
实体完整性
参照完整性
指多个实体之间的关联关系
一般用外码实现:取本表(子表)属性之一的外表主码
定义外码与主码之间的引用规则
对于外码要求:
用户定义的完整性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-finDmj2G-1648904975214)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220319202809257.png)]
当存储结构改变时,可(由DBA)用内模式定义语句,调整内模式定义,从而保持模式不变
数据与程序物理独立(存储独立)
当模式改变时,可用外模式/模式定义语句,调整外模式/模式映像定义,从而使外模式不变
数据和程序逻辑独立(概念独立)
DBMS是处理数据库访问的系统软件
处理过程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXwDnEZ9-1648904975215)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220319203854125.png)]
数据库管理系统的功能
数据定义
数据操作
优化和执行
数据安全和完整性
数据恢复和并发
数据字典
性能
SQL功能 | 命令动词 |
---|---|
数据查询 | select |
数据定义 | create、drop、alter |
数据操纵 | insert、update、delete |
数据控制 | grate、revoke |
整数
类型 | 字节数 |
---|---|
bigint | 8字节 |
int | 4字节 |
smallint | 2字节 |
tinyint | 1字节,0-255整数 |
bit | 1位,存储1或0 |
小数
numeric(p,q)或decimal(p,q),
其中:p为数字位长度,q为小数位长度
近似型
float:8字节
real:4字节
nchar(n):定长存储,n<=4000
nvchar(n):不定长存储,长度最大不超过n,n<=4000
ntext:存储大于8000字节的文本
特点:每个字符占两个字节
binary(n):固定长度,n<=8000
varbinary(n):可变长度,n<=8000
注:n为二进制数据的字节数
image:大容量、可变长二进制字符数据,可用于存储文件
create table<表名>
(<列名><数据类型>[列级完整性约束定义]
{,<列名><数据类型>
[列级完整性约束定义]...}
[,表级完整性约束定义]
)
列级完整性约束定义处可定义的约束
not null限制列取值非空
default 给定列的默认值
unique限制列取值不重
check限制列的取值范围
primary key制定本列为主码
foreign key 定义本列为引用其他表的外码
使用形式:[foreign key(<外码列名>)]
references<外表名>(<外表列名>)
几点说明:
约束定义
1.列取值非空约束
<列名><类型> not null
ex: sname char(10) not null
2.表主码约束
在定义列时定义主码(仅用于单列主码)
列定义 primary key
ex: sno char(7) primary key
在定义完列后定义主码(用于单/多列主码)
primary key(<列名序列>)
ex: primary key(sno)
primary key(sno,cno)
3.外码引用约束
指明本表外码列引用的表及表中的主码列
[foreign key(<本表列名>)]
references<外表名>(<外表主码列名>)
ex: foreign key(sno) references 学生表(sno)
创建表
drop table <表名>{[,<表名>]…}
ex:删除test表的语句为:
drop table test
删除表时会将与表有关的所有对象一起删掉,包括表中的数据
注:在增删改列定义时,可以使用 alter table语句实现
alter table<表名>
{alter column <列名><新数据类型>--修改列定义
| add<列名><数据类型><约束>--增加新列
|drop column<列名>--删除列
|add [constraint<约束名>]约束定义--添加约束
|drop [constraint]<约束名>}--删除约束
例:为SC表添加“修课类别”列,此列的定义为:XKLB char(4)
alter table SC
add XKLB char(4) null
将新添的XKLB的类型改为char(6)
alter table SC
alter column XKLB char(6)
删除course表的period列
alter table course
drop column period
保证实体完整性
每个表有且只有一个primary key 约束
格式
alter table 表名
add [constraint 约束名]
primary key (列名[,…n])
例
确保在非主键列中不输入重复值
应用在客观具有唯一性质的列上,如身份证号、社会保险号等
格式
alter table 表名
add [constraint 约束名]
unique(<列名>[,…n])
例
用于建立和加强两个表数据之间的连接的一列或多列
格式
alter table 表名
add [constraint 约束名]
foreign key(<列名>)
references 引用表名(<列名>)
例
当向表中插入数据时,如果没有定义为定义了default的列提供值,则此列使用默认值
一个default只能约束一列
格式
alter table 表名
add [constraint 约束名]
default 默认值 for 列名
例
通过限制输入到列中的值来强制域的完整性
可定义同表多列之间的约束关系
格式
alter table 表名
add [constraint 约束名]
check (逻辑表达式)
例
综合起来
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gOZdDp2F-1648904975215)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220322210300864.png)]
select <目标列名序列> --需要哪些列
from <数据源> --来自哪些表
[where <检索条件表达式>] --根据什么条件
[group by <分组依据列>]
[having <组提取条件>]
[order by <排序依据列>]
--擦汗寻表中用户感兴趣的部分属性列 --查询全体学生的学号和姓名 select sno,sname from student --查询全体学生的记录 select sno,sname,ssex,sage,sdept from student --等价于 select *from student --查询经过计算的列 --查询全体学生的姓名及出生年份并命名“出生年份” select sname,'出生年份:',2021-sage from student --改变列标题 --语法: 列名 | 表达式[as]列标题 或 列标题=列名 | 表达式 例: select sname as 姓名,'year of birth'出生年份,2020-sage 年份 from student
--消除取值相同的行
--查询选秀了课程的学生的学号
select distinct sno from sc
查询满足条件的元组
查询条件 | 谓词 |
---|---|
比较运算符 | =,>,>=,<,<=,!= |
确定范围 | (not) between…and |
确定集合 | (not) in |
字符匹配 | (not) like |
空值 | is (not) null |
多重条件 | and,or |
--比较大小
--查询计算机系全体学生的姓名
select sname form student
where sdept='计算机系'
--查询年龄在20岁以下的学生的姓名及年龄
select sname,sage form student
where sage<20
--确定范围
--查询年龄才20至23岁之间的学生的姓名、所在系和年龄
select sname,sdept,sage from student
where sage betwewn 20 and 23
--确定集合
--查询信息系、数学系和计算机系学生的姓名和性别
select sname,ssex from student
where sdept in ('信息系','数学系','计算机系')
--字符匹配 --查询姓‘张’的学生的详细信息 select *from student where sname like'张%' --查询姓‘张’、‘李’、‘刘’的学生的详细信息 select *from student where sname like'[张李刘]%' --擦汗寻名字中第2个字为‘小’或‘大’的学生的姓名和学号 select sname,sno from student where sname like'_[小大]%' --查询所有不姓王也不姓张的学生的姓名 select sname from student where sname not like'[王张]%' 或者 select sname from student where sname like'[^王张]%' 或者 select sname from student where sname not like'王%' and sname not like'张%' --查询姓王且名字是2个字的学生姓名 select sname from student where sname like '王_' --查询姓王且名字是3个字的学生姓名 select sname from student where rtrim(sname) like '王__'//尾随空格处理
--涉及空值查询
--查询没有考试成绩的学生的学号和相应的课程号
select sno,cno from sc
where grade is null
--查询所有有考试成绩的学生的学号和课程号
select sno,cno from sc
where grade is not null
--多重条件查询
--查询计算机系年龄在20岁以下的学生姓名
select sname fron student
where sdept='计算机系' and sage<20
--查询计算机系和信息系年龄大于等于20岁的学生姓名、所在系和年龄
select sname,sdept,sage from student
where sdepT IN ('计算机系','信息系')
and sage>=20
排序句为:
order by 列名 [asc|desc] [,<列名>…]
说明:按列名称进行升序(asc)或降序(desc)排
--按年龄进行升序
select *from student
order by sage
--查询选修了‘c02’号课程的学生的学号及其成绩,查询结果按成绩降序排列
select sno,grade from sc
where cno='c02'
order by grade desc
--查询全体学生的信息,查询结果按所在系的系名升序排列,统一系的学生按年龄降序排列
select *from student
order by sdept,sage desc
--sql提供的计算函数有
count(*) --统计表中元组个数
count([distinct]<列名>) --计算本列值的个数
sum([distinct]<列名>) --计算本列值总和
ave([distinct]<列名>) --计算本列平均值
max([distinct]<列名>) --求本列最大值
min([dsitinct]<列名>) --求本列最小值
注:除count(*)外,其他函数均忽略null值
--统计学生总人数 select count(*) from student --统计选修了课程的学生的人数 select count(distinct sno) from sc --计算9512101号学生的考试成绩之和 select sum(drade) from sc where sno='9512101' --计算‘c01’号课程学生的考试平均成绩 select ave(grade) from sc where cno='c01' --查询选修了‘c01’号课的学生的最高分和最低分 select max(grade),min(grade) from sc where cno='c01'
语句:
group by <分组条件>
having <组过滤条件>
--1.使用group by --统计每门课程的选课人数,列出课程号和人数 select cno 课程号,count(sno) 选课人数 from sc group by cno //对查询结果按cno的值分组,所有具有相同cno值的元组为一组,然后再对每一组使用count计算,求得每组得学生人数 --查询美名学生得选课门数和平均成绩 celect sno 学号,count(*) 选课门数,ave(grade) 平均成绩 from sc group by sno --查询每个系得女生人数 select sdept,count(*)女生人数 from student where ssex='女' group by sdept --统计每个系的男生人数和女生人数,男生最大年龄,女生最大年龄,结果按系名升序排列 select sdept,ssex,count(*) 人数,max(sage) 最大年龄 from student group by sdept,ssex order by sdept
--2.使用having
--having用于对分组的自身进行限制,有点像where子句,但它用于组而不是对单个记录
--查询修了3门以上课程的学生的学号
select sno from sc
group by sno
having count(*)>3
--查询修课门数等于或者大于4门的学生的平均成绩和选课门数
select sno,avg(grade) 平均成绩,count(*) 选课门数
from sc
group by sno
having count(*)>=4
[<表名1.>] [<列名1>] <比较运算符>[<表名2.>] [<列名2>]
如果两个表的相关字段满足连接条件,则从这两个表中提取数据并组成新的记录
语法:
select…
from
表名 [inner] join 被连接表 on 连接条件
--查询计算机系学生的修课情况,要求列出学生的名字、所修课的课程号和成绩 select sname.cno,grade from student join sc on student.sno=sc.sno where sdept='计算机系' --查询信息系修了VB课程的学生的修课成绩,要求列出学生姓名、课程名和成绩 select sname,cname,grade from student s join sc on s.sno=sc.sno join course c on c.cno=sc.cno where sdept='信息系' and cname='VB' --查询所有修了VB课程的学生的修课情况,要求列出学生姓名和所在的系 select sname,sdept from student s join sc on s.sno=sc.sno join course c on c.cno=sc.cno where cname='VB
自连接
--查询与刘晨在同一个系学习的学生的姓名和所在系
select s2.sname,s2.sdept
from student s1 join student s2
on s1.sdept=s2.sdept
where s1.sname='刘晨' and s2.sname!='刘晨'
只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件
ansi方式的外连接的语法
from 表1 left | right [outer]
join 表2 on <连接条件>
theta方式的外连接的语法
左外连接
from 表1,表2 where[表1.]列名(+) = [表2.]列名
右外连接
from 表1,表2 where[表1.]列名 =[表2.]列名(+)
--查询学生的修课情况,包括修了课程的学生和没有修课的学生
select student.sno,sname,cno,grade
from student left outer join sc
on student.sno=sc.sno
--查询哪些课程没有人选,列出其课程名
select cname
from course c left outer join sc
on c.cno=sc.cno
where sc.cno is null
使用top限制结果集
作用:列出结果集中的前几行结果
格式:top n [percent] [with this]
top n:查询结果的前n行
top percent:查询结果的前n%行数据
with this:包括并行的结果
在sql语言中,一个select-from-where语句中称为一个查询块
子查询是一个select查询,它嵌套在语句的where或having子句中,或者其他子查询中
子查询的select查询总用圆括号括起来
格式
列名 [not] in (子查询)
--查询与刘晨在同一个系得学生
select sno,sname,sdept
from student
where sdept in
(select sdept from student
where sname='刘晨')
and sname!='刘晨'
--查询成绩为90分得学生得学号和姓名
select sno,sname from student
where sno in
(select sno from sc
where grade>90)
插入单行记录的insert语句格式
insert into 表名(列表值)
values(表值)
功能
新增一个符合表结构的数据行,将值表数据按表中列定义顺序[或列名表顺序]赋给对应列名
值列表中的值与列名表中的列按位置顺序对应,它们的数据类型必须一致
如果<表名>后面没有指明列名,则新插入记录的值的顺序必须与表中列的定义顺序一致,且每一个列均有值(可以为空)
--例1.将新生记录(9521105,陈东,男,信息系,18岁)插入到student表中
insert into student
values('9521105','陈东','男',18,'信息系')
--例2.在sc表中插入一段新记录,成绩暂缺
insert into sc(sno,cno,xklb)
values('9521105','c01','必修')
实际插入:
('9521105','c01',null,'必修')
用update语句实现
格式:
update 表名
set 列名=表达式[,…n]
[where 更新条件]
--无条件更新
--将所有学生的年龄加1
update student
set sage = sage+1
--有条件更新
--1.基于本表条件更新
--将‘9512101’学生的年龄改为21岁
update student set sage=21
where sno='9512101'
--基于其他表条件的更新
--将计算机系全体学生的成绩加5
(1)用子查询
update sc set grade=grade+5
where sno in
(select sno from student
where sdept='计算机系')
(2)用多链表
update sc set grade=grade+5
from sc join student on sc.sno=student.sno
where sdept='计算机系'
用delete语句实现
格式:
delete from 表名
[where 删除条件]
--无条件删除
--删除所有学生的选课记录
delete from sc
--有条件删除 --(1)基于本表条件的删除 --删除所有不及格学生的选课记录 delete from sc where grade<60 --(2)基于其他表条件的删除 --删除计算机系不及格学生的选课记录 (1)用子查询 delete from sc where grade<60 and sno in( select sno from student where sdept='计算机系') (2)用多链表 delete from sc from sc join student on sc.cno=student.sno where sdept='计算机系' and grade<60
格式
select 查询列表序列 into <新表名>
from 数据源
<新表名>:存放查询结果的表名
--查询计算机系学生的姓名、选修的课程名和成绩,并将查询结果保存到永久表scg中
select sname,cname,grade
into scg
from student s join sc on s.sno=sc.sno
join course c on c.cno=sc.cno
where sdept='计算机系'
--统计每个系的学生人数,并将结果保存到永久表deptcnt中
select sdept,count(*) as 人数 into deptcnt
from student
group by sdept
一种多分支表达式,它可以根据条件列表的值返回多个可能的结果表达式中的一个
case表达式可用在任何允许使用表达式的地方,但它不是一个完整的T-SQL语句,因此不能单独执行,只能作为一个可以单独执行的语句的一部分来使用
简单case表达式
case input_expression
when when_expression then result_expression
[…n]
[else else_result_expression]
end
--查询选了Java课程的学生的学号、姓名、所在系和成绩,并对所在系进行如下处理
当所在系为”计算机系“时,在查询结果中显示”sc“
当所在系为”信息系“时,在查询结果中显示”im“
当所在系为”数学系“时,在查询结果中显示”com“
select s.sno 学号,sname 姓名,
case sdept
when '计算机系' then 'sc'
when '信息系' then 'im'
when '数学系' then 'com'
end as 所在系,grade 成绩
from student s join sc on s.sno=sc.sno
join course c on c.cno=sc.cno
where cname='java'
搜索case表达式
case
when boolean_expr then result_expr
[…n]
[else else_result_expr]
end
--上例用搜索case实现
select s.sno 学号,sname 姓名
case
when sdept='计算机系' then 'sc'
when sdept='信息系' then 'im'
when sdept='数学系' then 'com'
end as 所在系,grade 成绩
from student s join sc on s.sno=sc.sno
join course c on c.cno=sc.cno
where cname='java'
--例75.查询“c001”课程的考试情况,列出学号、成绩以及成绩等级,对成绩等级的处理如下:
如果成绩大于等于90,则等级为优
如果成绩在80到89分之间,则等级为良
如果成绩在70到79分之间,则等级为中
如果成绩在60到69分之间,则等级为及格
如果成绩小于60分,则等级为不及格
select sno,grade,case
when grade>=90 then '优'
when grade between 80 and 89 then '良'
when grade between 70 and 79 then '中'
when grade between 60 and 69 then '及格'
when grade<60 then '不及格'
end as 等级
from sc where cno='c001'
--修改全体学生的Java考试成绩,修改规则:
对信息系学生,成绩加10
对信息系学生,成绩加5
对其他系学生,成绩不变
update sc set grade=grade+
case dept
when '数学系' then 10
when '信息系' then 5
else 0
end
from student join sc on s.sno=sc.sno
join course c on c.cno=sc.cno
where canme='java'
并运算可将两个或多个查询语句的结果集合合并为一个结果集,这个运算可以使用union运算符实现
union是一个特殊运算符,通过它可以实现让两个或更多的查询结果产生单一的结果集
格式
select 语句1
union [all]
select 语句2
union [all]
union [all]
…
select 语句n
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。