nrr06402
@nrr06402

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

「OR演算子」を「比較演算子」としてとらえた方がうまく説明がつく感があります。

Q&A

Closed

phpMyAdminです。
 MySQLは実戦経験がないので、参考書で覚えた程度です。

テーブル my_items の全データは id 1 2 3 4の4件です。

id item_name price keyword sales
1 いちご 180 赤い,甘い,ケーキ 5
2 りんご 90 丸い,赤い,パイ 20
3 バナナ 120 パック,甘い,黄色 16
4 ブルーベリー 200 袋入り,青い,眼精疲労 8

1)SELECT * FROM my_items WHERE id=1 OR id=3 AND price<150 AND keyword LIKE '%甘い%';
  id item_name price keyword sales
  1 いちご 180 赤い,甘い,ケーキ 5
  3 バナナ 120 パック,甘い,黄色 16

2)SELECT * FROM my_items WHERE (id=1 OR id=3) AND price<150 AND keyword LIKE '%甘い%';
  id item_name price keyword sales
  3 バナナ 120 パック,甘い,黄色 16

以上のですが
 質問があります。
3) id=1 OR id=3・・・・為 OR 真・・・結果 → 真  真
4)(id=1 OR id=3)・・・ 為 OR 真・・・結果 →    真 
 
以上ですが、1)の()がない場合は 180の 為 も評価され出力される
 のは何故ですか?
  
 「OR演算子」を「比較演算子」としてとらえた方がうまく説明がつく感があります。
3) id=1 OR id=3
4)(id=1 OR id=3)
違いですが 
3)は()がないのでORで id=3 と比較されないため
ORの影響は受けない。そのため id=1 が独り歩き
できるので id=1 と書かれ時点で、選択の対象とな
り出力される。

4)の場合()でくくった時点で、id=1とid=3 が比較され
真である id=3 が返される。 id=1 は
AND price<150 AND keyword LIKE '%赤い%'
のすべての条件を満たしていないため、出力されない。

0

3Answer

演算子には優先順があります。
これは算数で足し算よりも掛け算のほうが先に計算するといったルールと同じものです。
SQL Serverのドキュメントを示します。
https://learn.microsoft.com/ja-jp/sql/t-sql/language-elements/operator-precedence-transact-sql?view=sql-server-ver16

id=1 OR id =3 AND price<150 AND keyword LIKE '%甘い%'の場合、ORよりANDのほうが優先度が高いためid=1 OR (id =3 AND price<150 AND keyword LIKE '%甘い%')と評価されます。
言葉にすると「IDが1のデータ または IDが3で価格が150円以下でキーワードに甘いを含むもの」という感じですね。

算数の例だと以下のようなイメージです。
3) 1 + 2 * 3 * 4 = 25
4) (1 + 2) * 3 * 4 = 36

=====追記=====
質問はMySQLでしたね。MySQLの演算子の優先順は以下のドキュメントに記載されています。
https://dev.mysql.com/doc/refman/5.6/ja/operator-precedence.html

3Like

Comments

  1. @nrr06402

    Questioner

    ありがとうございます。
    大変助かります。
    優先順位 ですね 以前から 参考書 などには書いてはあったのですが
     なかな 理解できていませんでした。 四則演算 の ()での優先順位
    など 算数レベル も 当然理解はしています。

     これは 組み合わせ的には ∞無限 にあるので
    他 私みたいにものは 慣れるしかないみたいです。
     到底 だまって 頭の中で 理解する能力、は私にはないです。
    ひたすら 指を動かしながら 慣れるまで 頑張るしかないと思います。
     現在 以下で 悩んでいます。
     
    SELECT * FROM my_items WHERE (id=1 OR id=3) AND price<150 AND keyword LIKE '%赤い%'
    返り値が空でした (行数 0)。 (Query took 0.0006 seconds.)

    SELECT * FROM my_items WHERE id=1 OR id=3 AND price<150 AND keyword LIKE '%赤い%'
    SELECT * FROM my_items WHERE id=1 OR (id=3 AND price<150 AND keyword LIKE '%赤い%')
    -------------------------------------------------------------
      id item_name price  keyword

    編集 コピー 削除 1 いちご   180  赤い,甘い,ケーキ
    ----------------------------------------------------------
     
     取り急ぎ 明日になったら ふと気が付く感があります。
    数時間 いろんなパターを 入力しました。
     
     そのパターンは アルゴリズム 化 するしかないと思います。
    詳しいことは 私も 分かりません!
     今後ともよろしくお願いいたします。

どうもすみません。
しばらくして みると なんだか見えてきました。
SELECT * FROM my_items WHERE (id=1 OR id=3) AND price<150 AND keyword LIKE '%赤い%'
対象idはi「1と3」です。150円未満で'赤い'のはありません!
 なので 返り値が空でした (行数 0)。

(id=3 AND price<150 AND keyword LIKE '%赤い%') 
「id 3 バナナ     120  パック,甘い,黄色 」は price<150 でも'%赤い%'にでも
該当無 です。

id1 だと
 1 いちご     180  赤い,甘い,ケーキ
なので 180円で '赤い' が該当する。

間違っていたなら ごめんなさいです。

0Like

ありがとうございました。
助かります。
優先順位 がある 了解です。

 他のサイトに以下がありました。

複数値の内どれかということならORを使わない方法
(id=1 OR id=3) → id in (1,3)

0Like

Your answer might help someone💌