读SQL学习指南(第3版)笔记07_分组和子查询

news2024/11/17 1:51:35

 

1. 数据通常以数据库用户所需的最低层级的粒度存储

2. 分组

2.1. 隐式分组

2.1.1. mysql

-> SELECT MAX(amount) max_amt,
    ->   MIN(amount) min_amt,
    ->   AVG(amount) avg_amt,
    ->   SUM(amount) tot_amt,
    ->   COUNT(*) num_payments
    -> FROM payment;

2.1.1.1. 查询返回的每个值都是由聚合函数生成的

2.1.1.2. 没有使用group by子句

2.1.1.3. 只有一个隐式分组

2.1.1.3.1. payment数据表中的所有行

2.2. 显式分组

2.2.1. mysql

-> SELECT customer_id,
    ->   MAX(amount) max_amt,
    ->   MIN(amount) min_amt,
    ->   AVG(amount) avg_amt,
    ->   SUM(amount) tot_amt,
    ->   COUNT(*) num_payments
    -> FROM payment
    -> GROUP BY customer_id;

2.2.1.1. 添加一个group by子句来指定聚合函数应该应用于哪个分组

2.3. 单列分组

2.3.1. 最简单,也是最常用的分组类型

2.3.2. mysql

-> SELECT actor_id, count(*)
    -> FROM film_actor
    -> GROUP BY actor_id;

2.4. 多列分组

2.4.1. 需要跨越多列生成分组

2.4.2. mysql

-> SELECT fa.actor_id, f.rating, count(*)
    -> FROM film_actor fa
    ->   INNER JOIN film f
    ->   ON fa.film_id = f.film_id
    -> GROUP BY fa.actor_id, f.rating
    -> ORDER BY 1,2;

2.5. 通过表达式分组

2.5.1. 根据表达式产生的值构建分组

2.5.2. mysql

-> SELECT extract(YEAR FROM rental_date) year,
    ->   COUNT(*) how_many
    -> FROM rental
    -> GROUP BY extract(YEAR FROM rental_date);

2.6. 分组过滤条件

2.6.1. 由于group by子句是在where子句被评估之后运行的,因此无法为此对where子句增加过滤条件

2.6.2. 无法在where子句中引用聚合函数count(*)

2.6.2.1. 因为在评估where子句时,分组尚未生成,因而必须将分组过滤条件放入having子句

2.6.3. 向包含group by子句的查询中添加过滤条件时,仔细考虑是过滤原始数据(将过滤条件放入where子句),还是过滤分组后的数据(将过滤条件放入having子句)

3. 聚合函数

3.1. 对分组中的所有行执行特定的操作

3.2. max()

3.2.1. 返回集合中的最大值

3.3. min()

3.3.1. 返回集合中的最小值

3.4. avg()

3.4.1. 返回集合中的平均值

3.5. sum()

3.5.1. 返回集合中所有值之和

3.6. count()

3.6.1. 返回集合中所有值的个数

4. 统计不同的值

4.1. mysql

-> SELECT COUNT(customer_id) num_rows,
    ->   COUNT(DISTINCT customer_id) num_customers
    -> FROM payment;

4.2. 通过指定distinct,count()函数检查分组中每个成员的列值,以便查找和删除重复项,而不是简单地计算分组中值的数量

4.3. mysql

-> SELECT COUNT(*) num_rows,
    ->   COUNT(val) num_vals,
    ->   SUM(val) total,
    ->   MAX(val) max_val,
    ->   AVG(val) avg_val
    -> FROM number_tbl;

4.4. count(*)统计行数

4.5. count(val)统计val列包含多少个值并且忽略所有遇到的null值

5. 使用表达式

5.1. mysql

-> SELECT MAX(datediff(return_date,rental_date))
    -> FROM rental;

5.2. 除了使用列作为聚合函数的参数,也可以使用表达式

6. 生成汇总

6.1. 假设在计算每位演员/评级组合的总计数的同时,还想知道不同演员参演的电影总数,这时可以运行一个额外的查询并合并结果

6.2. with rollup选项来让数据库服务器完成这些工作

6.3. mysql

-> SELECT fa.actor_id, f.rating, count(*)
    -> FROM film_actor fa
    ->   INNER JOIN film f
    ->   ON fa.film_id = f.film_id
    -> GROUP BY fa.actor_id, f.rating WITH ROLLUP
    -> ORDER BY 1,2;

6.4. Oracle Database

6.4.1. GROUP BY ROLLUP(fa.actor_id, f.rating)

6.4.2. 可以在group_by子句中对部分列汇总

6.4.3. 如果按照列a、b、c进行分组,可以指示服务器通过下列语句仅对列b和c执行汇总

6.4.3.1. GROUP BY a, ROLLUP(b, c)

6.5. with cube选项

6.5.1. 为分组列的所有可能的组合生成汇总行

6.5.2. MySQL 8.0版并未提供

6.5.3. SQL Server和Oracle Database中可以使

7. 子查询

7.1. 子查询总是被包围在括号中,通常先于包含语句执行

7.2. 子查询像是一个具有语句作用域的临时数据表(这意味着服务器在执行SQL语句后会清空分配给子查询结果的内存)

7.3. 如果不清楚子查询究竟做了什么,可以单独运行子查询(不加括号)并查看返回结果

7.4. 返回的结果集

7.4.1. 单行单列

7.4.2. 多行单列

7.4.2.1. in和not in运算符

7.4.2.1.1. 虽然不能把单个值与一组值进行相等比较,但是可以检查这个值能否包含在一组值中
7.4.2.1.2. mysql
-> SELECT country_id
    -> FROM country
    -> WHERE country IN ('Canada','Mexico');
7.4.2.1.3. mysql
-> SELECT city_id, city
    -> FROM city
    -> WHERE country_id IN
    ->  (SELECT country_id
    ->   FROM country
    ->   WHERE country IN ('Canada','Mexico'));
7.4.2.1.4. sql
SELECT first_name, last_name
FROM customer
WHERE customer_id NOT IN
 (SELECT customer_id
  FROM payment
  WHERE amount = 0)
7.4.2.1.4.1. not in的版本更易于理解

7.4.2.2. all运算符

7.4.2.2.1. 将某个值与集合中的所有值进行比较
7.4.2.2.2. mysql
-> SELECT first_name, last_name
    -> FROM customer
    -> WHERE customer_id <> ALL
    ->  (SELECT customer_id
    ->   FROM payment
    ->   WHERE amount = 0);

7.4.2.3. any运算符

7.4.2.3.1. 允许将单个值与一组值中的各个值进行比较
7.4.2.3.2. 只要有一次比较成立,使用any运算符的条件即为真
7.4.2.3.3. any与in等效

7.4.2.4. 使用not in或<>运算符比较一个值和一组值时,必须确保这组值中不包含null值,这是因为服务器会将表达式左侧的值与组中的各个值进行比较,任何值与null作相等比较时都会产生unknown

7.4.3. 多行多列

7.4.3.1. mysql

-> SELECT fa.actor_id, fa.film_id
    -> FROM film_actor fa
    -> WHERE fa.actor_id IN
    ->  (SELECT actor_id FROM actor WHERE last_name = 'MONROE')
    ->   AND fa.film_id IN
    ->  (SELECT film_id FROM film WHERE rating = 'PG');

7.4.3.2. 可以将两个单列子查询合并成一个多列子查询

7.4.3.3. mysql

-> SELECT actor_id, film_id
    -> FROM film_actor
    -> WHERE (actor_id, film_id) IN
    ->  (SELECT a.actor_id, f.film_id
    ->   FROM actor a
    ->      CROSS JOIN film f
    ->   WHERE a.last_name = 'MONROE'
    ->   AND f.rating = 'PG');

7.4.3.4. 过滤条件必须将film_actor数据表的两列放入括号内

7.4.3.5. 与子查询返回的顺序一致

7.4.3.6. 子查询使用了交叉连接

7.5. 子查询类型

7.5.1. 非关联子查询

7.5.1.1. 子查询完全独立

7.5.1.2. 单独执行,不会引用包含语句中的任何内容

7.5.2. 关联子查询

7.5.2.1. 子查询会引用包含语句中的列

7.5.2.2. 并不是先于包含语句一次性执行完毕,而是为每一个候选行(可能会包含在最终结果中)执行一次

7.5.2.2.1. 如果包含查询返回很多行,将会引发性能问题

7.5.2.3. 在MySQL的delete语句中使用关联子查询时,无论如何都不能使用数据表别名,这就是在子查询中使用数据表全名的原因

7.6. exists运算符

7.6.1. 子查询可能会返回0行、1行或者多行结果,然而条件只是简单地检查子查询是否返回至少1行

7.6.2. 惯例是指定select 1或select

7.6.3. 也可以使用not exists来检查没有返回行的子查询

8. 何时使用子查询

8.1. 子查询作为数据源

8.1.1. 数据加工

8.1.1.1. 如果使用子查询,你就能够遵守仅在有明确的存储新数据的业务需求时才向数据库添加新数据表的原则

8.1.2. 面向任务的子查询

8.1.3. 公用表表达式

8.1.3.1. Common table expression,CTE

8.1.3.2. MySQL 8.0版新引入的特性

8.1.3.3. CTE是一个具名子查询,出现在with子句内查询的顶部,该子句可以包含多个以逗号分隔的CTE

8.1.3.4. 使用临时数据表来存储后续查询要用到的查询结果的替代方案

8.2. 子查询作为表达式生成器

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

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

相关文章

电脑桌面备忘录怎么设置?如何在电脑上同步使用手机备忘录?

在工作中,上班族们需要经常记下一些重要的事项,如开会时间、工作进度、待办事项等等。这些信息对于他们来说至关重要,因为一旦遗忘或错过了这些事项,就可能造成不必要的麻烦和负面影响。因此,一款便捷的备忘录软件成为…

ssm+vue高校实验室管理系统源码和论文

ssmvue高校实验室管理系统源码和论文081 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 一.毕业设计的内容 本高校实验室管理系统采用Java语言、MySQL数据库,基于SSM框架进行开发设计&…

Fooocus:一个简单且功能强大的Stable Diffusion webUI

Stable Diffusion是一个强大的图像生成AI模型,但它通常需要大量调整和提示工程。Fooocus的目标是改变这种状况。 Fooocus的创始人Lvmin Zhang(也是 ControlNet论文的作者)将这个项目描述为对“Stable Diffusion”和“ Midjourney”设计的重新…

【MySQL】MySQL里的用户账户和角色是什么?如何管理?

用户(user)验证和授权创建用户账户连接服务器查看用户账户设置 角色(role)创建角色 操作用户帐户和角色重命名删除 感谢 💖 用户(user) 在MySQL中,用户是数据库访问的主要实体。每个…

新亮点!安防视频监控/视频集中存储/云存储平台EasyCVR平台六分屏功能展示

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Python爬虫(十六)_JSON模块与JsonPath

数据提取之JSON与JsonPATH JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是的人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。 JSON和XML的比较可谓不相…

基于单片机的智能小车设计

一、项目介绍 随着科技的发展,智能机器人在日常生活中的应用越来越广泛。智能小车作为智能机器人的一种,具有便携性和多功能的特点,在教育、娱乐和工业等领域得到了广泛关注和应用。智能小车可以通过远程控制实现各种动作,如前进…

Matlab图像处理-水平镜像

镜像变换 镜像变换又常称为对称变换,它可以分为水平对称、垂直对称等多种变换。对称变换后,图像的宽和高不变。 图像的镜像分为两种垂直镜像和水平镜像。 水平镜像即将图像左半部分和右半部分以图像竖直中轴线为中心轴进行对换; 竖直镜像…

精读《算法题 - 地下城游戏》

今天我们看一道 leetcode hard 难度题目:地下城游戏。 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士…

LeetCode--HOT100题(45)

目录 题目描述:199. 二叉树的右视图(中等)题目接口解题思路 PS: 题目描述:199. 二叉树的右视图(中等) 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序…

视频汇聚/视频云存储/视频监控管理平台EasyCVR视频平台添加萤火云设备的具体操作步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【TI毫米波雷达笔记】毫米波雷达芯片结构框架解析(以IWR6843AOP为例)

【TI毫米波雷达笔记】毫米波雷达芯片结构框架解析(以IWR6843AOP为例) 代码解读: blog.csdn.net/weixin_53403301/article/details/132565590芯片框架 IWR6843AOP可以分成三个主要部分及多个外设 BSS:雷达前端部分 MSS&#xff…

cobbler自动化安装CentOS、windows和ubuntu

环境介绍 同时玩cobbler3.3和cobbler2.8.5 cobbler3.3 系统CentOS8.3 VMware虚拟机 桥接到物理网络 IP: 192.168.1.33 cobbler2.8.5 系统CentOS7.9 VMWare虚拟机 桥接到物理网络 IP:192.168.1.33 安装cobbler3.3 yum源修改 cat /etc/yum.repo.d/Cento…

基于深度学习的机器视觉表计识别

01 引言 针对仪表自动读数问题,新型数字式仪表的读数比较方便,现阶段已经有非常多成熟的方案落地,而针对传统指针式仪表自动读数的现有方案还不够成熟,存在识别不精确、易受环境干扰等问题,是亟待研究和攻克的难题。我…

新能源汽车动力总成系统及技术

需要动力系统总成的请联:shbinzer 拆车邦 需要动力系统总成的请联:shbinzer 拆车邦 需要动力系统总成的请联:shbinzer 拆车邦 需要动力系统总成的请联:shbinzer 拆车邦 需要动力系统总成的请联:shbinzer …

二叉树的介绍及二叉树的链式结构的实现(C语言版)

前言 二叉树是一种特殊的树,它最大的度为2,每个节点至多只有两个子树。它是一种基础的数据结构,后面很多重要的数据结构都是依靠它来进行实现的。了解并且掌握它是很重要的。 目录 1.二叉树的介绍 1.1概念 1.2现实中的二叉树 1.3特殊的二叉…

AP5192 DC-DC降压恒流LED汽车灯 LED长条灯 汽车雾灯驱动IC

AP5192是一款PWM工作模式,高效率、外围简单、 内置功率MOS管,适用于4.5-100V输入的高精度 降压LED恒流驱动芯片。最大电流1.5A。 AP5192可实现线性调光和PWM调光,线性调光 脚有效电压范围0.55-2.6V. AP5192 工作频率可以通过RT 外部电阻编程 来设定&…

hadoop大数据集群中更换磁盘,balance的速度缓慢问题(解决)

hadoop大数据集群中更换磁盘,balance的速度缓慢问题(解决) 看现象只有4个bloucks在执行的 调整参数: 增大配置参数,观察重新负载的速度 修改配置文件 hdfs-site.xml dfs.datanode.balance.max.concurrent.moves100 …

JavaScript中的事件委托(event delegation)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript事件委托⭐ 事件冒泡(Event Bubbling)⭐ 事件委托的优点⭐ 如何使用事件委托⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启…

什么是AJAX?如何使用原生JavaScript搭建AJAX请求?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ AJAX(Asynchronous JavaScript and XML)⭐ 原生JavaScript中的AJAX请求1. 创建XMLHttpRequest对象2. 配置请求3. 设置回调函数4. 发送请求 ⭐ 完整示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开…