数据库系统概念笔记CH4(上)
第四章:中级SQL
4.1连接表达式
连接条件:
- join…using是一种自然连接的形式,只需要在指定属性上的取值匹配
- join…on则允许一种更为普遍的自然连接
- 在下面条件下对二者进行自然连接(注意CS-315仅存在于course,CS-347仅存在于prereq中)
举例说明:
--举例子说明join...on
--
select *
from student join takes on student.ID=takes.ID
--将student.ID和takes.ID相同的元组进行了自然连接
--如果使用join...using,则由于在ID上存在不匹配,故不能够成功连接
--等价于
select *
from student,takes
where student.ID=takes.ID
连接后:
因此由于on条件可以表示为任意的SQL谓词,故on条件的自然连接表达式使得自然连接变得更加丰富。
外连接 outer join
外连接通过在结果中创建包含空值元组的方式保留了在连接中丢失的元组
外连接有三种形式:
- 左外连接:只保留出现在左外连接运算之前的关系中的元组
- 右外连接:只保留出现在右外连接运算之后的关系中的元组
- 全外连接:保留出现在两个关系中的元组
4.2 VIEWS 视图
why need views?
有时候我们希望向用户隐藏特定的数据;如果直接对部分数据进行条件提取后,如果底层数据发生变化的话,则提取的数据需要再次提取,很不方便且占用空间。
视图:不是逻辑模型的一部分,是一种作为虚关系对用户可见的关系
视图的创建: 视图关系只有在需要的时候才会被创建
--通用:
creat view v as <qeary expression>
--其中<query expression>可以是任何合法的查询表达式,v表示视图名
--创建一个instructor视图,不看到工资
creat view faculty as
select ID,name,dept_name
from instructor;
--之后可以使用view
select name
from faculty
where dept_name='Biology'
视图更新:
对视图的修改与更新实际上是作用于其所对应的数据库逻辑模型中的实际关系的修改
通常来说SQL视图可更新的条件:
-
from子句中只有一个数据库关系
-
select子句中只包含关系的属性名,不包含任何表达式、聚集或者distinct声明
-
任何没有出现在select子句中的属性可以取值为空
-
查询中没有group by或having子句
--在可插入情况下,语句: insert into faculty values (’30765’, ’Green’, ’Music’); --等价于 insert into faculty values