【问题标题】:correlated subquery and GROUP BY相关子查询和 GROUP BY
【发布时间】:2021-02-11 17:15:27
【问题描述】:

我开始学习 Mysql,但在理解 相关子查询 时遇到问题,我搜索了定义说,它每行执行一次,但是当涉及到示例时:

DEPOT (N_Dpt, Name_Dpt, City)
STORE (N_Dpt #, N_Product #, Qt_Stored)
PRODUCT (N_Product, Label_Product, Price_U, Weight, Color)  


               

每种产品类型的最高单价列表

SELECT Product_Label, Price_U FROM Product AS P1  
WHERE Price = (SELECT MAX (Price_U) FROM PRODUCT P2  
WHERE P2. Product_Label = P1. Product Label )

第一个问题:为什么它是相关子查询?
第二个问题:为什么我们不能使用 GROUP BY?

SELECT Product_label, MAX(Price_U) FROM PRODUCT GROUP BY Product_label

【问题讨论】:

  • 1.它是相关的,因为 p2.product_label 等于 p1.product_label。 2. 可以使用 GROUP BY,但不能在相关子查询的上下文中使用。
  • 但是我怎么知道我必须使用相关子查询,并且说它是相关的,因为我不明白''p2.....''
  • 您不必使用相关子查询
  • 另外,请注意您的架构中没有“价格”列

标签: mysql subquery correlated-subquery


【解决方案1】:

考虑以下...

DROP TABLE IF EXISTS product;

CREATE TABLE product
(id SERIAL PRIMARY KEY
,product_label CHAR(1) NOT NULL
,price_u INT NOT NULL
);

INSERT INTO product VALUES
(1,'a',12),
(2,'a',18),
(3,'a',4),
(4,'b',9),
(5,'b',1),
(6,'c',13);


-- Correlated subquery:

SELECT product_label
     , price_u
  FROM product p1  
 WHERE price_u = (SELECT MAX(price_u) FROM product p2 WHERE p2.product_label = p1.product_label);
                                                      -----------------------------------------

 +---------------+---------+
 | product_label | price_u |
 +---------------+---------+
 | a             |      18 |
 | b             |       9 |
 | c             |      13 |
 +---------------+---------+
 
-- Uncorrelated subquery

SELECT x.product_label
     , x.price_u 
  FROM product x
  JOIN 
     ( SELECT product_label
            , MAX(price_u) price_u
         FROM product 
        GROUP
           BY product_label
     ) y
    ON y.product_label = x.product_label
   AND y.price_u = x.price_u;

 +---------------+---------+
 | product_label | price_u |
 +---------------+---------+
 | a             |      18 |
 | b             |       9 |
 | c             |      13 |
 +---------------+---------+
   
-- No subquery

SELECT x.product_label
     , x.price_u 
  FROM product x
  LEFT
  JOIN product y
    ON y.product_label = x.product_label
   AND y.price_u > x.price_u
 WHERE y.id IS NULL;

 +---------------+---------+
 | product_label | price_u |
 +---------------+---------+
 | a             |      18 |
 | b             |       9 |
 | c             |      13 |
 +---------------+---------+

以上内容并不详尽

【讨论】:

  • 我使用了你的代码,但是当我在上面使用 GROUP BY "SELECT product_label, MAX(Price_u) FROM product GROUP BY product_label" 的子查询时,它给出了相同的结果,那你为什么与内部连接一起使用?
  • 好点。以防我还想从同一行返回其他列(在这种情况下为 id,但可能还有其他列)
  • 你的意思是当我们想为每一行返回它的结果时我们使用相关子查询(它可以是双倍的),对不起,但我仍然困惑何时使用它
  • 我提供的三个例子都是有效的,可以互换使用(还有其他的)。选择其中一个的标准归结为性能。哪个最快?这与数据集的大小、到位的索引以及数据的基数(密度/“稀疏性”)有关。您的建议也是有效的,但是当我们想要返回其他列时失败,因为从这些列返回的值是“不确定的”;它们不一定与 product_label 和 price_u 值相对应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多