数据库引论:3、中级SQL

一些更复杂的查询表达

3.1 连接表达式

拼接多张表的几种方式

3.1.1 自然连接

natural join,自动连接在所有共同属性上相同的元组

join… using( A 1 , A 2 , ⋯ A_1,A_2,\cdots A1,A2,):使用括号里的属性进行自然连接,除了这些属性之外的共同属性不必相同

join…on… on后可以接任何SQL谓词,其实可以卸载where里

比如学生和所选课程的连接,他们都有共同的属性course_id和dept_name,如果直接使用natural join ,某些学生选择了不是自己院系的课,这种元组是有意义的,但会被排除,因此应该使用join takes using(course_id)

3.1.2 外连接

外连接通过在结果中创建包含空值的元组,来保留那些在连接中会丢失的元组。例如某些学生没有选课,那么

	select *
	from student join takes using (course_id)

将会丢失这些学生的信息,但如果使用

	select *
	from student left outer join takes on students.ID = takes.ID; 

那些没有选课的学生的takes.ID将会被置为null,即不匹配会被置为空值

有三种形式的外连接:

  1. **左外连接(natural left outer join):**只保留左外连接运算之前(左边)的关系中的元组
  2. 右外连接(natural right outer join):只保留出现在右外连接运算之后(右边)的关系中的元组
  3. 全外连接(natural full outer join):保留出现在两个关系中的元组

不匹配的元组将会被补上空值,加入到连接结果中

例子:显示Comp.Sci 系中所有学生以及他们在2017年春季选修的所有课程段的列表,2017年春季开设的所有课程段都必须显示,即使没有来自Comp.Sci 系的学生选修这些课程段。

	select *
	from (select *
          from student
          where dept_name= 'Comp.Sci')
          natural full outer join
          (select *
          from takes
           where semester='Spring' and year = 2017);

由于学生可能没学课,课也可能没人选,两边都会出现空值,使用全外连接。

注意natural表明是自然的,即所有共同属性上,如果要使用on和using,不要加natural

3.2 视图

博主个人认为就是函数

3.2.1 视图定义

​ 在SQL中通过使用create view命令来定义视图,且需要给视图一个名称,则格式为
c r e a t e   v i e w   v   a s   < 查询表达式 > ; create\ view\ v\ as\ <查询表达式>; create view v as <查询表达式>;
​ 例如,创建一个这样的视图:列出物理系在2017年秋季学期所开设的所有课程段,以及每个课程段在哪栋建筑的哪个房间授课:

	create view physics_fall_2017 as
		select course.course_id,sec_id,building,room_number
		from course,section
		where course.course_id = section.course_id
				and course.dept_name='Physics'
				and section.semester='Fall'
				and section.year = 2017;

3.2.2 在SQL查询中使用视图

​ 例如,使用视图physics_fall_2017,查询周到2017年秋季学期,在Watison大楼开设的所有物理课程:

	select course_id
	from physics_fall_2017
	where building='Watson';

​ 视图的属性名可以按下述方式来显示指定:

	create view departments_total_salary(dept_name,total_salary) as
		select dept_name,sum(salary)
		from instructor
		group by dept_name;

给sum(salary)显示指定了属性名为total_salary

在视图中也可使用另一个视图(函数嵌套)

	create view physics_fall_2017_watson as
		select course_id,room_number
		from physics_fall_2017
		where building='Watson';

3.2.3 物化视图

定义:某些数据库系统允许存储视图关系,但是他们保证:如果用于定义视图的实际关系发生改变,则视图也跟着修改以保持更新。这样的视图被称为物化视图(materialized view)

视图的运算结果也是一个表,例如department_total_salary中,如果instructor又插入了一个元组,那么原视图的查询结果也应该发生变化,即物化视图的内容也必须更新。

保持物化视图一直在最新状态的过程称为物化视图维护,或简称为视图维护

3.2.4 视图更新

视图可更新的条件:

  1. from子句中只有一个数据库关系
  2. select子句中只包含关系的属性名,而不包含任何表达式,聚集或distinct 声明
  3. 没有出现在select子句中的任何属性都可以取null值;也就是说,这些属性没有非空约束,也不构成主码的一部分
  4. 查询中不含有group byhaving子句

在这些限制下,允许在下面的视图上执行update、insertdelete操作

但即使满足上述条件,也会出现一些问题,例如插入的元组不满足视图的选择条件,则依然会被拒绝更新,但在缺省情况下,SQL允许执行上述更新。可以通过在视图定义的末尾包含with check option子句的方式来定义视图,这压根,如果向视图插入一条不满足视图的where子句条件的元组,则会拒绝插入。更新也是类似的

3.3 事务

​ 事务(transaction)由查询和(或)更新语句的序列组成。SQL标准规定当一条SQL语句被执行时,就隐式地开始了一个事务:

  • commit work 提交当前事务;则事务执行的更新在数据库中称为永久性的。在事务被提交后,一个新的事务会自动开始
  • rollback work 回滚当前事务;撤销事务中SQL语句执行的所有更新。数据库状态被恢复到它执行该事务的第一条语句之前的状态。

关键字work在两个语句中都是可选的

​ 一个事务或者在完成所有步骤后提交操作,或者不能成功完成其所有动作的情况下回滚其所有动作,通过这种方式数据库提供了对事务具有原子性(atomic)的抽象,要么事务的所有影响被反映到数据库中,要么任何影响也没有。

​ 在缺省方式下每条SQL语句自成一个事务,且语句一旦执行完就提交该事务,如果一个事务由需要执行的多条SQL语句组成,就必须关闭单条SQL语句的这种自动提交。

​ MySQL支持begin语句,该语句启动包含所有后续SQL语句的事务,但不支持end语句;事务必须通过commit workrollback work命令来结束

3.4 完整性约束

​ 完整性约束保证授权用户对数据库所作的修改不会导致数据一致性的丢失。因此,完整性约束防止的是对数据的意外破坏。

​ 通过创建关系的create table命令的一部分被声明。也可通过使用alter table table-name add constraint 命令将完整性约束施加到已有关系上。当这样一条命令被执行时,系统首先保证该关系满足指定的约束。如果满足,那么约束被施加到关系是;如果不满足,则上述命令被拒绝执行。

3.4.1 单个关系上的约束

​ 允许的完整性约束包括:

  • not null
  • unique
  • check(<谓词>)

示例

CREATE TABLE Persons
(
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    PRIMARY KEY (Id_P)  //PRIMARY KEY约束
)

3.4.2 非空约束

​ 非空约束不允许为空值,按以下方式声明:

name varchar(20) not null
budget numeric(12,2) not null

3.4.3 唯一性约束

​ SQL还支持这种完整性约束:

unique ( A j 1 , A j 2 , ⋯   , A j m ) (A_{j_1},A_{j_2},\cdots,A_{j_m}) (Aj1,Aj2,,Ajm)

唯一性(unique)声明指出属性 A j 1 , A j 2 , ⋯   , A j m A_{j_1},A_{j_2},\cdots,A_{j_m} Aj1,Aj2,,Ajm形成一个超码;意味着没有两个元组能在所有列出的属性上取值相同。然而声明了唯一性的属性允许为null,除非它们已被显示地声明为非空

3.4.4 check子句

​ 当应用于关系声明时,check( P P P)子句指定一个谓词P,每个元组都要满足

例如:

create table section
	(course_id		varchar(8) not null,
     sec_id			varchar(8) not null,
     semester		varchar(6) not null,
     year			numeric(4,0) not null,
     ...
     time_slot_id	varchar(4),
     primary key(course_id,sec_id,semester,year),
     check(semester in('Fall','Winter','Spring','Summer'))
    );

​ 使用check子句模拟了一个枚举类型,通过指定semester必须是春夏秋冬中地一个。

​ 此外,check子句的判断条件为不为假即满足,因此计算结果为未知的子句也是满足的,入股哦不需要空值,则必须指定单独的非空约束

3.4.5 引用完整性

​ 保证一个关系(引用关系)中给定属性集合的取值也在另一个关系(被引用关系)的特定属性集的取值中出现,这种情况称为引用完整性约束。

在这里插入图片描述

图1 大学数据库关系

​ 通过使用外码(foreign key)子句,可以将外码指定为SQL的创建表语句的一部分。

​ 例如 course表的定义中有一个声明foreign key (dept_name) references department ,表明:对于每个课程元组,元组中指定的系名必须在department关系中存在。如果没有这个约束,就可能会为一门课程指定一个并不存在的系名。

​ 也可以指定为foreign key (dept_name) references department(dept_name),显示的声明。一般在缺省情况下,外码引用的时被引用表的主码属性,在显示指定下,这个被指定的属性列表必须声明为被引用关系的超码,要么使用主码约束,要么使用唯一性约束来进行这种声明。

​ 外码必须引用一组兼容的属性,即属性数量必须相同,并且对应属性的数据类型必须兼容

级联删除(ondelete cascade):当违反引用完整性约束时,通常直接拒绝,但如果被引用关系上的删除或更新操作违反了约束,那么系统必须采取一些措施来改变引用关系中的元组以恢复完整性约束,而不是拒绝这样的操作。这个时候需要使用级联删除、级联更新。

 create table course(
 	...
     foreign key (dept_name) references department
     			on delete cascade
     			on update cascade,
     ...
 );

如果删除department中的一个元组导致违反了这种引用完整性约束,系统不拒绝该删除,二是对course关系左“级联(cascade)”删除,级删除引用了被删除系得元组。更新也是同理。

​ 也可用set null、set default来代替cascade,前者置为null,后者置为域得缺省值

3.4.6 给约束赋名

	salary numeric(8,2)constraint minsalary check(salary>29000),
	alter table instructor drop constaint minsalary;

3.4.7 事务中对完整性约束的违反

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Garnet技术实战测试开发:像使用Redis一样使用Garnet

一、Garnet简介 最近一段时间&#xff0c;看到非常多的文章描述和转发Garnet项目&#xff0c;比如说&#xff1a; .NET的集群Redis实现版本&#xff1a; Garnet – 一种开源、下一代 …Garnet发布 Redis不再是唯一选择 - Setli - 博客园Garnet: 力压Redis的C#高性能分布式存储…

电子电器架构 —— 诊断数据DTC具体故障篇

电子电器架构 —— 诊断数据DTC起始篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎…

计算机组成原理 CPU组成与机器指令执行实验

一、实验目的 (1)将微程序控制器同执行部件( 整个数据通路)联机&#xff0c;组成一台模型计算机; (2)用微程序控制器控制模型机数据通路; (3)通过CPU运行九条机器指令(排除中断指令)组成的简单程序&#xff0c;掌握机器指令与微指令的关系&#xff0c;牢固建立计算机的整机概…

C#绘制面形图

创建windows窗体应用 ,从工具箱添加Button和Panel using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Fo…

[激光原理与应用-77]:基于激光器加工板卡的二次开发软件的系统软硬件架构

目录 一、1个板卡、1个激光器、1个振镜的应用架构、1个工位 &#xff08;1&#xff09;PLC &#xff08;2&#xff09;MES &#xff08;3&#xff09;加工板卡 &#xff08;4&#xff09;激光加工板卡与激光器之间的转接卡 &#xff08;5&#xff09;DB25、DB15 &#x…

力扣面试150 x 的平方根 二分 换底法 牛顿迭代法 一题多解

Problem: 69. x 的平方根 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f496; 袖珍计算器算法 class Solution {public int mySqrt(int x){if (x 0)return 0; // Math.exp(3)&#xff1a;e的三次方int ans (int) Math.exp(0.5 * Math.log(x));return (long) (an…

Java面试题总结200道(四)

76、ApplicationContext 通常的实现是什么? FileSystemXmlApplicationContext &#xff1a;此容器从一个 XML 文件中加 载 beans 的定义&#xff0c;XML Bean 配置文件的全路径名必须提供给它的构造函数。ClassPathXmlApplicationContext&#xff1a;此容器也从一个 XML 文件…

Qt程序可执行文件打包

目录 一、新建一个目录二、命令行2.1 添加临时变量2.2 打包命令 三、添加动态库四、普通 Qt 项目打包 Qml 项目打包 笔者写的python程序打包地址&#xff08;https://blog.csdn.net/qq_43700779/article/details/136994813&#xff09; 一、新建一个目录 新目录(例如test)用以…

C语言自定义类型联合体和枚举

union n.工会&#xff1b;联邦&#xff0c;联盟&#xff1b;协会&#xff0c;俱乐部&#xff1b;联合&#xff0c;合并&#xff1b; 结婚&#xff0c;婚姻&#xff1b;美利坚合众国&#xff08;the Union&#xff09;&#xff1b; &#xff08;数&#xff09;并&#xff0c;并集…

Request请求参数----中文乱码问题

一: GET POST获取请求参数: 在处理为什么会出现中文乱码的情况之前, 首先我们要直到GET 以及 POST两种获取请求参数的不同 1>POST POST获取请求参数是通过输入流getReader来进行获取的, 通过字符输入流来获取响应的请求参数, 并且在解码的时候, 默认的情况是 ISO_885…

【MySQL】InnoDB引擎

逻辑结构 InnoDB存储引擎逻辑结构如图所示&#xff1a; Tablespace&#xff1a;表空间&#xff0c;一个数据库可以对应多个表空间。数据库中的每张表都有一个表空间&#xff0c;用来存放表记录、索引等数据。 Segment&#xff1a;段&#xff0c;表空间中有多个段&#xff0c…

通过dbeaver链接dm8数据库

一、环境说明 windows 11 vmware 17 ubuntu 22 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammytt:~$ docker info Client:Version: 24.0.5Context: d…

【Web】NKCTF 2024 个人wp(部分)

目录 my first cms 全世界最简单的CTF attack_tacooooo 属实太菜了&#xff0c;3/4 my first cms 一眼搜版本2.2.19 CVE -CVE-2024-27622 GitHub - capture0x/CMSMadeSimple 访问/admin/login.php 爆出弱口令&#xff0c;后台登录 admin Admin123 Extensions > User D…

华为OD机试 - 打印任务排序 - 队列(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

io流的学习4

字符缓冲流 原理&#xff1a;底层自带了长度为8192的缓冲区提高性能。 import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class BufferedStringdemo01 {public static void main(String…

Springboot实现合并单元格的excel文件导入到数据库(多模块)

最近做项目的时候一直在遇到excel导入导出的问题&#xff0c;本篇博文也是为了记录我这几天的血泪史&#xff0c;并做以记录&#xff0c;希望各位看完之后能有所收获。 以下是我excel文档里面的具体内容&#xff1a; excel文件中的编码信息属于另外一张表&#xff0c;所以以下…

基于VS code 实现Java前后端打通—基础—使用Springboot+postgreSql+mybatis+Navicat

前言&#xff1a; 作者学习webjava后的而总结&#xff0c;总的流程概括就是先使用springboot创建项目&#xff0c;在application.properties中完成相应的postgreSql和mybaits的环境配置和.xml文件中dependecy依赖配置&#xff0c;entities实现数据表的类型模板&#xff0c;分别…

【机器学习】包裹式特征选择之序列前向选择法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

php 快速入门(一)

一、配置系统环境 1.1 安装软件 1、安装php的开发软件&#xff1a;phpstorm 在这个软件中写代码 2、安装php的运行软件&#xff1a;phpstduy 写好的php程序需要放到phpstduy中&#xff0c;用户才能访问和测试 安装过程注意事项&#xff1a;安装的路径中不能有空格和中文字符&…

day6:STM32MP157——串口通信实验

使用的是cortex A7内核 【串口通信的工作原理】 本次实验使用的是uart4的串口&#xff0c;分别使用了uart4_tx和uart4_rx两个引脚。根据板子的原理图我们可以知道&#xff0c;他们分别对应着芯片的PG11和PB2 从引脚名字也可以知道使用了GPIO口&#xff0c;所以本次实验同样需…