關於where子句中的子查詢語法說明

2022-04-08 19:52:29 字數 638 閱讀 6736

首先說一句,大神就不用看了。

先看乙個sql語句

select distinct name from user u1 where (select count(*) from user u2 where u1.name=u2.name)>3

這句話是選出user表中name欄位相同的名字出現三次以上的name。

這句話的語義到底應該怎麼分析呢?

在sql語句中,where表示條件,如果這一行滿足where之後的條件,就是說,將這一行代入where之後的表示式,如果返回true,那麼就選擇這一行,如果返回false,就丟棄這一行。

那麼這句話的語義也就比較好理解了,就是,將user表中的行分別代入where後面的表示式,也就是後面的子查詢,如果後面的子查詢查詢結果大於3,那麼就保留這一行,如果不大於3,就丟棄這一行。而where子句中子查詢選出來的就是name在這張表中的出現次數。

但是這種查詢在mysql中效率是非常低的,explain他可以看到第二行是dependent subquery,也就是說,子查詢依賴於第一行的查詢結果,這個查詢是分兩步走的,

第一步:查詢出所有user中的行,

第二步:將每一行中的在子查詢中使用的字段代入子查詢,將子查詢的結果代入,以決定是否需要保留這一行

這樣效率絕對上不去了!

關於where子句中的子查詢語法說明

首先說一句,大神就不用看了。先看乙個sql語句 select distinct name from user u1 where select count from user u2 where u1.name u2.name 3 這句話是選出user表中name欄位相同的名字出現三次以上的name。這...

where子句中的and和or的影響

and 和 or 的執行條件 select from emp where deptno 10 or comm is not null or sal 2000 and deptno 20 在這個例項中where子句找到了如下的資料 or將前後的關係並列,有or的出現,使where子句進行分段。效果相當...

連線查詢中的ON 子句和 WHERE 子句

先看兩張表結構 produc表 問題是下面兩個查詢結果有什麼不同 1.select from product left join product details on product.id product details.id and product details.id 2 2.select fr...