You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于MySQL参考手册学习:解析Shop表关联查询语句

拆解MySQL自连接查询的开头逻辑

嘿,刚好我对这类MySQL查询很熟悉,结合你给出的shop表数据,我来给你拆解select s1.article s1aritle, s1.dealer s1dealer...这个语句的作用和逻辑:

首先先确认下我们的基础数据集——shop表的内容:

MariaDB [menagerio]> select * from shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001    | A      |  3.45 |
| 0001    | B      |  3.99 |
| 0002    | A      | 10.99 |
| 0003    | B      |  1.45 |
| 0003    | C      |  1.69 |
| 0003    | D      |  1.25 |
| 0004    | D      | 19.95 |
+---------+--------+-------+
7 rows in set (0.00 sec)

核心逻辑解析

这个查询语句的开头是自连接查询的典型写法,我给你拆成两点说:

  • 表别名s1的作用:
    这里的s1是shop表的别名,相当于把同一张表当成两个独立的数据集来使用。在需要对比同表内不同行数据时(比如同一商品不同经销商的价格),自连接是非常常用的技巧,后续你大概率会看到类似FROM shop s1 JOIN shop s2 ON ...的完整语句,s2就是对应另一个表别名。

  • 字段别名的作用:

    • s1.article s1aritle:选取s1表(也就是原始shop表)的article字段,同时给它起了个别名s1aritle(应该是拼写小失误,正确一般写s1article)。这么做是为了在最终结果里,能清晰区分来自不同别名表的同名字段(比如如果后续有s2.article,用别名s2article就不会混淆)。
    • s1.dealer s1dealer:同理,选取s1表的dealer字段并起别名,方便结果展示和后续的条件引用。

常见应用场景

结合shop表的结构,这种开头的查询几乎都是用来做同商品的多经销商数据对比,举个完整的例子:
比如要找出每个商品中,价格更低的经销商和对应的高价经销商,完整查询可能是这样:

SELECT s1.article AS s1article, s1.dealer AS s1dealer, s1.price AS s1price,
       s2.dealer AS s2dealer, s2.price AS s2price
FROM shop s1
JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price;

这个查询会输出同一件商品里,所有价格更低的经销商和比它贵的经销商的对应数据,用来分析差价或者筛选最低价/最高价的经销商。

内容的提问来源于stack exchange,提问作者Ami Nirob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:44:50