概念
1.术语
DB(Database)
DBMS(Database Management System)
DBS(Database System)
2.关系数据模型
关系:二维表
元组:行
属性:列(属性名唯一)
主码(主键):唯一确定一个元组的属性组
域:属性的取值范围
分量:元组中的一个属性值
数据模型

每个实体转为一个二维表
多对多关系必须有关系表(中间表)
关系运算
三种传统集合运算
1.并
并集运算
2.差
差集运算
3.交
交集运算
特有运算
1.笛卡尔积RxS
R表
m行n列
S表
p行q列
RxS 的结果有
mp行,n+q列
S表的每一行分别与R表的每一行连接
关系代数
1.选择
σF(R)
F表示选择条件,是一个逻辑表达式
表达式
σ性别="男" and 年龄>20(学生)
σ学号="010125" and 年龄>20(学生)
2.投影
π学号,年龄(R)
| 学号 | 年龄 |
|---|---|
| 010125 | 19 |
| 010126 | 20 |
| 010127 | 18 |
3.连接
σ条件(RxS)
σ学.学号=选.学号(学生x选修)
意义:实现跨表查询
案例
1.σ性别="男" and 系="信息"(S)
| 学号 | 姓名 | 性别 | 系 |
|---|---|---|---|
| 001 | 王一 | 男 | 信息 |
2.π姓名(σ性别="男"(S))
| 姓名 |
|---|
| 王一 |
| 李二 |
SQL语句
数据库操作
创建数据库
create database StudScore_DB1修改数据库
alter database databasename删除数据库
drop database StudScore_DB2表操作
创建表
create table StudInfo(
StudNo varchar(15) primary key,
StudName varchar(20) not null,
StudSex char(2) default '男' not null,
StudBirthDay date null,
ClassID varchar(10) not null
);复合主键 / check约束
显式命名:constraint [复合主键名字]
隐式命名: 系统自己给一个名字
Constraint PK_S_C primary Key(StudNo,CourseID)
primary Key(StudNo,CourseID)create table StudScoreInfo(
StudNo varchar(15),
CourseID varchar(10),
StudScore numeric(4,1) default 0 check(StudScore>0 and StudScore<=100),
-- check 约束
Constraint PK_S_C primary Key(StudNo,CourseID)
-- 建立复合主键
);标识符identity
概括:设置自增的值
数据类型:decimal int numeric smallint bigint tinyint
create table StudScoreInfo(
Seq_ID int identity(100001,1),
-- 初值为100001,步长为1
StudNo varchar(15) Primary Key,
StudName Varchar(30) not null
);修改表
增加自增编号的新列
alter table StudScoreInfo Add Seq_ID int Identity(1001,10)删除复合主键
alter table StudScoreInfo drop constraint PK_S_C设置主键
alter table StudScoreInfo add Constraint PK_T_C primary key(StudNo,CourseID)删除列
alter table StudScoreInfo drop colume Seq_ID删除表
drop table StudScoreInfo数据操作
插入数据/新增数据
insert into ClassInfo
(ClassName,ClassID)
values
('20000704','计算机2000'),
('20000705','高数2024');省略写法,但是要一一对应
insert into ClassInfo
values
('20000704','计算机2000'),
('20000705','高数2024');更新数据/修改数据
update ClassInfo
set ClassName='计科2000级',ClassDesc=NULL
where ClassID='20000704'删除数据
delete from ClassInfo
where ClassID='20000704'truncate table删除所有记录
功能相当于不带where字句的delete命令
不能用于被别的表依赖的表
不会对事务处理日志进行数据删除记录,因此不能激发触发器
truncate table StudScoreInfo查询数据
全部列
select * from StudInfo部分列
select StudNo,StudName,ClassID from StudInfo连接列(+)
select StudNo+StudName,ClassID from StudInfo计算列
select StudNo,CourseID,StudScore*0.8 from StudScoreInfodistinct 去重
select distinct StudSex from StudInfo结果:男,女
top n / top percent
top n:前n条数据
top percent:前percent%的数据(百分比)
select top 10 * from StudInfo
select top 10 percent * from StudInfowith ties
别名
select StudNo as 学号,姓名=StudName,ClassName 班级编号 from StudInfointo
将查询结果创建一个新的数据表
select StudNo as 学号 into StudInfoBack from StudInfofrom
[表名].[列名]
表示某表下的列
为join多表连接做准备,防止不同表的相同列名冲突
select s.StudNo,s.StudName from StudInfo as s group by 和聚合函数
聚合函数通常与group by 子句一起使用,对给定字段分组之后的结果进行分类汇总
avg() 求平均值
select StudNo,avg(StudScore) AvgScore
from StudScoreInfo
group by StudNo用cast函数保留小数位数
select StudNo,cast(avg(StudScore) as numeric(4,1)) AvgScore
from StudScoreInfo
group by StudNocount() 计算数量
select StudNo,count(*) CourseCount
from StudScoreInfo
group by StudNohaving
指定分组搜索条件,是对分组之后的结果再次筛选
与where语法的区别
| where | having | |
|---|---|---|
| 筛选 | 在分组操作前筛选 | 对分组操作之后的结果再次筛选 |
| 作用域 | 表和视图 | 组 |
| 直接引用别名 | 不可以 | 可以引用参与聚合函数和分组的别名 |
查询平均分80分以上的学生记录 having
select StudNo,sum(StudScore) as SumScore,count(*) CourseCount,
cast(avg(StudScore) as numeric(4,1)) AvgScore
from StudScoreInfo
group by StudNo
having avg(StudScore) >= 80统计80分以上的平均分,where
select StudNo,sum(StudScore) as SumScore,count(*) CourseCount,
cast(avg(StudScore) as numeric(4,1)) AvgScore
from StudScoreInfo
where StudScore >= 80
group by StudNo统计60分以下10门以上的学生平均分,where + having
select StudNo,avg(StudScore) as AvgScore
from StudScoreInfo
where StudScore<60
group by StudNo
having count(*)>=10order by
排序
升序:ASC(ascending)
降序:DESC(descending)
查询学生成绩,并按成绩高低排序
select * from StudScoreInfo where StudNo='20050319001'
order by StudScore desc按成绩高低排序,成绩相同的按课程编号升序排序
select * from StudScoreInfo where StudNo='20050319001'
order by StudScore desc,CourseID asc统计平均分,并排序
select StudNo,avg(StudScore) as 平均分
from StudScoreInfo
group by StudNo
order by 平均分 descwhere子句
比较运算符
>:大于<:小于<>/!=:不等于=:等于
select * from StudScoreInfo where StudScore>70逻辑运算
select * from StudScoreInfo where StudScore>=60 and StudScore<=70范围运算 between and
和[列名] >= [值] and [列名]<=[值] 功能相同
select * from StudScoreInfo where StudScore between 70 and 80in
select * from StudInfo where Studno in ('20050319001','99070405') 模式查询 like
通配符
%
包含零个或更多字符的任意字符串
where StudName='%丽%'_
任意单个字符
--
where StudName like '_丽'[]
指定该范围内包含的任意单个字符
-- 大写ABC字母开头的
where CourseID like '[A-C]%'[^]
函数
系统内置函数
字符串函数
left
select * from stsudinfo where left(right(studname,2),1)='丽'substring
select * from StudInfo where substring(StudName,2,1)='丽'charindex
-- 输出2
select charindex('B','ABC')
-- 输出0
select charindex('AD','ABCD')
-- 从第四个开始查询,输出4
select charindex('B','ABCBDE',4)replace
-- 将StudName中,所有‘李’,替换为‘张’
update StudInfo set StudName=replace(StudName,'李','张')
评论