2011-12-21 204 views
21

是否可以像這樣執行mysql查詢?Mysql子查詢導致「where」子句

select (select A from B where ...) as C from D where C like ' ... ' 

我需要在一般的「where」子句中使用子查詢的結果。

回答

27

你可以用它在一個子查詢是這樣的:如圖所示

SELECT * 
FROM (
     select (select A from B where ...) as C from D 
    ) subq 
WHERE 
    C like ' ... ' 
+1

+1你在我之前完成了... – 2011-12-21 13:22:07

+0

我認爲這應該起作用,但我認爲我不能用它來達到我的目的。我需要創建一些像「選擇field1,field2,sql3作爲field3,field4,sql5作爲field5從表field2 ='...',field5 ='...' – Eddie 2011-12-21 13:30:12

+0

@Eddie,是的,你可以使用它。將where子句中使用子查詢派生字段的部分移動到外部where子句中。 – 2011-12-21 13:32:23

7

你看過這個嗎?

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列1 FROM t2)是子查詢。我們說子查詢 嵌套在外部查詢中,實際上可以將 子查詢嵌套在其他子查詢中,達到相當深的程度。一個 子查詢必須始終出現在括號內。

子查詢的主要優點是:

他們允許那些結構化查詢,以便可以 隔離聲明的每個部分。

它們提供了替代方法來執行操作,否則將會需要複雜的聯接和聯合。

許多人發現子查詢比複雜連接或 工會更具可讀性。事實上,這是子查詢,給了人們 調用早期SQL的本意創新「結構化查詢 語言。」

下面是一個例子聲明顯示了有關 子查詢語法要點由SQL指定標準和 支持MySQL的:

1

無不是;但是你可以在兩個地方運行查詢。或者創建擁有這些結果的臨時表,並使其可用於查詢投身其中..

Select C from D inner join (Select A from B where...) C on C.1=D.1 where C like....

+0

我想過在兩個地方都運行查詢,是的...最簡單的方法) – Eddie 2011-12-21 13:38:47

0

如果你的意思是比較在其中子查詢的結果,是的,你可以做到這一點。

select X ... where (select Y ...) = Z

然而,可能是一個壞主意。通常,當你必須這樣做時,最好找一種方法將它簡化爲主要選擇。有非常有創意的方法來避免嵌套查詢。原因在於每次選擇都必須每次都執行內部查詢

如果您的意思是針對子查詢執行where操作,則只需選擇all並應用where。然而,再次,你可以申請另一個地方。

select X ... where Y = Z and A = B.

+0

我知道,這不是一個好主意,但它是我的目的的最佳解決方案。謝謝你的回答。 – Eddie 2011-12-21 13:27:03

+0

@Eddie我知道這看起來可能是最好的解決方案。我可以看到你必須嵌套的查詢的一個例子,所以我可以看看它是否可以重寫?嵌套是O(n),並且不可能是令人討厭的。如果嵌套查詢每次都會產生相同的結果,那麼絕對不需要使用嵌套查詢。 – 2011-12-21 13:30:06

+0

我需要創建一些東西,如「選擇field1,field2,sql3作爲field3,field4,sql5作爲field5從表field2 ='...',field5 ='...' – Eddie 2011-12-21 13:31:31

2

雖然這實際上是有效的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 
+0

我想過JOIN,但這樣會給我帶來困難。 – Eddie 2011-12-21 13:33:50

0

這始終是更好連接表而不是子查詢。 即 子查詢:

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' 

如果我們試圖把其中子查詢子句,它拋出的錯誤。