注:本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
前言知识
一、 关系模式
- 模式的定义:模式则是指数据库中所有关系模式的集合,它代表了整个数据库的结构。模式不仅包含了所有的关系模式,还可能包括视图、索引等其他数据库对象的定义。模式是数据库的整体架构,它定义了数据库中数据的组织方式和存储结构
- 关系模式定义:关系模式可以被看作是数据库中表的蓝图或框架,它定义了表的结构,包括表的属性(即列)和每个属性上的约束条件。它是静态的定义,不随表中数据的变化而变化。关系模式通常使用五元组来表示,包含关系名、属性集合、属性对应的域、属性到域的映射以及属性间的依赖关系
关系模式:表示一张基本表上的所有因素(属性、属性域、属性关系等)
模式:表示整个数据库的结构,是一组基本表的集合
二、 属性域
例子
CREATE DOMAIN age_domain as INTEGER CHECK (value >= 0 AND value <= 150) NOT NULL;
创建了一个age_domain,这个域是整形的,数值在0-150之间 且不能为空
介绍
域本身可以理解为一个特殊的变量类型,这个变量类型包括最基础的变量类型也包括变量的约束、限制等。定义完域后,我们可以在定义表中属性时直接使用属性域。如下:
CREATE TABLE person ( id char(10) PRIMARY KEY, name VARCHAR(50), age age_domain );
作用
- 提高数据一致性:通过为用户自定义数据类型添加约束,可以确保数据库中的数据满足特定的条件,从而维护数据的一致性和准确性。
- 简化数据类型管理:当需要对多个表或列应用相同的数据类型和约束时,用户自定义域可以减少重复代码,使数据库管理更加简洁高效。
- 促进代码重用:一旦定义了域,就可以在数据库中的任何表或列上重复使用它,这有助于保持数据类型的统一性和标准化。
三、Select常数
举例
select 2 from employe
结果为:
解释
1、select x from employee:在数据库中直接显示x这个数构成的元组,个数为employee中记录的个数
四、集合差运算
本质
A-B:A中有B中没有。在A中减掉B的部分
举例
-- 创建集合A和B的表 CREATE TABLE set_a (id INT); INSERT INTO set_a (id) VALUES (1), (2), (3); CREATE TABLE set_b (id INT); INSERT INTO set_b (id) VALUES (1), (4); -- 计算A减去B的结果 SELECT a.id FROM set_a a LEFT JOIN set_b b ON a.id = b.id WHERE b.id IS NULL;
所得到的结果为:
id --- 2 3
结论
集合差运算中B中有A中没有的部分对结果不产生影响
练习题
3.17
考虑图 3.19 中的雇员数据库。用 SQL 语句给出表达式
a. 给 "第一银行公司 "的所有员工加薪 10%
update works as T set T.salary=T.salary*1.1 where company_name='First Bank Corporation'
b. 给 "第一银行公司 "的所有经理加薪 10%
update works as T set T.salary=T.salary*1.1 where company_name='First Bank Corporation' and T.id in( select id from manages )
c. 删除 "小型银行公司 "员工在works关系中的所有元组
delete from works where company_name='Small Bank Corporation'
3.18
给出图 3.19 中雇员数据库的 SQL 模式定义。为每个属性选择一个适当的域,为每个关系模式选择一个适当的主键。为每个关系模式选择适当的域和主键。包括任何可能合适的外键约束。适当的外键约束(不单单看create本身对不对,前后顺序也要注意。有外码的要保证外表已经被创建)
create domain company_names char(20) create domain person_names char(20) create domain city_names char(30) create table employee( person_name person_names, street char(30), city city_names, ID char(4), primary key(ID) ) create table company( company_name company_names, city city_names, primary key(company_name) ) create table works( ID char(4), company_name company_names, salary int(8), foreign key(ID) references employee(ID), foreign key(company_name) references company(company_name) ) create table manages( ID char(4), manager_id char(4) foreign key(id) references employee(id) )
3.21
考虑图 3.20 中的图书馆数据库,用 SQL 编写以下查询
a. 找出每位至少借过一本“麦格劳-希尔”出版的书的会员的编号和姓名
select memb_no,name from member where memb_no in( select memb_no from book bk,borrowed bw where bk.isbn=bw.isbn and publisher='McGraw-Hill' )
b.找出每一位借过“麦格劳-希尔”出版的所有书的会员的编号和姓名
select memb_no,name from member m where no exists( ( select isbn from book bk where publisher='McGraw-Hill' ) minus ( select isbn from borrowed bw where m.memb_no=bw.memb_no ) )
c.对于每个出版商,找出每个借了该出版商五本书以上的会员的编号和姓名
select memb_no,name from member m where memb_no in( select memb_no from borrowed bw,book bk where bw.isbn=bk.isbn group by publisher,memb_no having (count(*)>5) )
d.找出每位会员的平均借书量。考虑到如果一个成员没有借阅任何书籍,那么该成员根本不会出现在借阅关系中,但该成员仍然计算在平均值中
select avg(ci) from( select member.memb_no,count(isbn) from borrowed,member where borrowed.memb_no(+)=member.memb_no group by member.memb_no) as tab1(memb_no,ci) 2.
总结
如果能帮助到大家,大家可以点点赞、收收藏呀~