基于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
相关产品推荐
相关产品推荐

