以下の例では、学生の成績を管理する grade テーブルを対象に、さまざまな SELECT クエリの使い方を紹介します。
テーブル定義とサンプルデータ
CREATE TABLE grade (
id INT NOT NULL,
sex CHAR(1),
firstname VARCHAR(20) NOT NULL,
lastname VARCHAR(20) NOT NULL,
english FLOAT,
math FLOAT,
chinese FLOAT
);
INSERT INTO grade VALUES
(1, 'm', 'John', 'Smith', 88.0, 85.0, 82.0),
(2, 'f', 'Adam', 'Smith', 76.0, 78.0, 90.0),
(3, 'm', 'Allen', 'William', 88.0, 92.0, 95.0),
(4, 'm', 'George', 'William', 62.0, 58.0, 72.0),
(5, 'f', 'Alice', 'Davis', 89.0, 94.0, 98.0),
(6, 'm', 'Kevin', 'Miller', 77.0, 88.0, 99.0),
(7, 'f', 'Helen', 'Davis', 79.0, 83.0, 91.0),
(8, 'm', 'Andrew', 'Johnson', 81.0, 86.0, 88.0);
基本的なクエリ例
- 全カラムを取得
SELECT * FROM grade; - 特定カラム(id, firstname, lastname)を取得
SELECT id, firstname, lastname FROM grade; - IDが4より大きい学生の名前を取得
SELECT firstname FROM grade WHERE id > 4; - 女性のレコードを取得
SELECT * FROM grade WHERE sex = 'f'; - IDが2, 4, 6の学生情報を取得
SELECT * FROM grade WHERE id IN (2, 4, 6); - 数学の点数が85〜94の範囲にあるレコードを取得
SELECT * FROM grade WHERE math BETWEEN 85 AND 94; - firstnameが'A'で始まるレコードを取得
SELECT * FROM grade WHERE firstname LIKE 'A%'; - firstnameが'A'で始まり'e'で終わるレコードを取得
SELECT * FROM grade WHERE firstname LIKE 'A%e'; - firstnameに'l'を含むレコードを取得
SELECT * FROM grade WHERE firstname LIKE '%l%'; - firstnameが'A'で始まり、全体で4文字のレコードを取得
SELECT * FROM grade WHERE firstname LIKE 'A%' AND CHAR_LENGTH(firstname) = 4; - 英語の点数が80〜90の範囲にあるレコードを取得
SELECT * FROM grade WHERE english BETWEEN 80 AND 90; - 数学または国語の点数が90より大きいレコードを取得
SELECT * FROM grade WHERE math > 90 OR chinese > 90; - IDが1,3,5,7以外のレコードを取得
SELECT * FROM grade WHERE id NOT IN (1, 3, 5, 7); - 登録されている性別の種類を取得
SELECT DISTINCT sex FROM grade; - 登録されている姓(lastname)の種類を取得
SELECT DISTINCT lastname FROM grade; - テーブルの総レコード数を取得
SELECT COUNT(*) FROM grade; - 英語の点数が80のレコード数を取得
SELECT COUNT(*) FROM grade WHERE english = 80; - 全学生の数学の合計点を計算
SELECT SUM(math) FROM grade; - 女子学生の数学の合計点を計算
SELECT SUM(math) FROM grade WHERE sex = 'f'; - 英語の平均点を計算
SELECT AVG(english) FROM grade; - 男子学生の英語の平均点を計算
SELECT AVG(english) FROM grade WHERE sex = 'm'; - 数学の最高点を取得
SELECT MAX(math) FROM grade; - 男子学生の数学の最高点を取得
SELECT MAX(math) FROM grade WHERE sex = 'm'; - 数学の点数で昇順ソート
SELECT * FROM grade ORDER BY math ASC; - 性別で昇順、国語の点数で降順にソート
SELECT * FROM grade ORDER BY sex ASC, chinese DESC; - 性別でグループ化して取得
SELECT sex FROM grade GROUP BY sex; - 姓ごとに学生数を集計
SELECT lastname, COUNT(*) FROM grade GROUP BY lastname; - 姓ごとに数学の合計が100未満のグループを抽出
SELECT lastname FROM grade GROUP BY lastname HAVING SUM(math) < 100; - IDが3から6のレコードを取得
SELECT * FROM grade WHERE id BETWEEN 3 AND 6; - 男子学生の3科目平均が85を超えるレコードを抽出
SELECT * FROM grade WHERE sex = 'm' GROUP BY id HAVING AVG(english + math + chinese) / 3 > 85;