板凳-------Mysql cookbook学习 (十一--------6)

https://blog.csdn.net/weixin_43236925/article/details/146382981
清晰易懂的 PHP 安装与配置教程

12.6 查找每组行中含有最大或最小值的行

mysql> set @max_price = (select max(price) from painting);
Query OK, 0 rows affected (0.01 sec)mysql> select artist.name, painting.title, painting.price-> from artist inner join painting-> on painting.a_id = artist.a_id-> where painting.price = @max_price;
+----------+-----------+-------+
| name     | title     | price |
+----------+-----------+-------+
| Da Vinci | Mona Lisa |    87 |
+----------+-----------+-------+
1 row in set (0.00 sec)mysql> create table tmpp select max(price) as max_price from painting;
Query OK, 1 row affected (0.07 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> select artist.name, painting.title, painting.price-> from artist inner join painting inner join tmpp-> on painting.a_id = artist.a_id-> and painting.price = tmpp.max_price;
+----------+-----------+-------+
| name     | title     | price |
+----------+-----------+-------+
| Da Vinci | Mona Lisa |    87 |
+----------+-----------+-------+
1 row in set (0.00 sec)mysql> create table tmpp1-> select a_id, max(price) as max_price from painting group by a_id;
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select artist.name, painting.title, painting.price-> from artist inner join painting inner join tmpp1-> on painting.a_id = artist.a_id-> and painting.a_id = tmpp1.a_id-> and painting.price = tmpp1.max_price;
+----------+-------------------+-------+
| name     | title             | price |
+----------+-------------------+-------+
| Da Vinci | Mona Lisa         |    87 |
| Van Gogh | The Potato Eaters |    67 |
| Renoir   | Les Deux Soeurs   |    64 |
+----------+-------------------+-------+
3 rows in set (0.00 sec)mysql> select artist.name, painting.title, painting.price-> from artist inner join painting inner join-> (select a_id, max(price) as max_price from painting group by a_id)-> as tmpp1-> on painting.a_id = artist.a_id-> and painting.a_id = tmpp1.a_id-> and painting.price = tmpp1.max_price;
+----------+-------------------+-------+
| name     | title             | price |
+----------+-------------------+-------+
| Da Vinci | Mona Lisa         |    87 |
| Van Gogh | The Potato Eaters |    67 |
| Renoir   | Les Deux Soeurs   |    64 |
+----------+-------------------+-------+
3 rows in set (0.00 sec)mysql> select p1.a_id, p1.title, p1.price-> from painting as p1 left join painting as p2-> on p1.a_id = p2.a_id and p1.price < p2.price-> where p2.a_id is null;
+------+-------------------+-------+
| a_id | title             | price |
+------+-------------------+-------+
|    1 | Mona Lisa         |    87 |
|    3 | The Potato Eaters |    67 |
|    4 | Les Deux Soeurs   |    64 |
+------+-------------------+-------+
3 rows in set (0.00 sec)mysql> select artist.name, p1.title, p1.price-> from painting as p1 left join painting as p2-> on p1.a_id = p2.a_id and p1.price < p2.price-> inner join artist on p1.a_id = artist.a_id-> where p2.a_id is null;
+----------+-------------------+-------+
| name     | title             | price |
+----------+-------------------+-------+
| Da Vinci | Mona Lisa         |    87 |
| Van Gogh | The Potato Eaters |    67 |
| Renoir   | Les Deux Soeurs   |    64 |
+----------+-------------------+-------+
3 rows in set (0.00 sec)mysql> DROP TABLE IF EXISTS driver_log;
Query OK, 0 rows affected (0.05 sec)mysql> #@ _CREATE_TABLE_
mysql> CREATE TABLE driver_log-> (->   rec_id    INT UNSIGNED NOT NULL AUTO_INCREMENT,->   name      VARCHAR(20) NOT NULL,->   trav_date DATE NOT NULL,->   miles     INT NOT NULL,->   PRIMARY KEY (rec_id)-> );
Query OK, 0 rows affected (0.05 sec)mysql> #@ _CREATE_TABLE_
mysql>
mysql> INSERT INTO driver_log (name,trav_date,miles)->   VALUES->     ('Ben','2006-08-30',152),->     ('Suzi','2006-08-29',391),->     ('Henry','2006-08-29',300),->     ('Henry','2006-08-27',96),->     ('Ben','2006-08-29',131),->     ('Henry','2006-08-26',115),->     ('Suzi','2006-09-02',502),->     ('Henry','2006-09-01',197),->     ('Ben','2006-09-02',79),->     ('Henry','2006-08-30',203)-> ;
Query OK, 10 rows affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0mysql>
mysql> SELECT * FROM driver_log;
+--------+-------+------------+-------+
| rec_id | name  | trav_date  | miles |
+--------+-------+------------+-------+
|      1 | Ben   | 2006-08-30 |   152 |
|      2 | Suzi  | 2006-08-29 |   391 |
|      3 | Henry | 2006-08-29 |   300 |
|      4 | Henry | 2006-08-27 |    96 |
|      5 | Ben   | 2006-08-29 |   131 |
|      6 | Henry | 2006-08-26 |   115 |
|      7 | Suzi  | 2006-09-02 |   502 |
|      8 | Henry | 2006-09-01 |   197 |
|      9 | Ben   | 2006-09-02 |    79 |
|     10 | Henry | 2006-08-30 |   203 |
+--------+-------+------------+-------+
10 rows in set (0.00 sec)mysql> select name, trav_date, miles-> from driver_log-> order by name, trav_date;
+-------+------------+-------+
| name  | trav_date  | miles |
+-------+------------+-------+
| Ben   | 2006-08-29 |   131 |
| Ben   | 2006-08-30 |   152 |
| Ben   | 2006-09-02 |    79 |
| Henry | 2006-08-26 |   115 |
| Henry | 2006-08-27 |    96 |
| Henry | 2006-08-29 |   300 |
| Henry | 2006-08-30 |   203 |
| Henry | 2006-09-01 |   197 |
| Suzi  | 2006-08-29 |   391 |
| Suzi  | 2006-09-02 |   502 |
+-------+------------+-------+
10 rows in set (0.00 sec)mysql> create table tmpp2-> select name, max(trav_date) as trav_date-> from driver_log group by name;
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 01. 第一条语句:用外部表tmpp2进行内连接
sql
SELECT driver_log.name, driver_log.trav_date, driver_log.miles
FROM driver_log 
INNER JOIN tmpp2  -- tmpp2是一个已存在的外部表ON driver_log.name = tmpp2.name AND driver_log.trav_date = tmpp2.trav_date
ORDER BY driver_log.name;•	tmpp2的性质:这里的tmpp2是一个预先存在的外部表(可能是手动创建的临时表或永久表),里面存储了一些name和trav_date的数据。
•	连接逻辑:只返回driver_log中与tmpp2表中完全匹配(name和trav_date都相同)的记录。
•	适用场景:当你需要筛选driver_log中符合某个预设条件(即tmpp2表中定义的特定name和trav_date组合)的记录时使用。例如:tmpp2可能存储了 “需要重点检查的司机和日期”。
2. 第二条语句:用子查询动态生成tmpp2
sql
SELECT driver_log.name, driver_log.trav_date, driver_log.miles
FROM driver_log 
INNER JOIN (-- 子查询:动态生成每个司机最新的出行日期SELECT name, max(trav_date) as trav_date FROM driver_log GROUP BY name
) AS tmpp2ON driver_log.name = tmpp2.name AND driver_log.trav_date = tmpp2.trav_date
ORDER BY driver_log.name;•	tmpp2的性质:这里的tmpp2是动态生成的子查询结果,逻辑是 “对driver_log按司机分组,获取每个司机最新的出行日期(max(trav_date))”。
•	连接逻辑:只返回driver_log中每个司机的最新出行记录(因为tmpp2存储的是每个司机的最大日期)。
•	适用场景:需要从driver_log中筛选每个司机的 “最新一条记录” 时使用(例如:查询每个司机最近一次出行的里程)。
核心区别总结
维度	第一条语句(外部表tmpp2)	第二条语句(子查询生成tmpp2)
tmpp2的来源	外部预设表(内容固定,非动态生成)	子查询动态生成(内容由driver_log数据决定)
连接的目的	筛选符合预设条件(tmpp2中的name+date)的记录	筛选每个司机的最新出行记录(max(trav_date))
结果的决定因素	依赖tmpp2表的预设内容	依赖driver_log自身的最大日期数据
灵活性	低(tmpp2内容变更需手动修改)	高(自动适应driver_log数据变化)

12.7 计算队伍排名

mysql> select team , wins, losses from standings1-> order by wins-losses desc;
+-------------+------+--------+
| team        | wins | losses |
+-------------+------+--------+
| Winnipeg    |   37 |     20 |
| Crookston   |   31 |     25 |
| Fargo       |   30 |     26 |
| Grand Forks |   28 |     26 |
| Devils Lake |   19 |     31 |
| Cavalier    |   15 |     32 |
+-------------+------+--------+
6 rows in set (0.01 sec)mysql> set @w1_diff = (select max(wins-losses) from standings1);
Query OK, 0 rows affected (0.00 sec)mysql> select team, wins as w, losses as L,-> wins/(wins+losses) as pct,-> (@w1_diff - (wins-losses)) / 2 as gb-> from standings1-> order by wins-losses desc, pct desc;
+-------------+------+------+--------+---------+
| team        | w    | L    | pct    | gb      |
+-------------+------+------+--------+---------+
| Winnipeg    |   37 |   20 | 0.6491 |  0.0000 |
| Crookston   |   31 |   25 | 0.5536 |  5.5000 |
| Fargo       |   30 |   26 | 0.5357 |  6.5000 |
| Grand Forks |   28 |   26 | 0.5185 |  7.5000 |
| Devils Lake |   19 |   31 | 0.3800 | 14.5000 |
| Cavalier    |   15 |   32 | 0.3191 | 17.0000 |
+-------------+------+------+--------+---------+
6 rows in set (0.00 sec)mysql> CREATE TABLE firstplace (->     half VARCHAR(20) NOT NULL,->     division VARCHAR(50) NOT NULL,->     w1_diff INT NOT NULL,->     PRIMARY KEY (half, division)-> );
Query OK, 0 rows affected (0.03 sec)mysql> SELECT->     w1.half,->     w1.division,->     w1.team,->     w1.wins AS w,->     w1.losses AS L,->     TRUNCATE(w1.wins / (w1.wins + w1.losses), 3) AS pct,->     IF(->         fp.w1_diff = w1.wins - w1.losses,->         '-',->         TRUNCATE((fp.w1_diff - (w1.wins - w1.losses)) / 2, 1)->     ) AS gb-> FROM standings2 AS w1-> INNER JOIN firstplace AS fp->     ON w1.half = fp.half AND w1.division = fp.division-> ORDER BY->     w1.half,->     w1.division,->     w1.wins - w1.losses DESC,->     pct DESC;
Empty set (0.01 sec)mysql> SELECT->     w1.half,->     w1.division,->     w1.team,->     w1.wins AS w,->     w1.losses AS l,->     TRUNCATE(w1.wins / (w1.wins + w1.losses), 3) AS pct,->     -- 计算与榜首的差距(gb)->     IF(->         w1.wins - w1.losses = fp.max_diff,  -- 若当前球队是榜首->         '-',  -- 榜首的gb为'-'->         TRUNCATE((fp.max_diff - (w1.wins - w1.losses)) / 2, 1)  -- 其他球队的gb->     ) AS gb-> FROM standings2 AS w1-> -- 子查询获取每个分区、半程的最大胜负差(即榜首球队的胜负差)-> INNER JOIN (->     SELECT->         half,->         division,->         MAX(wins - losses) AS max_diff  -- 最大胜负差 = 榜首球队的胜负差->     FROM standings2->     GROUP BY half, division-> ) AS fp-> ON w1.half = fp.half AND w1.division = fp.division-> -- 排序:按半程、分区,再按胜负差(降序)、胜率(降序)-> ORDER BY->     w1.half,->     w1.division,->     (w1.wins - w1.losses) DESC,->     pct DESC;
+------+----------+-----------------+------+------+-------+------+
| half | division | team            | w    | l    | pct   | gb   |
+------+----------+-----------------+------+------+-------+------+
|    1 | Eastern  | St. Paul        |   24 |   18 | 0.571 | -    |
|    1 | Eastern  | Thunder Bay     |   18 |   24 | 0.428 | 6.0  |
|    1 | Eastern  | Duluth-Superior |   17 |   24 | 0.414 | 6.5  |
|    1 | Eastern  | Madison         |   15 |   27 | 0.357 | 9.0  |
|    1 | Western  | Winnipeg        |   29 |   12 | 0.707 | -    |
|    1 | Western  | Sioux City      |   28 |   14 | 0.666 | 1.5  |
|    1 | Western  | Fargo-Moorhead  |   21 |   21 | 0.500 | 8.5  |
|    1 | Western  | Sioux Falls     |   15 |   27 | 0.357 | 14.5 |
|    2 | Eastern  | Duluth-Superior |   22 |   20 | 0.523 | -    |
|    2 | Eastern  | St. Paul        |   21 |   21 | 0.500 | 1.0  |
|    2 | Eastern  | Madison         |   19 |   23 | 0.452 | 3.0  |
|    2 | Eastern  | Thunder Bay     |   18 |   24 | 0.428 | 4.0  |
|    2 | Western  | Fargo-Moorhead  |   26 |   16 | 0.619 | -    |
|    2 | Western  | Winnipeg        |   24 |   18 | 0.571 | 2.0  |
|    2 | Western  | Sioux City      |   22 |   20 | 0.523 | 4.0  |
|    2 | Western  | Sioux Falls     |   16 |   26 | 0.380 | 10.0 |
+------+----------+-----------------+------+------+-------+------+
16 rows in set (0.01 sec)
关键修改说明
用子查询替代firstplace表:
通过 SELECT half, division, MAX(wins - losses) AS max_diff FROM standings2 GROUP BY half, division 动态计算每个分区、半程的榜首球队胜负差(无需手动创建firstplace表),避免了 “表不存在” 的错误。
gb字段计算逻辑:
若球队的胜负差(wins - losses)等于榜首的最大胜负差(max_diff),则gb为'-'(表示该队是榜首)。
否则,gb为(榜首胜负差 - 该队胜负差)/ 2(这是体育排名中计算 “场次差距” 的标准公式)。

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

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

相关文章

ECS由浅入深第四节:ECS 与 Unity 传统开发模式的结合?混合架构的艺术

ECS由浅入深第一节 ECS由浅入深第二节 ECS由浅入深第三节 ECS由浅入深第四节 ECS由浅入深第五节 尽管 ECS 带来了显著的性能和架构优势&#xff0c;但在实际的 Unity 项目中&#xff0c;完全摒弃 GameObject 和 MonoBehaviour 往往是不现实的。Unity 引擎本身的大部分功能&…

Mac关闭触控板

打开 “有鼠标或无线触控板时忽略内建触控板”选项即可 参考&#xff1a;Mac如何关闭触控板防止误触&#xff1f;内置的设置就可以达成 - Mac天空

Python:Rich 终端富文本与界面样式工具库

🖌️ 1、简述 Rich 是一个强大的 Python 库,用于在终端中呈现富文本和精美的格式,让命令行界面(CLI)应用拥有现代、美观的输出效果。本文将深入介绍 Rich 的核心功能,并通过一系列实际示例展示其强大能力。 Rich 由 Will McGugan 开发,主要特点包括: 丰富的文本样式:支…

深入解析享元模式:通过共享技术高效支持大量细粒度对象

深入解析享元模式&#xff1a;通过共享技术高效支持大量细粒度对象 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世…

Docker高级管理

一、Docker 容器的网络模式 当项目大规模使用 Docker 时&#xff0c;容器通信的问题也就产生了。要解决容器通信问题&#xff0c;必须先了解很多关于网络的知识。Docker 的网络模式非常丰富&#xff0c;可以满足不同容器的通信要求&#xff0c;下表列出了这些网络模式的主要信息…

ABP VNext + Tye:本地微服务编排与调试

ABP VNext Tye&#xff1a;本地微服务编排与调试 &#x1f680; &#x1f4da; 目录ABP VNext Tye&#xff1a;本地微服务编排与调试 &#x1f680;TL;DR ✨一、环境与依赖 &#x1f6e0;️二、核心配置详解 &#x1f680;1. 主配置 tye.yaml三、多环境文件 &#x1f331;&am…

Vue响应式原理一:认识响应式逻辑

核心思想&#xff1a;当数据发生变化时&#xff0c;依赖该数据的代码能够自动重新执行Vue中的应用&#xff1a;在data或ref/reactive中定义的数据&#xff0c;当数据变化时template会自动更新template的本质&#xff1a; 是render()函数, 用变化之后的数据重新执行render()函数…

Redis:分组与设备在 Redis 中缓存存储设计

一、缓存存储结构设计 分组与设备的映射关系&#xff08;使用 Set 结构&#xff09;&#xff1a; 键格式&#xff1a;采用 group:{groupId}:devices 的格式作为 Redis 中 Set 的键&#xff0c;例如 group:1:devices 就代表了分组 ID 为 1 的分组所关联的设备集合。值内容&#…

Leetcode 3605. Minimum Stability Factor of Array

Leetcode 3605. Minimum Stability Factor of Array 1. 解题思路2. 代码实现 题目链接&#xff1a;3605. Minimum Stability Factor of Array 1. 解题思路 这一题的核心思路是二分法&#xff0c;本质上就是我们给定一个常数kkk&#xff0c;然后考察是否存在一个构造使得能够…

编译安装的Mysql5.7报“Couldn‘t find MySQL server (mysqld_safe)“的原因 笔记250709

编译安装的Mysql5.7报"Couldn’t find MySQL server (mysqld_safe)"的原因 笔记250709 MySQL 的安装路径与配置文件&#xff08;如 my.cnf 或 mysql.server&#xff09;中指定的 basedir 不一致。 mysqld_safe 文件实际位置与系统查找路径不匹配&#xff08;常见于自…

在 Ubuntu 下配置 oh-my-posh —— 普通用户 + root 各自使用独立主题(共享可执行)

&#x1f9e9; 在 Ubuntu 下配置 oh-my-posh —— 普通用户 root 各自使用独立主题&#xff08;共享可执行&#xff09;✅ 目标说明普通用户 使用 tokyonight_storm 主题 root 用户 使用 1_shell 主题 共用全局路径下的 oh-my-posh 可执行文件 正确加载 Homebrew 到环境变量中…

Spring Boot 项目中的多数据源配置

关键词&#xff1a;Spring Boot、多数据源配置、MySQL、SQL Server、Oracle、动态切换 ✅ 摘要 在实际企业级开发中&#xff0c;一个 Spring Boot 项目可能需要连接多个数据库&#xff0c;比如 MySQL、SQL Server 和 Oracle。不同的业务模块可能依赖不同的数据源&#xff0c;这…

MATLAB/Simulink电机控制仿真代做 同步异步永磁直驱磁阻双馈无刷

以下是针对 MATLAB/Simulink 电机控制仿真 的系统性解决方案&#xff0c;涵盖 同步电机、异步电机、永磁电机、直驱电机、磁阻电机、双馈电机、无刷直流电机&#xff08;BLDC&#xff09; 的建模与控制策略实现&#xff0c;支持代做服务的技术细节和代码示例。一、电机建模与仿…

限流算法深度探索:从理论到实践的生产级避坑指南

凌晨3点&#xff0c;监控警报刺耳地尖叫着。我盯着屏幕上垂直下跌的服务可用性曲线&#xff0c;意识到那个被忽视的限流配置项终于引爆了——每秒1000次的支付请求正像洪水般冲垮我们的系统。这次事故让我深刻理解&#xff1a;限流不是可选项&#xff0c;而是分布式系统的生存法…

企业级后台管理系统的困境与飞算 JavaAI 的破局之道

企业级后台管理系统如 CRM&#xff08;客户关系管理系统&#xff09;、ERP&#xff08;企业资源计划系统&#xff09;已成为支撑企业高效运转的核心骨架。它们如同企业的 “神经中枢”&#xff0c;串联起客户数据、财务信息、供应链流程等关键环节&#xff0c;为决策制定、业务…

快速上手百宝箱搭建知识闯关游戏助手

引言&#xff1a;让学习更有趣&#xff0c;AI 赋能知识闯关新体验 1.在信息爆炸的时代&#xff0c;传统的填鸭式教学方式已难以满足现代用户对高效、个性化和趣味化学习的需求。越来越多的学习者倾向于通过互动性强、参与感十足的方式获取知识。在此背景下&#xff0c;游戏化学…

【YOLOv11-目标检测】目标检测数据格式(官方说明)

原文链接&#xff1a; https://docs.ultralytics.com/datasets/detect/ 写在前面 训练一个鲁棒且准确的目标检测模型需要一个全面的数据集。本文介绍&#xff1a;与Ultralytics YOLO模型兼容的各种数据集格式&#xff0c;并深入解析了它们的结构、使用方法以及如何在不同的格…

yolo8实现目标检测

✅步骤一&#xff1a;安装 PyTorch&#xff08;M1 专用&#xff09;# 推荐使用官方 MPS 后端&#xff08;Apple Metal 加速&#xff09; pip install torch torchvision torchaudio确认是否使用了 Apple MPS&#xff1a;import torch print(torch.backends.mps.is_available()…

安全管理协议(SMP):配对流程、密钥生成与防中间人攻击——蓝牙面试核心考点精解

一、SMP 核心知识点高频考点解析1.1 SMP 在蓝牙安全体系中的定位考点&#xff1a;SMP 的功能与协议栈位置解析&#xff1a; SMP&#xff08;Security Manager Protocol&#xff0c;安全管理协议&#xff09;是蓝牙核心规范中负责设备配对、密钥生成与安全连接的关键协议&#x…

U盘实现——U 盘类特殊命令

文章目录 U 盘类特殊命令U 盘的命令封包命令阶段数据阶段状态阶段get max luninquiry(0x12)read format capacities(0x23)read capacity(0x25)mode sense(0x1a)test unit ready(0x00)read(10) 0x28write(10) 0x2aU 盘类特殊命令 U 盘的命令封包 命令阶段 命令阶段主要由主机通…