MySQL 入門

MySQL 論理演算子

MySQLにおいて、WHERE 句は指定した条件に基づいてレコード(行)をフィルタリングするために使用されます。より正確で複雑なフィルターを作成するには、論理演算子を使用して複数の条件を組み合わせます。主に使われるのは ANDOR、および NOT です。これらの演算子を駆使することで、多様な条件の組み合わせに基づいた強力なデータ抽出クエリを構築できます。

1. AND による条件の組み合わせ

AND 演算子は、2つ以上の条件を組み合わせるために使用されます。結果セットにレコードが含まれるためには、AND で接続されたすべての条件が真(TRUE)である必要があります。どれか一つでも条件が偽(FALSE)であれば、その行の AND 式全体が偽と判定され、結果から除外されます。なお、括弧がない場合、AND 演算子の優先順位は OR よりも高いため、データベースは OR 条件よりも先に AND 条件を評価します。

1.1 AND の構文

SELECT column1, column2
FROM table_name
WHERE condition1 AND condition2 AND condition3;

1.2 AND の例

world データベースの city(都市)テーブルを例にします。このテーブルには、名称(Name)、国コード(CountryCode)、行政区(District)、人口(Population)などの情報が含まれています。

例 1:特定の国かつ最低人口要件を満たす都市
アメリカ(CountryCode = 'USA')に位置し、かつ人口が 500,000 人より多い都市を検索します。この場合、両方の条件を満たす必要があります。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'USA' AND Population > 500000;

このクエリは、ロサンゼルス、シカゴ、ヒューストンなどの都市を返します。これらはアメリカにあり、人口が 500,000 を超えているためです。人口が 500,000 以下の米国都市、あるいは人口が 500,000 を超えていても米国以外の都市は除外されます。

例 2:一国内の特定の行政区にある都市
インド(CountryCode = 'IND')にあり、かつ「Gujarat」(グジャラート州)行政区にある都市を検索します。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'IND' AND District = 'Gujarat';

このクエリは、両方の基準を満たすアーメダバードやスラトなどの都市を返します。

例 3:AND を使用して3つの条件を組み合わせる
中国(CountryCode = 'CHN')に位置し、かつ人口が 1,000,000 人から 5,000,000 人の間(両端を含む)である都市を検索します。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'CHN' AND Population >= 1000000 AND Population <= 5000000;

これにより、すべての基準を満たす天津や重慶のような都市が選択されます。

2. OR による条件の組み合わせ

OR 演算子は、2つ以上の条件を組み合わせます。OR で接続された条件のいずれか一つでも真であれば、そのレコードは結果セットに含まれます。OR で接続されたすべての条件が偽である場合にのみ、その行は除外されます。OR 演算子の優先順位は AND よりも低くなります。

2.1 OR の構文

SELECT column1, column2
FROM table_name
WHERE condition1 OR condition2 OR condition3;

2.2 OR の例

引き続き city テーブルを使用します。

例 1:特定の2カ国のいずれかに属する都市
フランス(CountryCode = 'FRA')またはドイツ(CountryCode = 'DEU')に位置する都市を検索します。どちらか一方の CountryCode 条件が真であれば十分です。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'FRA' OR CountryCode = 'DEU';

このクエリは、パリ(フランス)やベルリン(ドイツ)、およびこれら2カ国の他のすべての都市を返します。イタリアなど他の国の都市は除外されます。

例 2:特定の名称を持つ、または人口が多い都市
名前が 'London'(ロンドン)である、または人口が 10,000,000 人より多い都市を検索します。

SELECT Name, CountryCode, District, Population
FROM city
WHERE Name = 'London' OR Population > 10000000;

このクエリでは、ロンドン(英国)の人口が 1,000 万人を超えていなくても結果に含まれます。同様に、東京(日本)のような都市も、名前がロンドンでなくても人口が 1,000 万人を超えているため結果に含まれます。

3. NOT による条件の否定

NOT 演算子は条件を否定するために使用され、事実上その真偽値を反転させます。条件が真であれば NOT はそれを偽にし、偽であれば真にします。通常、特定の基準を満たすレコードを「除外」したい場合に使用されます。NOT の優先順位は AND および OR よりも高くなります。

3.1 NOT の構文

SELECT column1, column2
FROM table_name
WHERE NOT condition;

3.2 NOT の例

例 1:特定の国ではない都市
インド(CountryCode = 'IND')以外の都市を検索する場合、CountryCode = 'IND' 条件に NOT 演算子を適用します。

SELECT Name, CountryCode, District, Population
FROM city
WHERE NOT CountryCode = 'IND';

このクエリは、インド以外のすべての都市を返します。これと同じ結果を得る別の書き方は、WHERE CountryCode != 'IND' または WHERE CountryCode <> 'IND' です。

例 2:人口が特定の値を超えない都市
人口が 1,000,000 人より大きくない(つまり 1,000,000 人以下)の都市を検索します。

SELECT Name, CountryCode, District, Population
FROM city
WHERE NOT Population > 1000000;

このクエリには、人口が 1,000,000 人以下のすべての都市が含まれます。これは WHERE Population <= 1000000 と同等です。

4. AND、OR、NOT の組み合わせと優先順位

複数の論理演算子を組み合わせる場合、優先順位(プレシデンス)を理解し、括弧 () を使用することが極めて重要です。括弧を使用すると、評価の順序を明示的に定義でき、デフォルトの優先順位を上書きできます。括弧内の条件は常に最初に評価されます。

優先順位(高い順):

  1. NOT
  2. AND
  3. OR

4.1 演算子組み合わせの例

例 1:特定の国の都市 OR(高人口 AND 特定の行政区)
カナダ(CountryCode = 'CAN')に位置する、あるいは(人口が 5,000,000 より大きく、かつ「California」行政区にある)都市を検索します。(※この例はデモ用です。カリフォルニアは米国の行政区であり、通常カナダには存在しません)。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'CAN' OR Population > 5000000 AND District = 'California';

括弧がない場合、優先順位が高いため AND 条件 (Population > 5000000 AND District = 'California') が先に評価されます。その後、その結果が CountryCode = 'CAN' と OR で組み合わされます。つまり:

  1. カナダの都市が含まれる。
  2. カナダ以外でも、人口が 5,000,000 を超え、かつ 'California' にある都市が含まれる。

例 2:括弧を使用して優先順位を変更する
「カナダまたは人口が 5,000,000 を超える都市」を探し、さらにその中から「California」行政区にあるものだけを絞り込みたい場合はどうすればよいでしょうか。

SELECT Name, CountryCode, District, Population
FROM city
WHERE (CountryCode = 'CAN' OR Population > 5000000) AND District = 'California';

ここでは、括弧内の OR 条件 (CountryCode = 'CAN' OR Population > 5000000) が最初に評価されます。その結果(カナダの都市、または極めて人口が多い都市の集合)が、次に AND で District = 'California' 条件と組み合わされます。これにより、「2つの OR 条件のいずれかを満たし、かつ 'California' にある都市」のみが返されます。カリフォルニアにカナダの都市はなく、人口 500 万人以上の都市もなければ、結果は空になります。これは、括弧がいかにクエリの意味を根本的に変えるかを示しています。

例 3:NOT を AND および OR と組み合わせる
アメリカ(CountryCode = 'USA')以外で人口が 1,000,000 を超える都市、あるいは「England」(イングランド)行政区にある都市を検索します。

SELECT Name, CountryCode, District, Population
FROM city
WHERE (NOT CountryCode = 'USA' AND Population > 1000000) OR District = 'England';

ここでは、NOT 演算子が直接 CountryCode = 'USA' に適用されます。括弧があるため、まず AND 条件 (NOT CountryCode = 'USA' AND Population > 1000000) が計算され、その結果が OR District = 'England' と組み合わされます。これにより以下のレコードが返されます:

  1. アメリカ以外で人口が 1,000,000 を超える都市。
  2. 国や人口に関係なく、「England」行政区内のすべての都市。