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

MySQLでUNION ALLを使って学生の各科目の点数を1つの列に表示する方法

MySQLでは、科目ごとに分かれた列(MySQL、C、Javaなど)に格納された学生の点数を、縦持ち形式(1つの列)に変換して表示したいケースがよくあります。このような場合にはUNION ALLを利用するのが効果的です。本記事では、実際のテーブル作成からクエリ実行までの手順をわかりやすく解説します。

1. サンプルテーブルを作成する

まずは、学生ID・氏名・各科目の点数を持つテーブルを作成します。

mysql> create table DemoTable729 (
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName varchar(100),
    MySQLMarks int,
    CMarks int,
    JavaMarks int
);
Query OK, 0 rows affected (0.40 sec)

2. テストデータを挿入する

INSERT文を使って、3名分の学生データを登録します。

mysql> insert into DemoTable729(StudentName,MySQLMarks,CMarks,JavaMarks) values('Chris',94,67,75);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable729(StudentName,MySQLMarks,CMarks,JavaMarks) values('Robert',45,99,54);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable729(StudentName,MySQLMarks,CMarks,JavaMarks) values('David',57,89,43);
Query OK, 1 row affected (0.12 sec)

3. 登録したデータを確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable729;

実行結果は以下の通りです。現時点では科目ごとに列が分かれています。

+-----------+-------------+------------+--------+-----------+
| StudentId | StudentName | MySQLMarks | CMarks | JavaMarks |
+-----------+-------------+------------+--------+-----------+
| 1         | Chris       | 94         | 67     | 75        |
| 2         | Robert      | 45         | 99     | 54        |
| 3         | David       | 57         | 89     | 43        |
+-----------+-------------+------------+--------+-----------+
3 rows in set (0.00 sec)

4. UNION ALLで点数を1つの列に変換する

ここからが本題です。各科目のSELECT文をUNION ALLで連結し、固定文字列('MySQL'、'C'、'Java')を科目名として出力することで、点数を1つの「Score」列にまとめて表示できます。

mysql> select StudentId,StudentName,'MySQL' as SubjectName, MySQLMarks as Score
from DemoTable729
UNION ALL
select StudentId,StudentName, 'C' as SubjectName, CMarks as Score
from DemoTable729
UNION ALL
select StudentId,StudentName, 'Java' as SubjectName, JavaMarks as Score
from DemoTable729;

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

+-----------+-------------+-------------+-------+
| StudentId | StudentName | SubjectName | Score |
+-----------+-------------+-------------+-------+
| 1         | Chris       | MySQL       | 94    |
| 2         | Robert      | MySQL       | 45    |
| 3         | David       | MySQL       | 57    |
| 1         | Chris       | C           | 67    |
| 2         | Robert      | C           | 99    |
| 3         | David       | C           | 89    |
| 1         | Chris       | Java        | 75    |
| 2         | Robert      | Java        | 54    |
| 3         | David       | Java        | 43    |
+-----------+-------------+-------------+-------+
9 rows in set (0.00 sec)

ポイント解説

  • UNION ALL vs UNION: UNION ALLは重複チェックを行わないため高速です。今回のように科目名で区別される行は重複にはならないため、UNION ALLが適しています。
  • エイリアス(AS): 各SELECT文で「SubjectName」「Score」という共通の別名を付けることで、結果セットの列構造が揃います。
  • 活用シーン: この横持ち→縦持ちへの変換は、グラフ描画やピボット集計、正規化されたテーブル設計への移行などで役立ちます。
  1. MySQLで学生の点数に基づいてカスタムメッセージを表示する方法

    MySQLでは、CASE文を使うことで、点数などの数値データに応じてカスタムメッセージを動的に表示できます。この記事では、学生の点数が40点より大きいかどうかを判定し、「Good Marks」または「Not Good Marks」というメッセージを出力する具体的な手順を解説します。 1. サンプルテーブルを作成する まず、点数を格納するためのテーブルを作成しましょう。 mysql> create table DemoTable1952 ( Marks int ); Query OK, 0 rows affected (0.00 sec) 2. テストデータを挿入す

  2. MySQLで重複しない日付(個別の値)を表示する方法

    MySQLでは、datetime型のカラムから「日付のみ」を基準に重複を排除してデータを取得したいケースがよくあります。例えば、同じ日に複数の注文や出荷記録がある場合、日付単位で1件だけ取り出したいときなどです。本記事では、GROUP BYとDATE()関数を組み合わせて、重複しない日付ごとのレコードを表示する方法を解説します。 1. サンプルテーブルを作成する まず、動作確認用のテーブルを作成しましょう。ここでは、出荷日時(ShippingDate)と顧客名(CustomerName)を持つテーブルを定義します。 mysql> create table DemoTable1996 (