SQL クエリでの演算順序の制御

SQL クエリを実行する場合、期待どおりの結果を出すためには、項目が評価される順序を理解し管理することが重要です。

以下は、同じクエリの 2 つの例です。最初の例では、項目のグループ化が使用されていないため、返される結果は期待どおりではありません。2 つ目の例では、演算の順序が正しくなるよう項目をグループ化しているため、期待どおりの結果が返されます。

このシナリオでは、世界の人口統計データベースを扱っていて、人口が 100,000 人以上であるか州都であるかのいずれかの条件を満たす中国のすべての都市を検出したいとします。

例 1: グループ化なし

以下の図に示すように、3 つの項目でこのクエリを構築できます。このクエリを実行すると、最初に中国のすべての都市が検索され、次に、人口が 100,000 人以上の中国の都市がフィルタリングされます。次に、[Or] 演算子に基づいて、データセット全体が評価され、州都が返されます。最終的な結果として、人口が 100,000 人以上の中国の都市と州都である世界の都市が検索されます。これは、求める結果ではありません。こうなる理由は、[And] 演算子の方が [Or] 演算子よりも優先度が高いため、[And] が先に評価されるからです。

グループ化されていないクエリの 3 つの項目

例 2: グループ化あり

この場合、求める結果を返すには、[Or] 演算子が先に評価されるようにする必要があります。演算の順序を適用するように項目をグループ化できます。グループ内のすべての項目が、グループ外の項目より前に評価されます。

後ろの 2 つの項目がグループ化されたクエリの 3 つの項目

2 つ以上の項目をグループ化するには、クリックしながら Shift キーを押して項目を選択し、[項目のグループ化] 項目のグループ化 をクリックします。項目のグループ化を解除するには、グループ内の項目を選択し、[項目のグループ解除] 項目のグループ解除 をクリックします。

グループ化が適用されると、クエリでは、まず、グループ内の項目が評価されます。すなわち、人口が 100,000 人以上であるか、州都であるかのいずれかの条件を満たす都市が検出されます。次に、これが中国の都市であるかどうかが評価されます。[And] 演算子により、クエリで、両方の条件を満たす都市が正しく返されます。すなわち、人口が 100,000 人以上であるか、州都である中国の都市が返されます。

項目のグループ化とは、項目を括弧で囲むことです。[SQL] モードでは、このクエリは次のようになります。

CNTRY_NAME = 'China' And (POP > 100000 Or STATUS = 'Provincial capital')

関連トピック