极其感动!!!当时学数据库的时候,没白学!!
- 时隔很长时间回去看数据库的笔记都能看懂,每次都靠这份笔记巩固
- 真的是语雀分享要花钱,要不一定把笔记给贴出来
- (;´༎ຶД༎ຶ`) ,除了vue和react之外,最常看的一份笔记了!!!!
xd们,一定要收藏粘贴下来,真的没有自夸!!!!
- 当时学的时候,想来:就一份笔记么?脑子有病的人才一直记来记去的【框框自嘲】!有啥可分享的?现在,真香!!!
文章目录
- 三、关系数据语言-- SQL概述
- 3-1 SQL概述
- 3-2 DDL 数据定义功能
- 3-2-1 定义基本表
- 3-2-1-1 创建基本表
- 3-2-1-1-1
- 3-2-1-1-2 表级完整性约束 与 列级完整性约束
- 3-2-2 SQL支持的数据类型
- 3-2-3-1
- 3-2-3-2 创建教学数据库中四个基本表
- 3-2-3 修改基本表
- 3-2-3-1
- 3-2-4 删除基本表
- 3-3 DML
- 3-3-1 SELECT 表单查询
- 3-3-1-1 单表查询
- 3-3-1-1-1 select子句 : 查询指定**属性列** :
- 3-3-1-1-2 选择表中若干元组【where】
- 3-3-1-1-3 对查询结果排序【5.3P22】
- 3-3-1-1-4 使用集函数【统计不计Null值】
- 3-3-1-2 连接查询
- 3-3-1-2-1 交叉连接(广义笛卡尔积)
- 3-3-1-2-1 交叉连接(自身连接)
- 3-3-3 SQL---数据更新UPDATE
- 3-3-3-1
- 3-3-3-2 完整性校验
- 3-3-33 修改数据
- 3-3-4 删除
- 3-3-4-1
- 3-3-3-2 带子查询的删除语句
- 3-4 视图
- 3-4-1 关系(Relations)
- 3-4-2 定义视图(DDL)
- 3-4-3 建立视图 :
- 3-4-3-1 例子 :
- 3-4-4 删除视图
- 3-4-4-1 删除视图 例子
- 3-4-5 查询视图
- 3-4-6 更新视图[避免]
- 3-4-7 视图的作用
- 3-5 索引
- 3-5-1 建立与删除索引
- 3-5-2-1 建立索引
- 3-5-2-2 删除索引
- 3-6 DCL【数据控制语言,grant和revoke(授权和回收权力)】 和嵌入式SQL
- 3-6-1
- 3-6-2 SQL语言的两种使用方式
三、关系数据语言-- SQL概述

3-1 SQL概述
-
关系数据库的标准语言
-
特点 :
- 综合统一: DDL,DML,DCL
- 高度非过程化
- 面向集合的操作方式
- 同一种语法结构提供两种使用方式
- 自含式语言
- 嵌入式语言
- 语言简洁
-
SQL三大类11个命令词 :
- 数据定义DDL : create,drop,alter
- 数据操纵DML : select ,insert,update,delete
- 数据控制DCL:grant,revoke
-
SQL支持数据库的三级模式结构 :

-
用户用SQL语言对 基本表、视图、索引等进行操作
- 基本表(模式)
- 存储文件(内模式)
- 视图(外模式)

3-2 DDL 数据定义功能
-
- 定义表(模式)
- 创建删除表,修改表定义
- 定义视图(外模式)
- 创建删除视图
- 间接修改视图定义 : 删除+创建
- 定义索引(内模式)
- 创建删除索引
- 间接修改索引定义 : 删除+创建
- 定义表(模式)
-
定义、删除与修改基本表
3-2-1 定义基本表
3-2-1-1 创建基本表
3-2-1-1-1
-
定义基本表 :
- 关系名(表名)
- 属性名(列名)
- 属性数据类型
- 完整性约束
-
定义基本表语法格式 :

-
例子:
create database teach; -- 建表 use teach; create table student{ sid char(8) primary key, sname varchar(20) not null, sqender char(1), sdept int, sbirth date };
3-2-1-1-2 表级完整性约束 与 列级完整性约束
-
常用完整性约束
- 主码约束 :
primary key - 参照完整性约束 :
foreign key...references... - 唯一性约束 : unique
- 非空值约束 :
not null - 取值约束 :
check
- 主码约束 :
-
SQL支持的数据类型
-
整数数据
-
bigint
-
int
-
smallint
-
tinyint
-
bit

-
-
精确数值数据
-
decimal
-
numeric

-
浮点数值数据
-
float :
-
real
-

-
-
字符串数据
-
char
-
varchar

-
-
日期数据类型

-
3-2-2 SQL支持的数据类型
3-2-3-1
-
整数数据 :
- bigint:以8个字节来存储正负数,范围 : -263 到 263 - 1
- int : 4个字节
- smallint : 2个字节
- tinyint : 最小的整数类型,存储正负数
- bit : 值只能是0 或 1

-
精确数值 数据 :
- decimal : 存储从
- numeric
-
浮点 数值 数据 :
- float
- real

-
字符串数据 :
- char
- varchar

-
日期时间数据
- date : 日期类型
- time
- datetime

-
例子 :
-
建立一个”学生选课“表SC,由学号Sno,课程号Cno,成绩Grade组成,其中(Sno,Cno)为主码
-
Create table SC( Sno char(5), Cno int, Grade int, primary key(Sno,Cno) )
-
3-2-3-2 创建教学数据库中四个基本表
-

-
create table T( TID char(4), Tname varchar(8) not null, title varchar(10), primary key(TID) );table C( CID char(4), CNAME varchar(10) not null, TID char(4), primary key(CID), foreign key(TID) references T(TID) )create table S( SID char(4) primary key, SNAME varchar(10) not null, age samllint, sex char(1) )create table SC( SID char(4) not null, CID char(4) not null, score real, primary key(SID, CID), foreign key(SID) references S(SID), foreign key(CID) references C(CID) )
3-2-3 修改基本表
3-2-3-1
-
增加 列 【可以 增删列,可以增删完整性约束】
alter table STUDENT add CTIME datetimealter table STUDENT add primary key(sid)
-
删除列
-
alter table STUDENT drop CTIME -
删除主键约束 :
alter table SYUDENT drop 主键约束的名字
-
删除 学生姓名必须取唯一值的约束
alter table STUDENT drop unique(Sname)
-
删除 一列
alter table Student drop column score;
-
-
修改列数据类型
alter table SC alter column score INT;
3-2-4 删除基本表
drop table <表名>;
3-3 DML
3-3-1 SELECT 表单查询
-
查询语句格式 :
select A,B,...C from r,t,y where condition Group By columns Having condition Order by columns
-
两者不同 :
- select是等值选择
- 在condition中要有等值连接条件
- select结果不是集合是包,复元组
3-3-1-1 单表查询
-- 查询语句格式
select [all|distinct]
<目标列表达式>[<别名>]
<目标列表达式>[<别名>]
from <表名或视图名>[别名]
[<表名或视图名>[别名]]
[where<条件表达式>]
[group by<列名>]
[having<条件表达式>]
[ordedr by <列名>]

-
查询涉及一个表,是一种最简单的查询操作
- 选择表中的若干列 : select 子句
- 选择表中的若干元组 : where 子句
- 对查询结果排序 : order by 子句
- 使用集函数 : 5个集函数
- 对查询结果分组 : group by 子句
- 对分组之后结果进行筛选 : having 子句
-
选择表中的若干列 :
- 属投影运算 : 不消除重复行
3-3-1-1-1 select子句 : 查询指定属性列 :
-
- 查询所有列
- 查询经过计算的值
-
例题 :
- 查询全体学生的学号与姓名
select sno,sname from student;
-
例题 :
-
查询全体学生的姓名及其出生年份
select ssex,2020-age from student; select sname,year(getdate())-sage as 'birth' from student; select year(getdate())- year(): 返回指定日期的“年”日期部分的整数
-
-
例题 :
select Sname,'Year of Birth:',2020-Sage,Lower(Sdept) from Student;
select Sname Name,'Year of Birth:' BIRTH,2020-Sage BIRTHDAY,lower(Sdept) department
from student;

3-3-1-1-2 选择表中若干元组【where】
- 消除取值重复的行
-
在SC表中查询选修了课程的学生学号【一个学生选修多项,会有重复的学号】
select distinct Sno from SC; -
查询选修课程的各种成绩
select distinct Cno,Grade from SC;
-
查询满足条件的元组
- 选择运算
- 通过 where Condition子句实现

- 选择运算
-
【where】查询计算机系全体学生的名单
select Sname from Student where Sdept = 'CS'
-
【where】
-
使用谓词 :Between…and…
-
not between … and…
- between 后: 范围的下限
- and后:范围的上限
-
多重条件查询实现
-
select Sname,Sdept,Sage from Student where Sage between 20 and 23
-
-
【where】【确定集合】使用谓词:
-
in<值表>
-
not in<值表>
-
<值表> : 用逗号分隔的一组取值
-
查询是信息系、数学系和计算机科学系的学生的姓名和性比
select name,Ssex from Student where Sdept in('IS','MA','CS')
-
-
【where】【字符串匹配】使用谓词 LIKE或NOT LIKE
-
[not] like ‘<匹配串>’[escape’<换码字符>']
-
通配符 :
- % : 代表任意长度的字符串
- _ : 代表任意单个字符
-
查询姓”欧阳“且全名为三个汉字的学生的姓名
-
select Sname,Sno,Ssex from Student where Sname like '欧阳_'
-
-
-
Escape 短语
-
当用户查询的字符串本身含有 % 或_时,要使用**ESCAPE’<换码字符>'**短语对通配符进行转义
-
查询DB_…i…
select * from Course where Cname Like 'DB\_%i__' ESCAPE '\';
-
-
涉及空值的查询
-
使用谓词
IS NULL或者IS NOT NULL -
select Sno,Cno from SC where Grade is null;
-
-
多重条件查询
-
逻辑运算符and和or来联结多个查询条件
- and优先级高于or
- 用括号改变优先级
-
select Sname from Student where Sdept = 'CS' and Sage<20; -
查询信息系(IS)/数学系(MA)和计算机(CS)学生的姓名和sex
select Sname,Ssex from student where Sdept in('IS','MA','CS') -

-
3-3-1-1-3 对查询结果排序【5.3P22】
-
使用
ORDER BY 一个列名或多个列名子句 :- 按一个或多个属性列排序
- 升序: ASC;降序:DESC; 缺省值为升序
-
当排序列含空值时
- ACS:排序列为空值得元组最后显示
- DESC: 排序列为空值得元组最先显示
-
例题 : 查询选修了3号课程的学生的学号及成绩,查询结果按分数降序排列
select Sno,Grade
from SC
where Cno = 3
order by Grade desc;
-
例题 : 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中得学生按年龄降序排列
select * from Student order by Sdept,Sage desc
3-3-1-1-4 使用集函数【统计不计Null值】
-
统计个数 : count(<列名>)
- 计算列总和 : sum(<列名>)
- 计算列平均值 : avg(<列名>)
- 求列最大值 : max(<列名>)
- 求列最小值” min(<列名>)
- 注意 :
- 统计时不计NULL值
- COUNT(*) : 统计行数
- DISTINCT :在列名前加DISTINCT,则统计时去掉重复行
-
例题 :
-
查询学生的总人数:
select count(*) from studentselect count(sno) from student
-
查询选修了课程的学生人数
select count(distinct Sno) from SC
-
计算1号课程的学生平均成绩
select avg(Grade) from SC where Cno = 1; -
查询选修1号课程的学生最高分数
select max(Grade) from SC where Cno = 1; -
-
对查询结果 分组
- 分组方法 : 按指定的一列或多列值分组,值相等为一组
- 使用group by 字句后,select子句的列名列表中只能出现分组属性和集函数
- group by子句的作用对象是查询的中间结果表
-
【对查询结果分组】求各个课程号及相应的课程成绩在90分以上的学生人数
select Cno,Count(Sno) from sc where Grade >= 90 grounp by cno;-
求各个课程号及相应的选课人数
select cno,count(*) from sc group by cno
-
-
使用having短语筛选最终输出结果
- 只用满足having短语指定条件的组才输出
-
having短语 与where子句的区别 : 作用对象不同
-
查询选修3门以上课程的学号
select Sno from SC group by Sno having count(*) >= 3 -
查询有3门以上课程在90分 以上的学生的学号及90分以上的课程数
select Sno, count(*) from SC where Grade >= 90 group by Sno having count(*) >= 3;
-
-
统计每门课程的最高分
select cno,max(grade) from SC group by cno
3-3-1-2 连接查询
3-3-1-2-1 交叉连接(广义笛卡尔积)
-
等值连接
- 查询每个学生及其选修课程的学生
-
select Student.*,SC.* FROM Student,SC where Student.Sno = SC.SNO; - 等值连接
-
- 查询每个学生及其选修课程的学生
-
查询计算机系(CS)学生的学号、姓名、所在系,选修的课程号,课程名和成绩
select SC.Sno,Sname,Sdept,SC.Cno,Cname,Grade
from Student,SC,Course
where Student.Sno = SC.Sno and Course.Cno = SC.Cno and Sdept='CS';
3-3-1-2-1 交叉连接(自身连接)
-
select a1.Cname,a2.Cname from Course a1,Course a2 where a1.Cpno = a2.Cno
3-3-3 SQL—数据更新UPDATE
3-3-3-1
-

-
插入数据
-
插入单个元组
insert into <表名>[(<属性列1>)], values (<常量1>[,<常量2>]...)- 功能 : 把新元组插入指定表中
-
插入子查询结果
insert into <表名>
[(<属性列1>[,<属性列2>…])]
子查询;- -
-
-
插入数据—例子 :
-
将一个新学生记录(学号:95020;姓名:陈冬;性别:男;所在系:IS;18岁)插入到Student表中
insert into Student values('95020','陈东', 'M',18,'IS'); insert into SC(Sno,Cno) values('95020',1); insert into SC values('95020',2,null),('95021',2,null),('95022',2,null)
-
-
插入子查询—例子 :
-- 建表 create table Deptage(Sdept char(15)),Avage smallint); -- 插入数据 insert into Deptage(Sdept,Avgage) select Sdept,Avg(Sage) from Student group by Sdept;
3-3-3-2 完整性校验
- DBMS在形式插入语句时会检查元组是否破环表上已定义的完整性规则
- 实体完整性
- 参照完整性
- 用户定义的完整性
- 有NOT NULL约束的属性列是否提供非空值
- 对于有unique约束的属性列是否提供了非重复值
- 对于有值域约束的属性列所提供的属性值是否在值域范围内
3-3-33 修改数据
-
修改指定表中满足where子句条件的元组
update <表名> set <列名>=<表达式> where <条件> -
三种修改方式
- 修改某一个元组的值
- 修改多个元组的值
- 带子查询的修改语句
-
修改某一个元组的值
-
将学生95001的年龄改为22岁
update Student set Sage = 22 where Sno= '95001'; -
将所有学生的年龄增加1岁
update student set Sage = Sage+1; -
将信息系所有学生的年龄增加1岁
update Student set Sage = Sage +1 where Sdept ='IS'
-
-
带子查询的修改语句
-
将计算机科学系全体学生的成绩置0
update SC set Grade=0 where 'CS'=(select Sdept from Student where Student.Sno = SC.Sno);
-
3-3-4 删除
3-3-4-1
-
- 删除某一个元素的值
- 删除多个元组的值
- 带子查询的删除语句
-
- 删除学号为95019的学生记录
delete from Student where Sno = '95019';-
删除2号课程 的所有选课记录
delete from SC where Cno = 2; -
删除所有的学生选课记录
delete from SC;
-
带子查询的删除语句 :
-
删除计算机科学系所有学生的选课记录
delete from SC where 'CS'=(select Sdept from Student where Student.Sno = SC.Sno)
3-3-3-2 带子查询的删除语句
3-4 视图
3-4-1 关系(Relations)
-
三种类型关系
- 表(Table)-- 基表,存储关系(Base tables,Stored relations)
- 视图(Views)— 虚拟关系
- 临时结果—用于构建子查询的结果
-
SQL支持数据库的三级模式结构 :
-
视图的特点 :
- 虚表 : 一个或几个基本表(或视图)导出的表
- 只存放试图的定义,不会出现数据冗杂
- 基表中的数据发生改变,从试图中查询出的数据也随之改变
-
基于视图的操作
- 定义视图(DDL)
- 建立
- 定义基于该视图的新视图
- 删除
- 查询视图(DML)
- 更新视图(DML)
- 定义视图(DDL)
3-4-2 定义视图(DDL)
-
建立视图 :
create view <视图名>[<列名>] as <子查询> [with check option]; -
组成视图的属性列名或全部省略或全部指定 :
- 省略视图的各个属性列名,则隐含该视图由子查询中select子句目标列中的各字段组成
- 必须明确指定组成视图的所有列名的情形 :
- 某个目标列不是单纯的属性名,而是集函数或列表达式
- 目标列为*
- 多表连接时选出了几个同名列作为视图的字段
- 需要在视图中为某个列启用新的合适的名字
-
视图定义的select语句 :
- 不能包含order by子句和distinct短语
-
with check option
- 透过视图进行增删改操作时,不得破坏视图定义中的谓词条件(即子查询中的条件表达式)
3-4-3 建立视图 :
-
DBMS执行
create view语句时只是把视图的定义存入数据字典,并不执行其中的select语句 -
只是对视图查询时,才按视图的定义从基本表中将数据查出
-
行列子集视图 :
-
从单个基本表导出
-
只是去掉了基本表的某些行和某些列,但保留了码
-
例子 : 建立信息系学生的视图 :
create view V_StuIS as select Sno,Sname,Sage from Student where Sdept='IS'
-
-
with check option 的视图 :
-
建立信息系学生的视图,并要求透过该视图进行的更新操作涉及信息系学生
create view V_STUIS as select Sno,Sname,Sage from Student where Sdept = 'IS' with check option; -
对V_StuIS 视图的更新操作 :
- 修改操作 : DBMS自动加上Sdept =‘IS’的条件
- 删除操作: DBMS自动加上Sdept=’IS’的条件
- 插入操作 : DBMS 自动检查Sdept属性值是否为’IS’
- 如果不是,则拒绝该插入操作
- 没有提供Sdept属性值,则自动定义Sdept为’IS’
-
基于多个基表的视图
-
建立信息系选修了1号课程的学生视图
create view V_S1(Sno,Sname,Grade) ass select Student.Sno,Sname,Grade from Student,SC where Sdept = 'IS' and Student.Sno = SC.Sno and SC.Cno = 1;
-
-
基于视图的视图 :
-
建立信息系选修了1号课程且成绩在90分以上的学生的视图
create view V_S2 as select Sno,Sname,Grade from V_S1 where Grade >= 90;- 视图建立在V_S1之上
-
-
带表达式的视图 :
3-4-3-1 例子 :
-
建立1号课程的选课试图,并要求透过该视图进行更新操作时只涉及1号课程
create view V_SCCno as select Sno,Cno,Grade from SC where Cno = 1 with check option; -
以select * 方式创建的视图
-
将student表中所有女生记录定义为一个视图
create view V_Student1(stdnum,name,sex,age,dept) as select * from Student where Ssex='女' -
修改基表Student的结构后,Student表与V_Student1视图的映像关系,导致视图不能正确工作
-
-
上例可以这样写 :
create view V_Student2(stdnum,name,sex,age,dept) as select Sno,Sname,Ssex,Sage,Sdept from Student where Ssex='女'- 为基表Student增加属性列不会破坏Student表与V_Student2视图的关系
3-4-4 删除视图
drop view <视图名>;- 该语句从数据字典中删除指定的视图定义
- 由该视图到处的其他视图定义仍在数据字典中,但已不能使用,必须删除
- 删除基表时,由该基表导出的所有视图定义都必须删除
3-4-4-1 删除视图 例子
-
删除视图V_S1
drop view V_S1;- 执行此语句后,V_S1 视图的定义将从数据字典中删除,
3-4-5 查询视图
-
例1 : 在信息系学生的视图中找出年龄小于20岁的学生

3-4-6 更新视图[避免]
- DBMS :
- 视图实体化法(View Materialization)
- 视图消解法(View Resolution)
3-4-7 视图的作用
- 视图最终定义在基本表上,对视图的一切操作最终要转换对基本表的操作
- 对于非行列子集视图进行查询或更新时还有可能出现问题
- 视图的作用 :
- 能够简化用户的操作
- 使用户能以多种角度看待同一种数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
3-5 索引
3-5-1 建立与删除索引
- 建立 索引是加快查询速度的有效手段
- 建立索引
- DBMS自动建立
- Primary key
- unique
- DBA或表的属主(即建立表的人)根据需要建立
- DBMS自动建立
- 维护索引 : DBMS自动完成
- 使用索引 :DBMS自动选择是否使用索引以及使用哪些索引
3-5-2-1 建立索引
-
create [unique][cluster] index <索引名> on<表名>(列名)- 用
<表名>指定要建索引的基本表名字 - 索引可以建立在该表的一列
- 用<次序>指定索引值的排列次序,升序 : ASC,降序:DESC
- unique 表名此索引的每一个索引值值对应唯一的数据记录
- 用
-
唯一值索引 :
- 对于已含重复值的属性列不能建unique索引

3-5-2-2 删除索引
drop index<索引号>- 删除索引时,系统会从数据字典中删除有关该索引的描述
- 例子 : 删除Student表的idx_Stusname索引
drop index idx_Stusname;
3-6 DCL【数据控制语言,grant和revoke(授权和回收权力)】 和嵌入式SQL
3-6-1
- 完整性 :
- 数据库的完整性 : 数据库中数据的有效性、正确性和相容性
- SQL语言定义完整性约束条件
- 码
- 取值唯一的列
- 参照完整性
- 其他约束条件
- 并发控制 :
- 多个用户并发对数据库进行操作时,对他们加以控制、协调,以保证并发造作正确执行,并保证数据库的一致性
- 恢复
- 安全性
3-6-2 SQL语言的两种使用方式
- 在终端交互方式使用,称为交互式SQL
- 嵌入在高级语言的程序中使用,称为嵌入式SQL
- 宿主语言: java,C









![[附源码]SSM计算机毕业设计小锅米线点餐管理系统JAVA](https://img-blog.csdnimg.cn/ac89a3acf9cc4d7ca5c5d0c4abec4110.png)










