关系数据库标准语言SQL

news2024/11/15 1:31:25

1.SQL概述

1.1基本表(Base table)

  • 实际存储在数据库中的表
  • SQL中一个关系就对应一个基本表
  • 基本表可以有若干个索引
  • 基本表的集合组成关系模式,即全局概念模式(数据的整体逻辑结构)

1.2 存储文件

  • 存储文件和相关索引组成了关系的内模式,即存储模式
  • 一个基本表可跨一个或多个存储文件,一个存储文件可存放一个或多个基本表
  • 一个存储文件与外存储器上的一个物理文件相对应

1.3视图(view)

  • 从一个或几个基本表或其它视图导出来的表
  • 视图本身并不独立存储数据,系统只保存视图的定义
  • 访问视图时,系统将按照视图的定义从基本表中存取数据
  • 视图是个虚表,它动态地反映基本表中的当前数据,这与数据的静态复 制不同。
  • 从用户的观点出发,基本表和视图都是关系,用SQL一样访问
  • 视图可以看作用户按照需要定义的外模式,即用户的局部数据逻辑结构
  • 用户可以在视图上再定义视图

2.数据定义

2.1数据定义语言(DDL)

对SQL模式、基本表、视图、索引的定 义和删除以及对基本表的修改和对域的定义等

2.2命名机制

现代关系数据库管理系统提供了一个层次化 的数据库对象命名机制。

  • 一个关系数据库管理系统的实例(Instance) 中可以建立多个数据库
  • 一个数据库中可以建立多个模式
  • 一个模式下通常包括多个表、视图和索引等 数据库对象

2.3模式

2.3.1定义模式

CREATE  SCHEMA <模式名> AUTHORIZATION <用户名>

例如:CREATE SCHEMA “S-T” AUTHORIZATION WANG;

表示:为用户WANG定义一个学生-课程模式S-T

2.3.2删除模式

DROP SCHEMA <模式名> <CASCADE|RESTRICT>

  1. CASCADE(级联):删除模式的同时把该模式中所有的数据库对象全部删除
  2. RESTRICT(限制):若该模式中定义了下属的数据库对象(如表、视图等),则拒绝该 删除语句的执行。仅当该模式中没有任何下属的对象时才能执行

2.4基本表

2.4.1定义

例:建立一个“学生”表Student,它由学号Sno、姓名 Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。 其中学号不能为空,值是唯一的,并且姓名取值也唯一。

CREATE TABLE Sudent 
(
    Sno CHAR(9) PRIMARY KEY,-- 列级完整性约束条件Sno是主码
    Sname CHAR(20) UNIQUE,-- UNIQUE约束Sname取唯一值
    Ssex CHAR(2),
    Sage SMALLINT,
    Sdept CHAR(20)
);
    

常用完整性约束:

  • 主码约束: PRIMARY KEY
  • 唯一性约束: UNIQUE
  • 非空值约束: NOT NULL
  • 参照完整性约束:  [FOREIGN KEY (列名)] REFERENCES <外表名>(外表列名)

例:建立一个“学生选课”表SC,它由学号Sno、课程号 Cno,修课成绩Grade组成,其中(Sno, Cno)为主码。

create table sc
(
    Sno char(9),
    Cno char(3),
    Grade int ,
    Primary Key(Sno,Cno),-- 主码有两个必须用表级完整性定义。
    foreign key (Sno) references student (Sno),-- 表级完整性约束条件,Sno是外码,被参照表是Student
    foreign key (Cno) references Course (Cno),-- 表级完整性约束条件, Cno是外码,被参照表是Course
);

2.4.2数据类型

2.4.3修改基本表

例:(1)向Student表增加“入学时间”列,数据类型为日期型

alter table Student ADD S_entrance DATE;
-- 不管基本表中原来是否已有数据,新增加的列一律为空值

(2)将年龄的数据类型由字符型(假设原来的数据类型是字符型) 改为整数。

alter table Student alter column Sage INT;

(3)增加课程名称必须取唯一值的约束条件

ALTER TABLE Course ADD UNIQUE(Cname);

2.4.4索引的建立与删除

例:(1)为学生-课程数据库中的Student,Course,SC三个表建立索引。 Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引, SC表按学号升序和课程号降序建唯一索引。

CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);

2.4.5修改索引

ALTER INDEX <旧索引名> RENAME TO <新索引名>

(1)将SC表的SCno索引名改为SCSno。

ALTER INDEX SCno RENAME TO SCSno;

2.4.6删除索引

DROP INDEX <索引名>;

(1)删除Student表的Stusname索引

DROP INDEX Stusname;

2.5数据字典

  • 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有 对象的定义信息以及一些统计信息:
  • 关系模式、表、视图、索引的定义;完整性约束的定义;各类用户对数 据库的操作权限 ;统计信息等。
  • 关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新 数据字典表中的相应信息。

3.数据查询

  • 根据WHERE子句的条件表达式
  • 从FROM子句指定的基本表或视图中找出满足条件的元组
  • 再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表
  • 如果有ORDER BY子句,则结果表要根据指定按升序或降序排序
  • GROUP BY子句将结果按分组,每个组产生表中的一个元组。如 果带有聚集函数的HAVING短语,则只有满足指定条件的组才予以输出。

(1)查询全体学生的学号与姓名

SELECT Sno,Sname
FROM Student;

查询全部列:在SELECT关键字后面列出所有列名、将<目标表达式>指定为 *

SELECT子句的 <目标表达式> 不仅可以为表中的属性列,也可以是表达式

(1)查全体学生的姓名及其出生年份

SELECT Sname,2019-Sage /*假设当时为2019年*/
FROM Student;

(2)查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表 示系名。

SELECT Sname,
'Year of Birth: '
,2019-Sage,LOWER(Sdept)
FROM Student;

(3)使用列别名改变查询结果的列标题

SELECT Sname NAME,'Year of Birth:' BIRTH,
2019-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;

3.1选择表中的若干元组

消除取值重复的行

查询选修了课程的学生学号。

如果没有指定DISTINCT关键词,则缺省为ALL:

SELECT Sno FROM SC; 等价于:SELECT ALL Sno FROM SC;

指定DISTINCT关键词,去掉表中重复的行

SELECT DISTINCT Sno FROM SC;

3.2查询满足条件的元组

(1)查询计算机科学系全体学生的名单。

SELECT Sname
FROM Student
WHERE Sdept=‘CS’;

(2)查询所有年龄在20岁以下的学生姓名及其年龄。

SELECT Sname,Sage
FROM Student
WHERE Sage < 20;

(3)查询考试成绩有不及格的学生的学号。

SELECT DISTINCT Sno -- 注意DISTINCT
FROM SC
WHERE Grade<60; 

3.3确定范围

谓词: BETWEEN … AND … NOT BETWEEN … AND …

(1)查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系 别和年龄

SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;

3.4确定集合

谓词:IN<值表> , NOT IN<值表>

(1)查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的 姓名和性别。

SELECT Sname, Ssex
FROM Student
WHERE Sdept IN (‘CS’,'MA’,'IS' );

3.5字符匹配

(1)查询所有姓刘学生的姓名、学号和性别

SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '刘%';

(2)查询姓"欧阳"且全名为三个汉字的学生的姓名。

SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__';

3.6涉及空值的查询

IS NULL 或 IS NOT NULL

“IS” 不能用 “=” 代替


(1)某些学生选修课程后没有参加考试,所以有选课记录,但没有 考 试成绩。查询缺少成绩的学生的学号和相应的课程号。

SELECT Sno, Cno
FROM SC
WHERE Grade IS NULL

3.7多重条件查询

逻辑运算符:AND和 OR来连接多个查询条件

AND的优先级高于OR

可以用括号改变优先级

例:

(1)查询计算机系 、年龄在20岁以下 的学生姓名

SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage<20;

3.8ORDER BY子句

  • 可以按一个或多个属性列排序
  • 升序:ASC;
  • 降序:DESC;
  • 缺省值为升序

(1)查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序 排列。

select Sno,Grade
from SC
where Cno='3'
order by Grade desc;

(2)查询全体学生情况,查询结果按所在系的系号升序排列,同一系中 的学生按年龄降序排列。

SELECT *
FROM Student
ORDER BY Sdept, Sage DESC; 

4.聚集函数

(1)查询学生总人数。

SELECT COUNT(*)
FROM Student;

(2)查询选修了课程的学生人数

select count(distinct Sno)
from SC;

(3)计算1号课程的学生平均成绩。

select avg(Grade)
from SC
where Cno='1';

(4)查询选修1号课程的学生最高分数

select max(grade)
from SC
where Cno='1';

(5)查询学生201215012选修课程的总学分数。

select sum(Ccredit)
from SC,Course
where Sno='201215012' and SC.Cno=Course.Cno;

5.GROUP BY子句

GROUP BY 子句的HAVING 短语——对每一组内的数据进行条件设定。

例如:(1)查询选修了3门及以上课程的学生学号。

select Sno
from SC
group by Sno
having count(*)>=3; -- zz或者是count(Cno)>3;

过程:

中间过程:

Sno

Cno

Grade

200215121

1

92

2

85

3

88

200215122

2

90

3

80

先分组,接着执行having中的语句,对Cno进行count(注意因为是按照Sno进行分组,所以Sno相当于索引了,聚集函数不会对其进行操作)。


5.1区别

GROUP BY子句分组:细化聚集函数的作用对象

  • 如果未对查询结果分组,聚集函数将作用于整个查询结果
  • 对查询结果分组后,聚集函数将分别作用于每个组

HAVING短语与WHERE子句的区别:

  • 作用对象不同
    • WHERE子句作用于基表或视图的每个记录,从中选择满足条件的元组
    • HAVING短语作用于组,从中选择满足条件的组。

例(1)查询平均成绩大于等于90分的学生学号和平均成绩

select Sno,avg(Grade)
from SC
group by Sno
having avg(Grade)>=90;

(2)下面有关HAVING子句,说法不正确的是(C)

A.使用HAVING子句的作用是过滤掉不满足条件的分组;

B.使用HAVING子句的同时可以使用WHERE子句;

C.使用HAVING子句的同时不能使用WHERE子句;

D.HAVING子句必须与GROUP BY 子句同时使用,不能单 独使用

(3)列出计算机系CS所有姓刘同学的信息,按学号排序

select *
from Student
where Sdept='CS' and Sname like '刘%'
order by Sno ass;

(4)按系并区分男女统计各系学生人数,按人数降序排列

select Sdept,Ssex,count(Sno)
from student
group by Sdept,Ssex
order by count(sno) desc;

过程:首先按照系别分组,接着系别中按照性别分组,然后选择系别、性别、人数。

6.连接查询

  • 连接查询:同时涉及两个以上的表的查询
  • 在 SQL中“连接”是用“连接条件”来表达的
  • 连接条件或连接谓词:用来连接两个表的条件,
  • 连接字段:连接谓词中的列名称,连接条件中的各连接字段类型必须是可比的,但名字不必相同

6.1等值与非等值连接查询

6.1.1等值连接

等值连接:连接运算符为 =

例(1)查询每个学生及其选修课程情况

select Student.*,SC.* -- 注意这里<表名>.*代表表中所有属性
from Student,SC
where Student.Sno=SC.Sno;

6.1.2自然连接(去掉重复列)

对6.1.1中例1用自然连接完成。

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;

因为两个表中处理Sno其他名字不同,所以可以不用加“<表名>.

注意:一条SQL语句可以同时完成选择连接查询

        WHERE子句由连接谓词和选择谓词组成的复合条件

例(1)查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。

select Student.Sno,Sname
from Student,SC
where Cno='2' and Student.Sno=SC.Sno and Grade>=90;

执行过程:先从SC中挑选出Cno= '2'并且Grade>90的元组形成一个中间关系,再和Student中满足连接条件的元组进行连接得到最终的结果关系。因为DBMS会自动选择最优的,连接费事费空间,所以可以先筛选。

6.2自身连接

  • 一个表与其自己进行连接
  • 需要给表起别名以示区别
  • 由于所有属性名都是同名属性,因此必须使用别名前缀

例:

(1)查询每一门课的间接先修课(即先修课的先修课)

select first.Cno,second.Cpro
from first,second
where first.Cpro=second.Cno;

6.3外连接

外连接与普通连接的区别:

  • 普通连接操作只输出满足连接条件的元组
  • 外连接操作,以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
  • 左外连接:列出左边关系中所有的元组
  • 右外连接:列出右边关系中所有的元组

6.4多表连接

(1)查询每个学生的学号、姓名、选修的课程名及成绩

select Student.Sno,Sname,Cname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno and Course.Cno=SC.Cno;

7.嵌套查询

  • 一个SELECT-FROM-WHERE语句称为一个查询块
  • 将一个查询块嵌套在另一个查询块WHERE子句HAVING短语的 条件中的查询称为嵌套查询
SELECT Sname /*外层查询/父查询*/
FROM Student
WHERE Sno IN
( SELECT Sno /*内层查询/子查询*/
FROM SC
WHERE Cno= '2');

SQL语言允许多层嵌套查询:即一个子查询中还可以嵌套其他子查询

子查询的限制:不能使用ORDER BY子句

7.1带有IN谓词的子查询

例(1)查询与“刘晨”在同一个系学习的学生。

step1.确定“刘晨”所在系名

SELECT Sdept
FROM Student 
WHERE Sname= '刘晨';

step2.查找所有在CS系学习的学生。

select Sname
from Student
where Sdept ='CS';

将第一步查询嵌入到第二步查询的条件中:

select Sname
from Student
where Sdept in(
select Sdept
from Student
where Sname='刘晨';);

注:此查询为不相关子查询:子查询的查询条件不依赖于父查询。由里向外 逐层处理。

即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父 查询的查找条件。

另解:用自身连接完成

SELECT S1.Sno, S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND
S2.Sname = '刘晨';

例(2)查询选修了课程名为“信息系统”的学生学号和姓名。

select Sno,Sname
from Student
where Sno in(
select Sno
from SC,Course
where Course.Cno=SC.Cno and Cname='信息系统';);

解法2:

SELECT Sno,Sname
FROM Student
WHERE Sno IN
(
SELECT Sno 
FROM SC
WHERE Cno IN
(
SELECT Cno FROM Course
WHERE Cname= 
'信息系统'
)
)

解法3

SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND
SC.Cno = Course.Cno AND
Course.Cname='信息系统';

7.2带有比较运算符的子查询

当能确切知道内层查询返回单值时,可用比较运算符

例(1)找出每个学生超过他选修课程平均成绩的课程号.

SELECT Sno, Cno
  FROM SC x
  WHERE Grade >= (SELECT AVG(Grade) 
    FROM SC y
    WHERE y.Sno=x.Sno);

注意:相关子查询,子查询的查询条件依赖于父查询

7.2.1相关子查询可能的执行过程

step1:从外层查询中取出SC的一个元组x,将元组x的Sno值(201215121)传送给内层查询。

SELECT AVG(Grade)
FROM SC y
WHERE y.Sno='201215121';

step2:执行内层查询,得到值88(近似值), 用该值代替内层查询,得到外层查询:

SELECT Sno,Cno
FROM SC x
WHERE Grade >=88;

step3:执行这个查询,得到(201215121,1)、(201215121,3)。

step4:然后外层查询取出下一个元组重复做上述①至③步骤,直到外层的SC元组全部处理完毕。

7.3嵌套查询求解方法总结

7.3.1不相关子查询

子查询的查询条件不依赖于父查询:

  • 由里向外 逐层处理
  • 即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父 查询的查找条件。

7.3.2相关子查询

子查询的查询条件依赖于父查询

  • 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处 理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
  • 然后再取外层表的下一个元组
  • 重复这一过程,直至外层表全部检查完为止

7.4带有ANY(SOME)或ALL谓词的子查询

在谓词逻辑中,还有存在量词和全称量词的概念,在SQL中并没有对应的表达,统一采用“谓词” 来表达。

方法一:引入ANY和ALL谓词

  • 其对象为某个查询结果
  • 表示其中任意一个值或者全部值

方法二:引入EXIST谓词

  • 其对象也是某个查询结果
  • 但表示这个查询结果是否为空,返回真值。

7.4.1ANY和ALL

例(1)查询非计算机科学系中比计算机科学系任意某个学生年龄小的学生 姓名和年龄.

select Sname,Sage
from Student
where Sage < any(
  select Sage
  from Student
  where Sdept='CS';)
  and Sdept <> 'CS';

执行过程:首先处理子查询,找出CS系中所有学 生的年龄,构成一个集合1,处理父查询,找所有不是CS系且年龄 小于any(集合1)的元素。(其实也可以是直接<min(....))

例(2)查询非计算机科学系中比计算机科学系所有学生年龄都小的学生 姓名及年龄

方法一是将例1的any改成all。

方法二:

SELECT Sname,Sage
FROM Student
WHERE Sage < 
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= ' CS ')
AND Sdept <>' CS ';

7.5带有EXISTS谓词的子查询

EXISTS谓词 存在量词 \exists

  • 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或 逻辑假值“false“.
  • 若内层查询结果非空,则外层的WHERE子句返回真值
  • 若内层查询结果为空,则外层的WHERE子句返回假值
  • 由EXISTS引出的子查询,其目标列表达式通常都用 *
  • 因为带EXISTS的子查询只返回真或假值,给出列名无实际意义

NOT EXISTS谓词

  • 若内层查询结果非空,则外层的WHERE子句返回假值
  • 若内层查询结果为空,则外层的WHERE子句返回真值

例(1)查询所有选修了2号课程的学生姓名。

分析:本查询涉及Student和SC关系,在Student中依次取每个元组的Sno值,用此值去检查SC表,若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= ‘2’,则取此Student.Sname送入结果表。

SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno= ' 2 ');

本题也可以用in和连接去做。

例题(2)已知S(S#,SN,AGE,SEX),S#学号,SN姓名。若要检索所有比' 王华'年龄大的学生姓名、年龄和性别,正确的SELECT语句是(A)

A:SELECT SN, AGE, SEX FROM S

     WHERE AGE>(SELECT AGE FROM S

                                WHERE SN='王华')

B:SELECT SN,AGE,SEX FROM S

        WHERE SN='王华'

C:SELECT SN,AGE,SEX FROM S

        WHERE AGE>(SELECT AGE

                                        WHERE SN='王华')

D:SELECT SN,AGE,SEX FROM S

                WHERE AGE > 王华.AGE

8.数据更新

8.1插入数据

8.1.1插入元组

例(1)将一个新学生元组(学号:201215128;姓名:陈冬;性别:男; 所在系:IS;年龄:18岁)插入到Student表中。

insert into Student(Sno,Sname,Ssex,Sdept,Sage)
values('201215128','陈东','男','IS',18);

注意:VALUES子句与INTO子句相对应一致

例(2)插入一条选课记录( '200215128','1 ')。

INSERT INTO SC(Sno,Cno)
VALUES ('201215128 ','1');
-- 或者
INSERT INTO SC
VALUES ('201215128 ','1',NULL);

例(3)插入全部信息,INTO子句可省略列名

INSERT INTO Student
VALUES ('201215126','张成民','男’,18,'CS');

8.1.2插入子查询结果

例(1)对每一个系,求学生的平均年龄,并把结果存入数据库

第一步:建表

CREATE TABLE Dept_age
( Sdept CHAR(15) /*系名*/
Avg_age SMALLINT); /*学生平均年龄*/

第二步:插入数据

INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

8.2修改数据

8.2.1修改某一个元组的值

将学生201215121的年龄改为22岁.

UPDATE Student SET Sage=22
WHERE Sno=' 201215121 ‘;

8.2.2修改多个元组的值

将所有学生的年龄增加1岁.

update Student set Sage=Sage+1;

8.2.3带子查询的修改语句

关系数据库管理系统在执行修改语句时会检查修改操作是否破坏 表上已定义的完整性规则

  • 实体完整性:主码不允许修改
  • 用户定义的完整性: NOT NULL约束、 UNIQUE约束、 值域约束

将计算机科学系全体学生的成绩置零.

UPDATE SC SET Grade=0
WHERE Sno IN
(SELETE Sno
FROM Student
WHERE Sdept= 'CS' );

8.3删除数据

8.3.1删除某一个元组的值

删除学号为201215128的学生记录.

DELETE FROM Student
WHERE Sno= '201215128';

8.3.2. 删除多个元组的值

删除所有的学生选课记录。

DELETE FROM SC;

8.3.3带子查询的删除语句

删除计算机科学系所有学生的选课记录。

DELETE FROM SC
WHERE Sno IN(
SELETE Sno
FROM Student
WHERE Sdept= 'CS’
);

9.视图

视图的特点:

  • 虚表,是从一个或几个基本表(或视图)导出的表
  • 只存放视图的定义,不存放视图对应的数据
  • 基表中的数据发生变化,从视图中查询出的数据也随之改变

9.1建立视图

注意:

  • 关系数据库管理系统执行CREATE VIEW语句时只是把视图定义存 入数据字典,并不执行其中的SELECT语句
  • 在对视图查询时,按视图的定义从基本表中将数据查出。

例(1)建立信息系学生的视图

create view IS_Student
as
select Sno,Sname,Sage
from Student
where Sdept='IS';

例(2)建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该 视图只有信息系的学生 。

CREATE VIEW IS_Student AS 
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS' WITH CHECK OPTION;
  • WITH CHECK OPTION子句:对该视图进行插入、修改和删除操作时,RDBMS会自动 加上Sdept='IS'的条件。
  • 若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些 列,但保留了主码,称这类视图为行列子集视图
  • 上面的IS_Student视图就是一个行列子集视图

9.1.1基于多个基表的视图

例(1)建立信息系选修了1号课程的学生的视图(包括学号、姓名、 成绩)

create view IS_s1(Sno,Sname,Grade)
as
select Student.Sno,Sname,Grade
from Student,SC
where Sdept='IS' and Cno='1'and 
Student.Sno=SC.Sno;

9.1.2基于视图的视图

例(1)建立信息系选修了1号课程且成绩在90分以上的学生的视图。

CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;

9.1.3带表达式的视图

例(1)定义一个反映学生出生年份的视图。

CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS 
SELECT Sno,Sname,2014-Sage
FROM Student;

9.1.4分组视图

将学生的学号及平均成绩定义为一个视图

create view S_G(Sno,Gavg)
as
select Sno,avg(Grade)
from SC
group by Sno;

9.2删除视图

9.3查询视图

例(1)在信息系学生的视图中找出年龄小于20岁的学生。

SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;

视图消解转换后的查询语句为:

SELECT Sno,Sage 
FROM Student
WHERE Sdept= 'IS' AND Sage<20;

视图消解法的局限:有些情况下,视图消解法不能生成正确的查询。

例(2)在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩

SELECT *
FROM S_G
WHERE Gavg>=90;

上面由于:聚集函数不能在where子句里面。

9.4更新视图

例(1)将信息系学生视图IS_Student中学号”201215122”的学生姓 名改为”刘辰” 。

UPDATE IS_Student
SET Sname= '刘辰'
WHERE Sno= ' 201215122 ';

转换后的语句:

UPDATE Student
SET Sname= '刘辰'
WHERE Sno= ' 201215122 ' AND Sdept= 'IS';

例(2)向信息系学生视图IS_S中插入一个新的学生记录,其中学号 为”201215129”,姓名为”赵新”,年龄为20岁

INSERT
INTO IS_Student
VALUES(‘201215129’,’赵新’,20);

转换为对基本表的更新:

INSERT
INTO Student(Sno,Sname,Sage,Sdept)
VALUES(‘200215129 ','赵新',20,'IS' );

例(3)删除信息系学生视图IS_Student中学号为”201215129”的记录

DELETE
FROM IS_Student
WHERE Sno= ' 201215129 ';

转换为对基本表的更新:

DELETE
FROM Student
WHERE Sno= ' 201215129 ' AND Sdept= 'IS';

注意:

  • 更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不 能唯一地有意义地转换成对相应基本表的更新
  • 允许对行列子集视图进行更新
  • 对其他类型视图的更新不同系统有不同限制

比如下面:

UPDATE S_G
SET Gavg=90
WHERE Sno= 
'201215121';

这个对视图的更新无法转换成对基本表SC的更新,因为不可能修改多个数据使平均成绩变成90分。

9.5视图的作用

  • 视图能够简化用户的操作
    • 当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作
      • 基于多张表连接形成的视图
      • 基于复杂嵌套查询的视图
      • 含导出属性的视图
  • 视图使用户能以多种角度看待同一数据
    • 视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要
  • 视图对重构数据库提供了一定程度的逻辑独立性
    • 比如:数据库重构 :学生关系Student(Sno,Sname,Ssex,Sage,Sdept),“垂直”地分成两个基本表:SX(Sno,Sname,Sage) 、SY(Sno,Ssex,Sdept)。通过建立一个视图使两个表连接在一起,形成Student(Sno,Sname,Ssex,Sage,Sdept)。
    • 使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据
    • 由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因 基本表结构的改变而改变——一定程度的逻辑独立性
  • 视图能够对机密数据提供安全保护
    • 对不同用户定义不同视图,使每个用户只能看到他有权看到的数据
  • 适当的利用视图可以更清晰的表达查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1527805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android 顺滑滑动嵌套布局

1. 背景 最近项目中用到了上面的布局&#xff0c;于是使用了scrollviewrecycleview&#xff0c;为了自适应高度&#xff0c;重写了recycleview&#xff0c;实现了高度自适应&#xff1a; public class CustomRecyclerView extends RecyclerView {public CustomRecyclerView(Non…

【氮化镓】利用Ga2O3缓冲层改善SiC衬底AlN/GaN/AlGaN HEMT器件性能

Micro and Nanostructures 189 (2024) 207815文献于阅读总结。 本文是关于使用SiC衬底AlN/GaN/AlGaN高电子迁移率晶体管&#xff08;HEMT&#xff09;的研究&#xff0c;特别是探讨了不同缓冲层对器件性能的影响&#xff0c;以应用于高速射频&#xff08;RF&#xff09;应用。…

MySQL—基本操作

1.创建数据库 ①CREATE DATABASE schooldb; --不进行检查和设置默认字符集 ②CREATE DATABASE IF NOT EXISTS schooldb CHARSET utf8; --进行检查和设置默认字符集 CREATE DATABASE 创建数据库 IF NOT EXISTS 意为当前数据库不存在 CHARSET 意为设置数据库字符集…

文物管理系统|基于SSM框架+ Mysql+Java+ B/S结构的文物管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

GitLab/Github从头开始配置秘钥

1、下载git安装包 CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 拉到页面最底部选择 点进文件夹下载32位或者64位的版本&#xff0c;我的是64位就选择64的版本进行安装 2、傻瓜式安装 3、在相应的文件夹右键选择 UserName为你的用…

青海200MW光伏项目 35kV开关站图像监控及安全警示系统

一、背景 随着我国新能源产业的快速发展&#xff0c;光伏发电作为清洁能源的重要组成部分&#xff0c;得到了国家政策的大力扶持。青海作为我国光伏资源丰富地区&#xff0c;吸引了众多光伏项目的投资建设。在此背景下&#xff0c;为提高光伏发电项目的运行效率和安全性能&…

深度学习实战模拟——softmax回归(图像识别并分类)

目录 1、数据集&#xff1a; 2、完整代码 1、数据集&#xff1a; 1.1 Fashion-MNIST是一个服装分类数据集&#xff0c;由10个类别的图像组成&#xff0c;分别为t-shirt&#xff08;T恤&#xff09;、trouser&#xff08;裤子&#xff09;、pullover&#xff08;套衫&#xf…

苹果计划与谷歌合作使用Gemini AI技术,提升iPhone功能,同时探索与OpenAI合作可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Shape)

绘制组件的父组件&#xff0c;父组件中会描述所有绘制组件均支持的通用属性。 1、绘制组件使用Shape作为父组件&#xff0c;实现类似SVG的效果。 2、绘制组件单独使用&#xff0c;用于在页面上绘制指定的图形。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起&#xff0c;录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧&#xff0c;还是录制游戏过程&#xff0c;一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件&#xff0c;帮助读者了解它们的特点和操作步骤&#…

【测试开发学习历程】MySQL条件查询与通配符 + MySQL函数运算(上)

前言&#xff1a; 18日08&#xff1a;56&#xff0c;总要先写完明天的博客&#xff0c;才能安心准备今天或者明天的学习。 半夜爬起来写博客真的好辛苦&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 回归…

超越标签的探索:K-means与DBSCAN在数据分析中的新视角

最近在苦恼为我的数据决定分组问题&#xff0c;在查找资料时&#xff0c;恰好看到机器学习中的无监督学习的聚类分析&#xff0c;正好适用于我的问题&#xff0c;但是我之前学机器学习时。正好没有学习无监督部分&#xff0c;因为我认为绝大多数问题都是有标签的监督学习&#…

robots协议详解:爬虫也要有边界感

随着互联网的迅猛发展,信息的获取变得越来越便捷,而网络爬虫(Spider)技术就是其中之一。网络爬虫是一种自动化程序,它能够遍历互联网上的网页,提取信息,用于各种用途,例如搜索引擎索引、数据挖掘、价格比较等。但是,爬虫技术虽然强大,但是也是一把双刃剑,在正当使用…

ChatGPT是什么,怎么使用,需要注意些什么?

一、ChatGPT 是什么&#xff1f; ChatGPT&#xff0c;全称聊天生成预训练转换器&#xff08;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是 OpenAI 开发的人工智能(AI)聊天机器人程序&#xff0c;于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的…

使用uniapp,uni-data-select组件时,内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点,逼死强迫症

项目场景&#xff1a; 微信小程序开发&#xff0c;使用uniapp&#xff0c;uni-data-select组件时&#xff0c;内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点&#xff0c;逼死强迫症 解决方案&#xff1a; 找到组件的源代码&#xff0c;然后删除那三个…

MeterSphere和Jmeter使用总结

一、MeterSphere 介绍 MeterSphere 是⼀站式开源持续测试平台&#xff0c;涵盖测试跟踪、接⼝测试、UI 测试和性能测试等&#xff0c;全 ⾯兼容 JMeter、Selenium 等主流开源标准&#xff0c;能够有效助⼒开发和测试团队在线共享协作&#xff0c;实现端到 端的测试管理跟踪…

日志 | 日志级别 | c/c++ | 终端显示不同的颜色

日志想必都知道 优先级从高到低依次为&#xff1a;OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL日志参考1 #define RED "\x1B[31m" #define GRN "\x1B[32m" #define YEL "\x1B[33m" #define BLU "\x1B[34m" #define MAG "…

绝地求生:受到封禁三天的玩家,静待解封即可!官方暂未发布系误封公告

首先&#xff0c;评论区所说的误封解除公告为假&#xff01; 3.17晚上无聊刷到黑盒里有几个人一直在发一张截图&#xff0c;说是官方发布了公告 “表示三天的封禁系误封&#xff0c;已在逐步解封。” 但是在细看这个图片的时候&#xff0c;会发现很大一部分人都是用的一张图片…

HTML5球体下落粒子爆炸特效

HTML5球体下落粒子爆炸特效&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 HTML5球体下落粒子爆炸特效

【Flink】Flink 中的时间和窗口之窗口API使用

1. 窗口的API概念 窗口的API使用分为按键分区和非按键分区&#xff0c;在定义窗口操作之前&#xff0c;首先就要确定好是基于按键分区Keyed的数据流KeyedStream来开窗还是基于没有按键分区的DataStream上开窗。 1.1 按键分区窗口&#xff08;Keyed Windows&#xff09; 按键…