数据库期末复习
第一章 数据库发展史
-
数据管理技术三个阶段:人工管理、文件系统、数据库系统
-
文件系统的三个缺陷:数据冗余、不一致性、数据联系弱
-
数据库系统三个阶段:
-
层次模型/后面的逻辑数据模型和结构模型
特点:有根树,一般表示一对多联系,也可以表示多对多;用指针表示联系
-
网状模型有向图,能表示多对多m:n;用指针表示联系
-
关系模型二维表格表示实体集,外键和主键(公共属性)表示联系
- 关系模型的特性:
- 每列不可分
- 没有两行完全相同
- 没有行序和列序(有时候会有列序,为了方便)
- 关系模型的三个完整性约束
- (属于关系完整性)实体完整性
- (属于关系完整性)参照完整性
- 用户自定义完整性
- 关系模型的特性:
-
-
数据库专业术语
-
数据库DB
-
数据库管理系统DBMS
数据库管理系统的主要功能
- 数据库的定义功能
- 数据库的操纵功能
- 数据库的保护功能
- 数据库的维护功能
- 数据字典
-
数据库系统DBS:采用数据库技术的计算机系统
-
第二章 数据库系统结构
-
三个世界:现实世界、信息世界、机器世界
-
数据描述(概念和逻辑)
-
概念设计中的数据描述
- 实体
- 实体集
- 属性
- 实体标识符
-
逻辑设计中的数据描述
- 字段/数据项–对应属性
- 记录–对应实体
- 文件–对应实体集
- 关键码–对应实体标识符
-
-
数据联系的描述
联系的元数:与一个联系有关的实体集个数
-
二元联系的类型:
- 一对一
- 一对多
- 多对多
-
实体联通词:最少和最多关系<min,max>
-
概念和逻辑数据模型
数据模型(Data Model):表示实体类型和实体间联系的模型
-
概念(数据)模型:面对现实世界的第一层抽象(ER模型)
最著名的概念模型就是“实体联系模型”(即ER模型)
概念模型独立于计算机系统,独立于DBMS(完全不涉及信息在计算机系统的任何表达),用于建立信息世界的数据模型
-
逻辑模型/结构模型:面对现实世界的第二层抽象
逻辑/结构数据模型从计算机的观点对于数据建模
直接面向数据库的逻辑结构,直接与DBMS有关,用于建立机器世界的数据模型
- 层次模型
- 网状模型
- 关系模型
- 特性:二维表格表实体集,由若干个关系模式组成的集合
- 关系模型的3个完整性约束
- 实体完整性
- 参照完整性
- 用户自定义完整性
- 面向对象模型
-
-
数据模型三要素
- 数据结构
- 数据操纵
- 完整性约束
-
三级结构两级映像
从某个角度看到的数据特性称为**“数据视图“**
-
三级结构
-
外模式(外模式可以多个) 用户使用DML数据操纵语言对数据库进行操作
单个用户可以看到的数据特性
用户与数据库系统的接口
外模式是概念模式的逻辑子集
-
模式/概念模式(模式只有一个)模式DDL语言 schema data definition language
所有用户的数据定义
DB中所有数据的整体逻辑结构
不涉及到存储结构、访问技术
-
内模式 内模式DDL:物理方面的描述
定义内部记录类型、索引和文件组成方式
-
-
二级映像(确保数据独立性)
- 外模式/模式(放在外模式描述):逻辑独立性/逻辑数据独立性
- 模式/内模式(放在内模式描述):物理独立性/物理数据独立性
-
两个数据独立性:应用程序和数据库的数据结构之间相互独立 不受影响
-
逻辑独立性(外模式/模式)
改概念模式 只需要修改外模式/模式 外模式不受影响
-
物理独立性(模式/内模式)
改内模式 只需要修改模式/内模式 模式不受影响
-
-
第三章 关系运算
-
关系数据模型
-
定义
二维表格表示实体集,外键/关键码表示实体间联系的数据模型
-
关系的性质(1)属性是原子的 不可分(2)没有重复元组(3)没有行序(4)理论上没有列序,有时为了方便可以有列序
-
关键码/键
由一个或者多个属性组成
包含在任意候选键中的属性称为主属性,不包含在任何候选键中的称为非主属性或非键属性
-
超键:能唯一标识元组的属性或属性集
-
候选键:能唯一标识元组却不含多余属性的属性集 就是候选键
-
主键:如果有多个候选键,就选择其中一个为主键(下划线)
-
外键:包含的另一个关系的属性(波浪线)
R中有S主键 那么S是参照关系 R是依赖关系
-
-
关系模型三级体系结构
-
关系子模式(外模式是关系子模式集合)
数据不直接来自关系模式中的数据 而是从若干关系模式中抽取满足一定条件的
-
关系模式(概念模式是关系模式集合)用DDL定义
对关系的描述,包括模式名、组成该关系的属性名等。具体的关系称为实例
-
存储模式(内模式是存储模式集合)
关系如何在物理存储设备上存储的
-
-
关系模型的完整性规则
实体完整性规则和参照完整性规则是关系模型必须满足的完整性的约束条件,称为关系完整性规则
-
实体完整性规则:元组中主键的值不能为空
-
参照完整性规则:外键为空或者为对应某个主键
关系数据库中,关系和关系的联系是通过公共属性(一个表的主键和另一个表的外键)实现的。
这个外键要么是空值null,要么就是在另一个表的主键存在的
外键和对应的主键可以不同名,但是要定义在相同值域上
-
用户自定义的完整性规则
-
-
关系模式的三个组成部分:
- 数据结构
- 数据操作
- 完整性规则
-
-
关系查询语言(根据理论基础不同分两类)
- 关系代数语言:关系代数以集合操作为基础
- 关系演算语言:关系演算以谓词演算为基础
-
过程性语言与非过程性语言:
- 过程性语言(PASCAL、C等程序设计语言):编程时必须指出“干什么”及“怎么干”的语言;
- 非过程性语言(关系查询语言):编程时只须指出“干什么”,不必指出“怎么干”
- 关系代数语言非过程性较弱,因为要指定每一个步骤怎么做
-
关系代数(集合操作)这里的考试考察方式就是要你写【关系查询】
数据操纵语言DML(用户使用的)分为查询语句和更新语句两种
-
关系代数的五个基本操作 并 查 笛卡尔 投影 选择
-
并Union OR
要求:两个关系都有n个属性,相应属性取自同一个域 (属性性质一致)
两个关系中所有元组构成一个新关系 运算结果消除重复元组
-
**差Difference **NOT EXISTS
要求:两个关系都有n个属性,相应属性取自同一个域 (属性性质一致)
R-S是属于R而不属于S的所有元组
-
笛卡尔积 FROM A,B
R有m个元组r个属性 S有n个元组s个属性 那么R X S 有m x n个元组 每个元组有r+s个属性
前r个分量来自R的一个元组 后s个分量来自S的一个元组
-
投影Projection SELECT DISTINCT
对关系垂直分割 去掉一些列 重新安排顺序 再删去重复的元组
列出所有学生的学号、姓名、籍贯: π 学 号 , 姓 名 , 籍 贯 ( S ) \pi_{学号,姓名,籍贯}(S) π学号,姓名,籍贯(S)
-
选择Selection WHERE
对关系水平分割,选择复合条件的元组
选择学生表中性别为女的元组: σ S E X = ′ 女 ′ ( S ) \sigma_{SEX='女'}(S) σSEX=′女′(S)
-
-
引出的4个组合运算(要能用基本运算表示)
-
交Intersection (两遍差)
可以用两个差表示
R-(R-S) 或者 S-(S-R)
-
联接Join(笛卡尔积+选择的组合)
联接的顺序不重要!
- θ \theta θ联接:从笛卡尔积中选择属性值满足某 θ \theta θ操作的元组
- F联接:从笛卡尔积中选择属性间接满足某一公式F的元组
- 自然联接(特殊的等值连接,要求两个关系中进行比较的分量是相同的属性,并且去掉重复的属性) 自然联接相当于笛卡尔积 ➡️ 选择 ➡️ 投影去重复的列
-
-
除DivisionNOT EXISTS(NOT EXISTS)
除是笛卡尔积 差 投影组成的(一长串不用背)
定义:假设R➗S中的元组为t 那么t和 S中的任何元组u组成的新元组<t,u>一定在关系R中
-
投影相当于select distinct消除了重复行
-
关系代数书写小技巧
- 一般规则
- 否定 没有 不包括用差
- 全部/包含用除
- 能用自然联结就用自然联结
-
扩充的关系代数操作
-
外部并
外部并不一定要求两个表R和S有相同的关系模式
如果RS关系不同就取R和S的所有属性(公共属性只取一次)新关系由属于R或者属于S的元组构成
两个表并在一起 在新增加的属性上填空值null
-
外联接
- 保留因为不存在公共属性相等的元组
- 左外联接就把左边的全部保留
- 右外联接就把右边的全部保留
-
半联接(分布式数据库常常用到)
R和S的自然联接 在关系R的属性集上的投影
半联接不符合交换律
-
-
-
关系演算(以谓词演算为基础)–不考给查询写关系演算 客观题考
-
元组关系演算:元组为变量 {t|P(t) } t代表一个元组
元组前没有用到存在量词或者全称量词 就叫做自由元组变量
否则就叫约束元组变量
-
域关系演算:域为变量{t1,t2,…,tk|P(t1…tn) },t1,t2…tk代表一个元组
-
-
关系运算的安全性
在有限关系上的关系代数操作结果都不会导致无限关系和无穷验证,关系代数系统是安全的!!
但是元组关系演算和域关系演算可能会导致无限关系和无穷验证
所以要对于元组关系演算进行安全约束
-
安全的元祖关系演算
-
安全的域关系演算
-
什么是安全的不导致无穷验证和无限关系
无限关系:元组个数为无穷多
无穷验证:验证公式真假时要无穷多次
-
安全约束是什么?对关系演算表达式施加限制条件,对表达式中的变量取值规定一个范围,使之不产生无限关系和无穷次验证,这种表达式被称为是安全表达式
-
-
关系运算的等价性
并,差,笛卡尔积,投影和选择是关系代数最基本操作,构成了关系代数运算的最小完备集
在这基础上,关系代数、安全的元组操作演算、安全的域关系演算在关系的表达和操作能力上是等价的
-
查询优化(必考)
优化就是如何安排操作的顺序
-
等价变换规则-书p58页
-
6条优化一般策略
-
尽早选择
-
F联接运算代替 笛卡尔积+选择
-
同时计算一串选择和投影
-
如果多次出现一个子表达式,把子表达式的结果保存起来避免重复计算
-
适当对关系文件预处理
-
计算表达式之前估计一下怎么计算合算RxS哪个作为外层循环
-
-
(上课讲的三个例子)
- 笛卡尔积
- 投影再选择
- 选择再投影(发现要先选择)
-
语法树的优化过程-第三章作业里面有-应该就专门考这个
关系代数表达式可以化成一棵语法树,叶子是关系,非叶子结点是关系代数操作
关系代数表达式的优化:
-
用等价变换规则把 σ F 1 ∧ . . . ∧ F n ( E ) \sigma_{F1\wedge ...\wedge F_n}(E) σF1∧...∧Fn(E)的子表达式变为 σ F 1 ( . . . σ F n ( E ) . . . ) \sigma_{F_1}(...\sigma_{F_n}(E)...) σF1(...σFn(E)...)
-
对于选择操作,尽可能移到叶端
-
对于投影操作,尽可能移到叶端
-
把选择和投影合并为单个选择、单个投影或者一个选择后跟一个投影
-
把语法树内结点分组:每个二元运算结点(X ∪ \cup ∪ —)与它的直接祖先(不超过别的二元运算结点)的一元运算结点( σ \sigma σ或 π \pi π)分为一组;如果它的子孙结点一直到叶子都是一元运算,也并入这个组。但如果二元运算是笛卡尔积且后面不是与它组合成等值联接的选择时,不能将选择与这个二元运算并入一组
-
生成一个程序
-
-
查询的优化算法
-
自然连接变为笛卡尔+选择+投影
-
拆开选择
-
选择尽可能移到叶子
-
不需要的都投影去掉,只剩下最必需的属性
-
分组
-
相邻投影选择分一组
-
每组一个二元运算x
-
-
-
第四章 结构化查询语言SQL
SQL是介于关系代数与关系演算之间的语言,SQL的功能包括查询、操纵、定义和控制四方面。
-
SQL的概述
-
SQL数据库的体系结构
- SQL模式schema是表和约束的集合
- 一个表Table是行的集合 每行是列的序列 每一列对应一个数据项
- 一个表可以是基本表(实际存在数据库中的表),可以是视图(从基本表活着其他视图导出的表,数据库中只存放视图的定义,视图是虚表)
- 基本表可以跨存储文件,存储文件可以放多个基本。 一个表可以多个索引,索引放在存储文件中;每个存储文件与外存上一个物理文件对应。存储文件的逻辑结构就组成了关系数据库中的内模式。
- 用户可以用SQL语句对视图和基本表进行查询等操作 (用户看来视图和基本表都是关系/表格)
- SQL用户可以是应用程序,可以是终端用户。
-
SQL体系结构
- 外模式-对应视图
- 模式-对应基本表
- 内模式-对应存储文件
-
SQL的组成:数据定义,数据操纵,数据控制,嵌入式SQL的使用
-
数据定义 SQL DDL
定义SQL模式、基本表、视图和索引
-
数据操纵 SQL DML
- 数据查询
- 数据更新(插入 删除 修改)
-
数据控制 SQL DCL
- 基本表、视图授权
- 完整性约束
- 事务控制语句
-
嵌入式SQL的使用
-
-
-
SQL的数据定义
SQL的数据定义包括对于4个东西:SQL模式schema、基本表table、视图view、索引index的创建撤销操作。
模式定义/数据库定义
-
SQL模式创建:create database/schema<模式名> [AUTHORIZATION <用户名>]
-
SQL模式撤销:drop database/schema<模式名> [CASCADE | RESTRICT]
-
cascade(连锁式) SQL模式和下属的基本表、视图、索引都撤销
-
restrict(约束式) SQL模式下没有任何下属元素的时候才能撤销 否则拒绝
-
-
基本表的创建修改和撤销
-
基本表创建
-
语法:
create table SQL模式名.基本表名(
列名 类型,
…
完整性约束,
…)
-
完整性约束/规则的三个子句
-
检查子句(check)
-
主键子句(primary key)
3. **外键子句(foreign key)**体现了参照完整性
-
-
-
基本表撤销
语法:drop table 基本表名 [CASCADE | RESTRICT]
DROP TABLE S RESTRICT;
索引的定义
-
创建索引
语法:
create [UNIQUE] index 索引名 on 基本表名 (<列名>[次序]..)
次序包括
-
ASC升序
2. DESC降序 -
撤销索引
语法:drop index <索引名>
视图的定义(关于更新有限制)
-
创建
语法:create view 视图名(列名表) as select 查询语句;
-
查询
-
更新(限制)
-
不是所有视图都可以更新(见后)
-
视图也被称为虚表(系统把视图的定义存在数据字典中,不存数据)
-
-
SQL数据查询/数据操纵(40分SQL和关系代数 8个题各5分)
给数据库 给插入删除要求 写SQL语句
-
SELECT语句格式
-
语法:
SELECT [DISTINCT] 目标表的列名或者列表达式序列 FROM 基本表名和(或)视图序列|表引用 [ WHERE 行条件表达式] --行条件子句 [ GROUP BY 列名组列 --分组子句 [ HAVING 组条件表达式] ] --组条件子句 [ ORDER BY 列名[ ASC | DESC ], ··· ] --排序子句
-
SELECT语句执行步骤:
- 读取FROM中基本表和视图 执行笛卡尔积
- 选取满足WHERE的元组
- 按照GROUP子句给指定列分组 提取满足HAVING子句中组条件表达式的组
- 按照SELECT的列名求值输出
- 按照ORDER排序 如果有多个ORDER就依次
-
-
单表查询
字符串匹配符LIKE
语法:列名 LIKE 字符串常数
常用通配符:
%:表示和任意长度(0也可以)的字符串匹配
_:表示和任意单个字符匹配
SELECT cname FROM S WHERE cname like 'wang%';
-
多表查询
同名属性要加关系名 例如
S.sno
-
联结操作
-
联接的类型:
- INNER JOIN 内联接
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
- CROSS JOIN 交叉联接(笛卡尔积)
-
联接的语法:
from X inner join Y on X.sno=Y.sno…
select distinct X.jno from SPJ X inner join SPJ Y on X.jno=Y.jno where (X.pno='P3') and (Y.pno='P5');
-
-
聚合函数 一般会跟分组GROUP BY 还有组条件HAVING一起
- COUNT(*)
- COUNT(列名)
- SUM(列名)
- AVG(列名)
- MAX(列名)
- MIN(列名)
-
数据分组
一般会先分组再进行聚合运算
先GROUP BY分组 再按照HAVING子句的条件来选择 HAVING是选择组
-
集合操作
-
集合的并、交、差操作
-
集合的四个比较操作
-
集合成员资格比较
- 元组 IN 集合
- 元组 NOT IN 集合
-
集合成员算数比较
元组 θ \theta θ SOME(集合)
元组 θ \theta θ ALL(集合)
查询最昂贵的商品价格:
select distinct pno,price from SPJ where price>=all(select price from SPJ);
-
空关系测试 选择“所有”的使用用2次NOT EXISTS
EXISTS (集合)
NOT EXISTS (集合)
用EXISTS测试一个集合是否为非空或空 NOT EXISTS(X) 当X为空时 其值为True 否则为False
-
重复元组的测试
UNIQUE (集合) 检测一个集合中是否有重复元组
NOT UNIQUE (集合)
-
-
-
-
SQL的数据更新(数据插入,删除,修改)
-
数据插入 insert
INSERT INTO 基本表名(列名表) VALUE (元组值);
INSERT INTO J(JNO,JNAME,JCITY) VALUES ('J8','地铁二号线','上海');
-
数据删除 delete
一次只能删一个关系里面的元组
DELETE FROM <表名> WHERE <条件表达式>
delete from SPJ where sno in(select sno from S where sname='东方配件厂');
-
数据修改
UPDATE 基本表名
SET 列名=值表达式[,列名=值表达式···]
[WHERE 条件表达式]
如果省略WHERE表示修改表中的所有元组
update S set sno='1' where sno='2';
-
对视图的更新(有限制)
- 对视图的更新最后要转变为对基本表的更新
- 视图更新的三条规则
- 如果视图是从多个基本表用联结操作导出的,不允许更新操作
- 如果导出视图时使用了分组和聚合操作,不允许更新操作
- 如果视图是从单个基本表使用选择、投影操作导出,且包括基本表的主键或某个候选键,视图称为“行列子集视图”,可以更新操作
- 视图可以更新和不能更新的情况
- 可以更新
- 只有行列子集视图可以更新
- 行列子集视图:单个基本表仅选择投影操作,且结果包含主键或某个候选键的视图
- 不能更新
- 多个基本表联结操作
- 使用了分组和聚合
- 可以更新
-
-
嵌入式SQL(客观题:概念和应用)
-
SQL语言可以在
- 终端交互方式
- 嵌在高级语言的程序中(嵌入式) 使用,被嵌入的高级语言叫做宿主语言
-
为什么需要嵌入式SQL?
SQL基于关系模型
高级语言基于基本数据类型
-
数据交互-共享变量:引用宿主语言的程序变量 使用这些变量前加冒号:
-
工作模式-游标(并不是一直要用)
游标的作用:协调SQL一次处理一批而宿主语言一次处理一条的不同
游标可以统一SQL中一次一集合与程序中一次一记录的工作方式
-
游标的使用场景 只有DML语言会使用游标
- 查询结果有多条
-
-
要对当前的记录进行操作
-
游标不使用的场景
- 数据定义DDL 数据控制DCL不需要使用游标
-
插入,删除,更新不需要
- 查询是单结果不用游标
-
第六章 ER模型
-
会画(9周的研讨题)
给文字叙述/需求 画ER图 或者补充完整
画完之后转化为关系模式 标主键外键
-
实体模型的基本属性
-
实体E(用方框表示)
- 实体名
- 属性…
-
联系R(用菱形框表示)
- 元数(几个实体之间的联系)
- 连通词(几对几)
- 基数
-
属性(用椭圆表示,主键加下划线)
能唯一标识实体的属性或属性集称为“实体标识符”/“主键”
-
基本属性和复合属性
-
单值属性和多值属性
-
单值属性
-
多值属性(用双椭圆表示)
修改ER模型对多值属性进行变化的两种方法
- 增加几个新属性(把多值属性拆成很多不同属性)
- 增加新实体:增加一个依赖于原来实体的1:N弱实体(用双方框表示)
-
-
导出属性(虚线椭圆和虚线连线表示)
属性不仅可以从其他属性导出,也可以从实体导出
-
空值(不好 难处理 增加复杂性)
- 值无意义:占位空值
- 值暂时不知道:未知空值
- 不知道有没有意义或者值是什么:未知
-
-
-
联系的设计
-
联系的元数:一个联系涉及到的实体集个数
-
联系的联通词:联系涉及到的实体集之间对应的方式,二元联系中就有1:1, 1:N , M:N , M:1
-
联系的基数
两个实体集E1和E2,E1中每个实体与E2中有联系实体的数目的最小值Min和最大值Max构成E1的基数,用(Min,Max)表示
-
-
ER模型的扩充
-
弱实体(双方框和双菱形)
弱实体用双方框
实体和弱实体的联系用双菱形
-
子类和超类
子类实体继承超类实体的所有属性
这种继承性通过子类实体和超类实体具有相同标识符/主键实现的
超类用两端有双线的方框表示,超类与子类的联系用加圈的线表示
-
-
ER模型转化关系模式!!!
- 实体直接转为关系模式(一个实体就是一个关系模式,实体有几个属性关系模式就几个属性)
- 把ER图中的联系转化为关系模式
- 1对1联系:选择任意实体,把其中的一个的主键放在另一个实体做为外键
- 1对多联系:在多的这边添加一个外键:1的主键
- 多对多联系:添加新的关系模式/新的基本表来表示联系
- 联系的属性是关系模式属性
- 新关系模式/新基本表的主键是两个实体的主键集合
-
弱实体转化关系模式
例子:学生-1-n-社会关系
1对多:1的主键作为外键放在多的一边 作为主键的一部分
期末试卷题型分布
-
客观题
-
选择 10分
-
判断 10分
-
填空10分
-
SQL和关系代数各4句 40分
注意点:1.除操作
-
优化查询-语法树 15分
-
给文字描述画ER图-转化为关系模式
主键外键标清楚 属性不一定要全部写 15分
高分不容易 及格很容易
去年的数据库试卷:
题目
车C(CNO,CTYPE,CID,CDATE,)
驾照D(DNO)
部门B(BNO,BNAME,BTEL)
部门用车BC(BNO,CNO,DNO,RQ,DEST,DIS,FECS)
RQ是日期 DIS是距离[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UukHv6l8-1615858409836)(/Users/caizhuoyue/Library/Application Support/typora-user-images/截屏2021-03-13 下午12.29.58.png)]
sql重点考分组group by having
关系代数和sql都会考除和差
关系代数题:
- 为部门b01服务 车型是丰田 费用<600的驾驶员
- 没有被部门b09使用过的车的xxx
- 查询驾驶过所有车辆的驾驶员(除所有车)
- 查询使用沪xxx和沪xxx的驾驶员
- 19年用车超过xxx次的部门(group by)
- 查询定过所有车的部门
第四章SQL作业讲解:
4.2
写SQL语句不用考虑效率 写出来就行了
-
检索
select cname,tname from c,sc where c.cno=sc.cno and sno='s3'; select cname,tname from c innner join sc on c.cno=sc.cno where sno='s3'; select cname,tname from c where cno in (select cno from sc where sno='s3');
-
检索至少选修LIU老师所
select sname from s,c,sc where s.sno=sc.sno and sc.cno=c.cno and tname='LIU' and sex='F';
-
王同学不学的课(这里不能用不等于) 这里子查询是王同学选的课
select cno from c where cno not in (select cno from sc,s where sc.sno and sname='WANG');
有同学选但是王同学没选的课
select cno from sc where cno not in (select cno from sc,s where sc.sno and sname='WANG');
-
至少选修两门课的学生学号
写法1: 按照学号分组 count>1
select sno from sc group by sno having count(*)>1;
写法2: sc中有两条记录 学号相同课号不同
select distinct sno from sc x,sc y where x.sno=y.sno and x.cno!=y.cno;
-
全部学生都选的课程的课程号和课程名
不存在学生不选这门课 两个not exists
select cno,cname from c where not exists (select * from s where not exists (select * from sc where s.sno=sc.sno and c.cno=sc.cno));
-
检索选修课程包含LIU老师所授课程的学生学号
不存在一门刘老师的课 他不上
select sno from sc x where not exists (select * from c where tname='LIU' and not exists(select * from sc y where y.cno=c.cno and y.sno=x.sno));
4.6
-
有学生选修的课的课程门数
select count(distinct cno) from sc;
-
选修C4课程的学生平均年龄
select avg(age) from s,sc where s.sno=sc.sno and cno='C4';
-
LIU老师所授每门课的学生平均成绩:根据课号group
select cno,avg(grade) from c,sc where c.cno=sc.cno and tname='LIU' group by cno;
-
不确定这题答案
select cno,count(*) from sc group by cno having count(*) >=10 order by 2 desc,1;
-
学号比WANG同学大,年龄比WANG同学小的学生姓名
select sname from s where sno>(select sno from s where sname='WANG') and age<(select sno from s where sname='WANG');
select sname from s x, s y where x.sn>y.sno and x.age<y.age and y,sname='WANG';
-
检索姓名以WANG开头的所有学生姓名和年龄
select sname, age from s where sname like 'WANG%'; 百分号任意字符 下划线一个字符 用like
-
SC中成绩为空的学生学号和课程号
select sno,cno from sc where grade is null;
-
年龄大于女同学评价年龄的男同学姓名和年龄
select sname,age from s where sex='M' and age>(select avg(age) from s where sex='F');
-
年龄大于所有女同学年龄的男生姓名和年龄
select sname,age from s where sex='M' and age>(select max(age) from s where sex='F');
4.7
-
向基本表S中插入学生元组(‘S9’,‘WU’,18)
insert into s(sno,sname,age) values ('s9','wu',18);
-
在基本表S中检索每一门课成绩都大于等于80分的学生学号、姓名和性别。并将检索结果保存到另一个已经存在的基本表STUDENT(SNO,SNAME,SEX)中
思路:按照学号分组,最低分大于80分
insert into STUDENT select sno,sname,sex from s,sc where s.sno=sc.sno group by sno,sname,sex having min(grade)>80; insert into STUDENT select sno,sname,sex from s where sno in(select sno from sc group by sno having ....); insert into STUDENT select sno,sname,sex from s where not exists (select * from sc where sno=s.sno and grade<80);
-
插入删除
select from sc where grade is null;
-
删除操作
delete from sc where sno=(select sno from where sname ='wang');
-
是update操作
update sc set grade = null where grade<60 and cno=(select cno from c where cname='wang');
-
update操作(有二义性可以问老师)
update set sc x set
-
x
update sc set grade=grade*1.05 where cno='c4' and grade<=75; update sc set grade=grade*0.95 where cno='c4' and grade>75;