MySQL查询所有供应商和其任意一个产品 - Group by的使用

本文介绍了一种使用SQL查询从供应商表中提取所有供应商及其对应的一种商品记录的方法。通过使用LEFT JOIN结合GROUP BY语句,可以有效地实现一对一的数据提取,确保每个供应商只关联一条商品记录。

 一个网友的需求,原文如下:

有供应商表a,商品表b 以下简称a,b

a与b是一对多的关系(一条供应商对应多条商品)

现在想一对一的提取
即所有的供应商都提取出来,但是每条供应商只提取一条商品记录对应起来就行了.


我提供的测试代码如下:


在MySQL里,非Group 和聚合的字段是可以出现select里面的,系统会自动选择一个数据。

在别的数据库里是不允许这么使用的

Oracle MySQL 中的 `GROUP BY` 子句在基本功能上是相似的,都是用于对查询结果按一列或多列进行分组,然后对每组进行聚合操作(如 `SUM`, `COUNT`, `AVG` 等)。但它们在实现细节严格程度上有一些 **重要区别**。 --- ### 一、语法层面的区别 #### 1. **Oracle 对 GROUP BY 的要求更严格** 在 Oracle 中,**SELECT 列表中所有非聚合字段都必须出现在 GROUP BY 子句中**,否则会报错。 ```sql -- Oracle 中以下语句会报错 SELECT id, name, SUM(score) FROM students GROUP BY id; ``` > 报错原因:`name` 未出现在 `GROUP BY` 中。 正确写法: ```sql SELECT id, name, SUM(score) FROM students GROUP BY id, name; ``` #### 2. **MySQLGROUP BY 更宽松** MySQL(尤其是版本 5.7 及更早)允许 `SELECT` 中包含未在 `GROUP BY` 中出现的列,即使这些列没有使用聚合函数。MySQL 会从每组中任意选择一个值返回(行为不可控)。 ```sql -- MySQL 中可能正常执行 SELECT id, name, SUM(score) FROM students GROUP BY id; ``` > 注意:这种行为在 MySQL 8.0 中可以通过 SQL 模式(`ONLY_FULL_GROUP_BY`)控制。 --- ### 二、默认 SQL 模式的影响 MySQL 的行为可以通过 SQL 模式 `ONLY_FULL_GROUP_BY` 控制是否允许 `SELECT` 中包含非聚合且未在 `GROUP BY` 中的字段: - **开启** `ONLY_FULL_GROUP_BY`:行为更像 Oracle,必须将所有非聚合字段放入 `GROUP BY`。 - **关闭**:允许非聚合字段存在,行为不确定。 --- ### 三、性能与优化差异 - Oracle 的优化器通常对 `GROUP BY` 的处理更严格、更规范,适合企业级复杂查询- MySQL 的 `GROUP BY` 在某些场景下性能更好,尤其在小数据量场景下,但宽松的语法可能导致逻辑错误不易发现。 --- ### 四、总结对比表 | 特性 | Oracle | MySQL | |------|--------|-------| | 是否允许 SELECT 中非 GROUP BY 字段 | ❌ 不允许 | ✅ 允许(取决于 SQL 模式) | | 默认 GROUP BY 严格性 | 严格 | 松散(可配置) | | 推荐做法 | 所有非聚合字段必须出现在 GROUP BY 中 | 建议开启 `ONLY_FULL_GROUP_BY` 模式以增强规范性 | | 语法灵活性 | 较低 | 较高 | ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值