資料庫any
① 資料庫當中:如果子查詢中返回的是單列多值,則必須在子查詢前使用關鍵字all或any
我來回答一下,這個問題不好說清楚....
學生表
-- 查詢1、查詢出 年齡 = 17 的所有學生
select t.* from學生表 t where t.年齡 = 17;
-- 查詢2、查詢出 年齡 = 17或者 = 18的所有學生
select t.* from 學生表 t where t.年齡in (17, 18);
-- 查詢3、查詢出 性別 = 男 的所有學生,這里因為子查詢「學生表 t2」只有一條記錄滿足條件(即單列單行),所以查詢不會報錯
select t.* from 學生表 t where t.年齡 = (
select t2.年齡
from 學生表 t2 where t2.性別 = '男'
);
-- 查詢4、查詢出 年齡 = 17 的所有學生,這里因為子查詢 「學生表 t2」 有兩條數據符合條件(即單列多行),而 「t.性別 =」 只能等於某一個給定的值,參考 「查詢1」 ,所以執行查詢會報錯;這里把 =替換為 =any 或者 in 就可以正常查詢,因為 =any 和 in 是告訴 「t.性別」 要找的數據必須在我范圍內;而 <> any 和 not in 則表示取反的意思,告訴 「t.性別」 要找的數據必須排除我給你的范圍。
select t.* from 學生表 t where t.性別 = (
select t2.性別
from 學生表 t2 where t2.年齡 = 17
);
-- ANY 和 ALL 的具體用法,這里不再贅述。。。。
-- 查詢5、多列多值,參考查詢4,子查詢 「學生表 t2」 滿足條件的有兩條,如下查詢:
select t.* from 學生表 t where t.年齡 || t.性別=any (
select t2.年齡 || t2.性別
from 學生表 t2 where t2.性別 = '男'
);
注1:其實 ANY 和 ALL 不涉及什麼多行多列,查詢5隻是一種另類的解決方案。
注2:「||」 雙數線表示 在 ORACLE 資料庫中用來做合並的關鍵字元。
總結:
首先,請不要在查詢1、2、3、4、5上過於糾結,說什麼我可以用更簡單的SQL實現你的查詢1、2、3、4、5,我這里僅僅是為了舉例說明。
select t.* from 學生表 t where t.年齡 = 17;
= 後面可以是一個 特定的值,可以是一個 子查詢等等,但是需要保證 = 後面的任何運算或查詢只返回一個值,不然SQL是無法執行的;
而 any 和 all 以及 in,表示的是一個數據范圍,即單列多行,而使用 雙豎線 是把 多列合並為一列來處理,最終還是模擬的單列多行。
② 資料庫比較操作符>any表示什麼意思、
>any可以理解為大於子查詢中返回的任意一個值,因此只要大於最小值即可。滿意請採納。