質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.46%

  • SQL

    3099questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

SQLのANYについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 644

javacurry

score 38

SQLを勉強し始めたのですがANYの使い方がわからず止まっています。INSELECT * FROME 家計簿 WHERE 費目 IN ('食費', '交際費')と書くと費目の項目から食費交際費に該当する行が出力されるというのは理解できるのですがANYSELECT * FROME 家計簿 WHERE 出金額 < ANY (1000, 2000, 3000)と書くとERROR: syntax error at or near "," ポジション: 39とエラー表示されます。これは比較元の出金額が明示されていないからだと考えSELECT * FROME 家計簿 WHERE 出金額 2500 < ANY (1000, 2000, 3000)と書くとERROR: syntax error at or near "2500" ポジション: 29というエラーが表示されてしまいます。

出金額の比較元が2500で比較対象のリストが(1000, 2000, 3000)の場合のANYの書き方を教えていただけないでしょうか?

                          家計簿テーブル
   日付          費目           メモ           入金額     出金額 
2013-02-03    食費          コーヒーを購入         0        380
2013-02-10    給料          1月の給料         280000          0
2013-02-11    教養娯楽費    書籍を購入             0       2800
2013-02-14    交際費        同期会の会費           0       5000
2013-02-18    水道光熱費    1月の電気代            0       7560

 追記

DBのエンジン名はH2 Database Engineです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • javacurry

    2018/03/27 17:48

    「スッキリわかるSQL入門」という書籍で紹介されていた次のサイトを利用しています。これがどのエンジンに該当するかがわかりません。http://dokoql.com/d/app.html

    キャンセル

  • m6u

    2018/03/27 17:56

    《dokoQLは、内部でH2 Database Engineを利用しています》ってありますね。

    キャンセル

  • javacurry

    2018/03/27 17:59

    よくわかっておらず見落としていました。追記します

    キャンセル

回答 2

checkベストアンサー

+1

私自身ANYを使ったことはないのですが、調べてみるとANYに指定できるのはサブクエリのみとのことです。
何のDBを使っているのかはわかりませんが、MySQLのマニュアルをリンクしておきます。
https://dev.mysql.com/doc/refman/5.6/ja/any-in-some-subqueries.html
なのでINのように値を列挙するような書き方はできません。
上記リンク内にもありますが、INにサブクエリーを指定した場合と挙動は同じになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/27 18:03

    http://www.h2database.com/html/grammar.html#condition_right_hand_side
    にANYとかSOMEの説明がありますね。

    キャンセル

  • 2018/03/27 18:07

    DBのエンジン名を質問に追記しました。利用してるのはH2 Database Engineです。

    サブクエリというのがまだわからないのですがINのように列挙できないんですね。書籍には質問に書いたような書き方で表現してあったのでリスト内の値と比較する命令だと思っていました。書籍には以下のように書いてあります。

    値リストのそれぞれと比較して、いずれかが真なら真
    式 基本比較演算子 ANY (値1, 値2, 値3・・・・)

    キャンセル

  • 2018/03/27 18:13

    示したURLをみても、ALL/ANY/SOMEのあとには、SELECT文が来るだけで、値の列挙はありえません。
    本の誤植を疑ってください。

    キャンセル

  • 2018/03/27 23:45

    ANYとALLの解説ページだけは全く理解できないので先に進んでみようと思います。ありがとうございました。

    キャンセル

  • 2018/03/27 23:48

    ttyp03さんとyambejpのどちらがベストアンサーなのか、今の私には判断できないので高評価が投票されているttyp03さんを選びたいと思います。

    お二人ともアドバイスありがとうございました。

    キャンセル

  • 2018/03/28 09:58

    出版元のページ(https://book.impress.co.jp/books/1111101167)や、Amazonのレビューなどを見るに、まだまだ誤り箇所がありそうですね。(例えば:https://www.amazon.co.jp/gp/customer-reviews/R1464T2D61115U/ref=cm_cr_getr_d_rvw_ttl?ie=UTF8&amp;ASIN=4844333933 の主張によると第7刷でも間違いがまだあるというようだし。)

    キャンセル

  • 2019/02/27 09:26

    現在は https://dokoql.com/help によれば、「dokoQLは、内部でPostgreSQLを利用しています」ってなっていますね。

    https://www.postgresql.jp/document/9.2/html/functions-comparisons.html
    PostgreSQLでは、`expression operator ALL (array expression)`のように書けるということなので下記を試してみたところ動きました。
    ```
    select * from 家計簿
    where 出金額 > any(array[1000, 2000, 3000])
    ```

    キャンセル

0

出金額の比較元が2500で比較対象のリストが(1000, 2000, 3000)の場合

ちょっと日本語として意味が通じてないですね
2500が1000,2000,3000とどうからむのかわからないですし
例示したデータも2500と整合性があっていません

まずanyはSQLではサブクエリを指定するので数字の羅列ではなく、
あえてやるならUNIONしたSELECT文でしょうか

(SELECT 1000 UNION SELECT 2000 UNION SELECT 3000 )

これに対して出金額=で検証すれば合致するデータはないのでヒットしません

  • 元データ
create table 家計簿 (日付 date,費目 varchar(20), メモ varchar(20), 入金額 int, 出金額 int);
insert into 家計簿 values
('2013-02-03','食費','コーヒーを購入',0,380),
('2013-02-10','給料','1月の給料',280000,0),
('2013-02-11','教養娯楽費','書籍を購入',0,2800),
('2013-02-14','交際費','同期会の会費',0,5000),
('2013-02-18','水道光熱費','1月の電気代',0,7560);
  • 検索
SELECT * FROM 家計簿 WHERE  出金額 = ANY (SELECT 1000 UNION SELECT 2000 UNION SELECT 3000 );

一応文法上未満をとれるので試して見ると

SELECT * FROM 家計簿 WHERE  出金額 < ANY (SELECT 1000 UNION SELECT 2000 UNION SELECT 3000 );


なら拾えるでしょう。ただ、思っているデータがヒットしているかどうかはわかりません。
合致させるだけならINで十分だし、未満を取りたいという場合どういった結果を
期待しているか具体例がないと答えられないでしょう

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/27 23:44

    出金額の2500と()内の1000, 2000, 3000という数値を比較するという旨が書籍に書いてありました。こういう書き方はメリットがなく、先で学習する「式」や「副問い合わせ」と組み合わせることで真価を発揮するとも書いてあるのですが「この時点でANYやALLの構文と仕組みをマスターしてください」とも書いてあります。

    しかし、ANYとALLの書き方が載っていないので質問した次第です。この時点ではよくわからないので先に進んでみようと思います。

    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • SQL

    3099questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。