📖 前言:SQL中常用的数据更新操作也成为数据操作或数据操纵,包括插入数据、删除数据和修改数据三个方面的功能。
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图在数据库中并不是以数值存储集形式存在,除非是索引视图。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。
目录
🕒 0. 思维导图🕒 1. 基本表更新TABLE🕘 1.1 插入数据(INSERT INTO)🕤 1.1.1 插入元组🕤 1.1.2 插入子查询结果🕘 1.2 修改数据(UPDATE SET)🕘 1.3 删除数据(DELETE)🕒 2. 视图VIEW🕘 2.1 定义视图🕘 2.2 查询视图🕘 2.3 更新视图🕘 2.4 修改视图🕘 2.5 删除视图🕘 2.6 扩充:基于派生表的查询🕒 3. 课后习题🕒 0. 思维导图
🕒 1. 基本表更新TABLE
🕘 1.1 插入数据(INSERT INTO)
可以一次插入多个元组
🕤 1.1.1 插入元组
语句格式:
INSERTINTO <表名> [(<属性列1>[,<属性列2 >…)]VALUES (<常量1> [,<常量2>] … )
功能:将新元组插入指定表中
INTO子句
属性列的顺序可与表定义中的顺序不一致没有指定属性列指定部分属性列
VALUES子句
提供的值必须与INTO子句匹配 值的个数值的类型
注意:DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则,包括
实体完整性参照完整性用户定义的完整性 NOT NULL约束UNIQUE约束值域约束
例1:将一个新学生记录(学号Sno:1025;姓名Sname:育锐;性别Ssex:男;年龄Sage:20;专业名Smajor:网络工程;籍贯Shometown:广东揭阳)插入Student表中。
INSERT INTO Student (Sno, Smajor, Shometown, Sname, Ssex, Sage) VALUES ('1025', '网络工程', '广东揭阳', '育锐', '男',20);
在上例中,属性列表的顺序与表结构中的顺序不一致,因此不能省略INTO子句中的属性列表,但是若此例表示为:
INSERT INTO Student (Sno,Sname,Ssex, Sage,Smajor Shometown, ) VALUES ('1025', '育锐', '男',10,'网络工程', '广东揭阳');
则该语句可简写为:
INSERT INTO STUDENTVALUES ('1025', '育锐', '男',10,'网络工程', '广东揭阳');
例2:插入课程(课程号Cno:‘1000’, 课程名Cname:‘线性代数’, 无先修课程,学分Ccredit:1.5)。
INSERT INTO Course(Cno, Cname, Cpno, Ccredit)VALUES ('1000', '线性代数', NULL, 1.5);
🕤 1.1.2 插入子查询结果
语句格式:
INSERTINTO <表名> [(<属性列1>[,<属性列2 >…)]子查询;
功能:将子查询结果插入指定表中
INTO子句(与插入元组类似)
子查询
SELECT子句目标列必须与INTO子句匹配 值的个数值的类型
例3:在数据库新建一个表,存放STUDENT表中各专业的学生人数。
首先在数据库中新建一张表,存放各专业的名称及学生人数。
CREATE TABLE Major_num(专业名 char(12),人数 int);
然后求得各专业的人数并插入新建的表中。
INSERT INTO Major_numSELECT Smajor,count(Sno)/*不能用sum*/FROM STUDENTGROUP BY Smajor;
专业名人数1计算机科学与技术42软件工程43网络工程5\begin{array}{|l|l|l|} \hline & \text { 专业名 } & \text { 人数 } \\ \hline 1 & 计算机科学与技术 & 4 \\ \hline 2 & 软件工程 & 4 \\ \hline 3 & 网络工程 & 5 \\ \hline \end{array}123专业名计算机科学与技术软件工程网络工程人数445
🕘 1.2 修改数据(UPDATE SET)
语句格式:
UPDATE <表名>SET <列名>=<表达式>[,<列名>=<表达式>]…[WHERE <条件>];
功能:修改指定表中满足WHERE子句条件的元组
SET子句
指定修改方式要修改的列修改后取值
WHERE子句
指定要修改的元组缺省表示要修改表中的所有元组
三种修改方式
修改某些元组的值(有where子句)修改表中全部的值(无where子句)带子查询的修改语句
注意:DBMS在执行修改语句时会检查所修改元组是否破坏表上已定义的完整性规则,包括
实体完整性 一些DBMS规定主码不允许修改 用户定义的完整性 NOT NULL约束UNIQUE约束值域约束
例4:【带子查询的修改】:
将SC表中“计算机科学与技术”专业的所有的学生成绩增加2分。
UPDATE SC/*UPDATE后面只能跟一个表,如果需要修改多个就嵌套*/SET Grade = Grade +2WHERE Sno IN(SELECT SnoFROM StudentWHERE Smajor='计算机科学与技术');
🕘 1.3 删除数据(DELETE)
语句格式:
DELETEFROM <表名>[WHERE <条件>];
功能:删除指定表中满足WHERE子句条件的元组
WHERE子句
指定要删除的元组缺省表示要删除表中的全部元组,表的定义仍在字典中
注意:DROP是直接删除整个表
DBMS在执行删除语句时,会检查所删元组是否破坏表上已定义的完整性规则。
参照完整性 不允许删除级联删除(详见第4章 完整性,后续会介绍)
三种删除方式
删除某个(某些)元组的值删除多个元组的值带子查询的删除语句
例5:【带子查询的修改】:
在SC表中删除“计算机科学与技术”专业的所有学生的选课信息。
DELETE FROM SCWHERE Sno in( SELECT SnoFROM StudentWHERE Smajor='计算机科学与技术' )
🕒 2. 视图VIEW
视图的特点
虚表,是从一个或几个基本表(或视图)导出的表只存放视图的定义,不存放视图对应的数据基表中的数据发生变化,从视图中查询出的数据也随之改变
视图的作用(优点):
视图能够简化用户观点视图使用户能以多种角度看待同一数据视图对重构数据库提供了一定程度的逻辑独立性(视图是外模式的一种)视图能够对机密数据提供安全保护适当的利用视图可以更清晰的表达查询
基于视图的操作:查询、删除、受限更新、定义基于该视图的新视图
视图的UPDATE、DELETE、INSERT INTO(有受限),数据更新与基本表同步。
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页
🕘 2.1 定义视图
语句格式:
CREATE VIEW <视图名> [(<列名> [,<列名>]…)][WITH ENCRYPTION];AS <子查询>[WITH CHECK OPTION];
组成视图的属性列名:全部省略或全部指定
省略视图的各个属性列名,则隐含该视图由子查询中的select子句目标列中的诸字段组成。必须明确指定组成视图的所有列名的情形: 某个目标列不是单纯的属性名,而是集函数或列表达式(但实际并非如此,详见例8写法2);需要在视图中为某个列启用新的更合适的名字。
子查询:
通常不允许含有ORDER BY
子句和DISTINCT
(SQL Server中允许)短语
With check option
:
透过视图进行增删改操作时,不得破坏视图定义中的谓词条件(即子查询中的条件表达式)
RDBMS执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。
在对视图查询时,按视图的定义从基本表中将数据查出。
常见视图形式:
行列子集视图(定义:一个视图是从单个表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码)With check option视图基于多个基表的视图基于视图的视图带表达式的视图分组视图
例6:建立“网络工程”专业的学生选课信息视图NW_VIEW,包括学生的学号、姓名、课程号、成绩,且要保证对该视图进行修改和插入操作时都是“网络工程”专业的学生。
CREATE VIEW NW_VIEWAS SELECT Student.Sno, Sname, o, GradeFROM Student,SCWHERE Student.Sno=SC.Sno AND Smajor ='网络工程'WITH CHECK OPTION ;
对NW_VIEW视图的更新操作:
修改操作:自动加上Smajor='网络工程’的条件删除操作:自动加上Smajor='网络工程’的条件插入操作:自动检查Smajor属性值是否为’网络工程’ 如果不是,则拒绝该插入操作如果没有提供Smajor属性值,则自动定义Smajor值为’网络工程’
例7:创建一个视图NW_VIEW_0303,该视图中定义的是学号为“0303”学生的选课信息。
分析,该例可以直接对表进行查询建立视图,也可以对视图进行查询建立视图。
CREATE VIEW NW_VIEW_0303AS SELECT *FROM NW_VIEWWHERE Sno='0303'
例8:定义学生选修总学分的视图Total_Credit,包括该学生的学号和总学分。
CREATE VIEW Total_Credit (Vno, VCredit)AS SELECT Sno, SUM(redit)FROM SC, CourseWHERE o=oGROUP BY Sno
VnoVCredit101019.5201023.530.5402034502043.56030327\begin{array}{|l|l|l|} \hline & \text { Vno } & \text { VCredit } \\ \hline1 & 0101 & 9.5 \\ \hline2 & 0102 & 3.5 \\ \hline3 & 0201 & 3.5 \\ \hline4 & 0203 & 4 \\ \hline5 & 0204 & 3.5 \\ \hline6 & 0303 & 27 \\ \hline \end{array}123456Vno010101020016020302040303VCredit9.53.53.543.527
/*写法2*/CREATE VIEW Total_CreditAS SELECT Sno, SUM(redit) AS VCreditFROM SC, CourseWHERE o=oGROUP BY Sno
🕘 2.2 查询视图
用户角度:查询视图与查询基本表相同RDBMS实现视图查询的方法 视图消解法(View Resolution) 进行有效性检查转换成等价的对基本表的查询执行转换后的查询例9:查询“计算机科学与技术”和“软件工程”两个专业的所有学生的学号、姓名、专业、总学分。
SELECT Vno, Sname, Smajor, Vcredit FROM Student, Total_CreditWHERE Smajor IN ('计算机科学与技术','软件工程') and Sno=Vno
VnoSnameSmajorVcredit10101徐成波计算机科学与技术9.520102黄晓君计算机科学与技术3.530201黄晓君软件工程3.540203张顺峰软件工程450204洪铭勇软件工程3.5\begin{array}{|l|l|l|l|l|} \hline & \text { Vno } & \text { Sname } & \text { Smajor } & \text { Vcredit } \\ \hline 1 & 0101 & \text { 徐成波 } & \text { 计算机科学与技术 } & 9.5 \\ \hline 2 & 0102 & \text { 黄晓君 } & \text { 计算机科学与技术 } & 3.5 \\ \hline 3 & 0201 & \text { 黄晓君 } & \text { 软件工程 } & 3.5 \\ \hline 4 & 0203 & \text { 张顺峰 } & \text { 软件工程 } & 4 \\ \hline 5 & 0204 & \text { 洪铭勇 } & \text { 软件工程 } & 3.5 \\ \hline \end{array}12345Vno01010102001602030204Sname徐成波黄晓君黄晓君张顺峰洪铭勇Smajor计算机科学与技术计算机科学与技术软件工程软件工程软件工程Vcredit9.53.53.543.5
DBMS在执行此查询时,首先进行有效性检查,然后从数据字典中取出Total_Credit视图的定义,再与Student基本表的连接查询进行合并消解,转换为对基本表Student、Course和SC的查询。
🕘 2.3 更新视图
更新视图操作包括:
插入(INSERT)删除(DELETE)修改(UPDATE)
在DB2中对视图的更新有如下限制:
(1)若视图的属性来自属性表达式或常数,则不允许对视图执行INSERT
和UPDATE
操作,但允许执行DELETE
操作。
(2)若视图的属性来自聚集函数,则不允许对此视图更新。
(3)若视图定义中有GROUP BY
子句,则不允许对此视图更新。
(4)若视图定义中有DISTINCT
任选项,则不允许对此视图更新。
(5)若视图定义中有嵌套查询,并且嵌套查询的FROM
子句涉及导出该视图的基本表,则不允许对此视图更新。
(6)如果在一个不允许更新的视图上再定义一个视图,这种二次视图是不允许更新的。
PS:书上的这条,请注意:
若视图由两个以上的基本表导出,则不允许对此视图更新。-----实际上是可以的。
小结:只有行列子集视图允许更新,但我们一般不对视图做更新。
例10:将视图NW_VIEW中学号“0303”和课程号“1006”的成绩修改为91。
UPDATE NW_VIEWSET Grade=91WHERE Sno='0303' AND Cno='1006'
本例中该更新语句是可以执行的,且执行时也是转换为对基本表的更新。但是其他几个视图的更新是不允许的。
🕘 2.4 修改视图
视图修改的SQL语句格式为:
ALTER VIEW < 视图名>[WITH ENCRYPTION];AS <子查询>[WITH CHECK OPTION];
如果原来的视图定义中使用了WITH ENCRYPTION
或WITH CHECK OPTION
选项,则只有在ALTER VIEW
中也包含这些选项时,这些选项才能有效。修改视图并不会影响相关对象,除非对视图定义的更改使得该相关对象不再有效。
🕘 2.5 删除视图
语句的格式:
DROP VIEW <视图名>;
该语句从数据字典中删除指定的视图定义
如果该视图上还导出了其他视图,其定义还在数据字典中,但已不能使用,必须显式删除。删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW
语句删除
🕘 2.6 扩充:基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表(Derived Table)成为主查询的查询对象
例11:找出每个学生超过他自己选修课程平均成绩的课程号。
有哪些解决方案?
方法一:
SELECT Sno,Cno,grade as '这门课的成绩',avg_gradeFROM SC, (SELECT Sno, Avg(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno,avg_grade)/*定义了一个临时表*/WHERE SC.Sno = Avg_sc.avg_sno and SC.Grade >=Avg_sc.avg_grade
方法二:
CREATE VIEW V_avg_sc (avg_sno,avg_grade)AS SELECT Sno, Avg(Grade) FROM SC GROUP BY Sno;SELECT Sno, Cno,grade as '这门课的成绩', avg_gradeFROM SC,V_avg_scwhere Sno = avg_sno and Grade >=avg_grade;
SnoCno这门课的成绩avg_grade1010110069190201011008929030102100582824000590905020310038989602041005969670303100188858030310028685903031004988510030310069185\begin{array}{|l|l|l|l|l|} \hline & \text { Sno } & \text { Cno } & \text { 这门课的成绩 } & \text { avg\_grade } \\ \hline 1 & 0101 & 1006 & 91 & 90 \\ \hline 2 & 0101 & 1008 & 92 & 90 \\ \hline 3 & 0102 & 1005 & 82 & 82 \\ \hline 4 & 0201 & 1005 & 90 & 90 \\ \hline 5 & 0203 & 1003 & 89 & 89 \\ \hline 6 & 0204 & 1005 & 96 & 96 \\ \hline 7 & 0303 & 1001 & 88 & 85 \\ \hline 8 & 0303 & 1002 & 86 & 85 \\ \hline 9 & 0303 & 1004 & 98 & 85 \\ \hline 10 & 0303 & 1006 & 91 & 85 \\ \hline \end{array}12345678910Sno0101010101020016020302040303030303030303Cno1006100810051005100310051001100210041006这门课的成绩91928290899688869891avg_grade90908290899685858585
派生表是一种从查询表达式派生出虚拟结果表的表达式。
派生表与其他表一样出现在查询的FROM子句中。派生表仅存在于外部查询中.
使用派生表的一般形式如下:
FROM (SELECT * FROM TA WHERE ...) AS T
派生出来的表必须是一个有效的表,因此,它必须遵守以下几条规则:
所有列必须要有名称列名称必须是要唯一不允许使用ORDER BY
(除非指定了TOP)
如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其缺省属性。
例12:查询所有选修了1号课程的学生姓名,可以用如下查询完成:
派生表
SELECT SnameFROM Student, (SELECT Sno FROM SC WHERE Cno=' 1 ') AS SC1WHERE Student.Sno=SC1.Sno;
连接查询
SELECT SnameFROM Student, SCWHERE Student.Sno=SC.Sno and Cno=' 1 ';
嵌套查询一
SELECT SnameFROM Student WHERE sno in(select sno from sc where cno='1')
嵌套查询二
SELECT SnameFROM Student WHERE exists(select * from sc where sno=student.sno and cno='1')
视图
CREATE VIEW v_cno_1AS SELECT * FROM student,sc WHERE sc.sno=student.sno and cno='1';SELECT sname FROM v_cno_1;
🕒 3. 课后习题
【单选题】职工表EMP和部门表DEPT如图所示,其中有下划线的属性为主键,有波浪线的属性为外键。下面操作不能正确执行的是( )。
EMP
职工号‾部门号∼∼∼∼∼职工名E01D03李路E25D01武明E19D04崔浩E32D01李颖\begin{array}{|l|l|l|} \hline \underline{\text { 职工号 }} & \underset{\sim\sim\sim\sim\sim}{部门号} & \text { 职工名 } \\ \hline E01 & D03 & 李路 \\ \hline E25 & D01 & 武明 \\ \hline E19 & D04 & 崔浩 \\ \hline E32 & D01 & 李颖 \\ \hline \end{array}职工号E01E25E19E32∼∼∼∼∼部门号D03D01D04D01职工名李路武明崔浩李颖
DEPT
部门号‾部门名D01研发部D02市场部D03人事部D04财务部\begin{array}{|l|l|} \hline \underline{\text { 部门号 }} & \text { 部门名 } \\ \hline D01 & 研发部 \\ \hline D02 & 市场部 \\ \hline D03 & 人事部 \\ \hline D04 & 财务部 \\ \hline \end{array}部门号D01D02D03D04部门名研发部市场部人事部财务部
A.检索部门号为“D05”的职工号
B.将EMP表中职工“李路”的部门号改为空值
C.删除职工“崔浩”的记录
D.在EMP表中插入记录(“E18”,“D05”,“育锐”)
【多选题】对于student-course数据库,如果要查询没有选修了1号课程的学生姓名,以下选项正确是( )
A.SELECT Sname FROM Student, SC
WHERE Student.Sno=SC.Sno and Cno<>’ 1 ‘;
B.SELECT Sname FROM Student
WHERE sno not in (select sno from sc where cno=‘1’)
C.SELECT Sname FROM Student, (SELECT Sno FROM SC WHERE Cno<>’ 1 ') AS SC1
WHERE Student.Sno=SC1.Sno;
D.SELECT Sname FROM Student
WHERE not exists
(select * from sc where sno=student.sno and cno=‘1’)
E.create view v_cno_1
as select * from student,sc where sc.sno=student.sno and cno<>‘1’;
select sname from v_cno_1;
F.SELECT Sname FROM Student
WHERE sno in (select sno from sc where cno<>‘1’)
G.SELECT Sname FROM Student
WHERE not exists
(select * from sc where sno=student.sno and cno<>‘1’)
【单选题】若用如下的SQL语句创建一个Student表:
CREATE TABLE student (NO char(4) not null,
NAME Char(8) not null,
SEX char(2),
AGE numeric(2))
可以插入到student表中的是
A、(‘1031’,’育锐’,男,23)
B、(‘1031’,’育锐’,NULL,NULL)
C、(NULL,’育锐’,’男’,’23’)
D、(’1031’,NULL,’男’,23)
【单选题】在视图上不能完成的操作是( )
A、在视图上定义新的视图
B、查询操作
C、更新视图
D、在视图上定义新的基本表
【单选题】当修改基表数据时,视图________。
A、需要重建
B、可以看到修改结果
C、无法看到修改结果
D、不允许修改带视图的基表
【填空题】
设有如下关系表R:
R(,NAME,SEX,AGE,CLASS)
其中NO为学号,NAME为姓名,SEX为性别,AGE为年龄,CLASS为班号。写出实现下列功能的SQL语句。
①插入一个记录(25,‘李明’,‘男’,21,‘95031’);
②插入‘95031’ 班学号为30、姓名为‘郑和’的学生记录;
③将学号为 10的学生姓名改为 ‘王华’;
④将所有‘95101’ 班号改为‘95091’;
⑤删除学号为20的学生记录;
⑥删除姓‘王’的学生记录;
用SQL语句建立关系代数课后习题第19题中的四个表🔎 关系代数学习笔记
S(SNO,SNAME,STATUS,SCITY);
P(PNO,PNAME,COLOR,WEIGHT);
J(JNO,JNANE,JCITY);
SPJ(SNO,PNO,JNO,QTY)。
其中在SPJ表中,SNO、PNO和JNO是外键分别参照S、P、J中的相应字段。
注意:只需要创建SPJ表即可,但要记得外键和主键
针对上题中四个表,用SQL语句完成下述操作。
(1)找出使用供应商S1所供零件的工程号码。
(2)找出工程项目J2使用的各种零件名称及其数量。
(3)找出上海厂商供应的所有零件号码。
(4)找出使用上海产的零件的工程名称。
(5)找出没有使用天津产零件的工程号码。
(6)将由供应商S5供给工程代码为J4的零件P6改为由S3供应。
(7)从供应商关系中删除S2的记录,并从供应零件关系中删除相应的记录。
(8)请将(S2,J6,P4,500)插入供应情况表。
对于教学数据库的三个基本表:
S(SNO,SNAME ,AGE ,SEX)
SC(SNO ,CNO,GRADE)
C(CNO,CNAME ,TEACHER)
试用SQL语句表达下列查询:
(1)查询姓刘的老师所授课程的课程号和课程名。
(2)查询年龄大于23岁的男同学的学号和姓名。
(3)查询学号为S3学生所学课程的课程号、课程名和任课教师名。
(4)查询“张小飞”没有选修的课程号和课程名。
(5)查询至少选修了3门课程的学生的学号和姓名。
(6)在SC中删除尚无成绩的选课元组。
(7)把“高等数学”课的所有不及格成绩都改为60。
(8)把低于所有人总平均成绩的女同学的成绩提高5%。
(9)向C中插入元组(‘C8’,‘VC++’,‘王昆’)。
请为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY),并完成以下查询。
(1)找出三建工程项目使用的各种零件代码及其数量。
(2)找出供应商S1的供应情况。
答案:1.D(解析:因为EMP表的部门号是外键,参照的是DEPT表的主键,而DEPT表里没有D05,因此无法正确执行) 2.BD(解析:ACEFG都是否定在内层,不行) 3.B 4.D 5.B
6.第一空: INSERT INFO R VALUES(25, ‘李明’, ‘男’,21, ‘95031’);
第二空: INSERT INFO R(NO, NAME, CLASS) VALUES (30, ‘郑和’, ‘95031’);
第三空: UPDATE R
SET NAME=‘王华’
WHERE NO=‘10’
第四空: UPDATE R
SET CLASS = ‘95091’
WHERE CLASS=‘95101’
第五空: DELETE FROM R
WHERE NO = ‘20’
第六空: DELETE FROM R
WHERE NAME LIKE’王%’
CREATE TABLE SPJ( SNO VARCHAR(2)REFERENCES S(SNO),PNO VARCHAR(2),JNO VARCHAR(2),QTY NUMERIC(4), PRIMARY KEY (SNO,PNO,JNO),FOREIGN KEY(PNO) REFERENCES P(PNO),FOREIGN KEY(JNO) REFERENCES J(JNO));/* 注意:本题中主键约束只能放在表级,外键约束既可以放在表级也可以放在行级。 */
/*(1)*/SELECT DISTINCT JNO FROM SPJ WHERE SNO=’S1’/*(2)*/SELECT PNAME,QTY FROM P,SPJWHERE P.PNO=SPJ.PNO AND JNO=’J2’/*(3)*/SELECT DISTINCT PNO FROM SPJWHERE SNO IN(SELECT SNO FROM S WHERE SCITY=’上海’)/*(4)*/SELECT JNAME FROM J,SPJ,SWHERE J.JNO=SPJ.JNO AND SPJ.SNO=S.SNO AND S.SCITY=’上海’--或者SELECT JNAME FROM JWHERE JNO IN(SELECT JNO FROM SPJ,SWHERE SPJ.SNO=S.SNO AND S.SCITY=’上海’)--或者SELECT JNAME FROM J WHERE JNO IN(SELECT JNO FROM SPJ WHERE SNO IN(SELECT SNO FROM S WHERE SCITY=’上海’))/*(5)*/SELECT JNO FROM J WHERE NOT EXISTS(SELECT * FROM SPJ WHERE JNO= J.JNO AND SNO IN(SELECT SNO FROM S WHERE SCITY=’天津’))--或者SELECT JNO FROM J WHERE JNO NOT IN(SELECT JNO FROM SPJ WHERE SNO IN(SELECT SNO FROM S WHERE SCITY=’天津’))--或者SELECT JNO FROM J WHERE JNO NOT IN(SELECT JNO FROM SPJ,S WHERE SPJ.SNO=S.SNO AND SCITY=’天津’)--或者(SELECT JNO FROM J)EXCEPT(SELECT JNO FROM SPJ,SWHERE SPJ.SNO=S.SNO AND SCITY=’天津’)/*(6)*/UPDATE SPJ SET SNO=’S3’WHERE SNO=’S5’ AND PNO=’P6’ AND JNO=’J4’/*(7)*/DELETE FROM SPJ WHERE SNO=’S2’;DELETE FROM S WHERE SNO=’S2’;/* 本题一定要注意执行的顺序。Delete from SPJ,S where 是错误的!!!Update语句后面什么时候都不可能出现两个表需要用嵌套查询 *//*(8)*/INSERT INTO SPJ(SNO,JNO,PNO,QTY)VALUES (‘S2’,‘J6’,’P4’,500)--或者INSERT INTO SPJVALUES (‘S2’,’P4’,’J6’,500)
/*(1)*/SELECT CNO,CNAME FROM C WHERE TEACHER LIKE ’刘%’;/*(2)*/SELECT SNO ,SNAME FROM S WHERE AGE>23 AND SEX=’男’;/*(3)*/SELECT * FROM C WHERE CNO IN(SELECT CNO FROM SC WHERE SNO=’S3’);/*(4)*/SELECT CNO,CNAME FROM C WHERE NOT EXISTS(SELECT * FROM SC WHERE CNO=O AND SNO IN(SELECT SNO FROM S WHERE SNAME=’张小飞’));/*本题可以用EXCEPT*//*(5)*/SELECT SNO,SNAME FROM S WHERE SNO IN(SELECT SNO FROM SC GROUP BY SNO HAVING COUNT(*)>=3)COUNT(CNO)也可以--或者SELECT SNO,SNAME FROM S WHERE (SELECT COUNT(CNO) FROM SC WHERE SNO=S.SNO)>=3/*上面这个思路是:对于S表中的每一个学生,去检查他选修的课程门数是否大于等于3*/--或者用连接查询,但一般不用,没有必要SELECT SNO,SNAME FROM S WHERE SNO IN( SELECT S.SNO FROM S,SC WHERE S.SNO=SC.SNOGROUP BY S.SNO HAVING COUNT(*)>=3)/*(6)*/DELETE FROM SC WHERE GRADE IS NULL;/*(7)*/UPDATE SC SET GRADE=60WHERE GRADE<60 AND CNO IN(SELECT CNO FROM C WHERE CNAME=’高等数学’)/*(8)*/UPDATE SC SET GRADE=GRADE+GRADE*0.05 WHERE SNO IN (SELECT SNO FROM S WHERE S.SEX=’女’)AND GRADE < (SELECT AVG(GRADE) FROM SC)/*(9)*/INSERT INTO C VLAUES(‘C8’,‘VC++’,‘王昆’)--或者INSERT INTO C (CNO ,CNAME ,TEACHAR)VLAUES(‘C8’,‘VC++’,‘王昆’)
CREATE VIEW V_SPJASSELECT DISTINCT SNO,PNO,QTY FROM SPJWHERE JNO in(SELECT JNO FROM J WHERE JNAME=’三建’)--或者CREATE VIEW V_SPJASSELECT DISTINCT SNO,PNO,QTY FROM SPJ,JWHERE SPJ.JNO=J.JNO AND JNAME=’三建’
/*(1)*/SELECT PNO,SUM(QTY) FROM V_SPJGroup by pno/*(2)*/SELECT * FROM V_SPJWHERE SNO=’S1’
OK,以上就是本期知识点“基本表更新(INSERT、UPDATE、ALTER、DELETE)与视图VIEW”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页