繁体   English   中英

Mysql子查询导致“where”子句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM