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

推薦する

MySQL の連結で複数の一重引用符と三重引用符を使用する際の問題

文字列を動的に連結する場合、文字連結を使用することが多いです。次のような連結の引用符の意味がわかりま...

Linuxでのaliasコマンドの使い方の詳細な説明

1. 別名の使用alias コマンドは、コマンドのエイリアスを設定するために使用されます。このコマン...

フォーム送信時に追加のパラメータを渡すためのいくつかの一般的な方法

フォームを送信するときに、送信前に追加のパラメータが追加される状況が発生する場合があります。この問題...

Linux でのマルチスレッドにおけるフォークの紹介

目次質問:ケース(1)子スレッドを作成する前にフォークするケース(2)子スレッドを作成した後にフォー...

Vue でよく使われる命令 v-if と v-show の違いを簡単に分析します。

目次序文1.v-ショー2.v-if 3. v-showとv-ifの違い1. 原則の違い2. アプリケ...

HTML タグに類似: strong および em、q、cite、blockquote

XHTML には似た機能を持つタグがいくつかあります。もちろん、ここでの類似性とは意味の類似性を指...

Vueテクノロジーに基づく再帰コンポーネントの実装方法

説明するこの記事では、Vue テクノロジーに基づいて再帰コンポーネントを実装する方法を紹介します。 ...

Nginx フォワード プロキシとリバース プロキシ、および負荷分散機能の構成コード例

この記事は主に、Nginx のフォワード プロキシとリバース プロキシ、および負荷分散機能の設定コー...

Vue3 ページ、メニュー、ルートの使用

目次1. メニューをクリックしてジャンプ1. ページ名の統一2. 管理ページを追加3. ルートを追加...

MySQL で GTID モードをオンラインで有効または無効にする

目次基本的な概要GTIDをオンラインで有効にする1. GTID検証ENFORCE_GTID_CONS...

CSS と Bootstrap アイコンを使用して、上下にジャンプするインジケーター矢印のアニメーション効果を作成します。

ページが非常に長い場合は、下にさらにコンテンツがあることをユーザーに知らせるために矢印が必要になるこ...

VMware + Ubuntu18.04 による Hadoop クラスタ環境の構築に関するグラフィック チュートリアル

目次序文VMware クローン仮想マシン (準備、3 台の仮想マシンのクローン、1 台のマスター、2...

MySQL の繰り返し読み取りレベルでファントム読み取りを解決できますか?

導入データベース理論についてさらに学んでいくうちに、さまざまな分離レベルによって起こり得る問題につい...

WeChatミニプログラムのすべてのページがログインされていることを確認する方法

目次現状解決さらなる解決策やっと現状WeChat ミニプログラムには、ホームページ、個人ページ、いく...

一般的な XHTML タグの使用方法の紹介

XHTML には多くのタグがありますが、頻繁に使用されるのはごくわずかであり、習得する必要があるのは...