SQL文のANDとORの実行順序で発生する問題

SQL文のANDとORの実行順序で発生する問題

質問

昨日、データベースSQLを書いているときに問題が発生しました。問題の根本は、SQL ステートメント内の AND キーワードと OR キーワードの実行優先順位にあります。この問題をテストしてみましょう。

シナリオ

1. 学生テーブル Student があり、テーブルフィールドには Id (ユーザーの主キー)、Name (ユーザー名)、Grade (学年)、Class (クラス)、Sex (性別) が含まれます。次のように:

テーブル構造

2. 次のように 10 個のテスト データをテーブルにインポートします。

テーブルデータ

3. 次に、1 年生の女子生徒のうち女子である生徒、または 2 年生の女子生徒のうち女子である生徒を見つける必要があります。 SQL ステートメントは次のとおりです。
性別が「女」かつ学年が1またはクラスが2である学生から*を選択します
ただし、SQL クエリの結果は要件を満たしていません。実行結果は次のとおりです。

実行結果

実行結果では、2年生に男子生徒も見つかりましたが、これは明らかに誤りです。

4. SQL ステートメントを変更し、括弧を追加します。次のように:

性別が「女」かつ (学年=1 または クラス=2) である生徒から * を選択します

SQLクエリの結果は要件を満たしている

分析する

上記のシナリオから、問題の鍵は AND と OR の実行順序にあります。
データによると、関係演算子の優先順位は高い順から低い順で、NOT >AND >OR となっています。
where の後に OR 条件がある場合、OR は左と右のクエリ条件を自動的に分離します。
上記のシナリオの最初のステートメントと同様に、クエリ条件は 2 つの部分に分かれています (または)。

1. 性別 = '女性'、学年 = 1
2. クラス=2

これは、1 年生の女子生徒と 2 年生の生徒を見つけることを意味します。元のクエリの要件を満たしていません。
解決策は、実行順序を区別するために括弧を使用することです <br /> 上記のシナリオの 2 番目のステートメントと同様に、クエリ条件は 2 つの部分 (and) に分割されます。

1. 性別 = 「女性」 
2. (学年=1またはクラス=2)

以下もご興味があるかもしれません:
  • SQL文の実行順序の図による説明
  • SQL文の実行順序の詳細な説明
  • SQL ステートメント実行の詳細な説明 (MySQL アーキテクチャの概要 -> クエリ実行プロセス -> SQL 解析順序)
  • SQLクエリの実行順序をゼロから学ぶ
  • この記事ではSQLの実行順序について説明します

<<:  Linux(中心OS7)は、Java Webプロジェクトの実行環境を構築するためにJDK、Tomcat、MySQLをインストールします。

>>:  axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

推薦する

Vue で動的なスタイルを実現するためのさまざまな方法のまとめ

目次1. 三項演算子の判定2. 動的に設定されるクラス3. 方法判定4. 配列バインディング5. e...

WeChatアプレットがテキストスクロールを実装

この記事の例では、WeChatアプレットでテキストスクロールを実装するための具体的なコードを参考まで...

Vue プロジェクト コード分割ソリューション

目次背景目的分割前プロセス設計ディレクトリ構造の設計問題分割後プロセス設計ディレクトリ構造の設計問題...

IDEA が docker を統合して springboot プロジェクトを展開するプロセス全体

目次1. IDEAはdockerプラグインをダウンロードします2. クラウドサーバーDocker 2...

jQuery は、画像を切り替えるための左ボタンと右ボタンのクリックを実装します。

この記事では、左ボタンと右ボタンをクリックすることで画像を切り替えるjQueryの具体的なコードを例...

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明以下は私が作成した M...

JS での Reduce() メソッドの使用の概要

目次1. 文法2. 例3. その他の関連方法長い間、reduce() メソッドの具体的な使い方を理解...

Vue2.x の応答性の簡単な説明と例

1. Vue レスポンシブの使用法を確認する​ Vue の応答性は、私たち全員がよく知っています。 ...

すべてのブラウザに対応したデータURIとMHTMLの完全なソリューション

データURI Data URI は、小さなファイルをドキュメントに直接埋め込むために RFC 239...

Vueプロジェクトが完了した後にプロジェクトを最適化する方法の例

目次1. 開発モードとリリースモードに異なるパッケージエントリポイントを指定する2. 外部CDNリソ...

MySQLオンラインDDLの使用に関する詳細な説明

目次文章LOCKパラメータアルゴリズムパラメータCOPY TABLE プロセスIN-PLACEプロセ...

MySQL の JSON 挿入の問題

MySQL 5.7.8 以降では、JSON テキストでデータを効率的に取得できるネイティブ JSON...

MySQL の文字セット utf8 を utf8mb4 に変更する方法

MySQL 5.5 の場合、文字セットが設定されていない場合、MySQL のデフォルトの文字セットは...

Linux に MySQL をインストールする方法 (yum とソース コードのコンパイル)

Linux に MySQL をインストールするには、yum インストールとソース コード コンパイ...

Linux でネットワーク パケット損失と遅延をシミュレートする方法

netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...