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

推薦する

Xampp サーバーで MySQL パスワードを変更する方法 (画像付き)

今日、PHP で作業しているときに、Xampp サーバーに付属の mysql データベースを使用する...

nginx をベースにリロードなしでアップストリーム サーバーの動的な自動起動と停止を実装する方法

目次1. Consulクラスタをデプロイする1. 準備3. Consulクラスタを作成する4. 管理...

HTML 基本要約推奨事項 (タイトル)

HTML: タイトル見出しは <h1> - <h6> などのタグによって定...

IE9beta版ブラウザはHTML5/CSS3をサポート

IE9 は Microsoft の第二の革命だと言う人もいます。これは誇張ではないと思います。IE6...

さまざまなターミナルで Mac が SSH 経由でリモート サーバーに接続する方法の説明

Macはシェル(ターミナル)SSHを使用してリモートサーバーに接続します前提条件: 接続する必要があ...

HTML iframe 使用状況の概要の収集

Iframe 使用状況の詳細な分析<iframe frameborder=0 width=17...

オーディオマニアにアピールするオーディオビジュアルLinuxディストリビューション

私は最近、多くの音楽に特化した Linux ディストリビューションの 1 つである Audiovis...

Angularの親子コンポーネント通信の詳細な説明

目次概要1. 入力および出力プロパティの概要2. 入力属性3. プロパティバインディングは親コンポー...

TypeScript におけるジェネリックケースの詳細な説明

ジェネリックの定義 // 要件 1: ジェネリックは指定されていないデータ型をサポートできるため、渡...

MySQLにおける遅いSQLの最適化の方向性について詳しく話しましょう

目次序文SQL文の最適化遅いクエリSQLを記録する設定を変更する方法スロークエリログを表示するSQL...

MySQLはSQL文を使用してテーブル名を変更します

MySQL では、SQL ステートメント rename table を使用してテーブル名を変更できま...

Linuxでpyファイルを直接実行する方法

1. まずファイルを作成します(ファイルを配置するディレクトリにcdします) myTest.py を...

Docker Compose の実践とまとめ

Docker Compose は、Docker コンテナ クラスターのオーケストレーションを実現しま...

セマンティックウェブページ XHTML セマンティックマークアップ

構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...