MySQLのSELF JOIN(自己結合)の使い方をわかりやすく解説
SELF JOIN(自己結合)とは、同じテーブル同士を結合するSQLのテクニックです。例えば、同一テーブル内のある行と別の行を比較したい場合や、組織図のように「上司と部下」の関係を調べたい場合などに活用されます。この記事では、実際にサンプルテーブルを作成しながら、MySQLでのSELF JOINの基本的な使い方を順を追って解説します。
サンプルテーブルの作成
まず、SELF JOINを試すためのテーブルを作成します。以下のCREATE TABLE文を実行してください。
mysql> create table SelfJoinDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CountryName varchar(20),
-> CountryRank int,
-> `Year` varchar(10)
-> );
Query OK, 0 rows affected (1.02 sec)
このテーブルは、国名(CountryName)、国のランク(CountryRank)、年(Year)の3つのカラムを持つシンプルな構造です。
テストデータの挿入
次に、INSERT文を使ってレコードを挿入していきます。ここで注目すべきは、国名「UK」が異なる年・ランクで複数回登録されている点です。このように同一テーブル内に関連するデータが存在することで、SELF JOINの効果がわかりやすくなります。
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('US',1,'2016');
Query OK, 1 row affected (0.12 sec)
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('UK',5,'2013');
Query OK, 1 row affected (0.16 sec)
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('France',45,'2010');
Query OK, 1 row affected (0.21 sec)
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('Turkey',3,'2000');
Query OK, 1 row affected (0.17 sec)
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('Japan',78,'1995');
Query OK, 1 row affected (0.21 sec)
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('Romania',110,'2007');
Query OK, 1 row affected (0.22 sec)
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('UK',3,'2000');
Query OK, 1 row affected (0.16 sec)
登録データの確認
SELECT文ですべてのレコードを表示して、正しく登録されているか確認しましょう。
mysql> select *from SelfJoinDemo;
実行結果は以下の通りです。
+----+-------------+-------------+------+ | Id | CountryName | CountryRank | Year | +----+-------------+-------------+------+ | 1 | US | 1 | 2016 | | 2 | UK | 5 | 2013 | | 3 | France | 45 | 2010 | | 4 | Turkey | 3 | 2000 | | 5 | Japan | 78 | 1995 | | 6 | Romania | 110 | 2007 | | 7 | UK | 3 | 2000 | +----+-------------+-------------+------+ 7 rows in set (0.00 sec)
SELF JOINクエリの実行
それでは、いよいよSELF JOINを実行してみましょう。ポイントは、同じテーブルに別名(t1とt2)を付けて、あたかも2つの異なるテーブルであるかのように扱うことです。
mysql> SELECT DISTINCT t1.CountryName, t2.Year -> FROM SelfJoinDemo AS t1, -> SelfJoinDemo AS t2 -> WHERE t1.Year=t2.Year -> and t1.CountryName='US';
このクエリの仕組みを見てみましょう。
- t1側:CountryNameが「US」の行を抽出します。
- t2側:t1と同じ年(Year)を持つ行を結合します。
- DISTINCT:結合によって生じる重複した結果を除外します。
実行結果は以下の通りです。
+-------------+------+ | CountryName | Year | +-------------+------+ | US | 2016 | +-------------+------+ 1 row in set (0.00 sec)
まとめ
SELF JOINは、同じテーブルを別名で2つに見立てて結合する手法です。FROM句でテーブルに異なる別名を付け、WHERE句で結合条件を指定します。また、必要に応じてDISTINCTを使うことで重複行を排除できます。組織図やカテゴリの階層構造など、同一テーブル内の行同士の関連性を扱いたい場面で非常に役立つテクニックなので、ぜひマスターしておきましょう。
-
MySQLで@記号を使う方法!ユーザー定義変数の基本と実例をわかりやすく解説
MySQLで@記号を使用するには、SETコマンドを利用します。@記号は、セッション内で有効なユーザー定義変数を設定する際に使われる記号です。変数に値を格納しておけば、後続のクエリ内でその値を何度でも再利用できるため、条件の共通化や一時的な値の保持に非常に便利です。 @記号によるユーザー定義変数の基本構文 ユーザー定義変数を設定する基本的な構文は以下のとおりです。 SET @anyVariableName := yourValue; :=は代入演算子で、右側の値を左側の変数に代入します。これにより、以降のSQL文の中で@anyVariableNameを参照できるようになります。 サンプルテーブル
-
MySQLクエリでCASE条件を使ってカウントする方法
MySQLでは、CASE WHENを活用し、COUNT()関数の中にCASE条件を設定することで、特定の条件に一致するレコードだけを数えることができます。この仕組みが成り立つのは、COUNT()関数がNULL値を無視するためです。条件に合わない場合にNULLを返すことで、そのレコードはカウント対象から除外されます。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。 ); Query OK, 0 rows affected (0.61 sec)2. レコードの挿入続いて、insertコマンドを使ってテーブルにデータを登録します。mysql> insert into D