AND/ORの優先順位と括弧の付け方
面接官が問題に仕込む、最もよくあるフィルタリングのバグを学びます。
「AND/ORの優先順位と括弧の付け方」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
面接官が仕掛ける落とし穴
面接で最もよくあるフィルタリングのバグは、一見すると正しそうに見えます。出題は「customer 5の注文のうち、pendingまたはshippedのものを見つけてください」です。受験者がANDとORを混在させたWHEREを書き、余分な行が返されるという結果になります。
なぜでしょうか。ANDはORより強く結合するためです。データベースはまずすべてのANDの組み合わせを評価し、その後でORを評価します。このレッスンでは、このルールを反射的に使えるようにし、面接での失点を防ぎます。
演算子の優先順位を一文で説明する
すべてのSQL方言で、論理演算子は次の順序で結合します。最初にNOT、次にAND、最後にORです。
NOTが最も高い優先順位ANDが中間ORが最も低い優先順位
したがって、A OR B AND CはA OR (B AND C)と解釈され、(A OR B) AND Cとは解釈されません。面接官は、あなたがこの点を忘れることを想定しています。
問題のあるクエリ
これは、customer 5で、statusがpendingまたはshippedという条件に対して受験者が書くクエリです。一見正しそうですが、誤っています。
ANDの結合が強いため、SQLはこれを(customer_id = 5 AND status = 'pending') OR status = 'shipped'と解釈します。2つ目の分岐には顧客のフィルターがまったくありません。そのため、すべての顧客のshippedの注文が返されます。
SELECT *
FROM orders
WHERE customer_id = 5
AND status = 'pending'
OR status = 'shipped';修正方法:括弧
ORの分岐を括弧で囲み、顧客のフィルターが両方のステータスに適用されるようにします。括弧は優先順位を上書きし、意図を明確にします。
これでSQLはまずグループ化されたORを評価し、その後、グループ全体にcustomer_id = 5を適用します。優先順位によって結果が正しくなる場合でも、上級のレビュアーは可読性だけを理由に括弧を追加します。
SELECT *
FROM orders
WHERE customer_id = 5
AND (status = 'pending' OR status = 'shipped');真理値表をたどる
customer 9のshippedの注文を1件取り上げ、問題のあるバージョンを確認しましょう。
customer_id = 5はfalsestatus = 'pending'はfalsefalse AND falseはfalsefalse OR (status = 'shipped' is true)はtrue
この行はcustomer 5ではないにもかかわらず返されます。具体的な1行を声に出して追跡することは、まさに面接官が確認したいことです。
NOTが最も強く結合する
NOTは直後にある条件だけに適用されます。そのため、NOT status = 'open' AND priority = 'high'は(NOT status = 'open') AND priority = 'high'を意味します。
全体を否定したい場合は、括弧で囲む必要があります。NOT (status = 'open' AND priority = 'high')とします。これはド・モルガンの法則により、status <> 'open' OR priority <> 'high'と等価です。
SELECT *
FROM tickets
WHERE NOT (status = 'open' AND priority = 'high');3つの条件の例
商品を(電子機器または家電製品)で、かつ在庫ありのものに絞り込みます。括弧がないと、在庫ありの条件は家電製品にしか適用されません。
下のグループ化されたクエリは、2つのカテゴリのどちらかを選び、そのうえで在庫を要求するという形で、すっきり読めます。覚えておくべきルールは、クエリでANDとORを組み合わせる場合、ほとんど常にORのグループを括弧で囲む必要があるということです。
SELECT *
FROM products
WHERE (category = 'electronics' OR category = 'appliances')
AND in_stock = true;より簡潔な代替手段としての IN
同じ列に対するORの長い連鎖は、エラーが起きやすいうえに冗長です。曖昧さがなく、括弧も必要ないINに置き換えましょう。
下のクエリは直前のクエリと完全に同値ですが、壊れにくくなっています。面接官はこのリファクタリングを好みます。正確性と可読性の両方を理解していることが伝わるからです。
SELECT *
FROM products
WHERE category IN ('electronics', 'appliances')
AND in_stock = true;計算を含むフィルターでの優先順位
算術演算と論理演算を組み合わせる場合にも、優先順位が適用されます。price * 1.2 > 100 OR discount = 0 AND active = trueでは、まず比較と算術演算が解決され、次にAND、最後にORが解決されます。
つまり、(price * 1.2 > 100) OR ((discount = 0) AND (active = true))として読まれます。迷ったときは、プレッシャーの中で優先順位の表を暗記して適用しようとせず、すべてのグループを括弧で囲んでください。
その場での答え方
面接官からANDとORが混在するフィルターを示され、これは何を返しますかと聞かれたら、次の3つを行います。
- 優先順位のルールを述べます:
ANDがORより先です - クエリを声に出して括弧付きに書き直し、本当のグループ化を明らかにします
- バグが明らかになる1行を追跡します
そのうえで、正しく括弧で囲んだ修正版を提示します。この順序で答えると、シニアレベルの厳密さが伝わります。
防御的な習慣
プロフェッショナルが身につけている習慣は、すべてのORグループを必ず括弧で囲むことです。2文字分のコストで、バグやレビューコメントの大きな原因を丸ごと1つ取り除けます。
コードレビュー担当者が、フィルターの正しさを確認するために頭の中で優先順位を評価する必要はありません。グループ化を見える形にしてください。これは、冗長な構文が誰から見てもよいスタイルとされる数少ないケースの1つです。
SELECT order_id, status
FROM orders
WHERE customer_id = 5
AND (status = 'pending' OR status = 'shipped');クイックチェック
答える前に、優先順位のルールについて考えてみてください。
まとめ
重要なポイント:
- 論理演算の優先順位はNOT、次にAND、次にORです
ANDとORが混在するフィルターでは、ほとんど常にORグループを括弧で囲む必要があります- 括弧がないと結果の範囲がひそかに広がり、フィルターが完全に無視されることもあります
- 1つの列に対する長い
ORの連鎖はINに置き換えます - その場で答えるときは、ルールを述べ、括弧付きに書き直し、1行を追跡してから修正します
優先順位の結果がすでに意図どおりであっても、常にORグループを括弧で囲んでください。
よくある質問
「AND/ORの優先順位と括弧の付け方」レッスンは無料ですか?
はい。「AND/ORの優先順位と括弧の付け方」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「AND/ORの優先順位と括弧の付け方」で何を学びますか?
面接官が問題に仕込む、最もよくあるフィルタリングのバグを学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「AND/ORの優先順位と括弧の付け方」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- AND/ORの優先順位と括弧の付け方
- BETWEEN、IN、境界値の扱い
- LIKE、ワイルドカード、エスケープ
- 計算値でフィルタリングする