本专栏是对CMU15445的笔记的翻译,原文地址:https://15445.courses.cs.cmu.edu/fall2020/notes/02-advancedsql.pdf

1 关系语言

在20世纪70年代,Edgar Codd发布了一篇关于关系模型的论文。最初,他只定义了数据库在关系模型上运行查询的数学符号。

用户只需要使用声明性的语言指定他们想要的结果(例如SQL)。数据库有责任去决定最有效率的计划并返回结果。

关系代数基于set(无序,没有重复),SQL基于bag(无序,有重复)。

2 SQL历史

用于关系型数据库的声明式查询语言,最初是在20世纪70年代作为IBM System R项目的一部分开发的。IBM最初称为“SEQUEL”(Structured English Query Language 结构化英文查询语言)。在20世纪80年代改名为“SQL”(Structured Query Language 结构化查询语言)。

这个语言由不同种类的命令组成:

  1. Data Manipulation Language (DML 数据操纵语言):SELETE(查询),INSERT(插入),UPDATE(更新)和DELETE(删除)。
  2. Data Definition Language (DDL 数据定义语言):定义表,索引,视图和另外对象的模式。
  3. Data Control Language (DCL 数据控制语言):安全,访问控制。

SQL不是一个死(一成不变)的语言,每隔几年就会添加新功能。SQL-92标准是一个数据库支持SQL的最低要求。每个供应商都在一定程度上遵循标准,但同时他们也有很多自己的扩展语法。

3 聚合

聚合函数接受一批元组作为输入并产生单个标量作为输出。聚合函数只能用于SELECT的输出列。

例子:获取学生用“@cs”登录的数量。下列3个查询是等价的:

SELECT 

可以使用多个聚合函数在一个SELECT语句块中:

SELECT 

一些聚合函数支持DISTINCT关键字:

SELECT 

同时输出聚合函数列和非聚合函数列是未定义行为(e.cid在这里是未定义行为)

注:未定义行为指该行为标准中未定义,不同数据库可能会返回不同的结果(甚至可能会报错)

SELECT 

因此,其他非聚合函数的列必须使用GROUP BY命令进行聚合:

SELECT 

HAVING:聚合后进行过滤,像WHERE子句中使用GROUP BY过滤这样

SELECT 

4 字符串操作

SQL标准规定字符串区分大小写只能使用单引号。有些函数可以在查询的任何地方使用并操纵字符串。

Pattern Matching(模式匹配):LIKE关键字被用于在谓词中的字符串匹配。

  • “%” 匹配任何子串(包括空串)。
  • “_” 匹配单个字符。

Concatenation(连接):两个竖线(“||”)会连接2个或多个字符串变成1个字符串。

5 输出重定向

除了可以直接给用户返回结果,你还可以告诉数据库存储结果到另外一张表,然后你可以在后续查询中访问这些数据。

  • New Table(新表):存储查询的输出到新表中。
SELECT 

  • Existing Table(已存在的表):存储查询的输入到已经存在表中。目标表必须有相同的列数和相同的类型,列名可以和输出列不匹配。
INSERT 

6 输出控制

由于SQL是无序的,你必须使用ORDER BY子句去对结果进行排序:

SELECT 

你可以使用多个ORDER BY子句做更复杂的排序:

SELECT 

你可以使用任意的表达式在ORDER BY子句中:

SELECT 

通常,数据库会返回所有符合条件的元组。你可以使用LIMIT子句去限制返回元组的数量:

SELECT 

同时也可以提供offset去获得一个结果的区间:

SELECT 

除非你使用一个ORDER BY子句搭配LIMIT,否则数据库可能在每次查询会返回不同的元组,因为关系模型不在意顺序。

7 嵌套查询

嵌套查询可以使单个查询中运行更复杂的查询。外部查询的作用域在内部查询中(内部查询可以访问外部查询的属性),反之不行。

内部查询可以出现在查询的几乎所有地方:

  1. SELECT输出目标:
SELECT 

2. FROM子句:

SELECT 

3. WHERE子句:

SELECT 

例子:获取所有报名“15-445”的学生名字

SELECT 

注意,根据sid出现的不同位置,它拥有不同的作用域。

Nest Query Results Expressions(嵌套查询表达式):

  • ALL:必须满足子查询中所有的行
  • ANY:必须满足子查询中至少1行
  • IN:等价于ANY()
  • EXISTS:至少1行被返回

8 窗口函数

跨元组执行“移动”计算。和聚合一样,但它依然返回原始元组。

Functions(函数):窗口函数可以是上面讨论的任意的聚合函数。同时还有一些特殊的窗口函数:

  1. ROW_NUMBER:当前行的number
  2. RANK:当前行的排序

Grouping(分组):OVER子句指定当计算窗口函数的时候如何分组。使用PARTITION BY去指定分组。

SELECT 

你也可以在OVER中使用ORDER BY去确定结果的顺序,即使数据库内部存储结构发生改变也不会影响结果。

SELECT 

重点:RANK函数在窗口函数排序后计算,ROW_NUBMER函数在排序前计算。

9 公用表表达式(CTE)

公用表表达式(CTE)是窗口函数和嵌套查询的替代方法去编写更加复杂的查询。可以认为CTE是在单次查询的一个临时表。

WITH子句将内部查询的输出绑定到临时的结果。

例子:生成一个CTE叫cteName包含1个tuple的1个属性,属性值为1。这个查询返回了cteName的所有属性及值。

WITH 

你可以绑定输出列的名字在AS之前:

WITH 

单个查询可以包括多个CTE的定义:

WITH 

在WITH后添加RECURSIVE关键字允许CTE引用自己。

例子:打印1到10的序列

WITH 

sql删除元组_Lecture #02: 中级SQL相关推荐

  1. 《数据库系统概论》-02 中级SQL 约束、授权、索引

    文章目录 二.中级SQL 1.连接表达式 1.1 自然连接 1.2 外连接 1.3 连接条件 1.4 连接类型与条件 2.视图 2.1 视图定义 2.2 在SQL查询中使用视图 2.3 物化视图 2. ...

  2. sql 删除依赖_关系数据库标准语言SQL(二)

    声明:最近在准备考试,故整理数据库原理笔记. 视图 视图的创建和删除 CREATE VIEW <视图名 > [ <列名 > , --, <列名 >)] AS &l ...

  3. sql 删除数据_从零开始学SQL:是什么、如何安装、基本语法、表格(创建、删除、更新)、数据(插入、删除、更新)...

    一.学习知识的黄金圈思维 用黄金圈思维分析自己学习SQL,能增加自己的效率和坚持下去的动力. 二.SQL基础知识 1.数据库概念: database ,按照数据结构来组织.存储和管理数据的仓库. 2. ...

  4. 数据库系统概念总结:第四章 中级SQL

    周末无事水文章,期末备考的总结资料 第四章 中级SQL 4.1 连接表达式 4.1.1 连接条件 select * from student join takes on student.ID = ta ...

  5. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  6. 第三阶段:Web前端:02数据库(sql语言、JDBC数据库连接) | 03(1)SpringBoot

    二.数据库--> MySQl或MariaDB 0.1.Mysql-安装步骤 进入网址 http://doc.canglaoshi.org/-->常用下载:Windows必备-->Ma ...

  7. SQL删除重复数据方法

    原文:SQL删除重复数据方法 例如: id           name         value 1               a                 pp 2            ...

  8. sql 删除最低分数_一份虐你千百遍的SQL语句面试题,请笑纳

    一.现有数据库casemanage中表结构如下图 TABLENAME:afinfo 1)请编写sql语句对年龄进行升序排列 select * from afinfo order by birth; 2 ...

  9. asp sql查询过滤空格_对比Excel,轻松学习SQL数据分析数据笔记02

    本文主要梳理<对比Excel,轻松学习SQL数据分析>对于自己有用的sql知识.这本书中的所有代码和函数均适用于my sql 8.0版本. SQL的基本功能数据定义(DDL)--对数据库, ...

最新文章

  1. linux rabbitmq安装包,Linux安装RabbitMQ
  2. DS二叉树--左叶子数量
  3. 【MarkDown】:MarkDown编辑器
  4. CDN (2)特点和功能
  5. Input中实现对身份证的验证
  6. 第七课 ActionScript 3语言进阶一
  7. VC动态链接数据库类ADOConn
  8. TCP/IP参考模型与5层参考模型
  9. JS不能向WASM传递数组?
  10. 今天是愚人节。(Today is April Fools' Day.)网页需要倾斜o(∩_∩)o
  11. Magic Cube
  12. hp服务器u盘安装系统进不了安装界面,hp笔记本开机无法从u盘安装系统
  13. 原生JavaScript盒子的移动
  14. VsCode新建VueJs项目
  15. 已解决mybatis报错:Invalid bound statement (not found)
  16. linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。
  17. html 在当前页面时颜色不一样,网页中的图片在不同电脑上显示的颜色不同!求解决!_html/css_WEB-ITnose...
  18. java后台管理页面_一个很不错的,代码简单的后台管理界面
  19. 【从零开始的Java开发】1-4-3 多态:概念、实现、向上转型、向下转型、instanceof、类型转换、抽象类、抽象方法
  20. 实值函数相对于向量和矩阵的梯度

热门文章

  1. eclipse python插件_pydev插件下载-eclipse中的python插件下载6.0.0 官网最新版-西西软件下载...
  2. 简单的C++线程类实现, windows平台
  3. BASH中字符串的处理
  4. awk按分隔符的不同取出不同的列
  5. 通过类或ID记录上一个被选中的标签或者数字
  6. 前端学习(2982):一文理解undefine
  7. 前端学习(2978):上午回顾
  8. 前端学习(2956):项目中组件的本地注册
  9. [html] html的属性值有规定要使用单引号还是双引号吗?
  10. [vue] watch怎么深度监听对象变化