質問: SQLの副問い合わせのALLを勉強しているのですが、以下の文は何が違いがわかりません。 違いが分からず、検証してみたところ出力の違いを出すことはできました。 以下の文で条件の「<」「>」のうち「>」は出力が一緒なのですが、「<」だと出力が異なります。 ``` SELECT * FROM 家計簿 WHERE 入金額 > ALL (SELECT 入金額 FROM 家計簿アーカイブ); SELECT * FROM 家計簿 WHERE 入金額 > (SELECT MAX(入金額) FROM 家計簿アーカイブ); ``` ``` SELECT * FROM 家計簿 WHERE 入金額 < ALL (SELECT 入金額 FROM 家計簿アーカイブ); SELECT * FROM 家計簿 WHERE 入金額 < (SELECT MAX(入金額) FROM 家計簿アーカイブ); ``` 実際に使ったテーブルは以下のように設定しました。 ``` DROP TABLE 家計簿 IF EXISTS; CREATE TABLE 家計簿(日付 DATE, 費目 VARCHAR(20), メモ VARCHAR(100), 入金額 INTEGER, 出金額 INTEGER); INSERT INTO 家計簿 VALUES('2013-01-10','給料','12月の給料',300000,0); INSERT INTO 家計簿 VALUES('2013-02-10','給料','1月の給料',280000,0); INSERT INTO 家計簿 VALUES('2013-02-18','水道光熱費','1月の電気代',0,7560); INSERT INTO 家計簿 VALUES('2013-03-10','給料','2月の給料',290000,0); INSERT INTO 家計簿 VALUES('2013-04-10','給料','3月の給料',250000,0); DROP TABLE 家計簿アーカイブ IF EXISTS; CREATE TABLE 家計簿アーカイブ(日付 DATE, 費目 VARCHAR(20), メモ VARCHAR(100), 入金額 INTEGER, 出金額 INTEGER); INSERT INTO 家計簿アーカイブ VALUES('2012-12-10','給料','11月の給料',280000,0); INSERT INTO 家計簿アーカイブ VALUES('2012-12-25','居住費','1月の家賃支払い',0,80000); INSERT INTO 家計簿アーカイブ VALUES('2013-01-10','給料','12月の給料',280000,0); ```
回答: ALL句は全ての条件に一致する条件なので、下記のように言い換えることができます。 つまり項番3と項番5、および項番4と項番6のSQLがそれぞれ等価であり、質問文の項番3と項番4は意味が異なります。 1. `... hoge > ALL(SELECT fuga ...` * hogeがすべてのfugaより大きい 2. `... hoge > (SELECT MAX(fuga) ...` * hogeがすべてのfugaより大きい(← 集計したfugaの最大値より大きい) 3. `... hoge < ALL(SELECT fuga ...` * hogeがすべてのfugaより小さい 4. `... hoge < (SELECT MAX(fuga) ...` * hogeが**いずれかの**fugaより小さい(← 集計したfugaの最大値より小さい) 5. `... hoge < (SELECT MIN(fuga) ...` * hogeがすべてのfugaより小さい(← 集計したfugaの**最小値**より小さい) 6. `... hoge < ANY(SELECT fuga ...` * hogeが**いずれかの**fugaより小さい