Mysql 带有内部联接和子查询的WHERE子句

Mysql 带有内部联接和子查询的WHERE子句,mysql,sql,Mysql,Sql,我已经实现了我想要的查询,但我想知道这个查询是如何工作的。我的数据库中有多个表,我的要求是从名为product的表中获取id,使用此id,我想从多个表中检索一些数据,product id是其他表的外键。下面的查询可以很好地工作,我只是在尝试,幸运地得到了这个查询 SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes FROM product INNER JOIN priceOnSizesForDigitalPr

我已经实现了我想要的查询,但我想知道这个查询是如何工作的。我的数据库中有多个表,我的要求是从名为product的表中获取id,使用此id,我想从多个表中检索一些数据,product id是其他表的外键。下面的查询可以很好地工作,我只是在尝试,幸运地得到了这个查询

SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp ON ponsfdp.pId_fk = 
(SELECT pId FROM product WHERE pName LIKE "%booklet%")
WHERE pName LIKE "%booklet%";
但当我尝试这个问题时

SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp ON ponsfdp.pId_fk = 
(SELECT pId FROM product WHERE pName LIKE "%booklet%");

它包含所有数据,即使有空字段也是如此。有人能给我解释一下它是怎么工作的吗?我个人的观点是,两个查询都应该返回相同的数据,因为在第二个查询中,我使用的是子查询,它只返回一个id,另一方面,第一个查询有一个WHERE子句,该子句通过名称生成相同的id。第一个查询如何返回非常特定的列,第二个查询如何返回所有列,甚至是空列?我需要对这两个查询进行解释。

第一个查询也会返回第二个查询返回的所有行。但是,当您添加最后一个过滤器时-

WHERE pName LIKE "%booklet%"
它只是将pName类似于“小册子”的所有行中的一行保留下来。您可以将第二个查询的输出视为单个表,逻辑如下:

SELECT * FROM (
    SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes 
    FROM product
    INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp 
    ON ponsfdp.pId_fk = (SELECT pId FROM product WHERE pName LIKE "%booklet%")
)A
WHERE pName LIKE "%booklet%"

希望这至少能让您对您的查询有所了解。

我认为这里不需要子查询。您应该使用where条件从from表中选择行,然后使用join的ON子句在联接表中为from表的每一行查找正确的记录:

SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes
FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp
    ON ponsfdp.pId_fk = pId
WHERE pName LIKE "%booklet%";

从产品中选择pId,其中pName(如%booklet%)每次查询都会给出相同的输出,即pId=1,同时匹配所有记录的内部联接条件。在第一个查询中,您已经在结果集中应用了额外的WHERE过滤器。因此,您只能得到一条记录。编写查询的更好方法是从产品内部联接价格中选择ponsfdp.*、product.pName、product.pImage、product.productSizes,以便在ponsfdp.pId_fk=product.pId上以ponsfdp形式进行数字打印,其中类似于%booklet%的pName;子查询是不必要的,并且混淆了第二个查询没有WHERE的问题clause@SureshGajera基本上where子句是第一部分结果集的条件?@haider这是正确的,但where条件只有在内部联接执行后才会应用。@Nick哪个查询更快?你的还是我的?我是新来的,这就是我为什么要问的原因,这是最好的解释,谢谢,只是一个简单的问题,什么是后括号?a是子查询返回数据集的别名。这将成为输出和外部查询的表名,然后将其视为表。您可以根据需要使用任何别名。我在这里举了一个例子: