[英]Mysql subquery result in “where” clause
有可能像这样执行mysql查询吗?
select (select A from B where ... ) as C from D where C like ' ... '
我需要在一般的“where”子句中使用子查询的结果。
您可以将其包装在如下的子查询中:
SELECT *
FROM (
select (select A from B where ... ) as C from D
) subq
WHERE
C like ' ... '
你读过这个吗?
http://dev.mysql.com/doc/refman/5.0/en/subqueries.html
子查询是另一个语句中的SELECT语句。
从MySQL 4.1开始,支持SQL标准所需的所有子查询表单和操作,以及一些特定于MySQL的功能。
以下是子查询的示例:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
在此示例中,SELECT * FROM t1 ...是外部查询(或外部语句),而(SELECT column1 FROM t2)是子查询。 我们说子查询嵌套在外部查询中,实际上可以将子查询嵌套在其他子查询中,达到相当深的程度。 子查询必须始终出现在括号内。
子查询的主要优点是:
它们允许结构化的查询,以便可以隔离语句的每个部分。
它们提供了执行操作的替代方法,否则需要复杂的连接和联合。
许多人发现子查询比复杂的联接或联合更具可读性。 实际上,正是子查询的创新给人们提供了调用早期SQL“结构化查询语言”的最初想法。
下面是一个示例语句,显示了SQL标准指定并在MySQL中支持的子查询语法的主要观点:
虽然这实际上是有效的SQL:
select (select A from B where A = D.A ) as C
from D
相反,实现JOIN会更好(性能更好):
SELECT D.A
FROM D
INNER JOIN B ON B.A = D.A
不是没有说明; 但你可以在两个地方运行查询。 或者使用这些结果创建临时表并将它们连接起来以使其可用于查询。
Select C from D inner join (Select A from B where...) C on C.1=D.1 where C like....
连接表而不是子查询总是更好。 即子查询:
SELECT id, (SELECT abc FROM t2 WHERE ID = user_id) as user_name FROM t1
加入:
SELECT c.id,u.abc FROM t1 as c LEFT JOIN t2 AS u ON u.ID = c.user_id WHERE 1=1 AND u.`user_login` = 'qwe123'
如果我们尝试将where子句放在子查询中,则会抛出错误。
如果您的意思是比较子查询的结果,可以执行此操作。
select X ... where (select Y ... ) = Z
但是,可能是一个坏主意。 通常,当您必须这样做时,最好寻找一种方法将其简化为主选择。 有一些非常有创意的方法可以避免嵌套查询。 原因是每次选择都必须每次都进行内部查询
如果您的意思是针对子查询执行某个位置,则只需选择all并应用于where。 但是,再次,你可以在其他地方申请。
select X ... where Y = Z and A = B.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.