CMU 15-445 -- 关系型数据库重点概念回顾 - 01

news2024/11/17 9:46:50

CMU 15-445 -- 关系型数据库重点概念回顾 - 01

  • 引言
  • Relational Data Model
    • DBMS
    • 数据模型
    • Relational Model
        • Relation & Tuple
        • Primary Keys
        • Foreign Keys
    • Data Manipulation Languages (DML)
      • Relational Algebra
  • Advanced SQL
    • SQL 的历史
    • SQL
      • Aggregates
      • Group By
      • Having
      • Output Redirection
      • Output Control
        • Order By
        • Limit
      • Nested Queries
      • Common Table Expressions
      • String Operations
        • String Matching
        • String Operations
      • Date/Time Operations
      • Window Functions


引言

本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录,附加个人拙见,同样借助CMU 15-445课程内容来完成MIT 6.830 lab内容。

CMU 15-445实验如果有空,后期会在本专栏补充上。


Relational Data Model

DBMS

所有系统都会产生数据,因此数据库几乎是所有系统都不可或缺的模块。在早期,各个项目各自造轮子,因为每个轮子都是为应用量身打造,这些系统的逻辑层(logical)和物理层(physical)普遍耦合度很高。

Ted Codd 发现这个问题后,提出 DBMS 的抽象(Abstraction):

  • 用简单的、统一的数据结构存储数据
  • 通过高级语言操作数据
  • 逻辑层和物理层分离,系统开发者只关心逻辑层,而 DBMS 开发者才关心物理层。

数据模型

在逻辑层中,我们通常需要对所需存储的数据进行建模。如今,市面上有的数据模型包括:

  • Relational => 大部分 DBMS 属于关系型,也是本课讨论的重点
  • Key/Value
  • Graph
  • Document
  • Column-family
  • Array/Matrix

Relational Model

Relation & Tuple

每个 Relation 都是一个无序集合(unordered set),集合中的元素称为 tuple,每个 tuple 由一组属性构成,这些属性在逻辑上通常有内在联系。

Primary Keys

primary key 在一个 Relation 中唯一确定一个 tuple,如果你不指定,有些 DBMSs 会自动帮你生成 primary key。

Foreign Keys

foreign key 唯一确定另一个 relation 中的一个 tuple


Data Manipulation Languages (DML)

在 Relational Model 中从数据库中查询数据通常有两种方式:Procedural 与 NonProcedural:

  • Procedural:查询命令需要指定 DBMS 执行时的具体查询策略,如 Relational Algebra
  • Non-Procedural:查询命令只需要指定想要查询哪些数据,无需关心幕后的故事,如 SQL

使用哪种方式是具体的实现问题,与 Relational Model 本身无关。


Relational Algebra

relational algebra 是基于 set algebra 提出的,从 relation 中查询和修改 tuples 的一些基本操作,它们包括:

在这里插入图片描述

将这些操作串联起来,我们就能构建更复杂的操作

注意

  • 使用 Relation Algebra 时,我们实际上指定了执行策略,如:

在这里插入图片描述

  • 它们所做的事情都是 ”返回 R 和 S Join 后的结果中,b_id 等于 102 的 tuples“。

虽然 Relational Algebra 只是 Relational Model 的具体实现方式,但在之后的课程将会看到它对查询优化、执行的帮助。

本部分参考课程链接


Advanced SQL

在 Relational Model 下构建查询语句的方式分为两种:

  • Procedural 和 Non-Procedural。

第一节课中已经介绍了 Relational Algebra,它属于 Procedural 类型,而本节将介绍的 SQL 属于 Non-Procedural 类型。使用 SQL 构建查询时,用户只需要指定它们想要的数据,而不需要关心数据获取的方式,DBMS 负责理解用户的查询语义,选择最优的方式构建查询计划。

SQL 的历史

  • ”SEQUAL" from IBM’s System R prototype
    • Structured English Query Language
    • Adopted by Oracle in the 1970s
  • IBM releases DB2 in 1983
  • ANSI Standard in 1986. ISO in 1987
    • Structured Query Language

当前 SQL 的标准是 SQL 2016,而目前大部分 DBMSs 至少支持 SQL-92 标准,具体的系统对比信息可以到这里查询。


SQL

SQL 基于:

  • Aggregations + Group By
  • String / Date / Time Operations
  • Output Control + Redirection
  • Nested Queries
  • Common Table Expressions
  • Window Functions

本节使用的示例数据库如下所示:

student(sid, name, login, gpa)
sidnameloginagegpa
53666Kanyekayne@cs394.0
53668Bieberjbieber@cs223.9
enrolled(sid, cid, grade)
sidcidgrade
5366615-445C
5368815-721A
course(cid, name)
cidname
15-445Database Systems
15-721Advanced Database Systems

Aggregates

Aggregates 通常返回一个值,它们包括:

  • AVG(col)
  • MIN(col)
  • MAX(col)
  • SUM(col)
  • COUNT(col)

举例如下:

  • count.sql
SELECT COUNT(login) AS cnt FROM student WHERE login LIKE '%@cs';
SELECT COUNT(*) AS cnt FROM student WHERE login LIKE '%@cs';
SELECT COUNT(1) AS cnt FROM student WHERE login LIKE '%@cs';
  • multiple.sql
SELECT AVG(gpa), COUNT(sid) FROM student WHERE login LIKE '%@cs';
  • distinct.sql
SELECT COUNT(DISTINCT login) FROM student WHERE login LIKE '%@cs';

aggregate 与其它通常的查询列不可以混用,比如:

  • mix.sql
SELECT AVG(s.gpa), e.cid FROM enrolled AS e, student AS s WHERE e.sid = s.sid;

不同 DBMSs 的输出结果不一样,严格模式下,DBMS 应该抛错。


Group By

group by 就是把记录按某种方式分成多组,对每组记录分别做 aggregates 操作,如求每门课所有学生的 GPA 平均值:

SELECT AVG(s.gpa), e.cid FROM enrolled AS e, student AS s WHERE e.sid = s.sid GROUP BY e.cid;

所有非 aggregates 操作的字段,都必须出现在 group by 语句,如下面示例中的 e.cid 和 s.name:

SELECT AVG(s.gpa), e.cid, s.name FROM enrolled AS e, student AS s WHERE e.sid = s.sid GROUP BY e.cid, s.name;

Having

基于 aggregation 结果的过滤条件不能写在 WHERE 中,而应放在 HAVING 中,如:

SELECT AVG(s.gpa) AS avg_gpa, e.cid FROM enrolled AS e, student AS s WHERE e.sid = s.sid GROUP BY e.cid HAVING avg_gpa > 3.9;

Output Redirection

将查询结果储存到另一张表上:

  • 该表必须是已经存在的表
  • 该表的列数,以及每列的数据类型必须相同

SQL-92.sql:

SELECT DISTINCT cid INTO CourseIds FROM enrolled;

INSERT INTO CourseIds ( SELECT DISTINCT cid FROM enrolled );

MySQL.sql:

CREATE TABLE CourseIds ( SELECT DISTINCT cid FROM enrolled );

Output Control

Order By

语法: ORDER BY <column*> [ASC|DESC]

SELECT sid, grade FROM enrolled WHERE cid = '15-721' ORDER BY grade;

按多个字段分别排序:

SELECT sid FROM enrolled WHERE cid = '15-721' ORDER BY grade DESC, sid ASC;

Limit

语法:LIMIT <count> [offset]

SELECT sid, name FROM student WHERE login LIKE '%@cs' LIMIT 10;

SELECT sid, name FROM student WHERE login LIKE '%@cs' LIMIT 20 OFFSET 10;

Nested Queries

nested queries 包含 inner queries 和 outer queries,前者可以出现在 query 的任何位置,且 inner queries 可以引用 outer queries 中的表信息。

例 1:获取所有参与 ‘15-445’ 这门课所有学生的姓名:

SELECT name FROM student WHERE sid IN ( SELECT sid FROM enrolled WHERE cid = '15-445' );
SELECT (SELECT S.name FROM student AS S WHERE S.sid = E.sid) AS sname FROM enrolled AS E WHERE cid = '15-445';

语法中支持的谓词包括:

  • ALL: 所有 inner queries 返回的记录都必须满足条件
  • ANY:任意 inner queries 返回的记录满足条件即可
  • IN:与 ANY 等价
  • EXISTS: inner queries 返回的表不为空
SELECT name FROM student WHERE sid ANY ( SELECT sid FROM enrolled WHERE cid = '15-445')

例 2:找到至少参与一门课程的所有学生中,id 最大的

SELECT sid, name FROM student WHERE sid >= ALL (SELECT sid FROM enrolled);

SELECT sid, name FROM student WHERE sid IN (SELECT MAX(sid) FROM enrolled);

SELECT sid, name FROM student WHERE sid IN (SELECT sid FROM enrolled ORDER BY sid DESC LIMIT 1);

例 3:找到所有没有学生参与的课程

SELECT * FROM course WHERE NOT EXISTS (SELECT * FROM enrolled WHERE course.cid = enrolled.cid);

nested queries 比较难被优化。


Common Table Expressions

在一些复杂查询中,创建一些中间表能够使得这些查询逻辑更加清晰:

WITH cteName AS (SELECT 1) SELECT * FROM cteName

WITH cteName (col1, col2) AS (SELECT 1, 2) SELECT col1 + col2 FROM cteName

WITH cteName1(col) AS (SELECT 1),cteName2(col) AS (SELECT 2) SELECT C1.col + C2.col FROM cteName1 AS C1, cteName2 AS C2;

例 1:找到所有参与课程的学生中 id 最大的

WITH cteSource(maxId) AS (
    SELECT MAX(sid) FROM enrolled
)
SELECT name FROM student, cteSource
 WHERE student.sid = cteSource.maxId

例 2:打印 1-10

WITH RECURSIVE cteSource (counter) AS (
    (SELECT 1)
    UNION ALL
    (SELECT counter + 1 FROM cteSource
      WHERE counter < 10)
)
SELECT * FROM cteSource;

String Operations

DBMSString CaseString Quotes
SQL-92SensitiveSingle Only
PostgresSensitiveSingle Only
MySQLInSensitiveSingle/Double
SQLiteSensitiveSingle/Double
OracleSensitiveSingle Only

如在 condition 中判断两个字符串忽略大小写后是否相等:

/* SQL-92 */
WHERE UPPER(name) = UPPER('KaNyE')

/* MySQL */
WHERE name = "KaNyE"

String Matching

SELECT * FROM enrolled AS e
 WHERE e.cid LIKE '15-%';

SELECT * FROM student AS s
 WHERE s.login LIKE '%@c_';

String Operations

SQL-92 定义了一些 string 函数,如

SELECT SUBSTRING(name, 0, 5) AS abbrv_name
  FROM student WHERE sid = 53688;

SELECT * FROM student AS s
 WHERE UPPER(e.name) LIKE 'KAN%';

不同 DBMS 有不同的 string 函数(没有完全遵从 SQL-92 标准),如连接两个 strings

/* SQL-92 */
SELECT name FROM student
 WHERE login = LOWER(name) || '@cs';

/* MySQL */
SELECT name FROM student
 WHERE login = LOWER(name) + '@cs';
SELECT name FROM student
 WHERE login = CONCAT(LOWER(name), '@cs')

Date/Time Operations

不同的 DBMS 中的定义和用法不一样,具体见各 DBMS 的文档。

Window Functions

主要用于在一组记录中,对每一条记录进行一些计算,如:

例 1:

SELECT *, ROW_NUMBER() OVER () AS row_num FROM enrolled;

会得到类似下表:
在这里插入图片描述

例 2:

SELECT cid, sid,
       ROW_NUMBER() OVER (PARTITION BY cid)
  FROM enrolled
 ORDER BY cid;

可是得到类似下表:
在这里插入图片描述

例 3:找到每门课获得最高分的学生

SELECT * FROM (
  SELECT *,
         RANK() OVER (PARTITION BY cid ORDER BY grade ASC) AS rank
    FROM enrolled
  ) AS ranking
WHERE ranking.rank = 1

通俗易懂的学会:SQL窗口函数

本部分参考课程链接


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内存屏障类型表

load store 啥意思 内存屏障类型表 StoreLoad Barriers是一个“全能型”的屏障&#xff0c;它同时具有其他3个屏障的效果。现代的多处理器大多支持该屏障&#xff08;其他类型的屏障不一定被所有处理器支持&#xff09;。执行该屏障开销会很昂贵&#xff0c;因为当前处理器通常…

在文件每行开头或结尾插入指定字符

1、在文件每行插入指定字符 sed -i "s/^/curl /g" missing.txt效果 2、在每行末尾插入指定字符 sed -i "s/$/结束 /g" missing.txt

leetcode1856. 子数组最小乘积的最大值(单调栈-java)

子数组最小乘积的最大值 leetcode1856.子数组最小乘积的最大值题目描述解题思路代码演示&#xff1a; 经典算法集锦 leetcode1856.子数组最小乘积的最大值 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/maximum-subarr…

【网络安全】初探SQL注入漏洞

如何利用SQL注入漏洞获取用户密码 前言1. 设计思路2. 设计目的 一、网站快速搭建1. 登录页2. 注册页3. 数据库连接页4. 首页&#xff08;登录后跳转到此处&#xff09;5. session页6. 注销页7. 查询页8. 数据库 二、SQL注入实例&#xff08;小试牛刀&#xff09;1. 猜测漏洞逻辑…

tomcat部署以及优化

目录 1.三个核心组件 2.tomcat服务部署 3.虚拟主机配置 4.tomcat优化 5.部署两台tomcat服务器 6.总结 1.三个核心组件 web容器 完成web服务 servlet容器 名为catalina 用于处理servlet JSP容器 将JSP动态网页翻译成…

网络通信之旅:揭秘交换机、路由器与网关的神奇世界!

文章目录 一 交换机2.1 交换机初识2.2 MAC地址表2.3 数据包2.4 交换机与数据包2.5 泛洪2.6 结论&#xff1a;交换机—二层设备 三 路由器3.1 WAN口&LAN口3.2 路由器-WAN交换机 四 网关4.1 子网划分4.2 网关4.3 路由 五 实践&#xff1a;路由器桥接-搭建主副路由器5.1 知识探…

动态规划:

这类问题非常简单&#xff0c;甚至看起来有点笨&#xff0c;说白了就是利用计算机的计算能力一步步算过去&#xff0c;也就是大多数人没有意识到的递推问题 比如求1~n的前缀和&#xff1a; #include<iostream> using namespace std; long long sum[100]; int main(){in…

20kV高精度可调高压稳压测试电源的学习与使用

一&#xff1a;应用范围 A: 二极管反向耐压测试 B: 二极管反向漏电流测试 C: 高压电容耐压测试 D: 玻璃釉电阻非线性性能测试 E:氙灯击穿电压测试 F: 材料耐压测试 二、特点 高精度恒流恒压高压输出源 它拥有0~20kV的电压输出能力, 0.005%的电压分辨率精度, 0.1uA的电 …

Docker安装Prometheus和Grafana监控Redis

Docker安装Prometheus和Grafana监控Redis 使用 Docker 安装 Grafana 和 Prometheus 无疑是最简单的&#xff0c;我们接下来将采用此种方式。 1、安装Prometheus 查看Prometheus镜像 $ docker search prometheus拉取镜像 $ docker search bitnami/prometheus在/home/zhangs…

css 小程序 按钮控件点击区域放大 热点区域

背景&#xff1a; 小程序在手机上屏幕过小&#xff0c;但是又想放很多元素&#xff0c;这时候点击区域&#xff0c;命中元素概率很&#xff0c;希望能在不布局不变形情况下&#xff0c;把点击区域放大。 先看效果&#xff1a; 解决方法&#xff1a; 通过&#xff1a;transfo…

WebGL交错缓冲区【Interleaved Buffer】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 昨天我在 WebGL 沙箱项目的评论中收到 Jon 的一个问题&#xff1a; 嗨, 布兰登&#xff0c;以你的演示为起点&#xff0c;我尝试显示一个金字塔&#xff0c;但到目前为止我只能看到它的四个面之一。 如果我使用 gl.LINES…

零信任:基于Apisix构建认证网关

背景 零信任一直是我们未来主攻的一个方向&#xff0c;全球加速&#xff0c;SD-WAN组网都是一些非常成熟的产品&#xff0c;全球加速是我们所有产品的底座&#xff0c;SD-WAN解决的是多个网络打通的问题&#xff0c;而零信任则主打应用访问。 关于零信任&#xff0c;我们已经…

使用Wireshark 找出 TCP 吞吐瓶颈

Debug 网络质量的时候&#xff0c;我们一般会关注两个因素&#xff1a;延迟和吞吐量&#xff08;带宽&#xff09;。延迟比较好验证&#xff0c;Ping 一下或者 mtr[1] 一下就能看出来。这篇文章分享一个 debug 吞吐量的办法。 看重吞吐量的场景一般是所谓的长肥管道(Long Fat …

包装类~~

就是8种基本数据类型对应的引用类型 2&#xff1a;为什么提供包装类 Java为了实现一切皆对象&#xff0c;对8种基本类型提供了对应的引用类型后面的集合和泛型其实也只能支持包装类型&#xff0c;不支持基本数据类型。 自动装箱&#xff1a;基本类型的数据和变量可以直接赋值…

ResNet:深度学习中的重要里程碑

目录 导言&#xff1a; 1. 应用 2. 结构介绍 3. 代码案例 导言&#xff1a; 深度学习的迅速发展在图像识别、语音处理和自然语言处理等领域取得了巨大的突破。然而&#xff0c;深度神经网络在训练过程中遇到了梯度消失和梯度爆炸等问题&#xff0c;限制了模型的性能和训练…

【springboot整合】RabbitMQ

Spring与消息 概述 消息中间件的主要作用&#xff1a;提高系统异步通信、扩展解耦能力消息服务的两个重要概念&#xff1a;消息代理&#xff08;message broker&#xff09;和目的地&#xff08;destination&#xff09;消息队列的两种形式的目的地&#xff1a;队列&#xff…

CentOS ping命令:name or service not known

1.虚拟机网络连接设置为“NAT模式”&#xff0c;且NAT设置 导航栏“编辑”->“虚拟网络编辑器” ->NAT模式->NAT设置 2.网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33注&#xff1a;IPADDR和NAT设置里面的IP最后一位要不同 3.DNS设置 vi /etc/reso…

自然语言处理: 第四章Seq2Seq

自然语言处理: 第四章Seq2Seq 理论基础 开始之前&#xff0c;首先提出一个问题&#xff0c;电脑是怎么识别人类的命令的&#xff0c;首先人们通过输入代码(编码) &#xff0c;带入输入给计算机然后再经过处理(解码)得到最终的命令。所以可以看到这其实是一个编码 解码的过程…

lesson10 Zigbee组播通信原理

目录 Zigbee组播通信原理 实验原理 实验过程 实验设计 发送模块 接收模块 实验现象 组播通信总结 Zigbee组播通信原理 实验原理 1、组播通信&#xff1a;在Zigbee无线网络里&#xff0c;模块可以进行分组来标记。发送的模块如果发送的组号和网络里标记模块的组号相对应…