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 を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

ブログ    

推薦する

HTML知識ポイントの実践経験のまとめ

1. 表タグはtable、trは行、tdはセル、cellspacingはセル間の距離、cellpad...

CSS でフロートとマージンを混合するサンプルコード

最近の勉強で、GitHub でレイアウトの練習をいくつか見つけたのですが、レイアウトにまったく慣れて...

CentOS7 での mysql 5.7.23 のバイナリ インストール

インターネット上のインストール情報は不均一で、落とし穴だらけです。インストールにはかなりの労力がかか...

Dockerでホストファイルをカスタマイズする方法について簡単に説明します

目次1. コマンド2. docker-compose.yml 3. Dockerファイル4. 直接変...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0.12のインストールと設定方法を記録してみんなで共有します。 1. インストール1...

Kylin V10 サーバーで Storm をコンパイルしてインストールする詳細なプロセス

1 はじめにApache Storm は、Hadoop と同様に、大量のデータを処理するために使用で...

MySQL に大量のデータを挿入する 4 つの方法の例

序文この記事では主に、MySQLに大量のデータを挿入する4つの方法を紹介し、参考と学習のために共有し...

MySQL の 3 つの浮動小数点型 (float、double、decimal) の違いと概要について簡単に説明します。

各浮動小数点型のストレージ サイズと範囲は、次の表に示されています。タイプサイズ範囲(符号付き)範囲...

bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorException の解決方法

bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorExce...

VMware で Nginx+KeepAlived クラスタ デュアルアクティブ アーキテクチャを展開する際の問題と解決策

序文負荷分散には nginx を使用します。アーキテクチャのフロントエンドまたは中間層として、トラフ...

docker を使用して influxdb と mongo をデプロイするための一般的なコマンド

Docker ベースのデータベースをデプロイするsudo docker pull influxdb ...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

CSS属性のデフォルト値width: autoとwidth: 100%の違いの詳細な説明

幅: 自動子要素(コンテンツ+パディング+境界線+余白を含む)は、親要素のコンテンツ領域全体を埋めま...

MySQL のスケジュールされた完全なデータベースバックアップ

目次1. MySQLデータのバックアップ1.1、データをバックアップするためのmysqldumpコマ...

VUEユニアプリ開発環境についての簡単な説明

目次1. HBuilderXビジュアルインターフェースを通じて2. vue-cliコマンドで実行する...