Chapter 03

データの検索①

JboyHashimoto
JboyHashimoto
2022.10.10に更新

結果から重複行を除く

重複何それ?、同じ名前ということみたいです。今のままだと、データが足りないので、生徒さんのデータを増やしましょう。
その後に、点数が38点の生徒さんが3人いるので38の数字を1行だけ表示したいときは、DISTINCTを使います。DISTINCTを使うと重複する値を取り除くことができます。

--Dクラスの生徒のデータを追加--
START TRANSACTION;

INSERT INTO
  ClassD
VALUES
  ('0005', '池', 38),
  ('0006', '山内', 38),
  ('0007', '長谷部', 68),
  ('0008', '桜', 38);

COMMIT;

SELECT
  *
FROM
  ClassD;
--Dクラスの生徒の点数を表示--
SELECT class_score AS 数学 FROM ClassD;
--重複している点数の行を取り除く--
SELECT DISTINCT class_score AS 数学 FROM ClassD;

実行結果

mysql> SELECT DISTINCT class_score AS 数学 FROM ClassD;
+--------+
| 数学   |
+--------+
|    100 |
|     95 |
|     92 |
|     78 |
|     38 |
|     68 |
+--------+
6 rows in set (0.00 sec)

mysql> SELECT class_score AS 数学 FROM ClassD;
+--------+
| 数学   |
+--------+
|    100 |
|     95 |
|     92 |
|     78 |
|     38 |
|     38 |
|     68 |
|     38 |
+--------+
8 rows in set (0.00 sec)

条件に合う行だけ検索

特定の条件で、点数が100点の生徒のデータだけ検索したい場合があります。そんなときは、WHERE句を使います。WHEREの後に、生徒の名前や点数を比較演算子を使うと、条件にマッチした情報を検索することができます。

/*比較演算子を使ったWHEREによる検索*/
/*点数が100点の人*/
SELECT student_name, class_score FROM ClassD WHERE class_score = 100;
/*点数が100点ではない人*/
SELECT student_name, class_score FROM ClassD WHERE class_score <> 100;
/*点数が38点以上の人*/
SELECT student_name, class_score FROM ClassD WHERE class_score >= 38;
/*点数が38点を超える人*/
SELECT student_name, class_score FROM ClassD WHERE class_score > 38;
/*点数が68点以下の人*/
SELECT student_name, class_score FROM ClassD WHERE class_score <= 68;
/*点数が68点未満の人*/
SELECT student_name, class_score FROM ClassD WHERE class_score < 68;

検索結果

mysql> /*比較演算子を使ったWHEREによる検索*/
mysql> /*点数が100点の人*/
mysql> SELECT student_name, class_score FROM ClassD WHERE class_score = 100;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 綾小路       |         100 |
+--------------+-------------+
1 row in set (0.00 sec)

mysql> /*点数が100点ではない人*/
mysql> SELECT student_name, class_score FROM ClassD WHERE class_score <> 100;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 堀北         |          95 |
| 櫛田         |          92 |
| 軽井沢       |          78 |
| 池           |          38 |
| 山内         |          38 |
| 長谷部       |          68 |
| 桜           |          38 |
+--------------+-------------+
7 rows in set (0.01 sec)

mysql> /*点数が38点以上の人*/
mysql> SELECT student_name, class_score FROM ClassD WHERE class_score >= 38;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 綾小路       |         100 |
| 堀北         |          95 |
| 櫛田         |          92 |
| 軽井沢       |          78 |
| 池           |          38 |
| 山内         |          38 |
| 長谷部       |          68 |
| 桜           |          38 |
+--------------+-------------+
8 rows in set (0.00 sec)

mysql> /*点数が38点を超える人*/
mysql> SELECT student_name, class_score FROM ClassD WHERE class_score > 38;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 綾小路       |         100 |
| 堀北         |          95 |
| 櫛田         |          92 |
| 軽井沢       |          78 |
| 長谷部       |          68 |
+--------------+-------------+
5 rows in set (0.00 sec)

mysql> /*点数が68点以下の人*/
mysql> SELECT student_name, class_score FROM ClassD WHERE class_score <= 68;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 池           |          38 |
| 山内         |          38 |
| 長谷部       |          68 |
| 桜           |          38 |
+--------------+-------------+
4 rows in set (0.00 sec)

mysql> /*点数が68点未満の人*/
mysql> SELECT student_name, class_score FROM ClassD WHERE class_score < 68;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 池           |          38 |
| 山内         |          38 |
| 桜           |          38 |
+--------------+-------------+
3 rows in set (0.00 sec)

markdownの見た目が少し崩れてしまいますね😅
これは、仕方がないですね。こんな感じでWHEREを使えば条件にマッチしたデータを検索することができます。