极其感动!!!当时学数据库的时候,没白学!!
- 时隔很长时间回去看数据库的笔记都能看懂,每次都靠这份笔记巩固
- 真的是语雀分享要花钱,要不一定把笔记给贴出来
- (;´༎ຶД༎ຶ`) ,除了vue和react之外,最常看的一份笔记了!!!!
xd们,一定要收藏粘贴下来,真的没有自夸!!!!
- 当时学的时候,想来:就一份笔记么?脑子有病的人才一直记来记去的【框框自嘲】!有啥可分享的?现在,真香!!!
关系数据库的标准语言
特点 :
SQL三大类11个命令词 :
SQL支持数据库的三级模式结构 :
用户用SQL语言对 基本表、视图、索引等进行操作
定义、删除与修改基本表
定义基本表 :
定义基本表语法格式 :
例子:
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
};
常用完整性约束
primary key
foreign key...references...
not null
check
SQL支持的数据类型
整数数据
bigint
int
tinyint
bit
精确数值数据
decimal
numeric
浮点数值数据
float :
real
字符串数据
char
varchar
日期数据类型
整数数据 :
精确数值 数据 :
浮点 数值 数据 :
字符串数据 :
日期时间数据
例子 :
建立一个”学生选课“表SC,由学号Sno,课程号Cno,成绩Grade组成,其中(Sno,Cno)为主码
Create table SC(
Sno char(5),
Cno int,
Grade int,
primary key(Sno,Cno)
)
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)
)
增加 列 【可以 增删列,可以增删完整性约束】
alter table STUDENT add CTIME datetime
alter 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;
drop table <表名>;
查询语句格式 :
select A,B,...C
from r,t,y
where condition
Group By columns
Having condition
Order by columns
两者不同 :
-- 查询语句格式
select [all|distinct]
<目标列表达式>[<别名>]
<目标列表达式>[<别名>]
from <表名或视图名>[别名]
[<表名或视图名>[别名]]
[where<条件表达式>]
[group by<列名>]
[having<条件表达式>]
[ordedr by <列名>]
查询涉及一个表,是一种最简单的查询操作
选择表中的若干列 :
例题 :
select sno,sname from student;
例题 :
查询全体学生的姓名及其出生年份
select ssex,2020-age from student;
select sname,year(getdate())-sage as 'birth' from student;
select year(getdate())
例题 :
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;
在SC表中查询选修了课程的学生学号【一个学生选修多项,会有重复的学号】
select distinct Sno from SC;
查询选修课程的各种成绩
select distinct Cno,Grade from SC;
查询满足条件的元组
【where】查询计算机系全体学生的名单
select Sname from Student where Sdept = 'CS'
【where】
使用谓词 :Between…and…
not 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来联结多个查询条件
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')
使用ORDER BY 一个列名或多个列名
子句 :
当排序列含空值时
例题 : 查询选修了3号课程的学生的学号及成绩,查询结果按分数降序排列
select Sno,Grade
from SC
where Cno = 3
order by Grade desc;
例题 : 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中得学生按年龄降序排列
select *
from Student
order by Sdept,Sage desc
统计个数 : count(<列名>)
例题 :
查询学生的总人数:
select count(*) from student
select 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;
对查询结果 分组
【对查询结果分组】求各个课程号及相应的课程成绩在90分以上的学生人数
select Cno,Count(Sno)
from sc
where Grade >= 90
grounp by cno;
求各个课程号及相应的选课人数
select cno,count(*) from sc group by cno
使用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
等值连接
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';
select a1.Cname,a2.Cname
from Course a1,Course a2
where a1.Cpno = a2.Cno
插入数据
插入单个元组
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;
修改指定表中满足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);
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)
三种类型关系
SQL支持数据库的三级模式结构 :
视图的特点 :
基于视图的操作
建立视图 :
create view <视图名>[<列名>]
as <子查询>
[with check option];
组成视图的属性列名或全部省略或全部指定 :
视图定义的select语句 :
with check option
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 视图的更新操作 :
基于多个基表的视图
建立信息系选修了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;
带表达式的视图 :
建立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='女'
drop view <视图名>;
删除视图V_S1
drop view V_S1
;
例1 : 在信息系学生的视图中找出年龄小于20岁的学生
create [unique][cluster] index <索引名>
on<表名>(列名)
<表名>
指定要建索引的基本表名字唯一值索引 :
drop index<索引号>
drop index idx_Stusname;