当前位置: 首页 > news >正文

数据库引论: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 studentwhere dept_name= 'Comp.Sci')natural full outer join(select *from takeswhere 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 asselect course.course_id,sec_id,building,room_numberfrom course,sectionwhere course.course_id = section.course_idand course.dept_name='Physics'and section.semester='Fall'and section.year = 2017;

3.2.2 在SQL查询中使用视图

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

	select course_idfrom physics_fall_2017where building='Watson';

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

	create view departments_total_salary(dept_name,total_salary) asselect dept_name,sum(salary)from instructorgroup by dept_name;

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

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

	create view physics_fall_2017_watson asselect course_id,room_numberfrom physics_fall_2017where 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 departmenton delete cascadeon 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 事务中对完整性约束的违反

相关文章:

数据库引论:3、中级SQL

一些更复杂的查询表达 3.1 连接表达式 拼接多张表的几种方式 3.1.1 自然连接 natural join&#xff0c;自动连接在所有共同属性上相同的元组 join… using( A 1 , A 2 , ⋯ A_1,A_2,\cdots A1​,A2​,⋯):使用括号里的属性进行自然连接&#xff0c;除了这些属性之外的共同…...

毕业设计:日志记录编写(3/17起更新中)

目录 3/171.配置阿里云python加速镜像&#xff1a;2. 安装python3.9版本3. 爬虫技术选择4. 数据抓取和整理5. 难点和挑战 3/241.数据库建表信息2.后续进度安排3. 数据处理和分析 3/17 当前周期目标&#xff1a;构建基本的python环境&#xff1a;运行爬虫程序 1.配置阿里云pytho…...

(一)基于IDEA的JAVA基础7

关系运算符 运算符 含义 范例 结果 等于 12 false &#xff01; 不等于 1&#xff01;2 true > 大于 1>2 false < 小于 …...

MySQL数据库概念及MySQL的安装

文章目录 MySQL数据库一、数据库基本概念1、数据2、数据表3、数据库4、数据库管理系统&#xff08;DBMS&#xff09;4.1 数据库的建立和维护功能4.2 数据库的定义功能4.3 数据库的操纵功能4.4 数据库的运行管理功能4.5 数据库的通信功能&#xff08;数据库与外界对接&#xff0…...

redis实际应用场景及并发问题的解决

业务场景 接下来要模拟的业务场景: 每当被普通攻击的时候&#xff0c;有千分之三的概率掉落金币&#xff0c;每回合最多爆出两个金币。 1.每个回合只有15秒。 2.每次普通攻击的时间间隔是0.5s 3.这个服务是一个集群&#xff08;这个要求暂时不实现&#xff09; 编写接口&…...

考研数学|汤家凤《1800》基础部分什么时候做完?

从我个人的经验来看&#xff0c;做完汤家凤1800的基础部分在第一轮复习中并不是必须的&#xff0c;但是可以作为一个有效的复习工具。 我认为汤家凤1800的基础部分确实涵盖了考研高数的基础知识点&#xff0c;并且题目难度适中&#xff0c;适合用来巩固基础。在第一轮复习中&a…...

JS的设计模式(23种)

JavaScript设计模式是指在JavaScript编程中普遍应用的一系列经过验证的最佳实践和可重用的解决方案模板&#xff0c;它们用来解决在软件设计中频繁出现的问题&#xff0c;如对象的创建、职责分配、对象间通信以及系统架构等。 设计模式并不特指某个具体的代码片段&#xff0c;…...

[自研开源] MyData v0.7.5 更新日志

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 介绍 MyData …...

3月份的倒数第二个周末有感

坐在图书馆的那一刻&#xff0c;忽然感觉时间的节奏开始放缓。今天周末因为我们两都有任务需要完成&#xff0c;所以就选了嘉定图书馆&#xff0c;不得不说嘉定新城远香湖附近的图书馆真的很有感觉。然我不经意回想起学校的时光&#xff0c;那是多么美好且短暂的时光。凝视着窗…...

Java 变得越来越像 Rust

Java 变得越来越像 Rust 介绍 随着编程的增强和复杂性越来越流行&#xff0c;许多编程语言也相互效仿。 Java 也不例外。 尽管社区内部存在问题&#xff0c;Rust 仍逐年赢得了开发人员的喜爱。并且有充分的理由&#xff1a;由于编译器&#xff0c;Rust 使开发人员能够避免整…...

通过git bash 或命令行ssh访问服务器 sftp上传下载文件

上传下载文件 sftp -P 端口 appywIP 示例&#xff1a;sftp -P 10022 appyw25.222.133.222 然后输入密码即可 ls 查看文件 lls 查看本地文件 cd 跳转 lcd 本地跳转 get ... 下载文件 put 本地文件名 远程文件夹 //上传文件 put -r 本地文件夹 远程文件夹 //上传文件夹服务器…...

27 OpenCV 凸包

文章目录 概念Graham扫描算法convexHull 凸包函数示例 概念 什么是凸包(Convex Hull)&#xff0c;在一个多变形边缘或者内部任意两个点的连线都包含在多边形边界或者内部。 正式定义&#xff1a; 包含点集合S中所有点的最小凸多边形称为凸包 Graham扫描算法 首先选择Y方向最低…...

【GPT概念04】仅解码器(only decode)模型的解码策略

一、说明 在我之前的博客中&#xff0c;我们研究了关于生成式预训练转换器的整个概述&#xff0c;以及一篇关于生成式预训练转换器&#xff08;GPT&#xff09;的博客——预训练、微调和不同的用例应用。现在让我们看看所有仅解码器模型的解码策略是什么。 二、解码策略 在之前…...

蔚来-安全开发一面/二面

基本不怎么会渗透测试&#xff0c;本科期间有过大数据隐私保护(密码)的项目&#xff0c;硕士期间有个华为合作的项目一篇在投的ai安全论文 一面&#xff08;45min&#xff09; 1.介绍自己 2.介绍一下实习 3.场景题轰炸&#xff0c;主要针对实习中的场景&#xff0c;主要考察…...

Redis Cluster集群模式容器化部署

Redis Cluster集群模式容器化部署 安装Docker和docker-compose准备docker-compose文件准备Redis配置文件Linux内核参数优化启停Redis实例Redis集群搭建 环境准备&#xff1a; IP版本角色端口172.x.x.11RHEL 7.9master6379172.x.x.12RHEL 7.9master6379172.x.x.13RHEL 7.9maste…...

网络原理(6)——IP协议

目录 一、网段划分 现在的网络划分&#xff1a; 1、一般情况下的家庭网络环境 2、IP地址 3、子网掩码 4、网关 以前的网络划分&#xff1a; 二、特殊IP 1、环回 IP 2、主机号为全 0 的IP 3、广播地址IP 三、路由选择&#xff08;路线规划&#xff09; 一、网段划分…...

淘宝商品详情API接口:快速获取商品信息的高效工具

淘宝商品详情API接口&#xff1a;快速获取商品信息的高效工具 请求示例&#xff0c;API接口接入Anzexi58 在信息化、数字化的今天&#xff0c;数据已成为商业决策的重要依据。对于电商行业而言&#xff0c;快速准确地获取商品信息对于商家和消费者都至关重要。淘宝作为中国最大…...

一分钟学习Markdown语法

title: 一分钟学习Markdown语法 date: 2024/3/24 19:33:29 updated: 2024/3/24 19:33:29 tags: MD语法文本样式列表结构链接插入图片展示练习实践链接问题 欢迎来到Markdown语法的世界&#xff01;Markdown是一种简单而直观的标记语言&#xff0c;让文本排版变得轻松有趣。接下…...

Power Apps 学习笔记 -- OrganizationRequestCollection

文章目录 1. OrganizationRequestCollection 简介2. OrganizationRequestCollection2.1 OrganizationRequest 使用2.2 OrganizationRequestCollection 使用 1. OrganizationRequestCollection 简介 OrganizationRequestCollection 链接 : OrganizationRequestCollection Orga…...

python绘图matplotlib——使用记录1

本博文来自于网络收集&#xff0c;如有侵权请联系删除 使用matplotlib绘图 1 常用函数汇总1.1 plot1.2 legend1.3 scatter1.4 xlim1.5 xlabel1.6 grid1.7 axhline1.7 axvspan1.8 annotate1.9 text1.10 title 2 常见图形绘制2.1 bar——柱状图2.2 barh——条形图2.3 hist——直…...

机器学习赋能6G近场通信:从信道估计到波束赋形的智能革命

1. 项目概述&#xff1a;当6G遇见近场&#xff0c;为何机器学习成为破局关键&#xff1f;如果你关注过5G到6G的技术演进路线&#xff0c;会发现一个核心趋势&#xff1a;天线阵列的规模正在从“大规模”走向“极大规模”。这不仅仅是数量的堆砌&#xff0c;更是通信物理原理的一…...

深圳实体门店有必要做GEO AI代运营吗

深圳实体门店有必要做GEO AI代运营吗一、开篇引言2026年深圳本地实体商业竞争进入白热化阶段&#xff0c;全城数百万家线下实体门店涵盖本地生活、家装工装、汽车服务、餐饮娱乐、教育培训等全品类&#xff0c;传统线下地推、门店自然客流、传统团购平台引流效果持续下滑&#…...

电子商务设计师软考备战:特别篇 - 综合模拟与备考策略

1. 考试形式与内容结构1.1 考试基本信息考试科目与时间基础知识考试&#xff1a;上午9:00-11:30&#xff08;150分钟&#xff09;应用技术考试&#xff1a;下午2:00-4:30&#xff08;150分钟&#xff09;题型与分值分布上午考试&#xff08;基础知识&#xff09;&#xff1a; -…...

CausalVLR基准测试报告:在IU X-Ray和MIMIC-CXR数据集上的性能分析

CausalVLR基准测试报告&#xff1a;在IU X-Ray和MIMIC-CXR数据集上的性能分析 【免费下载链接】CausalVLR CausalVLR: A Toolbox and Benchmark for Vision-Language Causal Reasoning (多模态因果推理开源框架) 项目地址: https://gitcode.com/gh_mirrors/ca/CausalVLR …...

Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参

Gazebo Sim多旋翼控制&#xff1a;四轴飞行器动力学建模与PID调参 【免费下载链接】gz-sim Open source robotics simulator. The latest version of Gazebo. 项目地址: https://gitcode.com/gh_mirrors/gz/gz-sim Gazebo Sim是一款功能强大的开源机器人模拟器&#xff…...

机器学习在射电天文数据分类中的应用:以MIGHTEE巡天SFG/AGN分类为例

1. 项目概述&#xff1a;当机器学习遇见深空射电巡天在射电天文学领域&#xff0c;我们正经历一场数据洪流。以MeerKAT望远镜阵列主导的MIGHTEE巡天项目为例&#xff0c;其在COSMOS天区的一次早期科学数据释放&#xff0c;就在不到1平方度的天区内探测到了超过6000个射电源。传…...

开源三角洲机器人Delta-Robot One:从入门到精通的创客实践指南

1. 项目概述&#xff1a;一个为学习而生的开源三角洲机器人如果你对机器人感兴趣&#xff0c;但又觉得它高深莫测、无从下手&#xff0c;那么Delta-Robot One&#xff08;我们亲切地称它为“One”&#xff09;可能就是为你量身打造的入门项目。这不是一个遥不可及的工业设备&am…...

WorkshopDL终极指南:无需Steam客户端也能轻松下载创意工坊模组

WorkshopDL终极指南&#xff1a;无需Steam客户端也能轻松下载创意工坊模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了游戏&#xff0…...

C语言预处理指令全解析

第六章 预处理命令在c语言中&#xff0c;所有# 开头的指令&#xff0c;被称为预处理指令。gcc 编译预处理 所有的预处理指令&#xff0c;都要在这步处理完汇编编译连接#include包含头文件。 全局变量的声明&#xff0c;函数的声明&#xff0c; 自定义构造类型声明&#xff0c; …...

忆阻储层计算:预处理优化与硬件实现

1. 项目概述在当今人工智能快速发展的时代&#xff0c;神经形态计算正成为突破传统冯诺依曼架构瓶颈的重要方向。储层计算&#xff08;Reservoir Computing&#xff0c;RC&#xff09;作为一种特殊的循环神经网络架构&#xff0c;因其仅需训练输出层而显著降低了计算开销&#…...