MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでMAX(DISTINCT)を使う方法と、DISTINCTなしで使う場合の違いとは?

MySQLにおけるMAX関数とDISTINCTキーワードの関係

MySQLでは、MAX()関数にDISTINCTキーワードを組み合わせる構文と、組み合わせない構文の2通りが存在します。一見すると結果が異なりそうに思えますが、実際にはどうなのでしょうか。本記事では両者の違いを具体例とともに詳しく解説します。

2つの基本構文

まず、MAX()内でDISTINCTを使用する最初の構文を見てみましょう。

select max(DISTINCT yourColumnName) from yourTableName;

次に、DISTINCTを使用しない2つ目の構文です。

select max(yourColumnName) from yourTableName;

重要なポイント: 実は、上記のどちらのクエリもDISTINCTキーワードの有無にかかわらず同じ結果を返します。これは、MySQLが内部的にMAX(カラム名)をDISTINCT指定ありとして処理するためです。最大値を求める際には重複値が結果に影響しないため、DISTINCTを明示的に書く必要がないのです。

実例で確認してみよう

それでは、実際にテーブルを作成して動作を確認してみます。

ステップ1:テーブルの作成

mysql> create table DemoTable
(
    Number int
);
Query OK, 0 rows affected (1.50 sec)

ステップ2:レコードの挿入

insertコマンドを使って、いくつかのレコードをテーブルに登録します。

mysql> insert into DemoTable values(80);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(78);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(68);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.10 sec)

この例では、値「88」が意図的に3回挿入されている点に注目してください。

ステップ3:全レコードの表示

select文でテーブル内のすべてのレコードを確認します。

mysql> select *from DemoTable;

実行結果は以下のとおりです。

+--------+
| Number |
+--------+
|     80 |
|     88 |
|     78 |
|     88 |
|     68 |
|     88 |
+--------+
6 rows in set (0.00 sec)

CASE 1:MAX(DISTINCT ...) を実行する

DISTINCTを使って最大値を取得するクエリは以下のとおりです。

mysql> select max(DISTINCT Number) from DemoTable;

実行結果:

+----------------------+
| max(DISTINCT Number) |
+----------------------+
|                   88 |
+----------------------+
1 row in set (0.00 sec)

CASE 2:DISTINCTなしでMAX()を実行する

続いて、DISTINCTを使わずに最大値を取得します。

mysql> select max(Number) from DemoTable;

実行結果:

+-------------+
| max(Number) |
+-------------+
|          88 |
+-------------+
1 row in set (0.07 sec)

まとめ

上記の実行結果から分かるように、MAX(DISTINCT ...)MAX(...)はどちらも同じ「88」という結果を返しました。MySQLでは最大値の計算において重複値が結果に影響しないため、DISTINCTキーワードを付けても付けなくても動作は変わりません。なお、COUNT()やSUM()などの集計関数ではDISTINCTの有無によって結果が変わるため、これらの関数と混同しないよう注意しましょう。

  1. MySQLのTINYINT(1)とブール型(BOOLEAN)の違いとは?

    結論から言うと、TINYINT(1)とブール型(BOOLEAN)の間に違いはありません。MySQLでは、BOOLまたはBOOLEANというキーワードは内部的にTINYINT(1)へと変換されます。つまり、BOOLやBOOLEANはTINYINT(1)の別名(シノニム)として扱われるのです。それでは、実際にテーブルを作成して確認してみましょう。BOOLEAN型でテーブルを作成するmysql> create table DemoTable ( isMarried Boolean ); Query OK, 0 rows affected (1.77 sec)次に、作成したテーブルの構造

  2. MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?

    MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970     (