读SQL学习指南(第3版)笔记06_连接和集合

1. 连接

1.1. 笛卡儿积

1.1.1. 交叉连接(cross join)

1.1.2. 查询并没有指定两个数据表应该如何连接,数据库服务器就生成了笛卡儿积

1.1.2.1. 两个数据表的所有排列组合

1.1.3. 很少会用到(至少不会特意用到)

1.1.3.1. 使用频率并不高

1.1.4. mysql

-> SELECT c.first_name, c.last_name, a.address-> FROM customer c JOIN address a;

1.1.5. 为2020年的每一天生成一行,但是数据库中没有包含每天一行的数据表

1.1.5.1. 涉及交叉连接、外连接、日期函数、分组、集合运算(union all)和聚合函数(count())

1.1.5.2. sql

 SELECT '2020-01-01' dt
UNION ALL
SELECT '2020-01-02' dt
UNION ALL
SELECT '2020-01-03' dt
UNION ALL
...
...
...
SELECT '2020-12-29' dt
UNION ALL
SELECT '2020-12-30' dt
UNION ALL
SELECT '2020-12-31' dt

1.1.5.3. mysql

 -> SELECT ones.num + tens.num + hundreds.num-> FROM-> (SELECT 0 num UNION ALL-> SELECT 1 num UNION ALL-> SELECT 2 num UNION ALL-> SELECT 3 num UNION ALL-> SELECT 4 num UNION ALL-> SELECT 5 num UNION ALL-> SELECT 6 num UNION ALL-> SELECT 7 num UNION ALL-> SELECT 8 num UNION ALL-> SELECT 9 num) ones-> CROSS JOIN-> (SELECT 0 num UNION ALL-> SELECT 10 num UNION ALL-> SELECT 20 num UNION ALL-> SELECT 30 num UNION ALL-> SELECT 40 num UNION ALL-> SELECT 50 num UNION ALL-> SELECT 60 num UNION ALL-> SELECT 70 num UNION ALL-> SELECT 80 num UNION ALL-> SELECT 90 num) tens-> CROSS JOIN-> (SELECT 0 num UNION ALL-> SELECT 100 num UNION ALL-> SELECT 200 num UNION ALL-> SELECT 300 num) hundreds;

1.1.5.4. 如果生成{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}、{0, 10, 20, 30, 40, 50, 60, 70, 80, 90}和{0,100, 200, 300}这3个集合的笛卡儿积,并将这3列的值相加,就可以得到包含0~399的所有数值的400行结果集

1.1.5.5. mysql

 -> SELECT DATE_ADD('2020-01-01',->   INTERVAL (ones.num + tens.num + hundreds.num) DAY) dt-> FROM->  (SELECT 0 num UNION ALL->   SELECT 1 num UNION ALL->   SELECT 2 num UNION ALL->   SELECT 3 num UNION ALL->   SELECT 4 num UNION ALL->   SELECT 5 num UNION ALL->   SELECT 6 num UNION ALL->   SELECT 7 num UNION ALL->   SELECT 8 num UNION ALL->   SELECT 9 num) ones->   CROSS JOIN->  (SELECT 0 num UNION ALL->   SELECT 10 num UNION ALL->   SELECT 20 num UNION ALL->   SELECT 30 num UNION ALL->   SELECT 40 num UNION ALL->   SELECT 50 num UNION ALL->   SELECT 60 num UNION ALL->   SELECT 70 num UNION ALL->   SELECT 80 num UNION ALL->   SELECT 90 num) tens->   CROSS JOIN->  (SELECT 0 num UNION ALL->   SELECT 100 num UNION ALL->   SELECT 200 num UNION ALL->   SELECT 300 num) hundreds-> WHERE DATE_ADD('2020-01-01',->   INTERVAL (ones.num + tens.num + hundreds.num) DAY) < '2021-01-01'-> ORDER BY 1;

1.1.5.6. 无须人为介入,结果集会自动包含额外的闰日(2月29日),这是由数据库服务器通过将2020年1月1日加上59天计算得出

1.2. 内连接

1.2.1. 增加了连接类型(注意关键字inner)

1.2.2. mysql

 -> SELECT c.first_name, c.last_name, a.address-> FROM customer c JOIN address a->   ON c.address_id = a.address_id;

1.2.3. sql

SELECT c.first_name, c.last_name, a.address
FROM customer c INNER JOIN address aON c.address_id = a.address_id;

1.2.4. 如果用于连接两个数据表的列名相同,则可以使用using子句替代on

1.2.4.1. sql

SELECT c.first_name, c.last_name, a.address
FROM customer c INNER JOIN address aUSING (address_id);

1.2.4.2. using是一种只能在某些特定情况下使用的简写表示法

1.3. 外连接(outer join)

1.3.1. 如果要将一个数据表中的所有行全部纳入结果集,不管其在另一个数据表中是否存在匹配

1.3.2. mysql

 -> SELECT f.film_id, f.title, count(i.inventory_id) num_copies-> FROM film f->   LEFT OUTER JOIN inventory i->   ON f.film_id = i.film_id-> GROUP BY f.film_id, f.title;

1.3.3. 关键字left和right只是告知服务器哪个数据表的数据可以不足

1.3.4. outer关键字是可选的,可以使用A left join B来代替

1.4. 自然连接(natural join)

1.4.1. 依靠多个数据表之间相同的列名来推断适合的连接条件

1.4.2. mysql

 -> SELECT c.first_name, c.last_name, date(r.rental_date)-> FROM customer c->   NATURAL JOIN rental r;
Empty set (0.04 sec)

1.4.3. 数据库服务器检查数据表定义并添加了连接条件r.customer_id = c.customer_id

1.4.4. 应该避免使用这种连接类型,而使用带有显式连接条件的内连接

1.5. 连接的旧方法

1.5.1. mysql

 -> SELECT c.first_name, c.last_name, a.address-> FROM customer c, address a-> WHERE c.address_id = a.address_id;

1.5.2. 不需要on子句

1.5.3. from子句中的数据表名以逗号分隔

1.5.4. 连接条件出现在where子句中

1.6. ANSI连接语法

1.6.1. 连接条件和过滤条件被分隔在两个不同的子句中(on子句和where子句),使得查询语句更易于理解

1.6.2. 两个数据表的连接条件出现在其各自单独的on子句中,这样就不太可能错误地忽略连接条件

1.6.3. 使用SQL92连接语法的查询语句可以在各种数据库服务器间移植,而旧语法在不同服务器上的表现略有不同

1.7. 连接顺序

1.7.1. 各数据表在from子句中出现的顺序并不重要

1.7.1.1. 服务器使用从数据库对象收集的统计信息,在3个数据表中选择一个作为起点(所选择的数据表被称为驱动表),然后确定其他数据表的连接顺

1.7.2. 如果认为查询语句中的数据表应该始终以特定的顺序连接,可以将数据表按照需要的顺序排列

1.7.2.1. 在MySQL中指定straight_join关键字

1.7.2.1.1. sql
SELECT STRAIGHT_JOIN c.first_name, c.last_name, ct.city
FROM city ctINNER JOIN address aON a.city_id = ct.city_idINNER JOIN customer cON c.address_id = a.address_id

1.7.2.2. 在SQL Server中请求force order选项

1.7.2.3. 在Oracle Database中使用ordered或leading优化器

1.7.3. 三路外连接

1.7.3.1. mysql

-> SELECT f.film_id, f.title, i.inventory_id, r.rental_date-> FROM film f->   LEFT OUTER JOIN inventory i->   ON f.film_id = i.film_id->   LEFT OUTER JOIN rental r->   ON i.inventory_id = r.inventory_id-> WHERE f.film_id BETWEEN 13 AND 15;

1.8. 自连接

1.8.1. mysql

-> SELECT f.title, f_prnt.title prequel-> FROM film f->   INNER JOIN film f_prnt->   ON f_prnt.film_id = f.prequel_film_id-> WHERE f.prequel_film_id IS NOT NULL;

2. 集合

2.1. 在对两个数据集执行集合运算时

2.1.1. 两个数据集的列数必须相等

2.1.2. 两个数据集各列的数据类型必须相同

2.1.2.1. 数据库服务器必须能够将一种数据类型转换成另一种数据类型

2.2. union运算符

2.2.1. mysql

 -> SELECT 1 num, 'abc' str-> UNION-> SELECT 9 num, 'xyz' str;

2.2.2. union会对组合后的集合进行排序并去除重复项

2.2.3. union all则不然

2.3. intersect运算符

2.3.1. ANSI SQL规范中定义了用于执行交集运算的intersect运算符

2.3.2. ANSI SQL规范还提供了不去除重复行的intersect all运算符

2.3.2.1. 唯一实现了intersect all运算符的数据库服务器是IBM DB2 Universal Server

2.3.3. MySQL 8.0版还未实现intersect运算符

2.3.4. Oracle或SQL Server 2008中可以使用

2.4. except运算符

2.4.1. ANSI SQL规范提供了执行差集运算的except运算符

2.4.2. ANSI SQL规范还提供了except all运算符

2.4.2.1. 只有IBM的 DB2 Universal Server实现了该运算符

2.4.3. MySQL 8.0版也没有实现except运算符

2.4.4. Oracle Database需要使用非ANSI兼容的minus运算符替代except运算符

2.5. 对符合查询结果排序

2.5.1. mysql

 -> SELECT a.first_name fname, a.last_name lname-> FROM actor a-> WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%'-> UNION ALL-> SELECT c.first_name, c.last_name-> FROM customer c-> WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%'-> ORDER BY lname, fname;

2.6. 集合运算的优先级

2.6.1. 包含3个或以上查询语句的复合查询,是以自顶向下的顺序来评估查询的

2.6.2. 根据ANSI SQL规范,intersect运算符拥有比其他集合运算符更高的优先级

2.6.3. 可以将查询放入括号内,以明确指定查询的执行顺序

2.6.3.1. MySQL目前还不允许在复合查询中使用括号

2.6.3.2. 将相邻查询放入括号中,以覆盖复合查询默认的自顶向下的处理方式

 

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

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

相关文章

layui框架学习(43:文件上传模块-下)

上一篇文章介绍文件上传模块使用示例时介绍了done和error事件,这两个事件是在文件上传成功(原文:在上传接口请求完毕后触发,但文件不一定是上传成功的)及上传失败(原文:请求上传出现异常&#x…

深入浅出AXI协议(3)——握手过程

一、前言 在之前的文章中我们快速地浏览了一下AXI4协议中的接口信号,对此我们建议先有一个简单的认知,接下来在使用到的时候我们还会对各种信号进行一个详细的讲解,在这篇文章中我们将讲述AXI协议的握手协议。 二、握手协议概述 在前面的文章…

《Kubernetes部署篇:Ubuntu20.04基于二进制安装安装cri-containerd-cni》

一、背景 由于客户网络处于专网环境下, 使用kubeadm工具安装K8S集群,由于无法连通互联网,所有无法使用apt工具安装kubeadm、kubelet、kubectl,当然你也可以使用apt-get工具在一台能够连通互联网环境的服务器上下载cri-tools、cont…

Python-使用xlsxwriter创建单元格下拉列表(数据校验)

在一个B/S系统中,用户经常需要从以Excel的方式填写后导入,此时网页上需要提供Excel填写的模板,将所需填写的字段以及所处的列的位置固定下来。其中,避免用户随意填写导致系统后台校验出错,对于某些字段,系统…

【运维】hadoop3.0.3集群安装(一)多节点安装

文章目录 一.Purpose二. Prerequisites三. Installation1. 节点规划2. Configuring Hadoop in Non-Secure Mode3. 准备工作4. 配置core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlworkers 4. 分发配置、创建文件夹5. 格式化6. 操作进程6.1. hdfs启动停止 6.2. yarn启动…

PyQt6 GUI界面设计和Nuitka包生成exe程序(全笔记)

PyQt6 GUI界面设计和Nuitka包,生成exe程序全笔记 目录一、PyQt6包安装1.1 进行环境配置和安装1.2 检查包是否安装成功。1.3 运行desinger.exe二、GUI界面设计,写程序,并能运行成功。三、Nuitka打包生成exe程序3.1 做Nuitka安装准备工作(1)安装C编译器,设置环境变量3.2 安…

创建Vue项目时报错!

Vue CLI v5.0.8 ✨ Creating project in F:\program\demodemo\demo. 🗃 Initializing git repository... ⚙️ Installing CLI plugins. This might take a while... npm ERR! code EPERM npm ERR! syscall open npm ERR! path D:\NodeJs\node_cache\_cacache\tm…

新功能上线!Salesforce Field Service人工智能创新

Salesforce Field Service是Service Cloud的扩展,可提供员工管理的全面视图。Field Service专为进行现场服务的员工而设计,例如服务技术人员、服务座席、调度员等。随着Salesforce平台上线越来越多的生成式AI新增功能(包括Sales Cloud、Marke…

【PHP】常用的PHP内置函数

1、PHP内置函数非常丰富,用于执行各种任务。以下是一些常用的PHP内置函数: 字符串操作函数: strlen(): 返回字符串的长度。 strpos(): 查找字符串中的某个子串第一次出现的位置。 substr(): 返回字符串的子串。 str_replace(): 替换字符串中的…

Camunda 7.x 系列【38】表单服务 FormService

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 演示2.1 获取流程开始表单2.2 启动流程2.3 查询任务表单2.4 完成任务3. 实际开发…

linux磁盘空间满了

登录服务器,通过df -Hl查看 确定告警信息一致,接着是找到占用空间大目录或文件 一种比较笨的方法是,在根目录下,通过du -sh命令,列出各目录所占空间大小 之后再用同样的方法继续到对应目录下去找 再相对高效一点的…

useState

道阻且长,行而不辍,未来可期 Hook是React 16.8.0版本增加的新特性 state hook让函数组件也有状态,也可以进行状态的读写。 语法:const [xxx,setXxx] React.useState(initValue); useState()说明:参数&am…

浅谈红队资产信息收集经验

文章目录 子公司资产收集备案号|官网收集子域名|ip收集fofa灯塔ARLX情报社区 资产确认目录扫描Google Hacking绕过CDNnmap端口扫描参数技巧其他常用工具 子公司资产收集 红蓝对抗中往往只会给你目标企业的名称,以及对应的靶标系统地址,而很少有直接从靶标…

给前端返回http链接,由于浏览器缓存不能获取到最新资源怎么办?

1、问题描述 今天在工作中接到这样一个需求,接收前端的图片文件并上传到远程,将原有图片覆盖并返回一个http链接以供前端展示。用户使用后反馈没有修改成功,上了远程拉图片发现已经修改了,但是用户浏览器还是老的图片。排查原因是…

MySQL基础入门

推荐查看 数据库相关概念 MySQL百度百科 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Databa…

Unity Android Bugly 报错地址查询

借助Android NDK arm-linux-androideabi-addr2line.exe 对报错的地址转换成对应代码行。 一、报错信息,例如来自Firebase 报错如下: Fatal Exception: Tombstone: Version 2020.3.33f1 (915a7af8b0d5), Build type Release, Scripting Backend il2cpp,…

KylinOS配置完静态IP地址后,保存按钮是灰色

问题: 配置完静态IP地址后,保存按钮置灰,并且提示“无效设置IPv4设置:ipv4.gateway:网关与”never-default”不兼容”。 原因: 这是由于禁止添加默认路由导致的。 解决方案: 1、使用nmcli命令: nmcli con modify "有线连接 1" ipv4.never-default no 执…

常见的数据结构之队列

一、介绍 队列(Queue)是一种常见的数据结构,用于存储和管理一系列数据元素,其中元素按照 先进先出(First-In-First-Out,简称FIFO)的原则进行插入和删除。 队列可以类比为现实生活中排队等候的场景,例如在超市收银台排队购物的顾客队列。 二、队列的基本操作 2.1 出…

Java代码审计15之Apache log4j2漏洞

文章目录 1、log4j简介2、复现2.1、高版本测试2.2、测试代码2.3、补充之dns探测2.3.1、rmi、ldap也可以dnslog探测 2.3.2、dnslog外带信息 3、漏洞原理3.1、漏洞的危害大的背景3.2、具体的代码调试 4、靶场测试4.1、dns探测4.2、工具下载与使用4.3、测试 5、bypass 1、log4j简介…